{ "info": { "author": "Andrew Hawker", "author_email": "andrew.r.hawker@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: Apache Software License", "Natural Language :: English", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "ulid\n====\n\n|Build Status| |Build Status| |codecov| |Code Climate| |Issue Count|\n\n|PyPI Version| |PyPI Versions|\n\n|Updates|\n\n|Documentation Status|\n\n|Stories in Ready|\n\n`Universally Unique Lexicographically Sortable\nIdentifier `__ in `Python\n3 `__.\n\nStatus\n~~~~~~\n\nThis project is actively maintained.\n\nInstallation\n~~~~~~~~~~~~\n\nTo install ulid from `pip `__:\n\n.. code:: bash\n\n $ pip install ulid-py\n\nTo install ulid from source:\n\n.. code:: bash\n\n $ git clone git@github.com:ahawker/ulid.git\n $ cd ulid && python setup.py install\n\nUsage\n~~~~~\n\nCreate a brand new ULID.\n\nThe timestamp value (48-bits) is from\n`time.time() `__\nwith millisecond precision.\n\nThe randomness value (80-bits) is from\n`os.urandom() `__.\n\n.. code:: python\n\n >>> import ulid\n >>> ulid.new()\n \n\nCreate a new ULID from an existing 128-bit value, such as a\n`UUID `__.\n\nSupports ULID values as ``int``, ``bytes``, ``str``, and ``UUID`` types.\n\n.. code:: python\n\n >>> import ulid, uuid\n >>> value = uuid.uuid4()\n >>> value\n UUID('0983d0a2-ff15-4d83-8f37-7dd945b5aa39')\n >>> ulid.from_uuid(value)\n \n\nCreate a new ULID from an existing timestamp value, such as a\n`datetime `__\nobject.\n\nSupports timestamp values as ``int``, ``float``, ``str``, ``bytes``,\n``bytearray``, ``memoryview``, ``datetime``, ``Timestamp``, and ``ULID``\ntypes.\n\n.. code:: python\n\n >>> import datetime, ulid\n >>> ulid.from_timestamp(datetime.datetime(1999, 1, 1))\n \n\nCreate a new ULID from an existing randomness value.\n\nSupports randomness values as ``int``, ``float``, ``str``, ``bytes``,\n``bytearray``, ``memoryview``, ``Randomness``, and ``ULID`` types.\n\n.. code:: python\n\n >>> import os, ulid\n >>> randomness = os.urandom(10)\n >>> ulid.from_randomness(randomness)\n >>> \n\nFor cases when you don't necessarily control the data type (input from\nexternal system), you can use the ``parse`` method which will attempt to\nmake the correct determination for you. Please note that this will be\nslightly slower than creating the instance from the respective\n``from_*`` method as it needs to make a number of type/conditional\nchecks.\n\nSupports values as ``int``, ``float``, ``str``, ``bytes``,\n``bytearray``, ``memoryview``, ``uuid.UUID``, and ``ULID`` types.\n\n.. code:: python\n\n >>> import ulid\n >>> value = db.model.get_id() ## Unsure about datatype -- Could be int, UUID, or string?\n >>> ulid.parse(value)\n >>> \n\nOnce you have a ULID object, there are a number of ways to interact with\nit.\n\nThe ``timestamp`` method will give you a snapshot view of the first\n48-bits of the ULID while the ``randomness`` method will give you a\nsnapshot of the last 80-bits.\n\n.. code:: python\n\n >>> import ulid\n >>> u = ulid.new()\n >>> u\n \n >>> u.timestamp()\n \n >>> u.randomness()\n \n\nThe ``ULID``, ``Timestamp``, and ``Randomness`` classes all derive from\nthe same base class, a ``MemoryView``.\n\nA ``MemoryView`` provides the ``str``, ``int``, and ``bytes`` methods\nfor changing any values representation.\n\n.. code:: python\n\n >>> import ulid\n >>> u = ulid.new()\n >>> u\n \n >>> u.timestamp()\n \n >>> u.timestamp().int\n 1497589322893\n >>> u.timestamp().bytes\n b'\\x01\\\\\\xafG\\x94\\x8d'\n >>> u.timestamp().datetime\n datetime.datetime(2017, 6, 16, 5, 2, 2, 893000)\n >>> u.randomness().bytes\n b'\\x02F\\xde\\xb9\\\\\\xf9\\xa5\\xecYW'\n >>> u.bytes[6:] == u.randomness().bytes\n True\n >>> u.str\n '01BJQMF54D093DXEAWZ6JYRPAQ'\n >>> u.int\n 1810474399624548315999517391436142935\n\nA ``MemoryView`` also provides rich comparison functionality.\n\n.. code:: python\n\n >>> import datetime, time, ulid\n >>> u1 = ulid.new()\n >>> time.sleep(5)\n >>> u2 = ulid.new()\n >>> u1 < u2\n True\n >>> u3 = ulid.from_timestamp(datetime.datetime(2039, 1, 1))\n >>> u1 < u2 < u3\n True\n >>> [u.timestamp().datetime for u in sorted([u2, u3, u1])]\n [datetime.datetime(2017, 6, 16, 5, 7, 14, 847000), datetime.datetime(2017, 6, 16, 5, 7, 26, 775000), datetime.datetime(2039, 1, 1, 8, 0)]\n\nFuture Items\n~~~~~~~~~~~~\n\n- Collection of benchmarks to track performance.\n- Backport to Python 2.7?\n- See `Github Issues `__ for\n more!\n\nGoals\n~~~~~\n\nA fast implementation in pure python of the spec with binary format\nsupport.\n\nContributing\n~~~~~~~~~~~~\n\nIf you would like to contribute, simply fork the repository, push your\nchanges and send a pull request. Pull requests will be brought into the\n``master`` branch via a rebase and fast-forward merge with the goal of\nhaving a linear branch history with no merge commits.\n\nLicense\n~~~~~~~\n\n`Apache 2.0 `__\n\nWhy not UUID?\n-------------\n\nUUID can be suboptimal for many uses-cases because:\n\n- It isn't the most character efficient way of encoding 128 bits of\n randomness\n- UUID v1/v2 is impractical in many environments, as it requires access\n to a unique, stable MAC address\n- UUID v3/v5 requires a unique seed and produces randomly distributed\n IDs, which can cause fragmentation in many data structures\n- UUID v4 provides no other information than randomness which can cause\n fragmentation in many data structures\n\nULID provides:\n\n- 128-bit compatibility with UUID\n- 1.21e+24 unique ULIDs per millisecond\n- Lexicographically sortable!\n- Canonically encoded as a 26 character string, as opposed to the 36\n character UUID\n- Uses Crockford's base32 for better efficiency and readability (5 bits\n per character)\n- Case insensitive\n- No special characters (URL safe)\n\nSpecification\n-------------\n\nBelow is the current specification of ULID as implemented in this\nrepository.\n\nThe binary format is implemented.\n\n::\n\n 01AN4Z07BY 79KA1307SR9X4MV3\n\n |----------| |----------------|\n Timestamp Randomness\n 10chars 16chars\n 48bits 80bits\n\nComponents\n~~~~~~~~~~\n\n**Timestamp** \\* 48 bit integer \\* UNIX-time in milliseconds \\* Won't\nrun out of space till the year 10895 AD.\n\n**Randomness** \\* 80 bits \\* Cryptographically secure source of\nrandomness, if possible\n\nSorting\n~~~~~~~\n\nThe left-most character must be sorted first, and the right-most\ncharacter sorted last (lexical order). The default ASCII character set\nmust be used. Within the same millisecond, sort order is not guaranteed\n\nEncoding\n~~~~~~~~\n\nCrockford's Base32 is used as shown. This alphabet excludes the letters\nI, L, O, and U to avoid confusion and abuse.\n\n::\n\n 0123456789ABCDEFGHJKMNPQRSTVWXYZ\n\nBinary Layout and Byte Order\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe components are encoded as 16 octets. Each component is encoded with\nthe Most Significant Byte first (network byte order).\n\n::\n\n 0 1 2 3\n 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n | 32_bit_uint_time_high |\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n | 16_bit_uint_time_low | 16_bit_uint_random |\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n | 32_bit_uint_random |\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n | 32_bit_uint_random |\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n\nString Representation\n~~~~~~~~~~~~~~~~~~~~~\n\n::\n\n ttttttttttrrrrrrrrrrrrrrrr\n\n where\n t is Timestamp\n r is Randomness\n\nLinks\n~~~~~\n\n- `Original Implementation\n (Javascript) `__\n- `ulid (python) `__\n\n.. |Build Status| image:: https://travis-ci.org/ahawker/ulid.svg?branch=master\n :target: https://travis-ci.org/ahawker/ulid\n.. |Build Status| image:: https://ci.appveyor.com/api/projects/status/fy0hufnb8h6gwk4d/branch/master?svg=true\n :target: https://ci.appveyor.com/project/ahawker/ulid/branch/master\n.. |codecov| image:: https://codecov.io/gh/ahawker/ulid/branch/master/graph/badge.svg\n :target: https://codecov.io/gh/ahawker/ulid\n.. |Code Climate| image:: https://codeclimate.com/github/ahawker/ulid/badges/gpa.svg\n :target: https://codeclimate.com/github/ahawker/ulid\n.. |Issue Count| image:: https://codeclimate.com/github/ahawker/ulid/badges/issue_count.svg\n :target: https://codeclimate.com/github/ahawker/ulid\n.. |PyPI Version| image:: https://badge.fury.io/py/ulid-py.svg\n :target: https://badge.fury.io/py/ulid-py\n.. |PyPI Versions| image:: https://img.shields.io/pypi/pyversions/ulid-py.svg\n :target: https://pypi.python.org/pypi/ulid-py\n.. |Updates| image:: https://pyup.io/repos/github/ahawker/ulid/shield.svg\n :target: https://pyup.io/repos/github/ahawker/ulid/\n.. |Documentation Status| image:: https://readthedocs.org/projects/ulid/badge/?version=latest\n :target: http://ulid.readthedocs.io/en/latest/?badge=latest\n.. |Stories in Ready| image:: https://badge.waffle.io/ahawker/ulid.svg?label=ready&title=Ready\n :target: http://waffle.io/ahawker/ulid\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/ahawker/ulid", "keywords": "", "license": "Apache 2.0", "maintainer": "", "maintainer_email": "", "name": "ulid-py", "package_url": "https://pypi.org/project/ulid-py/", "platform": "", "project_url": "https://pypi.org/project/ulid-py/", "project_urls": { "Homepage": "https://github.com/ahawker/ulid" }, "release_url": "https://pypi.org/project/ulid-py/0.0.9/", "requires_dist": null, "requires_python": "", "summary": "Universally Unique Lexicographically Sortable Identifier", "version": "0.0.9" }, "last_serial": 4696544, "releases": { "0.0.1": [], "0.0.2": [ { "comment_text": "", "digests": { "md5": "fb9ab3ae6fb34d892ee41b1d8273833c", "sha256": "4e598571d767a4b917a244c4fa0aa229b8b0bb886c1dc37198d4127bd68a54a9" }, "downloads": -1, "filename": "ulid_py-0.0.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "fb9ab3ae6fb34d892ee41b1d8273833c", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 13021, "upload_time": "2017-06-16T05:00:54", "url": "https://files.pythonhosted.org/packages/ef/5a/0190abba545bebff084a25009dfb2bc447d6b2cf75ffba9affcaca9ba8a4/ulid_py-0.0.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fe4819f8e9dfe8adf89fcfe9e3c239cd", "sha256": "2e8382c06f63b623bf2fbe1ffcb0c2e6705e82a709b23cd235c691c91bcdb894" }, "downloads": -1, "filename": "ulid-py-0.0.2.tar.gz", "has_sig": false, "md5_digest": "fe4819f8e9dfe8adf89fcfe9e3c239cd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6503, "upload_time": "2017-06-16T05:00:56", "url": "https://files.pythonhosted.org/packages/27/b5/de27bf71ca9a976aff28ecc1cef00d4a974752ac8eec834f075b1d236919/ulid-py-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "f96ddfeb084d32f5653965c7b80ee307", "sha256": "0b9c686536cb5c6e72ab6843e85193a6cd48722701d79174aca2a77ef3c2f628" }, "downloads": -1, "filename": "ulid_py-0.0.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f96ddfeb084d32f5653965c7b80ee307", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 13148, "upload_time": "2017-06-25T19:36:29", "url": "https://files.pythonhosted.org/packages/25/fb/c3a34d68fb313ce0029bc283b5e9bf1b83177ede1f0f0ffa41e1d7625335/ulid_py-0.0.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "389d816f011407cfcec1a2bb46465e62", "sha256": "ec3bfbf80bc46b7cee34dfaa5549ea3f6a9854d78ccc64ef67b96398099ffedc" }, "downloads": -1, "filename": "ulid-py-0.0.3.tar.gz", "has_sig": false, "md5_digest": "389d816f011407cfcec1a2bb46465e62", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6650, "upload_time": "2017-06-25T19:36:30", "url": "https://files.pythonhosted.org/packages/8a/49/8edb8f06b1cccc2607e84530175b1e2422190bc1963bfdddaecee5c41b9b/ulid-py-0.0.3.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "25bd5792e8813955d9515b2cde9c5309", "sha256": "389923435a1692fa6e979bdff5f12de7a03283776d136221a8382799f8217072" }, "downloads": -1, "filename": "ulid_py-0.0.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "25bd5792e8813955d9515b2cde9c5309", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 19338, "upload_time": "2017-09-22T05:34:05", "url": "https://files.pythonhosted.org/packages/10/e0/4fe45aba24269f7fc15e0396f5466928ad38a03aa9394e6e4ef93b25c76b/ulid_py-0.0.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "56e647e5814b2342de413b7aa805b4b3", "sha256": "8baf5f234c2aa154ea92108c28add089618d7aab93e2c44a1cc6539a13f939ca" }, "downloads": -1, "filename": "ulid-py-0.0.4.tar.gz", "has_sig": false, "md5_digest": "56e647e5814b2342de413b7aa805b4b3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10617, "upload_time": "2017-09-22T05:34:06", "url": "https://files.pythonhosted.org/packages/06/3a/0109550b724c7b0d3d08439318cb9597c0073ce23cfc264c70b399a57bfb/ulid-py-0.0.4.tar.gz" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "8b6413bc2859336af3a736c228b358ce", "sha256": "4121b984cac990cc5d11be56e74f833e66e27fe5b677e89311f501f87f82797b" }, "downloads": -1, "filename": "ulid_py-0.0.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "8b6413bc2859336af3a736c228b358ce", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 19349, "upload_time": "2017-10-26T03:13:45", "url": "https://files.pythonhosted.org/packages/16/49/8709ca07550a542965a3d64642e864935a19c479c937b9bd2bd0494e5166/ulid_py-0.0.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ecab40f43e1be93ed83ac5142132c441", "sha256": "5c66fd57a9670414c5a0cd4066108ad476e6eb8bc19f3bed667afaad9e563818" }, "downloads": -1, "filename": "ulid-py-0.0.5.tar.gz", "has_sig": false, "md5_digest": "ecab40f43e1be93ed83ac5142132c441", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10639, "upload_time": "2017-10-26T03:13:47", "url": "https://files.pythonhosted.org/packages/b7/1f/16ebb705d99469bdc346a097c07a77bb0ec2c0c11feaf4be5012b2f70e1b/ulid-py-0.0.5.tar.gz" } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "52c0f389c9b4407c8e2107355863c3c3", "sha256": "275bb4a9e4d0f9cf0a28f2db8b126581a99567045175bea9be94b174cbc57ce0" }, "downloads": -1, "filename": "ulid_py-0.0.6-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "52c0f389c9b4407c8e2107355863c3c3", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 19576, "upload_time": "2017-10-28T23:22:19", "url": "https://files.pythonhosted.org/packages/dc/a5/e03017d742aba520b2f5b92c87cf76b734497c028a0e9a9a79b6a8ae7dea/ulid_py-0.0.6-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "014763575fd33ca37110fc10ba2cb400", "sha256": "b804f97cb355e020a2bd3b9f97a0cbcae318cc9222c287ee18480cee42e5aa1a" }, "downloads": -1, "filename": "ulid-py-0.0.6.tar.gz", "has_sig": false, "md5_digest": "014763575fd33ca37110fc10ba2cb400", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10843, "upload_time": "2017-10-28T23:22:22", "url": "https://files.pythonhosted.org/packages/b9/7c/c7af46ea8f0d9d12b2dbe82ae9dceacc1d292f0a223a6faa3160f349a5fc/ulid-py-0.0.6.tar.gz" } ], "0.0.7": [ { "comment_text": "", "digests": { "md5": "b5ac51569c7490ef7aac4ece4912c35c", "sha256": "08ed8bd85184157f1a206b66da7aff89024a883ebd949417504144acdb2bbdda" }, "downloads": -1, "filename": "ulid_py-0.0.7-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "b5ac51569c7490ef7aac4ece4912c35c", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 15545, "upload_time": "2018-10-09T14:26:35", "url": "https://files.pythonhosted.org/packages/a6/31/7ced2beec4974c8d0e6945f5c5c87294b6277664105b4ec4c3ced5f90fe1/ulid_py-0.0.7-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5aed95f13f8e541e15ae59f21b3b3173", "sha256": "d7a9de7c886a852b38c091dd6a8c9e390f9930c5f6ae7c342b22b35643e35088" }, "downloads": -1, "filename": "ulid-py-0.0.7.tar.gz", "has_sig": false, "md5_digest": "5aed95f13f8e541e15ae59f21b3b3173", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10922, "upload_time": "2018-10-09T14:26:37", "url": "https://files.pythonhosted.org/packages/58/ae/549467d29c691c9d6c42b768701c3711eddb7a641358b75f7435b6c362ea/ulid-py-0.0.7.tar.gz" } ], "0.0.8": [ { "comment_text": "", "digests": { "md5": "117877fd0b5a025a0f93a229f8791141", "sha256": "0050eddd0f7d029cf3f1ee94eda89ecfddcb06d17891936a2880d39ec7f0ba6d" }, "downloads": -1, "filename": "ulid_py-0.0.8-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "117877fd0b5a025a0f93a229f8791141", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 15911, "upload_time": "2019-01-14T05:39:50", "url": "https://files.pythonhosted.org/packages/99/6c/6d0562f3847cdff8ac775eb6f900039e44860d4be82ce52ec0f476cfb31d/ulid_py-0.0.8-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "855d8a3d8a209e322ac1a4c1677ac508", "sha256": "a92d432ba07676a7759c10a463b52b7743e33fdb741ec9f3706ea64930d08378" }, "downloads": -1, "filename": "ulid-py-0.0.8.tar.gz", "has_sig": false, "md5_digest": "855d8a3d8a209e322ac1a4c1677ac508", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14634, "upload_time": "2019-01-14T05:39:51", "url": "https://files.pythonhosted.org/packages/cb/4e/4e26eb0107ad88874276ce7b1c0634565d2f0ccea00dff46796de5c870f2/ulid-py-0.0.8.tar.gz" } ], "0.0.9": [ { "comment_text": "", "digests": { "md5": "0cc1f42b4128d89a364419facb42e709", "sha256": "94d894e8174ab35d3b55e6dc9b8b29c774de0c28ea104e7b228efa05b7215600" }, "downloads": -1, "filename": "ulid_py-0.0.9-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "0cc1f42b4128d89a364419facb42e709", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 16189, "upload_time": "2019-01-14T23:34:02", "url": "https://files.pythonhosted.org/packages/a5/dc/be79bff452a0f456d00134d03c34556180c6f0ce0a53685c78457b92ee55/ulid_py-0.0.9-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "40071f74e46a4e638dcaa0296d728a6f", "sha256": "9cd95dca1b366d85e0d12d03bf54b1224af56c97380868bb4f3385fcc6a85620" }, "downloads": -1, "filename": "ulid-py-0.0.9.tar.gz", "has_sig": false, "md5_digest": "40071f74e46a4e638dcaa0296d728a6f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15192, "upload_time": "2019-01-14T23:34:04", "url": "https://files.pythonhosted.org/packages/0f/cc/2923ab4d5fa0203d7e5be54e9f434133b457984c49ced32aa80768c2e3d0/ulid-py-0.0.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "0cc1f42b4128d89a364419facb42e709", "sha256": "94d894e8174ab35d3b55e6dc9b8b29c774de0c28ea104e7b228efa05b7215600" }, "downloads": -1, "filename": "ulid_py-0.0.9-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "0cc1f42b4128d89a364419facb42e709", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 16189, "upload_time": "2019-01-14T23:34:02", "url": "https://files.pythonhosted.org/packages/a5/dc/be79bff452a0f456d00134d03c34556180c6f0ce0a53685c78457b92ee55/ulid_py-0.0.9-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "40071f74e46a4e638dcaa0296d728a6f", "sha256": "9cd95dca1b366d85e0d12d03bf54b1224af56c97380868bb4f3385fcc6a85620" }, "downloads": -1, "filename": "ulid-py-0.0.9.tar.gz", "has_sig": false, "md5_digest": "40071f74e46a4e638dcaa0296d728a6f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15192, "upload_time": "2019-01-14T23:34:04", "url": "https://files.pythonhosted.org/packages/0f/cc/2923ab4d5fa0203d7e5be54e9f434133b457984c49ced32aa80768c2e3d0/ulid-py-0.0.9.tar.gz" } ] }