All Versions
Latest Version
Avg Release Cycle
102 days
Latest Release

Changelog History
Page 2

  • v19.0.0 Changes

    February 11, 2019

    (February 10, 2019)

    ๐Ÿš€ A very big release indeed, perhaps the biggest yet. A big, big thank you to all the contributors!

    • ๐Ÿ†• New types and utilities
      • [dictutils.ManyToMany][dictutils.ManyToMany] arrives, to complement [dictutils.OneToOne][dictutils.OneToOne]
      • [dictutils.FrozenDict][dictutils.FrozenDict] brings immutable mapping to a module near you (#105)
      • [setutils.complement()][setutils.complement] introduces "negative" sets, useful for exclusion and many other set operations
      • [iterutils.soft_sorted()][iterutils.soft_sorted] allows for looser, more flexible sorting of sequences
      • [iterutils.flatten_iter()][iterutils.flatten_iter] and [iterutils.flatten()][iterutils.flatten], to collapse nested iterables. (#118)
      • [mathutils.Bits][mathutils.Bits] type for representing a bitstring and translating between integer, bytestring, hex, and boolean sequence representations.
    • funcutils improvements
      • [FunctionBuilder][funcutils.FunctionBuilder] and [funcutils.wraps][funcutils.wraps] now support coroutines/async (#194)
      • [FunctionBuilder.add_arg()][funcutils.FunctionBuilder.add_arg] allows the addition of arguments to the signature, to match [FunctionBuilder.remove_arg()][funcutils.FunctionBuilder.remove_arg] (#201)
      • Similarly [funcutils.wraps()][funcutils.wraps] now takes an "expected" argument, to complement "injected" (#161)
    • ๐Ÿ›  Other bugfixes and improvements
      • [cacheutils.LRI][cacheutils.LRI] is now threadsafe and correctly evicts when duplicate keys are added (#155, #157)
      • [dictutils.subdict()][dictutils.subdict] now does its best to return the same type of dictionary it was passed.
      • [urlutils][urlutils] now has better IPv6 support and URL can be used more natively like a string
      • Improve singularization in [strutils][strutils]
      • Fix some deprecation warnings in Python 3.7 (#165, #196)
      • Document the change in dict constructor behavior affecting [dictutils.OMD][dictutils.OMD] under Python 3.7+ (#179)
  • v18.0.1 Changes

    February 11, 2019

    (August 29, 2018)

    ๐Ÿ›  A few bugfixes and a handy text utility.

    • โž• Add MultiSub for multiple string substitutions in a single call ([#162][i162])
    • tableutils.Table.to_text() is more Markdown compatible
    • โž• Add LICENSE to package ([#164][i164])
    • ๐Ÿ‘ atomic_save works better with overwrite=True ([#161][i161])
    • Reduced memory footprint on tbutils._DeferredLine with __slots__
  • v18.0.0 Changes

    February 11, 2019

    (March 2, 2018)

    • โž• Add <thead> and <tbody> structure to tableutils.Table HTML output, which helps with styling and other functionality (e.g., jQuery datatables).
    • โž• Add [dictutils.subdict()][dictutils.subdict] to get a filtered version of a dictionary based on a subset of keys. ([#150][i150])
    • โž• Add beta version of cacheutils.MinIDMap.
  • v17.2.0 Changes

    February 11, 2019

    (December 16, 2017)

    ๐Ÿ›  A big release with a lot of features and bugfixes, big and small. Just in time for the holidays!

    • ๐Ÿ‘ Better handling of file and file-like objects in [remap][iterutils.remap]'s default_enter
    • ๐Ÿ›  Fix line-by-line iteration in [ioutils][ioutils] types
    • ๐Ÿ”„ Change [strutils.slugify][strutils.slugify] to always output at least a single-character slug (in cases of all-punctuation/whitespace inputs).
    • ๐Ÿ›  Fix [DeferredValue][formatutils.DeferredValue] caching in [formatutils][formatutils]
    • โž• Add [OneToOne][dictutils.OneToOne] to [dictutils][dictutils]
    • โž• Add [MultiFileReader][ioutils.MultiFileReader] to [ioutils][ioutils] (see [#135][i135])
    • ๐Ÿ‘Œ Support passing dir argument to [ioutils][ioutils] SpooledIO types
    • ๐Ÿ›  fix default arguments for [mathutils.clamp][mathutils.clamp] (see [#128][i128])
    • โž• Add [iterutils.research][iterutils.research], a [remap][iterutils.remap]-based recursive search function for nested data
    • Improved and expanded [urlutils.SCHEME_PORT_MAP][urlutils.SCHEME_PORT_MAP]
    • Simplify [urlutils.find_all_links][urlutils.find_all_links] signature
  • v17.1.0 Changes

    February 11, 2019

    (February 27, 2017)

    Add urlutils module, with URL type and find_all_links function. also
    โšก๏ธ update Sentinel for Python 3 falsiness

    • โž• Add urlutils module, complete with RFC3986-compliant URL type
    • Also add urlutils.find_all_links function, which heuristically
      finds all links in plaintext, and creates URLs out of them.
    • โšก๏ธ Update typeutils.Sentinel to be appropriately falsy on Python 3
  • v17.0.0 Changes

    January 25, 2017

    (January 24, 2017)

    Several tweaks and enhancements to ring in the new year.

    • [tbutils][tbutils] objects like the [ExceptionInfo][tbutils.ExceptionInfo] are now more easily JSON-serializable thanks to a tweak to [Callpoint][tbutils.Callpoint].
    • SpooledIO objects like [ioutils.SpooledBytesIO][ioutils.SpooledBytesIO] are now bool-able.
    • [iterutils.bucketize][iterutils.bucketize] gains the value_transform and key_filter arguments.
    • [cachedproperty][cacheutils.cachedproperty] properly maintains docstring
    • [funcutils.wraps][funcutils.wraps] maintains a reference to the wrapped function with __wrapped__ attribute.
    • A bit of cleanup to be backwards compatible to Python 3.3
  • v16.5.1 Changes

    (November 6, 2016)

    ๐Ÿ›  Mostly bug fixes and various tweaks, optimizations, and ๐Ÿ“š documentation. Also added a bit of functionality in the form of [ioutils][ioutils] and some GUID stuff.

    • โž• Add [ioutils][ioutils] with [SpooledStringIO][ioutils.SpooledStringIO] and [SpooledBytesIO][ioutils.SpooledBytesIO], two in-memory file-like objects, like the stdlib [StringIO][StringIO], except that they automatically spill over to disk when they reach a configurable size.
    • โž• Add [iterutils.GUIDerator][iterutils.GUIDerator] and [iterutils.SequentialGUIDerator][iterutils.SequentialGUIDerator], two methods of getting random iterables.
    • โž• Add [mathutils.clamp][mathutils.clamp], a combined min-max function, like numpy's clip.
    • โšก๏ธ Optimized [iterutils.first][iterutils.first].
    • Enabled spillover kwargs in [funcutils.wraps][funcutils.wraps]
    • ๐Ÿ›  fix for default [remap][iterutils.remap] set support, fixes [#84][i84]
    • โœ… improving and testing exceptions around classmethod and staticmethod for [funcutils.wraps][funcutils.wraps] and [FunctionBuilder][funcutils.FunctionBuilder], fixes [#86][i86] to the degree possible.
  • v16.5.0 Changes

    (July 16, 2016)

    A few minor changes, and medium-sized breaking change to [cacheutils][cacheutils].

    • [cacheutils][cacheutils] caching decorators now take the function/method into account by default. This was done by adding the scoped argument to [@cached][cacheutils.cached] and [@cachedmethod][cacheutils.cachedmethod] (and removing selfish from cachedmethod). also fixed a bug in a cachedmethod test, as well as added docs for scoped and key arguments. all of this to fix [#83][i83].
    • [tableutils.Table][tableutils.Table] cell html can be customized by overriding get_cell_html method.
    • [funcutils.total_ordering][funcutils.total_ordering], a [functools.total_ordering][functools.total_ordering] backport for python 2.6.
    • [funcutils.FunctionBuilder][funcutils.FunctionBuilder] function names are now configurable.
  • v16.4.1 Changes

    (June 14, 2016)

    ๐Ÿš€ This release primarily contains several [statsutils][statsutils] updates.

    • The biggest change was the addition of [Stats.format_histogram][statsutils.Stats.format_histogram] complete with Freedman bin selection and other useful options.
    • โž• Added inter-quartile range (iqr) to [statsutils.Stats][statsutils.Stats]
    • โž• Adding mad (median absolute deviation) to [Stats.describe][statsutils.Stats.describe], since median and std_dev were already there.
  • v16.4.0 Changes

    (June 8, 2016)

    ๐Ÿš€ another significant release, thanks to the addition of funcutils.wraps and funcutils.FunctionBuilder. also iterutils.chunked speedup, and ๐Ÿ“œ tbutils.ParsedException.to_string.

    • [funcutils.wraps][funcutils.wraps]: Just like functools.wraps, but can preserve the function signature as well.
    • [funcutils.FunctionBuilder][funcutils.FunctionBuilder]: The basis for [funcutils.wraps][funcutils.wraps], this full-featured type enables programmatically creating functions, from scratch or from existing functions. Supports all Python 2 and 3 function features.
    • [ecoutils][ecoutils]: Python 2.4 and 2.5 support.
    • [iterutils][iterutils]: optimize [iterutils.chunked_iter][iterutils.chunked_iter] (2-5x faster depending on runtime). [See #79][i79].
    • [tbutils][tbutils]: add the [ParsedException.to_string][tbutils.ParsedException.to_string] method, to convert parsed exceptions back into strings, possibly after manipulation
    • switch FunctionBuilder on Python 2 to be congruent with Python 3 (keywords attribute renamed to varkw, preview users might have to adjust)