{ "info": { "author": "Jon Crall", "author_email": "erotemic@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: Apache Software License", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Utilities" ], "description": "|CircleCI| |Travis| |Appveyor| |Codecov| |Pypi| |Downloads| |ReadTheDocs|\n\n\n.. The large version wont work because github strips rst image rescaling. https://i.imgur.com/AcWVroL.png\n.. image:: https://i.imgur.com/PoYIsWE.png\n :height: 100px\n :align: left\n\n\n.. .. raw:: html\n.. \n\nUbelt is a small library of robust, tested, documented, and simple functions\nthat extend the Python standard library. You've probably written and\nre-written some of the functions in ubelt before (or wrote out the logic\ninline). Next time, try ``pip install ubelt`` instead. \n\n* Goal: provide simple functions that acomplish common tasks not yet addressed by the python standard library.\n\n* Constraints: Must be low-impact pure python; it should be easy to install and use.\n\n* Method: All functions are written with docstrings and doctests to ensure that a baseline level of documentation and testing always exists (even if functions are copy/pasted into other libraries)\n\n* Motto: Good utilities lift all codes. \n\n\nDescription:\n============\n\nUBelt is cross platform and all top-level functions behave similarly on\nWindows, Mac, and Linux (up to some small unavoidable differences).\nAlmost every function in ``ubelt`` was written with a doctest. This\nprovides helpful documentation and example usage as well as helping\nachieve 100% test coverage (sans Python2, Windows, stuff that could not\nbe tested automatically, etc).\n\nSee the (Available Functions) section for detailed information.\n\nRead the docs here: http://ubelt.readthedocs.io/en/latest/\n\n\nCurrent Functionality\n=====================\nUbelt is a currated collection of utilities. \n\nUBelt's functionality is a mixture of the following categories:\n\n- Timing\n- Caching\n- Hashing\n- Command Line / Shell Interaction\n- Cross-Platform Cache, Config, and Data Directories\n- Symlinks\n- Downloading Files\n- Dictionary Histogram\n- Find Duplicates\n- Dictionary Manipulation\n- AutoDict - Autovivification\n- String-based imports\n- Horizontal String Concatenation\n- Standalone modules.\n - `progiter `__ for Loop Progress\n - `timerit `__ for Robust Timing and Benchmarking\n - `ordered-set `__ for ordered set collections\n\n\nInstallation:\n=============\n\nUBelt is written in pure Python and integrated into the python package\nindex. Just pip install it and then import it!\n\nFrom pypi:\n----------\n\n::\n\n pip install ubelt\n\nFrom github:\n------------\n\n::\n\n pip install git+https://github.com/Erotemic/ubelt.git\n\n\nPurpose\n=======\n\nUBelt is a \"utility belt\" of commonly needed utility and helper\nfunctions.\n\n- Reusable code - Many functions in ``ubelt`` are simple to write\n yourself (e.g. ``take``, ``memoize``, ``ensure_unicode``), but even\n re-writing trivial functions takes time better spent on more\n important tasks. Rewriting has its place, but not when you can just\n ``pip install ubelt``!\n\n- Easy access - The entire ``ubelt`` API is exposed at the top level.\n While the functions are defined in submodules, explicit imports make\n easy to access any function. There are also a small number of\n functions (e.g. ``ub.odict``, ``ub.ddict``, ``ub.flatten``, which are\n aliases for ``collections.OrderedDict``, ``collections.DefaultDict``,\n and ``itertools.chain.from_iterable``, respectively) that are\n essentially aliases for functions already in Python's standard\n library. I found myself using these functions so much that I wanted\n easier access to them, thus they are included in ``ubelt``.\n\n- Extra batteries - Python's standard library is \"batteries included\"\n and provides great APIs for a variety of tasks. UBelt both extends\n these batteries and provides simplified interfaces to others.\n\n- Copy paste - It is often not desirable to add extra dependencies to\n code. While I encourage installation and use of this module, I\n realize that option is not always feasible. Most (but not all)\n functions were also written in a way where they can be copy and\n pasted into your packages own utility library without needing to add\n a dependency on ``ubelt``.\n\nHistory:\n========\n\nUBelt is a migration of the most useful parts of\n``utool``\\ (https://github.com/Erotemic/utool) into a standalone module\nwith minimal dependencies.\n\nThe ``utool`` library contains a number of useful utility functions, but\nit also contained non-useful functions, as well as the kitchen sink. A\nnumber of the functions were too specific or not well documented. The\n``ubelt`` packages was created to is to slowly port over the most\nre-usable parts of ``utool`` into a stable package.\n\nThe doctest harness in ``utool`` was ported and rewritten in a new\nmodule called: ```xdoctest`` `__,\nwhich integrates with ``pytest`` as a plugin. All of the doctests in\n``ubelt`` are run using ``xdoctest``.\n\nA small subset of the static-analysis and code introspection tools in\n``xdoctest`` are made visible through ``ubelt``.\n\nAvailable Functions:\n====================\n\nBe sure to checkout the new Jupyter notebook: https://github.com/Erotemic/ubelt/blob/master/docs/notebooks/Ubelt%20Demo.ipynb\n\nFor the following functions, see corresponding doc-strings for more\ndetails.\n\nSome of the more interesting and useful functions and classes\nimplemented are:\n\n.. code:: python\n\n import ubelt as ub\n\n ub.ensuredir\n ub.Timerit # powerful multiline alternative to timeit\n ub.Cacher # configuration based on-disk cachine\n ub.cmd # combines the best of subprocess.Popen and os.system\n ub.hash_data # extremely useful with Cacher to config strings\n ub.repr2\n ub.download \n ub.AutoDict\n ub.modname_to_modpath # (works via static analysis)\n ub.modpath_to_modname # (works via static analysis)\n ub.import_module_from_path # (Unlike importlib, this does not break pytest)\n ub.import_module_from_name # (Unlike importlib, this does not break pytest)\n\nA complete list of available functions can be seen in the\n``ubelt/__init__.py`` file, which was auto-generated by\n``mkinit``\\ (https://github.com/Erotemic/mkinit):\n\n.. code:: python\n\n from ubelt.util_arg import (argflag, argval,)\n from ubelt.util_cache import (CacheStamp, Cacher,)\n from ubelt.util_colors import (color_text, highlight_code,)\n from ubelt.util_const import (NoParam,)\n from ubelt.util_cmd import (cmd,)\n from ubelt.util_dict import (AutoDict, AutoOrderedDict, ddict, dict_diff,\n dict_hist, dict_isect, dict_subset, dict_take,\n dict_union, dzip, find_duplicates, group_items,\n invert_dict, map_keys, map_vals, odict,)\n from ubelt.util_download import (download, grabdata,)\n from ubelt.util_func import (identity, inject_method,)\n from ubelt.util_format import (FormatterExtensions, repr2,)\n from ubelt.util_io import (delete, readfrom, touch, writeto,)\n from ubelt.util_links import (symlink,)\n from ubelt.util_list import (allsame, argmax, argmin, argsort, argunique,\n boolmask, chunks, compress, flatten, iter_window,\n iterable, peek, take, unique, unique_flags,)\n from ubelt.util_hash import (hash_data, hash_file,)\n from ubelt.util_import import (import_module_from_name,\n import_module_from_path, modname_to_modpath,\n modpath_to_modname, split_modpath,)\n from ubelt.util_memoize import (memoize, memoize_method, memoize_property,)\n from ubelt.util_mixins import (NiceRepr,)\n from ubelt.util_path import (TempDir, augpath, compressuser, ensuredir,\n expandpath, truepath, userhome,)\n from ubelt.util_platform import (DARWIN, LINUX, POSIX, WIN32, editfile,\n ensure_app_cache_dir, ensure_app_config_dir,\n ensure_app_data_dir, ensure_app_resource_dir,\n find_exe, find_path, get_app_cache_dir,\n get_app_config_dir, get_app_data_dir,\n get_app_resource_dir, platform_cache_dir,\n platform_config_dir, platform_data_dir,\n platform_resource_dir, startfile,)\n from ubelt.util_str import (codeblock, ensure_unicode, hzcat, indent,\n paragraph,)\n from ubelt.util_stream import (CaptureStdout, CaptureStream, TeeStringIO,)\n from ubelt.util_time import (Timer, Timerit, timestamp,)\n from ubelt.orderedset import (OrderedSet, oset,)\n from ubelt.progiter import (ProgIter,)\n\n\nExamples\n========\n\nHere are some examples of some features inside ``ubelt``\n\n\nTiming\n------\n\nQuickly time a single line.\n\n.. code:: python\n\n >>> import math\n >>> import ubelt as ub\n >>> timer = ub.Timer('Timer demo!', verbose=1)\n >>> with timer:\n >>> math.factorial(100000)\n tic('Timer demo!')\n ...toc('Timer demo!')=0.1453s\n\n\nRobust Timing and Benchmarking\n------------------------------\n\nEasily do robust timings on existing blocks of code by simply indenting\nthem. There is no need to refactor into a string representation or\nconvert to a single line. With ``ub.Timerit`` there is no need to resort\nto the ``timeit`` module!\n\nThe quick and dirty way just requires one indent.\n\n.. code:: python\n\n >>> import math\n >>> import ubelt as ub\n >>> for _ in ub.Timerit(num=200, verbose=3):\n >>> math.factorial(10000)\n Timing for 200 loops\n Timed for: 200 loops, best of 3\n time per loop: best=2.055 ms, mean=2.145 \u00b1 0.083 ms\n\nUse the loop variable as a context manager for more accurate timings or\nto incorporate an setup phase that is not timed. You can also access\nproperties of the ``ub.Timerit`` class to programmatically use results.\n\n.. code:: python\n\n >>> import math\n >>> import ubelt as ub\n >>> t1 = ub.Timerit(num=200, verbose=2)\n >>> for timer in t1:\n >>> setup_vars = 10000\n >>> with timer:\n >>> math.factorial(setup_vars)\n >>> print('t1.total_time = %r' % (t1.total_time,))\n Timing for 200 loops\n Timed for: 200 loops, best of 3\n time per loop: best=2.064 ms, mean=2.115 \u00b1 0.05 ms\n t1.total_time = 0.4427177629695507\n\n\nLoop Progress\n-------------\n\n``ProgIter`` is a (mostly) drop-in alternative to\n```tqdm`` `__. \n*The advantage of ``ProgIter`` is that it does not use any python threading*,\nand therefore can be safer with code that makes heavy use of multiprocessing.\n\nNote: ProgIter is now a standalone module: ``pip intstall progiter``)\n\n.. code:: python\n\n >>> import ubelt as ub\n >>> def is_prime(n):\n ... return n >= 2 and not any(n % i == 0 for i in range(2, n))\n >>> for n in ub.ProgIter(range(1000), verbose=2):\n >>> # do some work\n >>> is_prime(n)\n 0/1000... rate=0.00 Hz, eta=?, total=0:00:00, wall=14:05 EST \n 1/1000... rate=82241.25 Hz, eta=0:00:00, total=0:00:00, wall=14:05 EST \n 257/1000... rate=177204.69 Hz, eta=0:00:00, total=0:00:00, wall=14:05 EST \n 642/1000... rate=94099.22 Hz, eta=0:00:00, total=0:00:00, wall=14:05 EST \n 1000/1000... rate=71886.74 Hz, eta=0:00:00, total=0:00:00, wall=14:05 EST \n\n\nCaching\n-------\n\nCache intermediate results in a script with minimal boilerplate.\n\n.. code:: python\n\n >>> import ubelt as ub\n >>> cfgstr = 'repr-of-params-that-uniquely-determine-the-process'\n >>> cacher = ub.Cacher('test_process', cfgstr)\n >>> data = cacher.tryload()\n >>> if data is None:\n >>> myvar1 = 'result of expensive process'\n >>> myvar2 = 'another result'\n >>> data = myvar1, myvar2\n >>> cacher.save(data)\n >>> myvar1, myvar2 = data\n\nHashing\n-------\n\nThe ``ub.hash_data`` constructs a hash corresponding to a (mostly)\narbitrary ordered python object. A common use case for this function is\nto construct the ``cfgstr`` mentioned in the example for ``ub.Cacher``.\nInstead of returning a hex, string, ``ub.hash_data`` encodes the hash\ndigest using the 26 lowercase letters in the roman alphabet. This makes\nthe result easy to use as a filename suffix.\n\n.. code:: python\n\n >>> import ubelt as ub\n >>> data = [('arg1', 5), ('lr', .01), ('augmenters', ['flip', 'translate'])]\n >>> ub.hash_data(data)[0:8]\n 5f5fda5e\n\nThere exists an undocumented plugin architecture to extend this function\nto arbitrary types. See ``ubelt/util_hash.py`` for details.\n\nCommand Line Interaction\n------------------------\n\nThe builtin Python ``subprocess.Popen`` module is great, but it can be a\nbit clunky at times. The ``os.system`` command is easy to use, but it\ndoesn't have much flexibility. The ``ub.cmd`` function aims to fix this.\nIt is as simple to run as ``os.system``, but it returns a dictionary\ncontaining the return code, standard out, standard error, and the\n``Popen`` object used under the hood.\n\n.. code:: python\n\n >>> import ubelt as ub\n >>> info = ub.cmd('gcc --version')\n >>> print(ub.repr2(info))\n {\n 'command': 'gcc --version',\n 'err': '',\n 'out': 'gcc (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609\\nCopyright (C) 2015 Free Software Foundation, Inc.\\nThis is free software; see the source for copying conditions. There is NO\\nwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\\n\\n',\n 'proc': ,\n 'ret': 0,\n }\n\nAlso note the use of ``ub.repr2`` to nicely format the output\ndictionary.\n\nAdditionally, if you specify ``verbout=True``, ``ub.cmd`` will\nsimultaneously capture the standard output and display it in real time.\n\n.. code:: python\n\n >>> import ubelt as ub\n >>> info = ub.cmd('gcc --version', verbout=True)\n gcc (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609\n Copyright (C) 2015 Free Software Foundation, Inc.\n This is free software; see the source for copying conditions. There is NO\n warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\nA common use case for ``ub.cmd`` is parsing version numbers of programs\n\n.. code:: python\n\n >>> import ubelt as ub\n >>> cmake_version = ub.cmd('cmake --version')['out'].splitlines()[0].split()[-1]\n >>> print('cmake_version = {!r}'.format(cmake_version))\n cmake_version = 3.11.0-rc2\n\nThis allows you to easily run a command line executable as part of a\npython process, see what it is doing, and then do something based on its\noutput, just as you would if you were interacting with the command line\nitself.\n\nLastly, ``ub.cmd`` removes the need to think about if you need to pass a\nlist of args, or a string. Both will work. This utility has been tested\non both Windows and Linux.\n\nCross-Platform Resource and Cache Directories\n---------------------------------------------\n\nIf you have an application which writes configuration or cache files,\nthe standard place to dump those files differs depending if you are on\nWindows, Linux, or Mac. UBelt offers a unified functions for determining\nwhat these paths are.\n\nThe ``ub.ensure_app_cache_dir`` and ``ub.ensure_app_resource_dir``\nfunctions find the correct platform-specific location for these files\nand ensures that the directories exist. (Note: replacing \"ensure\" with\n\"get\" will simply return the path, but not ensure that it exists)\n\nThe resource root directory is ``~/AppData/Roaming`` on Windows,\n``~/.config`` on Linux and ``~/Library/Application Support`` on Mac. The\ncache root directory is ``~/AppData/Local`` on Windows, ``~/.config`` on\nLinux and ``~/Library/Caches`` on Mac.\n\nExample usage on Linux might look like this:\n\n.. code:: python\n\n >>> import ubelt as ub\n >>> print(ub.compressuser(ub.ensure_app_cache_dir('my_app')))\n ~/.cache/my_app\n >>> print(ub.compressuser(ub.ensure_app_resource_dir('my_app')))\n ~/.config/my_app\n\nSymlinks\n--------\n\nThe ``ub.symlink`` function will create a symlink similar to\n``os.symlink``. The main differences are that 1) it will not error if\nthe symlink exists and already points to the correct location. 2) it\nworks\\* on Windows (\\*hard links and junctions are used if real symlinks\nare not available)\n\n.. code:: python\n\n >>> import ubelt as ub\n >>> dpath = ub.ensure_app_cache_dir('ubelt', 'demo_symlink')\n >>> real_path = join(dpath, 'real_file.txt')\n >>> link_path = join(dpath, 'link_file.txt')\n >>> ub.writeto(real_path, 'foo')\n >>> ub.symlink(real_path, link_path)\n\nDownloading Files\n-----------------\n\nThe function ``ub.download`` provides a simple interface to download a\nURL and save its data to a file.\n\n.. code:: python\n\n >>> import ubelt as ub\n >>> url = 'http://i.imgur.com/rqwaDag.png'\n >>> fpath = ub.download(url, verbose=0)\n >>> print(ub.compressuser(fpath))\n ~/.cache/ubelt/rqwaDag.png\n\nThe function ``ub.grabdata`` works similarly to ``ub.download``, but\nwhereas ``ub.download`` will always re-download the file,\n``ub.grabdata`` will check if the file exists and only re-download it if\nit needs to.\n\n.. code:: python\n\n >>> import ubelt as ub\n >>> url = 'http://i.imgur.com/rqwaDag.png'\n >>> fpath = ub.grabdata(url, verbose=0, hash_prefix='944389a39')\n >>> print(ub.compressuser(fpath))\n ~/.cache/ubelt/rqwaDag.png\n\n\nNew in version 0.4.0: both functions now accepts the ``hash_prefix`` keyword\nargument, which if specified will check that the hash of the file matches the\nprovided value. The ``hasher`` keyword argument can be used to change which\nhashing algorithm is used (it defaults to ``\"sha512\"``).\n\nGrouping\n--------\n\nGroup items in a sequence into a dictionary by a second id list\n\n.. code:: python\n\n >>> import ubelt as ub\n >>> item_list = ['ham', 'jam', 'spam', 'eggs', 'cheese', 'bannana']\n >>> groupid_list = ['protein', 'fruit', 'protein', 'protein', 'dairy', 'fruit']\n >>> ub.group_items(item_list, groupid_list)\n {'dairy': ['cheese'], 'fruit': ['jam', 'bannana'], 'protein': ['ham', 'spam', 'eggs']}\n\nDictionary Histogram\n--------------------\n\nFind the frequency of items in a sequence\n\n.. code:: python\n\n >>> import ubelt as ub\n >>> item_list = [1, 2, 39, 900, 1232, 900, 1232, 2, 2, 2, 900]\n >>> ub.dict_hist(item_list)\n {1232: 2, 1: 1, 2: 4, 900: 3, 39: 1}\n\nFind Duplicates\n---------------\n\nFind all duplicate items in a list. More specifically,\n``ub.find_duplicates`` searches for items that appear more than ``k``\ntimes, and returns a mapping from each duplicate item to the positions\nit appeared in.\n\n.. code:: python\n\n >>> import ubelt as ub\n >>> items = [0, 0, 1, 2, 3, 3, 0, 12, 2, 9]\n >>> ub.find_duplicates(items, k=2)\n {0: [0, 1, 6], 2: [3, 8], 3: [4, 5]}\n\nDictionary Manipulation\n-----------------------\n\nTake a subset of a dictionary.\n\n.. code:: python\n\n >>> import ubelt as ub\n >>> dict_ = {'K': 3, 'dcvs_clip_max': 0.2, 'p': 0.1}\n >>> subdict_ = ub.dict_subset(dict_, ['K', 'dcvs_clip_max'])\n >>> print(subdict_)\n {'K': 3, 'dcvs_clip_max': 0.2}\n\nTake only the values, optionally specify a default value.\n\n.. code:: python\n\n >>> import ubelt as ub\n >>> dict_ = {1: 'a', 2: 'b', 3: 'c'}\n >>> print(list(ub.dict_take(dict_, [1, 2, 3, 4, 5], default=None)))\n ['a', 'b', 'c', None, None]\n\nApply a function to each value in the dictionary (see also\n``ub.map_keys``).\n\n.. code:: python\n\n >>> import ubelt as ub\n >>> dict_ = {'a': [1, 2, 3], 'b': []}\n >>> newdict = ub.map_vals(len, dict_)\n >>> print(newdict)\n {'a': 3, 'b': 0}\n\nInvert the mapping defined by a dictionary. By default ``invert_dict``\nassumes that all dictionary values are distinct (i.e. the mapping is\none-to-one / injective).\n\n.. code:: python\n\n >>> import ubelt as ub\n >>> mapping = {0: 'a', 1: 'b', 2: 'c', 3: 'd'}\n >>> ub.invert_dict(mapping)\n {'a': 0, 'b': 1, 'c': 2, 'd': 3}\n\nHowever, by specifying ``unique_vals=False`` the inverted dictionary\nbuilds a set of keys that were associated with each value.\n\n.. code:: python\n\n >>> import ubelt as ub\n >>> mapping = {'a': 0, 'A': 0, 'b': 1, 'c': 2, 'C': 2, 'd': 3}\n >>> ub.invert_dict(mapping, unique_vals=False)\n {0: {'A', 'a'}, 1: {'b'}, 2: {'C', 'c'}, 3: {'d'}}\n\nAutoDict - Autovivification\n---------------------------\n\nWhile the ``collections.defaultdict`` is nice, it is sometimes more\nconvenient to have an infinitely nested dictionary of dictionaries.\n\n.. code:: python\n\n >>> import ubelt as ub\n >>> auto = ub.AutoDict()\n >>> print('auto = {!r}'.format(auto))\n auto = {}\n >>> auto[0][10][100] = None\n >>> print('auto = {!r}'.format(auto))\n auto = {0: {10: {100: None}}}\n >>> auto[0][1] = 'hello'\n >>> print('auto = {!r}'.format(auto))\n auto = {0: {1: 'hello', 10: {100: None}}}\n\nString-based imports\n--------------------\n\nUbelt contains functions to import modules dynamically without using the\npython ``import`` statement. While ``importlib`` exists, the ``ubelt``\nimplementation is simpler to user and does not have the disadvantage of\nbreaking ``pytest``.\n\nNote ``ubelt`` simply provides an interface to this functionality, the\ncore implementation is in ``xdoctest`` (over as of version ``0.7.0``, \nthe code is statically copied into an autogenerated file such that ``ubelt``\ndoes not actually depend on ``xdoctest`` during runtime).\n\n.. code:: python\n\n >>> import ubelt as ub\n >>> module = ub.import_module_from_path(ub.truepath('~/code/ubelt/ubelt'))\n >>> print('module = {!r}'.format(module))\n module = \n >>> module = ub.import_module_from_name('ubelt')\n >>> print('module = {!r}'.format(module))\n module = \n\nRelated to this functionality are the functions\n``ub.modpath_to_modname`` and ``ub.modname_to_modpath``, which\n*statically* transform (i.e. no code in the target modules is imported\nor executed) between module names (e.g. ``ubelt.util_import``) and\nmodule paths (e.g.\n``~/.local/conda/envs/cenv3/lib/python3.5/site-packages/ubelt/util_import.py``).\n\n.. code:: python\n\n >>> import ubelt as ub\n >>> modpath = ub.util_import.__file__\n >>> print(ub.modpath_to_modname(modpath))\n ubelt.util_import\n >>> modname = ub.util_import.__name__\n >>> assert ub.truepath(ub.modname_to_modpath(modname)) == modpath\n\nHorizontal String Concatenation\n-------------------------------\n\nSometimes its just prettier to horizontally concatenate two blocks of\ntext.\n\n.. code:: python\n\n >>> import ubelt as ub\n >>> B = ub.repr2([[1, 2], [3, 4]], nl=1, cbr=True, trailsep=False)\n >>> C = ub.repr2([[5, 6], [7, 8]], nl=1, cbr=True, trailsep=False)\n >>> print(ub.hzcat(['A = ', B, ' * ', C]))\n A = [[1, 2], * [[5, 6],\n [3, 4]] [7, 8]]\n\nStandalone tools.\n-----------------\n\nSome of the tools in ``ubelt`` have been / are being ported to\nstandalone modules. These tools will remain exposed in ``ubelt``, so you\nhave all the extra batteries at your disposal, but they will eventually\njust be added as simple dependencies and the source code will be removed\nfrom ``ubelt``.\n\nHere are the repos containing the standalone class utilities:\n\n- ProgIter - https://github.com/Erotemic/progiter\n- Timerit - https://github.com/Erotemic/timerit\n- OrderedSet - https://github.com/LuminosoInsight/ordered-set\n\n\nNotes.\n-----------------\nUbelt will support Python2 for the forseeable future (at least until everyone I\nwork with is off it followed by a probation period).\n\nPRs are welcome. If you have a utility function that you think is useful then\nwrite a PR. I'm likely to respond promptly.\n\nAlso check out my other projects (many of which are powered by ubelt):\n\n- ProgIter https://github.com/Erotemic/netharn\n- Timerit - https://github.com/Erotemic/timerit\n- mkinit https://github.com/Erotemic/mkinit\n- xdoctest https://github.com/Erotemic/xdoctest\n- xinspect https://github.com/Erotemic/xinspect\n- xdev https://github.com/Erotemic/xdev\n- vimtk https://github.com/Erotemic/vimtk\n- futures_actors https://github.com/Erotemic/futures_actors\n- ibeis https://github.com/Erotemic/ibeis\n- graphid https://github.com/Erotemic/graphid\n\n\n.. |CircleCI| image:: https://circleci.com/gh/Erotemic/ubelt.svg?style=svg\n :target: https://circleci.com/gh/Erotemic/ubelt\n.. |Travis| image:: https://img.shields.io/travis/Erotemic/ubelt/master.svg?label=Travis%20CI\n :target: https://travis-ci.org/Erotemic/ubelt?branch=master\n.. |Appveyor| image:: https://ci.appveyor.com/api/projects/status/github/Erotemic/ubelt?branch=master&svg=True\n :target: https://ci.appveyor.com/project/Erotemic/ubelt/branch/master\n.. |Codecov| image:: https://codecov.io/github/Erotemic/ubelt/badge.svg?branch=master&service=github\n :target: https://codecov.io/github/Erotemic/ubelt?branch=master\n.. |Pypi| image:: https://img.shields.io/pypi/v/ubelt.svg\n :target: https://pypi.python.org/pypi/ubelt\n.. |Downloads| image:: https://img.shields.io/pypi/dm/ubelt.svg\n :target: https://pypistats.org/packages/ubelt\n.. |ReadTheDocs| image:: https://readthedocs.org/projects/ubelt/badge/?version=latest\n :target: http://ubelt.readthedocs.io/en/latest/\n\n\n", "description_content_type": "text/x-rst", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/Erotemic/ubelt", "keywords": "", "license": "Apache 2", "maintainer": "", "maintainer_email": "", "name": "ubelt", "package_url": "https://pypi.org/project/ubelt/", "platform": "", "project_url": "https://pypi.org/project/ubelt/", "project_urls": { "Homepage": "https://github.com/Erotemic/ubelt" }, "release_url": "https://pypi.org/project/ubelt/0.8.2/", "requires_dist": [ "six", "ordered-set", "progiter", "timerit", "jaraco.windows ; platform_system == \"Windows\"", "six ; extra == 'all'", "ordered-set ; extra == 'all'", "progiter ; extra == 'all'", "timerit ; extra == 'all'", "numpy ; extra == 'all'", "xxhash ; extra == 'all'", "Pygments ; extra == 'all'", "xdoctest ; extra == 'all'", "pytest ; extra == 'all'", "pytest-cov ; extra == 'all'", "coverage ; extra == 'all'", "jaraco.windows ; (platform_system == \"Windows\") and extra == 'all'", "numpy ; extra == 'optional'", "xxhash ; extra == 'optional'", "Pygments ; extra == 'optional'", "xdoctest ; extra == 'tests'", "pytest ; extra == 'tests'", "pytest-cov ; extra == 'tests'", "coverage ; extra == 'tests'" ], "requires_python": "", "summary": "A Python utility belt containing simple tools, a stdlib like feel, and extra batteries.", "version": "0.8.2" }, "last_serial": 5519954, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "c5aa0655479700e9818f1dba49e40ea0", "sha256": "3fcdeb5ed1676da7994d1f393082514dad3d6ce5bad0d1ad2f50703ee6e4e7c5" }, "downloads": -1, "filename": "ubelt-0.0.1.tar.gz", "has_sig": false, "md5_digest": "c5aa0655479700e9818f1dba49e40ea0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4725, "upload_time": "2017-02-01T15:12:20", "url": "https://files.pythonhosted.org/packages/44/c9/7ba359ad7fca59da27412630c4808a921911bfe7f16c810d8b0a32771708/ubelt-0.0.1.tar.gz" } ], "0.0.11": [ { "comment_text": "", "digests": { "md5": "0eb074810c989c4fae43610960684a2c", "sha256": "192e2bf2ecce0be4b3b29155d884fb48db7ab08d73059b3c809738781194be26" }, "downloads": -1, "filename": "ubelt-0.0.11.tar.gz", "has_sig": false, "md5_digest": "0eb074810c989c4fae43610960684a2c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6358, "upload_time": "2017-02-01T16:15:20", "url": "https://files.pythonhosted.org/packages/bf/1a/120d98231bf083e2155e3b55270e2cbe4fc8f49ad0d23221b94dd4475603/ubelt-0.0.11.tar.gz" } ], "0.0.16": [ { "comment_text": "", "digests": { "md5": "29657b502bb22be0b1a789b93074bafe", "sha256": "9c1dfe271a525624e5b7b7206453bff8b316481fab1c3c58d7f2bf8ff6402a09" }, "downloads": -1, "filename": "ubelt-0.0.16.tar.gz", "has_sig": false, "md5_digest": "29657b502bb22be0b1a789b93074bafe", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22880, "upload_time": "2017-04-05T22:03:00", "url": "https://files.pythonhosted.org/packages/92/cd/51a0abefd9934bd9eb3e3ff18a833db8de74c108371152b5f8e51e5388fb/ubelt-0.0.16.tar.gz" } ], "0.0.17": [ { "comment_text": "", "digests": { "md5": "fc86edfb5e0d61d6043af5d98acbe174", "sha256": "79bba0d0e134624d0affd55260b3df1ce78147a79561f44b2450b50e3cc32f25" }, "downloads": -1, "filename": "ubelt-0.0.17.tar.gz", "has_sig": false, "md5_digest": "fc86edfb5e0d61d6043af5d98acbe174", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31565, "upload_time": "2017-04-05T22:08:49", "url": "https://files.pythonhosted.org/packages/6b/16/f2ddec7ebdc2e3f93b927fad06826ced9304f4bcdd55adaf89dd962fafb6/ubelt-0.0.17.tar.gz" } ], "0.0.22": [ { "comment_text": "", "digests": { "md5": "3758e2bfa538972134724b3b23999f1d", "sha256": "a657c2628991bbc3ed45bbee285bf5393e6ce569bc8d15c097f6d7eb8cf08975" }, "downloads": -1, "filename": "ubelt-0.0.22.tar.gz", "has_sig": false, "md5_digest": "3758e2bfa538972134724b3b23999f1d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 37143, "upload_time": "2017-07-02T20:07:48", "url": "https://files.pythonhosted.org/packages/e9/ea/f34171a2e8e8fae3ba8aeb434c3769a36904e466b4e46c3b1febf9971490/ubelt-0.0.22.tar.gz" } ], "0.0.25": [ { "comment_text": "", "digests": { "md5": "ce36ac48fa34a04bec9645465644646d", "sha256": "eaed089bb7f12a844e722fedb8839303800fa047abb6d669ab5d59e0e99443ab" }, "downloads": -1, "filename": "ubelt-0.0.25-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "ce36ac48fa34a04bec9645465644646d", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 44035, "upload_time": "2017-07-02T21:02:27", "url": "https://files.pythonhosted.org/packages/58/cd/a828e6543c01716a81c1f0b261d0d449ea8c24b2a73fb9d74c0ae8070931/ubelt-0.0.25-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e72ec5ec05c35ae23c2a04788141421b", "sha256": "e66286a39a5396e97fc9a3cd77f455b20223dabbf1e3080e2c6b3ca30599d726" }, "downloads": -1, "filename": "ubelt-0.0.25-py3-none-any.whl", "has_sig": false, "md5_digest": "e72ec5ec05c35ae23c2a04788141421b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 44030, "upload_time": "2017-07-02T21:02:28", "url": "https://files.pythonhosted.org/packages/86/0d/317be3723ce7fba488bfb3618260f1f20a3dfbaef5db5666a432b0b6922f/ubelt-0.0.25-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "af73bd73699190ba4c9558409272bf69", "sha256": "0ec45fb145eec46a1ce65c4bc0192e5611102ad2c5afa48cbd5d7f50c7872e05" }, "downloads": -1, "filename": "ubelt-0.0.25.tar.gz", "has_sig": false, "md5_digest": "af73bd73699190ba4c9558409272bf69", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35161, "upload_time": "2017-07-02T20:53:40", "url": "https://files.pythonhosted.org/packages/26/0d/0b6bac0553da6766d4ece7509789eb8b2fcb3047e2dc5a9d168c2a752a8a/ubelt-0.0.25.tar.gz" } ], "0.0.26": [ { "comment_text": "", "digests": { "md5": "f3d7dbb1798dd0ed7f07cf1c65b2d099", "sha256": "fd7b352bdff055fa3c2cd9dd33b4ff49e118c091afce42e97fdf26cb90f1740b" }, "downloads": -1, "filename": "ubelt-0.0.26-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f3d7dbb1798dd0ed7f07cf1c65b2d099", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 48807, "upload_time": "2017-07-02T21:15:44", "url": "https://files.pythonhosted.org/packages/62/7e/2ab2c5113b8ba1d711a90c0c5a543698875485d722261d2c22fab7399784/ubelt-0.0.26-py2.py3-none-any.whl" } ], "0.0.27": [ { "comment_text": "", "digests": { "md5": "6c3e6d2afd202f4848db82b2d42d2980", "sha256": "ddad93c566def2a95dddd712a52f8c9eb80b1f1018874c7a9d6a3b9d90c37a58" }, "downloads": -1, "filename": "ubelt-0.0.27-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "6c3e6d2afd202f4848db82b2d42d2980", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 44730, "upload_time": "2017-07-02T21:19:21", "url": "https://files.pythonhosted.org/packages/f3/62/c51f311fa6719fd7db6d2d490e1f20098217a4baf1aef8bab7d66ea2c31f/ubelt-0.0.27-py2.py3-none-any.whl" } ], "0.0.28": [ { "comment_text": "", "digests": { "md5": "b822899ca990338c3adf04260a3e1a5d", "sha256": "b999a45e7646795594e3d1bd77fc429a81fa4ceab9952d26ceb4e209b36512c4" }, "downloads": -1, "filename": "ubelt-0.0.28-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "b822899ca990338c3adf04260a3e1a5d", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 45336, "upload_time": "2017-07-05T18:21:23", "url": "https://files.pythonhosted.org/packages/c9/84/556c62aa0d22f4fd0a6ac6b0bcf5e42c77ac126b4e5b802eb93f3d9c6047/ubelt-0.0.28-py2.py3-none-any.whl" } ], "0.0.30": [ { "comment_text": "", "digests": { "md5": "d456508242bef5af978ba0dffbe394b5", "sha256": "abc85b0ed3acecf4efc02844fc3279e502f8f326054ffd058bb1b8a62c0af8ac" }, "downloads": -1, "filename": "ubelt-0.0.30-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d456508242bef5af978ba0dffbe394b5", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 48646, "upload_time": "2017-08-21T22:45:37", "url": "https://files.pythonhosted.org/packages/8b/7e/fd980f8c9e63a7319c1752a91412df0a11cfa2e077e7edc17547d4f64b4e/ubelt-0.0.30-py2.py3-none-any.whl" } ], "0.0.31": [ { "comment_text": "", "digests": { "md5": "530646c41ba529c9001d964eb19ff798", "sha256": "115cc64520293803b024222dc2b0ee887aa8c6b169c58e3f31fdcaddda8eb9a6" }, "downloads": -1, "filename": "ubelt-0.0.31-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "530646c41ba529c9001d964eb19ff798", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 40584, "upload_time": "2017-09-04T21:40:45", "url": "https://files.pythonhosted.org/packages/84/e0/cd7be73505ac1362f0c9eeb9acee3508349a595f65a5345238262312fe49/ubelt-0.0.31-py2.py3-none-any.whl" } ], "0.0.32": [ { "comment_text": "", "digests": { "md5": "f2498882d097982eedcdb708b098e190", "sha256": "89d248a12c62d0892f1b2f9b1169b14777295e6415b677c56ea869e9d02650a6" }, "downloads": -1, "filename": "ubelt-0.0.32-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f2498882d097982eedcdb708b098e190", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 40582, "upload_time": "2017-09-04T21:40:46", "url": "https://files.pythonhosted.org/packages/07/9f/1a489bf28a532dd380996cce1aabbd6108e0b7516e4c3035821843ea0a5b/ubelt-0.0.32-py2.py3-none-any.whl" } ], "0.0.33": [ { "comment_text": "", "digests": { "md5": "326eeedb9921bd424288534abca9c198", "sha256": "24d125fd8beb9f4771e58728feb833cf2b6a904ae93699f17264916b8904887d" }, "downloads": -1, "filename": "ubelt-0.0.33-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "326eeedb9921bd424288534abca9c198", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 58158, "upload_time": "2017-09-13T22:32:48", "url": "https://files.pythonhosted.org/packages/db/d1/df9eec41c53f731ed3da273da611950d760d05c446e8d9b74190fd65a18d/ubelt-0.0.33-py2.py3-none-any.whl" } ], "0.0.34": [ { "comment_text": "", "digests": { "md5": "d9b50a582ec0e8da0d287341d905da24", "sha256": "64758cda532170824769c9c7e20708b455201c05c0cce2aaf0ddd582993e94f3" }, "downloads": -1, "filename": "ubelt-0.0.34-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d9b50a582ec0e8da0d287341d905da24", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 61731, "upload_time": "2017-11-11T22:47:30", "url": "https://files.pythonhosted.org/packages/bb/b2/b7b233b1d4a7e1fea429706484ec9d2ebce401a0adec4aa08b3fae99048a/ubelt-0.0.34-py2.py3-none-any.whl" } ], "0.0.35": [ { "comment_text": "", "digests": { "md5": "d0d87e9c03a33140010c0320eea9dae7", "sha256": "0c2f2311cffc94d0795485cf4b64a2f2c0acd94d4d51987d58de5094b7a2ed10" }, "downloads": -1, "filename": "ubelt-0.0.35-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d0d87e9c03a33140010c0320eea9dae7", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 125690, "upload_time": "2017-12-12T22:24:22", "url": "https://files.pythonhosted.org/packages/a1/1c/b1ad8fa68deba04d2dd1379ebc23e03409254b593888cbd0c8af7823e38c/ubelt-0.0.35-py2.py3-none-any.whl" } ], "0.0.36": [ { "comment_text": "", "digests": { "md5": "f6cfa874395370a009bce2eb07477814", "sha256": "5990c3816476109a9bf2730713fc203072dd69d7a3386bb17238be3480ad6bf3" }, "downloads": -1, "filename": "ubelt-0.0.36-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f6cfa874395370a009bce2eb07477814", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 126183, "upload_time": "2017-12-20T23:13:37", "url": "https://files.pythonhosted.org/packages/e8/27/76c4147e7c7f97cc05ae419de901db6f39a02a30e3f2af08e8fcd6259100/ubelt-0.0.36-py2.py3-none-any.whl" } ], "0.0.38": [ { "comment_text": "", "digests": { "md5": "f2e42e69208111c97654d7da56a0be4d", "sha256": "3f166fe6757841d65509c1cae6461ea77edf05e8b7e7d487eed0de44078f2a95" }, "downloads": -1, "filename": "ubelt-0.0.38-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f2e42e69208111c97654d7da56a0be4d", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 68649, "upload_time": "2017-12-31T20:20:37", "url": "https://files.pythonhosted.org/packages/27/f4/7696ba9114627b7e3c544badaee252e9afdbd76590d941bc23ed559ee27c/ubelt-0.0.38-py2.py3-none-any.whl" } ], "0.0.39": [ { "comment_text": "", "digests": { "md5": "d71a6ba96f3a454bec10548873d31da1", "sha256": "486d3d8830ce23f4eaa703aca3623cb12e1aad625d5293c039b790802684a71a" }, "downloads": -1, "filename": "ubelt-0.0.39-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d71a6ba96f3a454bec10548873d31da1", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 137993, "upload_time": "2018-01-18T22:05:09", "url": "https://files.pythonhosted.org/packages/2c/bc/330ddc671fbbf9329a39154af20cc6e510e64b231613a029e95e3e5eada7/ubelt-0.0.39-py2.py3-none-any.whl" } ], "0.0.40": [ { "comment_text": "", "digests": { "md5": "e58df95a62ac7618b4387d3cd417b7ab", "sha256": "00ccfbbffe640568b12b567d1fd16b6b32142b3d1e4f825cf0dd82687febb4a9" }, "downloads": -1, "filename": "ubelt-0.0.40-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "e58df95a62ac7618b4387d3cd417b7ab", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 72765, "upload_time": "2018-02-05T03:25:36", "url": "https://files.pythonhosted.org/packages/18/c3/f593bd71e2a24729d4e1851197be5875a6d0934e638793eb119bd91a3201/ubelt-0.0.40-py2.py3-none-any.whl" } ], "0.0.42": [ { "comment_text": "", "digests": { "md5": "15bdc29454d4d59f57e8b94a336cd2f1", "sha256": "d850cd7f1aa2557688a352659e50488cf2c859e0b514948dc2492aae1ec55999" }, "downloads": -1, "filename": "ubelt-0.0.42-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "15bdc29454d4d59f57e8b94a336cd2f1", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 150414, "upload_time": "2018-02-26T20:05:21", "url": "https://files.pythonhosted.org/packages/8c/22/632dc8ad520242e594e2f90295fdf8986b664ac56a165420f9a4a7f46067/ubelt-0.0.42-py2.py3-none-any.whl" } ], "0.0.43": [ { "comment_text": "", "digests": { "md5": "eb8bb4f846728a8312e2cf0019ab0ad6", "sha256": "b2b8e868db616dfd3f6069463ae77f1ec6c84b0d9540bc568aeb1c01dee4571c" }, "downloads": -1, "filename": "ubelt-0.0.43-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "eb8bb4f846728a8312e2cf0019ab0ad6", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 150505, "upload_time": "2018-03-09T15:08:37", "url": "https://files.pythonhosted.org/packages/95/a2/6c6ef95bb86c33988d334064f09c9bc5720d0cc001f9ac72863e9544c6ce/ubelt-0.0.43-py2.py3-none-any.whl" } ], "0.0.44": [ { "comment_text": "", "digests": { "md5": "26443c98edd2a119851281a9ffa6da36", "sha256": "b4cf6de232ac5890f9733392688958e51662120f96adc47439408782bbea92fc" }, "downloads": -1, "filename": "ubelt-0.0.44-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "26443c98edd2a119851281a9ffa6da36", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 84275, "upload_time": "2018-03-12T15:45:20", "url": "https://files.pythonhosted.org/packages/58/1d/00fab1244d9216ce766760cdb8e91dafdb44e686453901f82024168af5c3/ubelt-0.0.44-py2.py3-none-any.whl" } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "166dfec1dff80b35f036145cce4c0e8f", "sha256": "171bc2f6e4064198879ab0997f918ee73f6530093b81d32d179fb643756d1263" }, "downloads": -1, "filename": "ubelt-0.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "166dfec1dff80b35f036145cce4c0e8f", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 155839, "upload_time": "2018-04-02T20:15:00", "url": "https://files.pythonhosted.org/packages/f9/6c/3ea501394518696784ddfedca562e5424ee44cf4b9eaafc1dbc45037ab22/ubelt-0.1.0-py2.py3-none-any.whl" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "041752e2b49d86f6bbb32afeddf08e58", "sha256": "5f451c86d829c8acf67febd57b9db5266e9ed887ebdd6447451a18e885dbfe93" }, "downloads": -1, "filename": "ubelt-0.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "041752e2b49d86f6bbb32afeddf08e58", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 96955, "upload_time": "2018-04-21T02:25:32", "url": "https://files.pythonhosted.org/packages/d8/4c/a9e1950f1867fb0c5e755f7254a7170745a68cae3ea4417a26e4f139c26c/ubelt-0.1.1-py2.py3-none-any.whl" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "155c9e89a12ba8833eb2b7598319fcc4", "sha256": "a241d693c51ad5c6f4cdc5e5b08d93f20c657bc65127cd53e32de11c9be2ea41" }, "downloads": -1, "filename": "ubelt-0.2.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "155c9e89a12ba8833eb2b7598319fcc4", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 89935, "upload_time": "2018-05-05T09:23:02", "url": "https://files.pythonhosted.org/packages/f8/57/650ced1632f9467e3b06207e4cebf48d55a909552b59ffb07db71cc8e18a/ubelt-0.2.0-py2.py3-none-any.whl" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "c74ec5824106e3ae0bce12ed1c99da20", "sha256": "67cce3b8d7c451fe6ef73279bee50fea8dc6ee583d8d3801872ffb45921852b0" }, "downloads": -1, "filename": "ubelt-0.3.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "c74ec5824106e3ae0bce12ed1c99da20", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 76935, "upload_time": "2018-06-12T14:59:45", "url": "https://files.pythonhosted.org/packages/3d/36/b095998aceaccf23a26f0a89f8c534c2767502f093d7a1ac215a115c73ad/ubelt-0.3.0-py2.py3-none-any.whl" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "edb5ddff7fdd00b148604778eb2ebeaa", "sha256": "7bcd7e4c74422dc862ca136e1f423781ba8dc44d5815319f53e0ff41385db4d3" }, "downloads": -1, "filename": "ubelt-0.4.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "edb5ddff7fdd00b148604778eb2ebeaa", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 79441, "upload_time": "2018-07-12T16:17:35", "url": "https://files.pythonhosted.org/packages/d8/fb/a1416684d9b6ba8d7d1da52504bbef3ee58291940205b34b6fe6f1918cf8/ubelt-0.4.0-py2.py3-none-any.whl" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "2a9e577555b1b1a36a9ec66370450925", "sha256": "0d3756e0bd57ce954d4393bec5b726b74be681bb531a4ee448203b40d93d6547" }, "downloads": -1, "filename": "ubelt-0.5.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "2a9e577555b1b1a36a9ec66370450925", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 106417, "upload_time": "2018-07-23T04:08:00", "url": "https://files.pythonhosted.org/packages/94/b0/0a1eae3d01cf4fa27c39c528d77926c8b743c4ac8cae6d0d902c3ba693bc/ubelt-0.5.0-py2.py3-none-any.whl" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "e79d67e2e898f615078cca9d9c7f23c1", "sha256": "c3fa1b0baa87fbb0c720300cef4927246b269b1cf7f13b929b6bda5b97d09cfb" }, "downloads": -1, "filename": "ubelt-0.5.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "e79d67e2e898f615078cca9d9c7f23c1", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 106279, "upload_time": "2018-07-23T04:11:27", "url": "https://files.pythonhosted.org/packages/7c/be/178ef3e51eb69c343667d10a134eb50d69a71aa982f4b13f6c56b897e3cd/ubelt-0.5.1-py2.py3-none-any.whl" } ], "0.5.2": [ { "comment_text": "", "digests": { "md5": "32b79fc847f6a3c2d4b02d4e34846baa", "sha256": "c6f2421deb4e4ecfcf2748deed278eb675a9b6ab5f05af18a7478074fe127074" }, "downloads": -1, "filename": "ubelt-0.5.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "32b79fc847f6a3c2d4b02d4e34846baa", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 107078, "upload_time": "2018-09-05T02:16:08", "url": "https://files.pythonhosted.org/packages/cf/1e/3ebcbc40549ee4927afe280ee1dd66d3e7e34516a8ee6046befeac8eb6fd/ubelt-0.5.2-py2.py3-none-any.whl" } ], "0.5.3": [ { "comment_text": "", "digests": { "md5": "8b8d882f33d059b5ed5d3ac74271c9eb", "sha256": "a5cc3670f4d9ae1c631038b5dcd15bf3ea5df33a95d32bf81e2131307c2f4212" }, "downloads": -1, "filename": "ubelt-0.5.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "8b8d882f33d059b5ed5d3ac74271c9eb", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 170943, "upload_time": "2018-10-24T04:29:11", "url": "https://files.pythonhosted.org/packages/b0/aa/3bb8f1e54506c2edccf0834182d2953dbf2fb9318a76014229235d9a8a23/ubelt-0.5.3-py2.py3-none-any.whl" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "7248a699a9facb73e01e3608b53a4dcd", "sha256": "2310780fdbd07506270306cba6d02934d0b606bf1d780d695251b28d1252432c" }, "downloads": -1, "filename": "ubelt-0.6.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "7248a699a9facb73e01e3608b53a4dcd", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 109026, "upload_time": "2018-11-11T00:52:26", "url": "https://files.pythonhosted.org/packages/80/4c/679dd4ab69076848b07c0d028ef5e3b3857ae68eb6c40b9129014ec44ff1/ubelt-0.6.0-py2.py3-none-any.whl" } ], "0.6.1": [ { "comment_text": "", "digests": { "md5": "0a5c7c39c0334a4465deafdddb624d22", "sha256": "9ed2e3a548f77769857123cdb9157905c2be0b022fa677be06b320e2304460a7" }, "downloads": -1, "filename": "ubelt-0.6.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "0a5c7c39c0334a4465deafdddb624d22", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 111454, "upload_time": "2019-01-08T23:50:59", "url": "https://files.pythonhosted.org/packages/09/35/68f6af4f8687194e960d5daa298b74e324180b414d2c383efedc44f79015/ubelt-0.6.1-py2.py3-none-any.whl" } ], "0.6.2": [ { "comment_text": "", "digests": { "md5": "a4500a5847f371993e6c047e3a90f973", "sha256": "ef2f9383842a19532447361efcfae57289b3334fd8df3019412fbcb9c81c4f65" }, "downloads": -1, "filename": "ubelt-0.6.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "a4500a5847f371993e6c047e3a90f973", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 87326, "upload_time": "2019-02-14T14:53:37", "url": "https://files.pythonhosted.org/packages/ac/9f/fa2000cee14119361c830b58439403b8f553adab249bff8c828a514e5549/ubelt-0.6.2-py2.py3-none-any.whl" } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "b8783cf27f7f917ad285db66e6c02830", "sha256": "70f786d42679ebf596468dcd1378b1d667c9b4dc145e8d12331f8e5d48722a06" }, "downloads": -1, "filename": "ubelt-0.7.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "b8783cf27f7f917ad285db66e6c02830", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 121115, "upload_time": "2019-03-13T02:46:52", "url": "https://files.pythonhosted.org/packages/48/e9/cd71ea6ab218e8f2b3b17e720c193da89ba989b9272ef758ed24a9bf90ea/ubelt-0.7.0-py2.py3-none-any.whl" } ], "0.7.1": [ { "comment_text": "", "digests": { "md5": "1e146f734c7c072173ae615e62061463", "sha256": "b24a313836c592d777f2b31147d092c4a893351558cfedc0c60457fe6cd68a4b" }, "downloads": -1, "filename": "ubelt-0.7.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "1e146f734c7c072173ae615e62061463", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 121134, "upload_time": "2019-03-19T23:08:37", "url": "https://files.pythonhosted.org/packages/25/bc/3b61766d92c75b942ba93b984efc1de31ee93eccc3c03c27256241fc5e72/ubelt-0.7.1-py2.py3-none-any.whl" } ], "0.8.0": [ { "comment_text": "", "digests": { "md5": "19a70db9231bd0f5f059c20145c8c4b5", "sha256": "2cd15517c9faa0a89a0ef0655d54e7bd05043c98e85eaa7723be228c67edbf7d" }, "downloads": -1, "filename": "ubelt-0.8.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "19a70db9231bd0f5f059c20145c8c4b5", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 125827, "upload_time": "2019-05-13T02:44:00", "url": "https://files.pythonhosted.org/packages/a7/a9/72176eb64f845be030a14b2548ea52fe3759704313183625cce40dbacd9f/ubelt-0.8.0-py2.py3-none-any.whl" } ], "0.8.1": [ { "comment_text": "", "digests": { "md5": "540b41c0d6a364ab845669c9710d9986", "sha256": "a7907f5b04367ef3a456ff5e6985e59769a0ccb6ba3175da9ea9af452eef788b" }, "downloads": -1, "filename": "ubelt-0.8.1-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "540b41c0d6a364ab845669c9710d9986", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 125874, "upload_time": "2019-05-24T23:29:53", "url": "https://files.pythonhosted.org/packages/26/d6/869ccbfced2e3049709c2ff4711214837affc2d137529facd1d83a690a94/ubelt-0.8.1-py2.py3-none-any.whl" } ], "0.8.2": [ { "comment_text": "", "digests": { "md5": "3414bc76f14574e0af15a9c8fe4b12bf", "sha256": "fbc9bea30fafa57a04d755bb70ed2589bceadbc5aa844dfecc25df952fa1ca9b" }, "downloads": -1, "filename": "ubelt-0.8.2-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "3414bc76f14574e0af15a9c8fe4b12bf", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 104243, "upload_time": "2019-07-11T20:20:34", "url": "https://files.pythonhosted.org/packages/35/3c/14f58f4bc1e0d691652f5e30bb84b55798a299c23a7dc4dca02da2a8809b/ubelt-0.8.2-py2.py3-none-any.whl" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "3414bc76f14574e0af15a9c8fe4b12bf", "sha256": "fbc9bea30fafa57a04d755bb70ed2589bceadbc5aa844dfecc25df952fa1ca9b" }, "downloads": -1, "filename": "ubelt-0.8.2-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "3414bc76f14574e0af15a9c8fe4b12bf", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 104243, "upload_time": "2019-07-11T20:20:34", "url": "https://files.pythonhosted.org/packages/35/3c/14f58f4bc1e0d691652f5e30bb84b55798a299c23a7dc4dca02da2a8809b/ubelt-0.8.2-py2.py3-none-any.whl" } ] }