{ "info": { "author": "Sean Stewart", "author_email": "sean_stewart@me.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: Implementation :: CPython", "Topic :: Utilities", "Typing :: Typed" ], "description": "Typical: Take Typing Further. :duck: \n=====================================\n[![image](https://img.shields.io/pypi/v/typical.svg)](https://pypi.org/project/typical/)\n[![image](https://img.shields.io/pypi/l/typical.svg)](https://pypi.org/project/typical/)\n[![image](https://img.shields.io/pypi/pyversions/typical.svg)](https://pypi.org/project/typical/)\n[![image](https://img.shields.io/github/languages/code-size/seandstewart/typical.svg?style=flat)](https://github.com/seandstewart/typical)\n[![image](https://img.shields.io/travis/seandstewart/typical.svg)](https://travis-ci.org/seandstewart/typical)\n[![codecov](https://codecov.io/gh/seandstewart/typical/branch/master/graph/badge.svg)](https://codecov.io/gh/seandstewart/typical)\n[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/ambv/black)\n\nTake Typing Further with Typical. Make your annotations work for you.\n\n## Quickstart\n\n**Typical** is exceptionally light-weight (<50KB) and has only one\ndependency -\n[python-dateutil](https://dateutil.readthedocs.io/en/stable/), which\nit uses to parse date-strings into datetime objects.\n\nIn order to install, simply `pip3 install typical` and annotate to your\nheart's content! :duck: \n\n\n## Motivations\n\nIn the world of web-services development, type-safety becomes necessary\nfor the sanity of your code and your fellow developers. This is not to\nsay that static-typing is the solution - When it comes to the external\nentrypoints to your code, not even a compiler is going to help you. \n\nWith Python3, type annotations were introduced. With Python3.7, the\nlibrary was completely re-written for performance and ease-of-use. Type\nannotations are here to stay and I couldn't be happier about it. \n\nHowever, there is one place where annotations fall down. There is no\nprovided path for ensuring the type-safety of your methods, functions,\nand classes. This means if you're receiving data from an external\nsource, (such as with a web service) you still need to do this work\nyourself.\n\nUntil now.\n\n\n## Automatic, Guaranteed Duck-Typing\n\nBehold, the power of *Typical*:\n\n```python\n>>> import typic\n>>>\n>>> @typic.al\n>>> def multi(a: int, b: int):\n... return a * b\n...\n>>> multi('2', '3')\n6\n```\n\nTake it further...\n\n```python\n>>> import dataclasses\n>>> import enum\n>>> import typic\n>>>\n>>> class DuckType(str, enum.Enum):\n... MAL = 'mallard'\n... BLK = 'black'\n... WHT = 'white'\n... \n>>> @typic.al\n... @dataclasses.dataclass\n... class Duck:\n... type: DuckType\n... name: str\n...\n>>> donald = Duck('white', 'Donald')\n>>> donald.type\n\n```\n\nThis is all fine and dandy, but can we go... further? :thinking: \n\n```python\n>>> class DuckRegistry:\n... \"\"\"A Registry for all the ducks\"\"\"\n... \n... @typic.al\n... def __init__(self, *duck: Duck):\n... self._reg = {x.name: x for x in duck}\n... \n... @typic.al\n... def add(self, duck: Duck):\n... self._reg[duck.name] = duck\n... \n... @typic.al\n... def find(self, name: str):\n... \"\"\"Try to find a duck by its name. Otherwise, try with type.\"\"\"\n... if name not in self._reg:\n... matches = [x for x in self._reg.values() if x.type == name]\n... if matches:\n... return matches[-1] if len(matches) == 1 else matches\n... return self._reg[name]\n... \n>>> registry = DuckRegistry({'type': 'black', 'name': 'Daffy'})\n>>> registry.find('Daffy')\nDuck(type=, name='Daffy')\n>>> registry.add({'type': 'white', 'name': 'Donald'})\n>>> registry.find('Donald')\nDuck(type=, name='Donald')\n\n>>> registry.add({'type': 'goose', 'name': 'Maynard'})\nTraceback (most recent call last):\n ...\nValueError: 'goose' is not a valid DuckType\n```\n\n### What Just Happended Here?\n\nWhen we wrap a callable with `@typic.al`, the wrapper reads the\nsignature of the callable and automatically coerces the incoming data to\nthe type which is annotated. This includes varargs (`*args` and\n`**kwargs`). This means that you no longer need to do the work of\nconverting incoming data yourself. You just need to signal what you\nexpect the data to be with an annotation and **Typical** will do the\nrest.\n\nThe `ValueError` we see in the last operation is what we can expect when\nattempting to supply an invalid value for the Enum class we used above.\nRather than have to write code to cast this data and handle stuff that's\ninvalid, you can rest easy in the guarantee that the data you expect is\nthe data you'll get.\n\n### What's Supported?\n\nAs of this version, **Typical** can parse the following inputs into\nvalid Python types and classes:\n* JSON\n* YAML (if [PyYAML](https://pyyaml.org/wiki/PyYAMLDocumentation) is \n installed)\n* Python code (via\n [ast.literal_eval](https://docs.python.org/3/library/ast.html#ast.literal_eval))\n* Date-strings and Unix Timestamps (via\n [python-dateutil](https://dateutil.readthedocs.io/en/stable/))\n* Custom `NewType` declarations.\n\n\n### Limitations\n\n#### Forward Refs\nA \"forward reference\" is a reference to a type which has either not yet\nbeen defined, or is not available within the module which the annotation\nlives. This is noted by encapsulating the annotation in quotes, e.g.:\n`foo: 'str' = 'bar'`. Beware of using such syntax in combination with\nTypical. Typical makes use of `typing.get_type_hints`, which scans the\nnamespace(s) available to the given object to resolve annotations. If\nthe annotation is unavailable, a `NameError` will be raised. This\nbehavior is considered valid. If you wish to make use of Typical for\ntype-coercion, make sure the annotated type is in the namespace of the\nobject you're wrapping and avoid Forward References if at all possible.\n\n#### Special Forms\nThere is a subset of type annotations which are 'suscriptable' - meaning\nyou can specify what other types this annotation may resolve to. In a\nfew of those cases, the intended type for the incoming data is too\nambiguous to resolve. The following annotations are special forms which\ncannot be supported:\n* Union\n* Any\n\nBecause these signal an unclear resolution, Typical will ignore this\nflavor of annotation, leaving it to the developer to determine the\nappropriate action.\n\n\n## Updates\n\n_New in version 1.1.0:_ `typing.Optional` and `typing.ClassVar` are now\nsupported.\n\n_New in version 1.2.0:_ Values set to annotated attributes are\nautomagically resolved.\n\n_New in version 1.3.0:_ \n1. Custom coercers may now be registered, e.g.:\n ```python\n import typic\n\n class MyCustomClass:\n\n def __init__(self, value):\n self.value = value\n\n @classmethod\n def factory(cls, value):\n return cls(value)\n\n\n def custom_class_coercer(value, annotation: MyCustomClass):\n return annotation.factory(value)\n\n\n def ismycustomclass(obj) -> bool:\n return obj is MyCustomClass\n\n\n typic.register(custom_class_coercer, ismycustomclass)\n ```\n\n2. Squashed a few bugs:\n - Nested calls of `Coercer.coerce_value` didn't account for values\n that didn't need coercion. This sometimes broke evaluation, and\n definitely resulted in sub-optimal type resolution performance.\n - In the final attempt to coerce a custom class, calling\n `typic.evals.safe_eval` could reveal that a value is null. In this\n case, we should respect whether the annotation was optional.\n - Sometimes people are using a version of PyYAML that's older than\n 5.1. We should support that.\n\n_New in version 1.3.1_:\n1. Improved caching strategy and resolution times.\n\n_New in version 1.3.2:_ \n1. Resolution time is better than ever.\n2. Custom Unions are now supported via registering custom coercers with\n `typic.register`, as a result of raising the priority of\n user-registered coercers.\n\n_New in version 1.4.0:_\n1. A new wrapper has been added to simplify dataclass usage:\n\n ```python\n import typic\n\n @typic.klass\n class Foo:\n bar: str\n\n ```\n is equivalent to \n ```python\n import dataclasses\n import typic\n\n @typic.al\n @dataclasses.dataclass\n class Foo:\n bar: str\n\n ```\n All standard dataclass syntax is supported with\n `typic.klass`\n\n_New in version 1.4.1:_\n1. Fixed a nasty bug in wrapped classes that resulted in\n infinite recursion.\n\n_New in version 1.5.0:_\n1. Frozen dataclasses are now supported.\n\n_New in version 1.9.0:_\n1. Introducing `typic.bind`:\n - An optimized version of `inspect.Signature.bind` which will also \n coerce inputs given.\n2. `typic.al` is now up to ~30% faster on wrapped callables.\n\n_New in version 1.9.1:_\n1. Squashed a bug that broke annotation resolution when wrapping bound\n methods of classes.\n\n_New in version 1.9.2:_\n1. Added the `delay` keyword-arg to wrappers to allow user to delay\n annotation resolution until the first call of the wrapped object.\n2. Added the `coerce` keyword-arg to `typic.bind` to allow users to\n bind args without coercing them.\n\n_New in version 1.10.0:_\n1. Added the ability to resolve delayed annotations with a\n module-level callable, i.e.: \n ```python\n import typic\n\n @typic.klass(delay=True)\n class SomeClass:\n some_attr: str\n\n typic.resolve()\n ```\n This is useful in more complex typing situations, such as in the\n library [iambic](https://www.github.com/seandstewart/iambic), where\n a single coercer is registered to handle type coercion for all\n models. In those cases, you may wish to resolve your annotations\n after you have registered your coercer.\n\n## Documentation\n\nFull documentation coming soon!\n\nHappy Typing :duck:\n\n\n## How to Contribute\n1. Check for open issues or open a fresh issue to start a discussion\n around a feature idea or a bug. \n2. Create a branch on Github for your issue or fork\n [the repository](https://github.com/seandstewart/que) on GitHub to\n start making your changes to the **master** branch.\n3. Write a test which shows that the bug was fixed or that the feature\n works as expected.\n4. Send a pull request and bug the maintainer until it gets merged and\n published. :)\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/seandstewart/typical", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "typical", "package_url": "https://pypi.org/project/typical/", "platform": "", "project_url": "https://pypi.org/project/typical/", "project_urls": { "Homepage": "https://github.com/seandstewart/typical" }, "release_url": "https://pypi.org/project/typical/1.10.5/", "requires_dist": [ "python-dateutil" ], "requires_python": ">=3.6", "summary": "Typical: Take Typing Further.", "version": "1.10.5" }, "last_serial": 5559277, "releases": { "1.0.0": [ { "comment_text": "", "digests": { "md5": "c99551bf20c897e023cda6798986f5fa", "sha256": "73663324a711b65d6a853cf267196e681c348599271f9f2a86a020e93d010eae" }, "downloads": -1, "filename": "typical-1.0.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "c99551bf20c897e023cda6798986f5fa", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 10322, "upload_time": "2019-03-20T13:20:55", "url": "https://files.pythonhosted.org/packages/99/07/2b477e1b0d9e934e809fcd546b343cf926fc96d1fa1c968e3e47f124f4bd/typical-1.0.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c0ec1d6e472982afae13cd14b2278a42", "sha256": "991d00a8be6dc0eb173d3cb710ff1ff96c7a04b62ad2285cc208a3a751fc05a7" }, "downloads": -1, "filename": "typical-1.0.0.tar.gz", "has_sig": false, "md5_digest": "c0ec1d6e472982afae13cd14b2278a42", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 12639, "upload_time": "2019-03-20T13:20:57", "url": "https://files.pythonhosted.org/packages/f1/7f/6e2fc6de664a5a3197cfc2566bb4852c764ae89866c83d8f7623202bb57b/typical-1.0.0.tar.gz" } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "f270324b8f5f03c30f3863b0116ceda2", "sha256": "4812ff97be3010ca6788d86d4cc2cd5fe90304877ac979263bff52dcba023138" }, "downloads": -1, "filename": "typical-1.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f270324b8f5f03c30f3863b0116ceda2", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 10778, "upload_time": "2019-04-19T03:07:50", "url": "https://files.pythonhosted.org/packages/59/e8/0683790d26e77b4f4c1158a784c04495379bcb059bc2ba370c37d94f495b/typical-1.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "21ce6fffdb1d569db25a3b86dfedf0d0", "sha256": "41f4d27b58379b38317551c021f4cbc8bf50a38ed3a43dc23ab214948a3a9232" }, "downloads": -1, "filename": "typical-1.1.1.tar.gz", "has_sig": false, "md5_digest": "21ce6fffdb1d569db25a3b86dfedf0d0", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 13928, "upload_time": "2019-04-19T03:07:52", "url": "https://files.pythonhosted.org/packages/13/5a/02d3a4f0e72bffce54a156001a2f04063a54fe7f884775228a64b2f38ec1/typical-1.1.1.tar.gz" } ], "1.10.0": [ { "comment_text": "", "digests": { "md5": "32d7c673b4749fb430a6d4de5b5b5837", "sha256": "c86cf17b360c639d46f4227e11984f0eb87f54dd0ce75c9411c65e140350f294" }, "downloads": -1, "filename": "typical-1.10.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "32d7c673b4749fb430a6d4de5b5b5837", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 19816, "upload_time": "2019-07-10T11:53:26", "url": "https://files.pythonhosted.org/packages/a4/b6/748acfb76dc75a656a89dfb45b870f31a319e16ca12455c3ebbf7c674dd5/typical-1.10.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b224471e5f301fcbbfa5afd6a38db1d0", "sha256": "95b699e27b80687ae6a369d94634043b2f4d171e315905f126ef78e1f35b86cf" }, "downloads": -1, "filename": "typical-1.10.0.tar.gz", "has_sig": false, "md5_digest": "b224471e5f301fcbbfa5afd6a38db1d0", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 22283, "upload_time": "2019-07-10T11:53:28", "url": "https://files.pythonhosted.org/packages/bd/b3/114158ad0f794b132670ec16129acd53fbbbe6272609bcd375ebee0416c2/typical-1.10.0.tar.gz" } ], "1.10.1": [ { "comment_text": "", "digests": { "md5": "d38d4519ff19f44a508064571ac19ddc", "sha256": "a8e565407b6f0f9cb8a0d49106ff67806c45b54cfa35e8a46b60b3db31e4bbb7" }, "downloads": -1, "filename": "typical-1.10.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d38d4519ff19f44a508064571ac19ddc", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 20012, "upload_time": "2019-07-10T14:02:27", "url": "https://files.pythonhosted.org/packages/12/d4/8bf0a13e866e630e0c002e076d953323a1f34b10abb49a489fc79873d2bf/typical-1.10.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d519d8d0360977891d47cf63b9b2b1a3", "sha256": "91e11cfd2b2e7bc3247831fb3e2932dfca96313d2cbabc5519be83bf32d99e24" }, "downloads": -1, "filename": "typical-1.10.1.tar.gz", "has_sig": false, "md5_digest": "d519d8d0360977891d47cf63b9b2b1a3", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 22474, "upload_time": "2019-07-10T14:02:29", "url": "https://files.pythonhosted.org/packages/d2/15/466bf5ec73c0238af46100e1c40c0c82f351290771282b1d354cc2780aed/typical-1.10.1.tar.gz" } ], "1.10.2": [ { "comment_text": "", "digests": { "md5": "b83feb6b0ce2423a424e7bcd3a15939a", "sha256": "a30b28736cf28a7b209c786c9beba4abf20c7e8a970f13fa752b829656c6b599" }, "downloads": -1, "filename": "typical-1.10.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "b83feb6b0ce2423a424e7bcd3a15939a", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 18530, "upload_time": "2019-07-12T13:05:55", "url": "https://files.pythonhosted.org/packages/77/28/b6202581ff0eea279c8b2df1b73d670abb7841650e64fd5db55de5942a43/typical-1.10.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "def90297e3fd952ee169a3c5c7f845b3", "sha256": "197cb6b5812abfa7d0c57510e2d0884f7788b68c1f0c78f3bda1db2815b5424d" }, "downloads": -1, "filename": "typical-1.10.2.tar.gz", "has_sig": false, "md5_digest": "def90297e3fd952ee169a3c5c7f845b3", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 22563, "upload_time": "2019-07-12T13:05:57", "url": "https://files.pythonhosted.org/packages/6c/23/3d1a99f806ea516d06c45bcb93f879c09d66733609f9cd4960f1ed528d05/typical-1.10.2.tar.gz" } ], "1.10.3": [ { "comment_text": "", "digests": { "md5": "040af9b2a1ce9556cc83a2669ef84cb0", "sha256": "a9d116902979e39f053f079f880030352b69a51a4b46161869c947709144391f" }, "downloads": -1, "filename": "typical-1.10.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "040af9b2a1ce9556cc83a2669ef84cb0", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 18552, "upload_time": "2019-07-17T23:09:25", "url": "https://files.pythonhosted.org/packages/8d/5e/6042423780e5a30ff75d67d3c75deec2f5a7eaad5a7b9022f5fc67240fdc/typical-1.10.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8d4873d6d4fadac36fa158eacd43fae2", "sha256": "7e4ae91b6a719879fab9fef1f06b7cce1db88de3d86eaf207c7c0a4b602beb22" }, "downloads": -1, "filename": "typical-1.10.3.tar.gz", "has_sig": false, "md5_digest": "8d4873d6d4fadac36fa158eacd43fae2", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 22584, "upload_time": "2019-07-17T23:09:27", "url": "https://files.pythonhosted.org/packages/8f/88/b7e79202e0205dcd721d1166f109afa50c7dc5d6ee9e6be55d4770ca0240/typical-1.10.3.tar.gz" } ], "1.10.4": [ { "comment_text": "", "digests": { "md5": "ad5df24bd9894d98e881935365443dc1", "sha256": "6818359ed40826a4e2722cb8b98993188d1806b4e5a8e711f3f3ab97235bbabf" }, "downloads": -1, "filename": "typical-1.10.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "ad5df24bd9894d98e881935365443dc1", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 18550, "upload_time": "2019-07-19T23:52:14", "url": "https://files.pythonhosted.org/packages/16/60/0529aed357965c9cbe76865abc59bd63bb2eee691f58d0f50756aaf5ab03/typical-1.10.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8e4a8db73e51db8dd2f073855f4169f5", "sha256": "e7655eb9c19e2d80ee542342ced4a440c236e4b5231d07df4aabb44969a7c5ba" }, "downloads": -1, "filename": "typical-1.10.4.tar.gz", "has_sig": false, "md5_digest": "8e4a8db73e51db8dd2f073855f4169f5", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 22581, "upload_time": "2019-07-19T23:52:47", "url": "https://files.pythonhosted.org/packages/06/00/dd87057704181f7a1f13ee6d208831cd9c132215595618adc4af3c49eb54/typical-1.10.4.tar.gz" } ], "1.10.5": [ { "comment_text": "", "digests": { "md5": "a80091e89e59ad0a13524dcee38eff35", "sha256": "a2f52a63447bfc44bb4112fb08ce8b73b2b5379f99f3a6b9538ba0b0e2d240a1" }, "downloads": -1, "filename": "typical-1.10.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "a80091e89e59ad0a13524dcee38eff35", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 18552, "upload_time": "2019-07-20T00:03:59", "url": "https://files.pythonhosted.org/packages/98/0b/6172c5af704a1aae94ca9a27286637d21eacd4ec1242ea54aaf70c7673a8/typical-1.10.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "afa7eeb1af083ea0f0035d6016f1c764", "sha256": "707360d74f9e1379a5088e1150f298d8b03c22498c6cdee2a53f45cbdcf2bc0e" }, "downloads": -1, "filename": "typical-1.10.5.tar.gz", "has_sig": false, "md5_digest": "afa7eeb1af083ea0f0035d6016f1c764", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 22581, "upload_time": "2019-07-20T00:04:00", "url": "https://files.pythonhosted.org/packages/d4/f6/2620617c2b1bdfa157aaf8e2fb0b95da3d1d1f3a8452f27268c66d5f3543/typical-1.10.5.tar.gz" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "c08ad5a61bab345ce76dbb65550bff2c", "sha256": "ab733ec9ce21fa60e46f20c882370bd1d46a082082ad0ac80143220430d79f40" }, "downloads": -1, "filename": "typical-1.2.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "c08ad5a61bab345ce76dbb65550bff2c", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 11275, "upload_time": "2019-04-22T19:12:47", "url": "https://files.pythonhosted.org/packages/22/17/df846229442d7f05906d15f07d480e82e34456afa7923ff6e627a57e56be/typical-1.2.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "45a9445cfaffd164cdbc7ea7de903ffe", "sha256": "4550af77412e798c26cc0419a8b976f91f475bd63e5190fc59e2412ad83235dc" }, "downloads": -1, "filename": "typical-1.2.0.tar.gz", "has_sig": false, "md5_digest": "45a9445cfaffd164cdbc7ea7de903ffe", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 14532, "upload_time": "2019-04-22T19:12:49", "url": "https://files.pythonhosted.org/packages/c8/54/48cbb4a916d21b75af761a8f5d60ab443c42e3ff6e8e44d7fdcd1e71fdcb/typical-1.2.0.tar.gz" } ], "1.3.0": [ { "comment_text": "", "digests": { "md5": "91e4bd5600799428e41e7c0de8d9d0fc", "sha256": "867dfe8c2f2a64d75c0fd83b16a84f0479348157ba8a2782c4fb0bb53c7c1116" }, "downloads": -1, "filename": "typical-1.3.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "91e4bd5600799428e41e7c0de8d9d0fc", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 13359, "upload_time": "2019-05-13T15:39:17", "url": "https://files.pythonhosted.org/packages/9a/25/a086cf8c16b532b32fb24bf5198ec9fd550ba2d7140a43d22606159f4aca/typical-1.3.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bc1053b1ae3bf47015ad3393efb86126", "sha256": "0df11e3c7ecaf1f0f3ce6a3736cc02abcb676ba65961a41b8975a080eb99db94" }, "downloads": -1, "filename": "typical-1.3.0.tar.gz", "has_sig": false, "md5_digest": "bc1053b1ae3bf47015ad3393efb86126", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 16697, "upload_time": "2019-05-13T15:39:18", "url": "https://files.pythonhosted.org/packages/a4/7a/2cc0f670b211fb79628ca658941ff400c8cd77cdca319800a54e0d33ce0b/typical-1.3.0.tar.gz" } ], "1.3.1": [ { "comment_text": "", "digests": { "md5": "c3eeebbf63d251006f9e82edd8de5162", "sha256": "d7b94f49e83b6cef2fe58a74fb900a419d6a34fabff37b2c37e8c7e00c2d17d6" }, "downloads": -1, "filename": "typical-1.3.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "c3eeebbf63d251006f9e82edd8de5162", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 13350, "upload_time": "2019-06-05T13:28:49", "url": "https://files.pythonhosted.org/packages/cc/9c/03e3b2de80fee0424f1b342aab0e7359980f9af19b4e098c6b5a57c445c7/typical-1.3.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "28c2776921fde9d4c643c5e31da92382", "sha256": "0f6fe8487b4807a0416ea966a9c237efdaec736b24612f0ed34ff816e1f256c4" }, "downloads": -1, "filename": "typical-1.3.1.tar.gz", "has_sig": false, "md5_digest": "28c2776921fde9d4c643c5e31da92382", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 16705, "upload_time": "2019-06-05T13:28:50", "url": "https://files.pythonhosted.org/packages/3f/ed/4789da44b4edb713b53ee8e928e247f8af8b7b6d347176a1b36451063558/typical-1.3.1.tar.gz" } ], "1.3.2": [ { "comment_text": "", "digests": { "md5": "5db91727b6a420281eb96502211e38f1", "sha256": "460fe7349627832623f1e45669b290b23ed39847bcd8c3a8590acb5f03d9a892" }, "downloads": -1, "filename": "typical-1.3.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "5db91727b6a420281eb96502211e38f1", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 13617, "upload_time": "2019-06-05T14:43:53", "url": "https://files.pythonhosted.org/packages/ea/7a/2881887bac62ff71c0d815c3a8050ef977797ff05a0c5dab34d87565108e/typical-1.3.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0808c0ba7ccd8f66361c93c969ea3fb9", "sha256": "70bc1cf49659769cdc93165ef5f0b778d9202122d7208e336063673bfc337498" }, "downloads": -1, "filename": "typical-1.3.2.tar.gz", "has_sig": false, "md5_digest": "0808c0ba7ccd8f66361c93c969ea3fb9", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 17105, "upload_time": "2019-06-05T14:43:55", "url": "https://files.pythonhosted.org/packages/0f/3c/b0932a3548ddf90e4482498c86ce91701639c8d7a229529730a36570e469/typical-1.3.2.tar.gz" } ], "1.3.3": [ { "comment_text": "", "digests": { "md5": "029900d2823477c3439b54f23daa8100", "sha256": "1e7450af68718b49bb8be8d3c158579e17d0b10ea5917dde9415c658a63912f3" }, "downloads": -1, "filename": "typical-1.3.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "029900d2823477c3439b54f23daa8100", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 13641, "upload_time": "2019-06-09T22:01:14", "url": "https://files.pythonhosted.org/packages/c3/fa/d651bfd41a111711bca4c5ac35b6fd5a6b7cc3dd23bdfd93264781de9024/typical-1.3.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "79a0c0aed14c8d5ea52938890998b5b5", "sha256": "b6d9136d65df77f7dfffa0370bde8c90ac8255f7d82e78c3bb8fed55c4bf6426" }, "downloads": -1, "filename": "typical-1.3.3.tar.gz", "has_sig": false, "md5_digest": "79a0c0aed14c8d5ea52938890998b5b5", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 17124, "upload_time": "2019-06-09T22:01:16", "url": "https://files.pythonhosted.org/packages/0f/01/b8c8aa921ababb4d7e39063eedaec3a72c837f1e637b197afd24e339978c/typical-1.3.3.tar.gz" } ], "1.3.4": [ { "comment_text": "", "digests": { "md5": "d2d2239f4887b426b8193e287a117e79", "sha256": "d61d0b7c94bae8af5d20f470554c13c29a406720a9c1580fcb1df7bdf493d696" }, "downloads": -1, "filename": "typical-1.3.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d2d2239f4887b426b8193e287a117e79", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 13639, "upload_time": "2019-06-09T22:23:10", "url": "https://files.pythonhosted.org/packages/55/4a/f9b623a36b59955317a41b9ab6eeeba4ed3a0f5649a8a364f330f45515bf/typical-1.3.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "15697533e5d8bfbb8b2e65426a40ca5d", "sha256": "eb15373b7b9b2e8ca3a4aa385ee4f71b60dc8939b20c280aacde4aa62b95c5ae" }, "downloads": -1, "filename": "typical-1.3.4.tar.gz", "has_sig": false, "md5_digest": "15697533e5d8bfbb8b2e65426a40ca5d", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 17117, "upload_time": "2019-06-09T22:23:12", "url": "https://files.pythonhosted.org/packages/f1/94/7dad278fb8ba9951ac9af49ccc974a4ba9a87ae8c776901b038e02939591/typical-1.3.4.tar.gz" } ], "1.4.0": [ { "comment_text": "", "digests": { "md5": "2dac5d31806f674c856ee753d4312534", "sha256": "720d2a61fdc1b65c2cf1f61ad14d0e0d73286ff3c6d2b843cb826760e3f70577" }, "downloads": -1, "filename": "typical-1.4.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "2dac5d31806f674c856ee753d4312534", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 14346, "upload_time": "2019-06-20T17:55:00", "url": "https://files.pythonhosted.org/packages/45/cb/d3aabfa09bd3ba982a07cebb4afb1664e7dddc8039d8f7b00e031b48e8a5/typical-1.4.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a1f27a8ab523969ae95e97d01f81262d", "sha256": "682237bacb042cbe88c303627088cf5831e02e6b4c837e8850c97e2634252573" }, "downloads": -1, "filename": "typical-1.4.0.tar.gz", "has_sig": false, "md5_digest": "a1f27a8ab523969ae95e97d01f81262d", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 17769, "upload_time": "2019-06-20T17:55:02", "url": "https://files.pythonhosted.org/packages/c7/79/80f8210ddad973914c598927dc35eb4f9f6c10dc664f4a65709c1f70c86b/typical-1.4.0.tar.gz" } ], "1.4.1": [ { "comment_text": "", "digests": { "md5": "de487c387efac55d05880f4749aa2d79", "sha256": "29f2972b147d75ea8544bb9936371ade9fb1fe29830ecf893c6a08dd0d9d95ed" }, "downloads": -1, "filename": "typical-1.4.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "de487c387efac55d05880f4749aa2d79", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 14560, "upload_time": "2019-06-30T21:27:09", "url": "https://files.pythonhosted.org/packages/69/df/ea5189d2ec589f6e3f9346e25e4bc18cafbee55f58869933fa1b431ba820/typical-1.4.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b7ec1a6c76e72db57a22dacb1b8c09fe", "sha256": "77eec5d077a9ec677270e2a2fc6b0d3e16b9e4e1c3e5bde23448a1423cc96295" }, "downloads": -1, "filename": "typical-1.4.1.tar.gz", "has_sig": false, "md5_digest": "b7ec1a6c76e72db57a22dacb1b8c09fe", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 18131, "upload_time": "2019-06-30T21:27:12", "url": "https://files.pythonhosted.org/packages/ad/d7/5e0030f06a269d53888b0f8a5deeecf361de7f95bc35ecbb7636355cf011/typical-1.4.1.tar.gz" } ], "1.4.2": [ { "comment_text": "", "digests": { "md5": "bc17c9548d892856867fc53e1bab91bf", "sha256": "8594d3814bd05532f05a35af1fe4563702e4dac344f07a24b0a222b87c1a2f22" }, "downloads": -1, "filename": "typical-1.4.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "bc17c9548d892856867fc53e1bab91bf", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 14578, "upload_time": "2019-06-30T22:08:53", "url": "https://files.pythonhosted.org/packages/99/41/96b24933e118012bcd0d85ac231a03e991a5b324fabbd249ca9b8a416980/typical-1.4.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "22380126880cf5570ae4fe0e8fe8cae4", "sha256": "e93a6d4564ca6813352c8377182ef9de060b14185d5a7e4b5ded85c9c8355ded" }, "downloads": -1, "filename": "typical-1.4.2.tar.gz", "has_sig": false, "md5_digest": "22380126880cf5570ae4fe0e8fe8cae4", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 18148, "upload_time": "2019-06-30T22:08:54", "url": "https://files.pythonhosted.org/packages/78/f9/9911aad032b53b3fb5f62abbc89d32c6d05125b8a746b72c3a8519892029/typical-1.4.2.tar.gz" } ], "1.5.0": [ { "comment_text": "", "digests": { "md5": "37869f1f9000c5a3a897ba1a022c64ee", "sha256": "f203efc6565c69dc37be3d79871648c6445998482f73153ec8f380e7534e6a35" }, "downloads": -1, "filename": "typical-1.5.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "37869f1f9000c5a3a897ba1a022c64ee", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 14792, "upload_time": "2019-07-01T01:54:58", "url": "https://files.pythonhosted.org/packages/85/9b/5cd4b8f0692f4c4e5b03494c24aef4061397ccd56abfc80126b8129ab807/typical-1.5.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4c81a6d882b3d059fec5c2839e1efb00", "sha256": "e6e05ea84d1cf8ddc59b83d68e42218b9d07f2dda126d9ae71d9188ff097071d" }, "downloads": -1, "filename": "typical-1.5.0.tar.gz", "has_sig": false, "md5_digest": "4c81a6d882b3d059fec5c2839e1efb00", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 18364, "upload_time": "2019-07-01T01:54:59", "url": "https://files.pythonhosted.org/packages/e3/5a/241a501ec5fe18af71d0673d50af0a50676b2ee2530335be33ceec28266c/typical-1.5.0.tar.gz" } ], "1.5.1": [ { "comment_text": "", "digests": { "md5": "634cd2c24b2d6696d680d11f22b4d8e2", "sha256": "103ec39820f3eac5abbfaacd4ef03f0e2b0f82533691f29065cf84adf1a0a0c8" }, "downloads": -1, "filename": "typical-1.5.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "634cd2c24b2d6696d680d11f22b4d8e2", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 14808, "upload_time": "2019-07-01T12:36:42", "url": "https://files.pythonhosted.org/packages/31/8a/541b68d16f3bb0e9c9443db014b381d85cf60adb15524d95246af9d0bcd1/typical-1.5.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1f34a46f1d48aa2d53adb901a3643850", "sha256": "866ac2988bbcde897ec98d57d64adacc7ff9fcaa3b6737342eeb17cba6d339f6" }, "downloads": -1, "filename": "typical-1.5.1.tar.gz", "has_sig": false, "md5_digest": "1f34a46f1d48aa2d53adb901a3643850", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 18417, "upload_time": "2019-07-01T12:36:44", "url": "https://files.pythonhosted.org/packages/37/3a/6f4bfc989c78a544927fc866c1e2c8cd78ec7ab811dd75237ef161fb4ce2/typical-1.5.1.tar.gz" } ], "1.6.0": [ { "comment_text": "", "digests": { "md5": "f6e42370a94e23949f88c6c16f46a5be", "sha256": "0fd2b258157bb31e969954e7d15f17f5c9cfc4c628144bf5bdeb2e0133558f4f" }, "downloads": -1, "filename": "typical-1.6.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f6e42370a94e23949f88c6c16f46a5be", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 14803, "upload_time": "2019-07-01T15:19:10", "url": "https://files.pythonhosted.org/packages/94/ca/cf6009f4e344cd7f66f03cf741692e20bf8dd9563de47af9c63e0f69ec6d/typical-1.6.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c0c319fda103fd2885d83945820e2d57", "sha256": "b2b9f0cce8b21a805ffc7636570a4046217272c99cc91ea50f30aa922ca24e29" }, "downloads": -1, "filename": "typical-1.6.0.tar.gz", "has_sig": false, "md5_digest": "c0c319fda103fd2885d83945820e2d57", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 18436, "upload_time": "2019-07-01T15:19:11", "url": "https://files.pythonhosted.org/packages/45/96/fb2249993382310dd8a0f7886dca5c4d6366e39df5f0ddb5f573b30bde5e/typical-1.6.0.tar.gz" } ], "1.7.0": [ { "comment_text": "", "digests": { "md5": "ee6f53bde608d244562a0acd8186e96c", "sha256": "0109262a6d3ede52176a30a7feafa818127bf0a3124a719e109783f54ba8f8f6" }, "downloads": -1, "filename": "typical-1.7.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "ee6f53bde608d244562a0acd8186e96c", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 15537, "upload_time": "2019-07-02T15:04:55", "url": "https://files.pythonhosted.org/packages/2b/c9/369ed883e2b1d4f8a7136bd0985aeaa20490bc6cb06130cd253be61b1d13/typical-1.7.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "342dee31b2a9ae2a599216e9220ff7b4", "sha256": "8e209dc0b53c1ad6dee9f00b55bb66a85f02e3d13c2f3f80c99f65070a8b48c6" }, "downloads": -1, "filename": "typical-1.7.0.tar.gz", "has_sig": false, "md5_digest": "342dee31b2a9ae2a599216e9220ff7b4", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 19126, "upload_time": "2019-07-02T15:04:57", "url": "https://files.pythonhosted.org/packages/a1/fb/37ddcda69b0f9e604417b8d9213588f819881fc490e23a02a493beea1ea5/typical-1.7.0.tar.gz" } ], "1.8.0": [ { "comment_text": "", "digests": { "md5": "0b8eef68017dcf03a62af132b6d8d2d8", "sha256": "fb5edbc55373bdb58f5129d846dfc1165d3c48b9c674a479843ac0d31ae1c0c5" }, "downloads": -1, "filename": "typical-1.8.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "0b8eef68017dcf03a62af132b6d8d2d8", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 17366, "upload_time": "2019-07-03T19:32:27", "url": "https://files.pythonhosted.org/packages/99/6d/c9b4062f1288031f8f96964f88dedab9c201d3b0fe940c6a3f7ebdb7e485/typical-1.8.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8f6caf36c34f9a844a4c5a4cceaa2bfa", "sha256": "f4b4c6806542c0327f36b802b0ff8e9a7ef53f57b26c7c5e3310967408a5c6d3" }, "downloads": -1, "filename": "typical-1.8.0.tar.gz", "has_sig": false, "md5_digest": "8f6caf36c34f9a844a4c5a4cceaa2bfa", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 20582, "upload_time": "2019-07-03T19:32:29", "url": "https://files.pythonhosted.org/packages/41/7e/317bc4c55cc27318aca7d09ae1677e8b588b40591ddf5df4e4f90779a349/typical-1.8.0.tar.gz" } ], "1.9.0": [ { "comment_text": "", "digests": { "md5": "d87e46dc00884e79cd6012ddf4abba25", "sha256": "b50f26ce31287d05d2dc060b60d5e8e65f09c43fb3d7978f9f3e0a5b5a655c61" }, "downloads": -1, "filename": "typical-1.9.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d87e46dc00884e79cd6012ddf4abba25", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 18785, "upload_time": "2019-07-04T14:53:10", "url": "https://files.pythonhosted.org/packages/72/cb/4f0f202937f7360fabebc4d6fa94e0196a570a033dc459a49694f9466098/typical-1.9.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8b0d6eb04865fb33cfb17133d2ee7547", "sha256": "7cf84949be12ca8b853a14521dc804fc50c548e0d43bc18a5d644616ecafb4b1" }, "downloads": -1, "filename": "typical-1.9.0.tar.gz", "has_sig": false, "md5_digest": "8b0d6eb04865fb33cfb17133d2ee7547", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 20929, "upload_time": "2019-07-04T14:53:12", "url": "https://files.pythonhosted.org/packages/37/b0/bf056c0abdb331378d69c97bb4198945b8ec03ee5f8d3b8dc694bd5b8f61/typical-1.9.0.tar.gz" } ], "1.9.1": [ { "comment_text": "", "digests": { "md5": "acfd2ac1d0f02bc4186886dc931df1db", "sha256": "28ce1f6d9c0aaef65b9bf5536651539385ae7f55b5736099f077c3c39e2f7eb2" }, "downloads": -1, "filename": "typical-1.9.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "acfd2ac1d0f02bc4186886dc931df1db", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 18966, "upload_time": "2019-07-09T12:12:39", "url": "https://files.pythonhosted.org/packages/d8/93/a5268f24e190acae1681ccf099aa28c8837820d6ce1f19e6aa4cab6d2256/typical-1.9.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d4a9f2574dd1f11efec6489709e2a834", "sha256": "093e5ac7ec13f7d1b41cdb125e136a30abe6f6ffca6c8c5b1cdbc9a01ca34a89" }, "downloads": -1, "filename": "typical-1.9.1.tar.gz", "has_sig": false, "md5_digest": "d4a9f2574dd1f11efec6489709e2a834", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 21170, "upload_time": "2019-07-09T12:12:41", "url": "https://files.pythonhosted.org/packages/a0/9e/a12516dc43198f11c71838bae64921bbc44341f769e4dfe8530929fba14a/typical-1.9.1.tar.gz" } ], "1.9.2": [ { "comment_text": "", "digests": { "md5": "ff50a2b7e6fe8a2596848a48ab35b90c", "sha256": "bebd0132ebdec313d4c38573622c0b6391220bc002b474317227aa69935bca98" }, "downloads": -1, "filename": "typical-1.9.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "ff50a2b7e6fe8a2596848a48ab35b90c", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 19364, "upload_time": "2019-07-09T22:11:34", "url": "https://files.pythonhosted.org/packages/1b/02/6bb14a5cd2c18e9ce55b03ad97046880c2e9b3aebab253fb4b0dc9cf4f3d/typical-1.9.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "48925377651e31541f0ef7b3c7a9d644", "sha256": "a2a569f2e48b7475874faa315d498c4f29dda3817fcfad1c4ee42a41065b18b0" }, "downloads": -1, "filename": "typical-1.9.2.tar.gz", "has_sig": false, "md5_digest": "48925377651e31541f0ef7b3c7a9d644", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 21660, "upload_time": "2019-07-09T22:11:37", "url": "https://files.pythonhosted.org/packages/e9/3e/ad543594df67b23d82771dcdf48777b2c4748d8027fdd4d66324bbfd66ed/typical-1.9.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "a80091e89e59ad0a13524dcee38eff35", "sha256": "a2f52a63447bfc44bb4112fb08ce8b73b2b5379f99f3a6b9538ba0b0e2d240a1" }, "downloads": -1, "filename": "typical-1.10.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "a80091e89e59ad0a13524dcee38eff35", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 18552, "upload_time": "2019-07-20T00:03:59", "url": "https://files.pythonhosted.org/packages/98/0b/6172c5af704a1aae94ca9a27286637d21eacd4ec1242ea54aaf70c7673a8/typical-1.10.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "afa7eeb1af083ea0f0035d6016f1c764", "sha256": "707360d74f9e1379a5088e1150f298d8b03c22498c6cdee2a53f45cbdcf2bc0e" }, "downloads": -1, "filename": "typical-1.10.5.tar.gz", "has_sig": false, "md5_digest": "afa7eeb1af083ea0f0035d6016f1c764", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 22581, "upload_time": "2019-07-20T00:04:00", "url": "https://files.pythonhosted.org/packages/d4/f6/2620617c2b1bdfa157aaf8e2fb0b95da3d1d1f3a8452f27268c66d5f3543/typical-1.10.5.tar.gz" } ] }