I’m writing this blog post to announce that Ubelt 0.8.8 has been released.

If you don’t know, Ubelt is a small library of useful Python utilities. For more details I recommend you check out GitHub or read-the-docs. The last time I publicly promoted a release of Ubelt was for the 0.7.0 release on Reddit nearly 1 year ago. This time I’m pushing the release announcement to my blog.

As far as new functionality goes, there haven’t been too many new functions added (as it should be for a small stable library). The two newcomers are: ub.dict_diff ​, which was conspicuously missing from the other dictionary set operations and ub.paragraph ​, which helps format prose similarly to how ub.codeblock ​ formats code. The rest of the updates between 0.7.0 and 0.8.8 have been for fixing bugs, expanding signatures of existing functions, improving the packaging and publishing process (the latest Ubelt releases are now GPG signed with public key D297D757), and working hard to provide better documentation.

For specifics on what’s changed I recommend looking at the CHANGELOG.

One of the nicest new features about the docs is that I’ve measured how “useful” each function is. This gives a ranked list of function names and the number of times I’ve used them across all of my other projects. I was surprised to see just how frequently I’ve used the repr2 function — an (IMHO superior) alternative to pprint.

Function name Usefulness ubelt.repr2() 1051 ubelt.take() 180 ubelt.dzip() 177 ubelt.odict() 167 ubelt.argval() 130 ubelt.ProgIter() 128 ubelt.flatten() 123 ubelt.NoParam() 103 ubelt.Timerit() 100 ubelt.NiceRepr() 95 ubelt.hzcat() 94 ubelt.argflag() 89 ubelt.iterable() 87 ubelt.cmd() 82 ubelt.codeblock() 82 ubelt.ensuredir() 80 ubelt.map_vals() 76 ubelt.ddict() 73 ubelt.expandpath() 72 ubelt.grabdata() 70 ubelt.compress() 56 ubelt.group_items() 56 ubelt.hash_data() 50 ubelt.color_text() 50 ubelt.delete() 42 ubelt.writeto() 38 ubelt.invert_dict() 37 ubelt.chunks() 36 ubelt.allsame() 36 ubelt.dict_hist() 32 ubelt.Timer() 31 ubelt.indent() 30 ubelt.argsort() 29 ubelt.Cacher() 26 ubelt.identity() 23 ubelt.peek() 23 ubelt.ensure_unicode() 22 ubelt.iter_window() 20 ubelt.map_keys() 19 ubelt.readfrom() 19 ubelt.oset() 18 ubelt.timestamp() 18 ubelt.find_duplicates() 18 ubelt.modname_to_modpath() 16 ubelt.unique() 15 ubelt.memoize_property() 14 ubelt.memoize() 13 ubelt.touch() 12 ubelt.highlight_code() 12 ubelt.find_exe() 10 ubelt.argmax() 10 ubelt.inject_method() 8 ubelt.memoize_method() 8 ubelt.dict_subset() 7 ubelt.augpath() 6 ubelt.import_module_from_path() 6 ubelt.hash_file() 6 ubelt.symlink() 6 ubelt.dict_union() 5 ubelt.split_modpath() 5 ubelt.CaptureStdout() 4 ubelt.dict_diff() 4 ubelt.shrinkuser() 4 ubelt.argmin() 3 ubelt.modpath_to_modname() 3 ubelt.import_module_from_name() 3 ubelt.paragraph() 3 ubelt.CacheStamp() 3 ubelt.AutoDict() 2 ubelt.AutoOrderedDict() 2 ubelt.unique_flags() 2 ubelt.dict_isect() 2 ubelt.find_path() 2 ubelt.download() 1

This blog article is mostly to promote the new release of the library and not to explain it. Again for an high level explanation please see the GitHub README. For details about specific functions, please see read-the-docs. For demos of Ubelt in use check out the Jupyter notebooks.

On a related note, I’ve noticed that development of the library is slowing down. Recently I’m finding that I spend much more time using Ubelt than I do writing it. As far as I can tell the library is feature-complete. Therefore, I’m looking to release a version 1.0.0 by the end of 2020, so be on the lookout for that (and make sure you aren’t using anything in ubelt._util_deprecated , I will likely remove it before the 1.0 release).