{ "info": { "author": "Melissa Nuno", "author_email": "melissa@contains.io", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Software Development" ], "description": "Type[T]\n=======\n\n|PyPI| |Python Versions| |Build Status| |Coverage Status| |Code Quality|\n\n*Types that make coding in Python quick and safe.*\n\nType[T] works best with Python 3.6 or later. Prior to 3.6, object types must\nuse comment type hint syntax.\n\n\nInstallation\n------------\n\nInstall it using pip:\n\n::\n\n pip install typet\n\n\nFeatures\n--------\n\n- An Object base class that eliminates boilerplate code and verifies and\n coerces types when possible.\n- Validation types that, when instantiated, create an instance of a specific\n type and verify that they are within the user defined boundaries for the\n type.\n\n\nQuick Start: Creating a `Person`\n--------------------------------\n\nImport the Type[T] types that you will use.\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. code-block:: python\n\n from typet import Bounded, Object, String\n\n* `Object`, for composing complex objects\n* `Bound` to describe a type that validates its value is of the correct type and within bounds upon instantiation\n* `String`, which will validate that it is instantiated with a string with a length within the defined bounds.\n\nCreate Type Aliases That Describe the Intent of the Type\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. code-block:: python\n\n Age = Bounded[int, 0:150]\n Name = String[1:50]\n Hobby = String[1:300]\n\nIn this example, a `Person` has an `Age`, which is an integer between 0 and\n150, inclusive; a `Name` which must be a non-empty string with no more than\n50 characters; and finally, a `Hobby`, which is a non-empty string with no more\nthan 300 characters.\n\nCompose a `Person` object Using Type Aliases\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. code-block:: python\n\n class Person(Object):\n name: Name\n surname: Name\n age: Age\n hobby: Hobby = None\n\nAssigning a class attribute sets that value as the default value for instances\nof the `Object`. In this instance, `hobby` is assigned a default value of\n`None`; by convention, this tells Python that the type is `Optional[Hobby]`,\nand Type[T] will allow `None` in addition to strings of the correct length.\n\n\nPut It All Together\n~~~~~~~~~~~~~~~~~~~\n\n.. code-block:: python\n\n from typet import Bounded, Object, String\n\n Age = Bounded[int, 0:150]\n Name = String[1:50]\n Hobby = String[1:300]\n\n class Person(Object):\n name: Name\n surname: Name\n age: Age\n hobby: Hobby = None\n\n`Person` is now a clearly defined and typed object with an intuitive\nconstructor, hash method, comparison operators and bounds checking.\n\nPositional arguments will be in the order of the definition of class\nattributes, and keyword arguments are also acceptable.\n\n.. code-block:: python\n\n jim = Person('Jim', 'Coder', 23, 'Python')\n bob = Person('Robert', 'Coder', hobby='C++', age=51)\n\n\nPython 2.7 to 3.5\n~~~~~~~~~~~~~~~~~\n\nType[T] supports PEP 484 class comment type hints for defining an `Object`.\n\n.. code-block:: python\n\n from typing import Optional\n\n from typet import Bounded, Object, String\n\n Age = Bounded[int, 0:150]\n Name = String[1:50]\n Hobby = String[1:300]\n\n class Person(Object):\n name = None # type: Name\n surname = None # type: Name\n age = None # type: Age\n hobby = None # type: Optional[Hobby]\n\nNote that, because Python prior to 3.6 cannot annotate an attribute without\ndefining it, by convention, assigning the attribute to `None` will not imply\nthat it is optional; it must be specified explicitly in the type hint comment.\n\n\n`Object` Types\n--------------\n\n`Object`\n~~~~~~~~\n\nOne of the cooler features of Type[T] is the ability to create complex\nobjects with very little code. The following code creates an object that\ngenerates properties from the annotated class attributes that will ensure that\nonly values of *int* or that can be coerced into *int* can be set. It also\ngenerates a full suite of common comparison methods.\n\n.. code-block:: python\n\n from typet import Object\n\n class Point(Object):\n x: int\n y: int\n\nPoint objects can be used intuitively because they generate a standard\n`__init__` method that will allow positional and keyword arguments.\n\n.. code-block:: python\n\n p1 = Point(0, 0) # Point(x=0, y=0)\n p2 = Point('2', 2.5) # Point(x=2, y=2)\n p3 = Point(y=5, x=2) # Point(x=2, y=5)\n assert p1 < p2 # True\n assert p2 < p1 # AssertionError\n\n\nA close equivalent traditional class would be much larger, would have to be\nupdated for any new attributes, and wouldn't support more advanced casting,\nsuch as to types annotated using the typing_ module:\n\n.. code-block:: python\n\n class Point(object):\n\n def __init__(self, x, y):\n self.x = x\n self.y = y\n\n def __repr__(self):\n return 'Point(x={x}, y={y})'.format(x=self.x, y=self.y)\n\n def __setattr__(self, name, value):\n if name in ('x', 'y'):\n value = int(value)\n super(Point, self).__setattr__(name, value)\n\n def __eq__(self, other):\n if other.__class__ is not self.__class__:\n return NotImplemented\n return (self.x, self.y) == (other.x, other.y)\n\n def __ne__(self, other):\n if other.__class__ is not self.__class__:\n return NotImplemented\n return (self.x, self.y) != (other.x, other.y)\n\n def __lt__(self, other):\n if other.__class__ is not self.__class__:\n return NotImplemented\n return (self.x, self.y) < (other.x, other.y)\n\n def __le__(self, other):\n if other.__class__ is not self.__class__:\n return NotImplemented\n return (self.x, self.y) <= (other.x, other.y)\n\n def __gt__(self, other):\n if other.__class__ is not self.__class__:\n return NotImplemented\n return (self.x, self.y) > (other.x, other.y)\n\n def __ge__(self, other):\n if other.__class__ is not self.__class__:\n return NotImplemented\n return (self.x, self.y) >= (other.x, other.y)\n\n def __hash__(self):\n return hash((self.x, self.y))\n\n\nAttributes can be declared optional either manually, by using typing.Optional_\nor by using the PEP 484 implicit optional of a default value of `None`.\n\n.. code-block:: python\n\n from typing import Optional\n\n from typet import Object\n\n class Point(Object):\n x: Optional[int]\n y: int = None\n\n p1 = Point() # Point(x=None, y=None)\n p2 = Point(5) # Point(x=5, y=None)\n\n\n`StrictObject`\n~~~~~~~~~~~~~~\n\nBy default, `Object` will use `cast` from typingplus_ to attempt to coerce\nany values supplied to attributes to the annotated type. In some cases, it may\nbe preferred to disallow casting and only allow types that are already of the\ncorrect type. `StrictObject` has all of the features of `Object`, but will not\ncoerce values into the annotated type.\n\n.. code-block:: python\n\n from typet import StrictObject\n\n class Point(StrictObject):\n x: int\n y: int\n\n Point(0, 0) # Okay\n Point('2', 2.5) # Raises TypeError\n\n`StrictObject` uses `is_instance` from typingplus_ to check types, so it's\npossible to use types from the typing_ library for stricter checking.\n\n.. code-block:: python\n\n from typing import List\n\n from typet import StrictObject\n\n class IntegerContainer(StrictObject):\n integers: List[int]\n\n IntegerContainer([0, 1, 2, 3]) # Okay\n IntegerContainer(['a', 'b', 'c', 'd']) # Raises TypeError\n\n\nValidation Types\n----------------\n\nType[T] contains a suite of sliceable classes that will create bounded, or\nvalidated, versions of those types that always assert their values are within\nbounds; however, when an instance of a bounded type is instantiated, the\ninstance will be of the original type.\n\n`Bounded`\n~~~~~~~~~\n\n`Bounded` can be sliced with either two arguments or three. The first argument\nis the type being bound. The second is a `slice` containing the upper and lower\nbounds used for comparison during instantiation.\n\n.. code-block:: python\n\n from typet import Bounded\n\n BoundedInt = Bounded[int, 10:20]\n\n BoundedInt(15) # Okay\n type(x) # \n BoundedInt(5) # Raises ValueError\n\nOptionally, a third argument, a function, may be supplied that will be run on\nthe value before the comparison.\n\n.. code-block:: python\n\n from typet import Bounded\n\n LengthBoundedString = Bounded[str, 1:3, len]\n\n LengthBoundedString('ab') # Okay\n LengthBoundedString('') # Raises ValueError\n LengthBoundedString('abcd') # Raises ValueError\n\n\n`Length`\n~~~~~~~~\n\nBecause `len` is a common comparison method, there is a shortcut type, `Length`\nthat takes two arguments and uses `len` as the comparison method.\n\n.. code-block:: python\n\n from typing import List\n\n from typet import Length\n\n LengthBoundedList = Length[List[int], 1:3]\n\n LengthBoundedList([1, 2]) # Okay\n LengthBoundedList([]) # Raises ValueError\n LengthBoundedList([1, 2, 3, 4]) # Raises ValueError\n\n\n`String`\n~~~~~~~~\n\n`str` and `len` are commonly used together so a special type, `String`, has\nbeen added to simplify binding strings to specific lengths.\n\n.. code-block:: python\n\n from typet import String\n\n ShortString = String[1:3]\n\n ShortString('ab') # Okay\n ShortString('') # Raises ValueError\n ShortString('abcd') # Raises ValueError\n\nNote that, on Python 2, `String` instantiates `unicode` objects and not `str`.\n\n\nMetaclasses and Utilities\n-------------------------\n\nSingleton\n~~~~~~~~~\n\n`Singleton` will cause a class to allow only one instance.\n\n.. code-block:: python\n\n from typet import Singleton\n\n class Config(metaclass=Singleton):\n pass\n\n c1 = Config()\n c2 = Config()\n assert c1 is c2 # Okay\n\n`Singleton` supports an optional `__singleton__` method on the class that will\nallow the instance to update if given new parameters.\n\n.. code-block:: python\n\n from typet import Singleton\n\n class Config(metaclass=Singleton):\n\n def __init__(self, x):\n self.x = x\n\n def __singleton__(self, x=None):\n if x:\n self.x = x\n\n c1 = Config(1)\n c1.x # 1\n c2 = Config() # Okay because __init__ is not called.\n c2.x # 1\n c3 = Config(3) # Calls __singleton__ if it exists.\n c1.x # 3\n c2.x # 3\n c3.x # 3\n assert c1 is c2 is c3 # Okay\n\n\n@singleton\n~~~~~~~~~~\n\nAdditionally, there is a decorator, `@singleton` that can be used make a class\na singleton, even if it already uses another metaclass. This is convenient for\ncreating singleton Objects.\n\n.. code-block:: python\n\n from typet import Object, singleton\n\n @singleton\n class Config(Object):\n x: int\n\n c1 = Config(1)\n c2 = Config() # Okay because __init__ is not called.\n assert c1 is c2 # Okay\n\n\n@metaclass\n~~~~~~~~~~\n\nType[T] contains a class decorator, `@metaclass`, that will create a derivative\nmetaclass from the given metaclasses and the metaclass used by the decorated\nclass and recreate the class with the derived metaclass.\n\nMost metaclasses are not designed to be used in such a way, so careful testing\nmust be performed when this decorator is to be used. It is primarily intended\nto ease use of additional metaclasses with Objects.\n\n.. code-block:: python\n\n from typet import metaclass, Object, Singleton\n\n @metaclass(Singleton)\n class Config(Object):\n x: int\n\n c1 = Config(1)\n c2 = Config() # Okay because __init__ is not called.\n assert c1 is c2 # Okay\n\n\n.. _typingplus: https://github.com/contains-io/typingplus/\n.. _typing: https://docs.python.org/3/library/typing.html\n.. _typing.Optional: https://docs.python.org/3/library/typing.html#typing.Optional\n\n.. |Build Status| image:: https://travis-ci.org/contains-io/typet.svg?branch=master\n :target: https://travis-ci.org/contains-io/typet\n.. |Coverage Status| image:: https://coveralls.io/repos/github/contains-io/typet/badge.svg?branch=master\n :target: https://coveralls.io/github/contains-io/typet?branch=master\n.. |PyPI| image:: https://img.shields.io/pypi/v/typet.svg\n :target: https://pypi.python.org/pypi/typet/\n.. |Python Versions| image:: https://img.shields.io/pypi/pyversions/typet.svg\n :target: https://pypi.python.org/pypi/typet/\n.. |Code Quality| image:: https://api.codacy.com/project/badge/Grade/dae19ee1767b492e8bdf5edb16409f65\n :target: https://www.codacy.com/app/contains-io/typet?utm_source=github.com&utm_medium=referral&utm_content=contains-io/typet&utm_campaign=Badge_Grade\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/contains-io/typet", "keywords": "typing", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "typet", "package_url": "https://pypi.org/project/typet/", "platform": "", "project_url": "https://pypi.org/project/typet/", "project_urls": { "Homepage": "https://github.com/contains-io/typet" }, "release_url": "https://pypi.org/project/typet/0.4.0/", "requires_dist": null, "requires_python": "", "summary": "A library of types that simplify working with typed Python.", "version": "0.4.0" }, "last_serial": 6005741, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "0798fafc10f6efab49b5fb4902622757", "sha256": "8dca54ec96b18aed08bfa5dcef7defed126d4ac58b52aa0d9d517f629ee85c9b" }, "downloads": -1, "filename": "typet-0.0.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "0798fafc10f6efab49b5fb4902622757", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 11792, "upload_time": "2017-11-12T11:19:08", "url": "https://files.pythonhosted.org/packages/35/40/e019d339b510c9276b11fd4ea5426b0bc66490899348734b95aa2a6f5f0c/typet-0.0.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3255a98c9781c9a3d44db430ceb64d9d", "sha256": "eecbb45bbaf3cf71f212cf78ac4c0fed4f662fbf3574a41bbbb23d7edee3db95" }, "downloads": -1, "filename": "typet-0.0.1.tar.gz", "has_sig": false, "md5_digest": "3255a98c9781c9a3d44db430ceb64d9d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12279, "upload_time": "2017-11-12T11:19:00", "url": "https://files.pythonhosted.org/packages/be/e7/9fb0b4b8d0f9c06ce5ebffbfab522b3160f3e6075b5eda4987bb390594f0/typet-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "0cd7d0dce24a29ab73e84a36dcf9047d", "sha256": "ffa56a3cb682b0cf475950de781f5fdf9ad9fe4d9be018335ca3e0ebba7aeb6b" }, "downloads": -1, "filename": "typet-0.0.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "0cd7d0dce24a29ab73e84a36dcf9047d", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 13240, "upload_time": "2017-11-12T19:20:53", "url": "https://files.pythonhosted.org/packages/72/80/ac46a448d6fa8999076001c411c3eb089ab40aa34dc36ed57988cb2d7cd5/typet-0.0.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9e06dea96b569bb92c21df3ad95c1ae9", "sha256": "3bc40577418d146836ca2753cdf2be3c3564f2e1ac62ade868b358264fd01d43" }, "downloads": -1, "filename": "typet-0.0.2.tar.gz", "has_sig": false, "md5_digest": "9e06dea96b569bb92c21df3ad95c1ae9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13284, "upload_time": "2017-11-12T19:20:47", "url": "https://files.pythonhosted.org/packages/ab/47/aa774f09e53741d8a4e1326ca025b31a12f7aedcc6ee2d1c04286acf43a7/typet-0.0.2.tar.gz" } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "8e076f279c96d2a96bd69b1c6d120d7d", "sha256": "60ee1f4361236eccdd925a6ca6f730cbbef90eb6d292eee949da827ee8448b06" }, "downloads": -1, "filename": "typet-0.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "8e076f279c96d2a96bd69b1c6d120d7d", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 13844, "upload_time": "2017-11-20T08:49:33", "url": "https://files.pythonhosted.org/packages/46/75/25a45753f6e3bdf5fb57b88e94107395012eedf1bcb0ae12502400161ff8/typet-0.1.0-py2.py3-none-any.whl" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "4ed0cf194d17558eb5c9a53b72afb3f6", "sha256": "9f878889f6f35b4545ffcfa1cf78bb9b1e788643eeb11b36b3f1a0d5eabeef3e" }, "downloads": -1, "filename": "typet-0.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "4ed0cf194d17558eb5c9a53b72afb3f6", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 13857, "upload_time": "2017-11-20T08:59:21", "url": "https://files.pythonhosted.org/packages/72/8b/e5608155559f5afc3513ec1914ac952192665927eca76bc7b442ec65ab0b/typet-0.1.1-py2.py3-none-any.whl" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "0a03a6c9641654300c224a912b2d7ef7", "sha256": "072eb8c9d0de61191cbd651580d16f03f3c4594a5203718a615e1cee87ecb00a" }, "downloads": -1, "filename": "typet-0.2.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "0a03a6c9641654300c224a912b2d7ef7", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 16386, "upload_time": "2017-11-27T04:36:37", "url": "https://files.pythonhosted.org/packages/8a/2e/8fdd311dd6c7d6688a92e49e7fef0937db86eb34130e95ddf4311455dd8a/typet-0.2.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "61d5231984b49959f31e07170a356a5c", "sha256": "e18eeaab10876bdbe6bd3254dd1e52d593d4b1a8b1799dacd608b92c29e91ac5" }, "downloads": -1, "filename": "typet-0.2.0.tar.gz", "has_sig": false, "md5_digest": "61d5231984b49959f31e07170a356a5c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14953, "upload_time": "2017-11-27T04:36:36", "url": "https://files.pythonhosted.org/packages/20/7c/8b765e8fcafeeea12e01a6813e19a39cbd5e74197335be55e6fabe8eb43f/typet-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "a40dab58bc56ef374852acc203eed763", "sha256": "854aa1acd83d2a150eeef16dd8ac0dbcbdcd53d5b4355835e8a383e679839465" }, "downloads": -1, "filename": "typet-0.2.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "a40dab58bc56ef374852acc203eed763", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 16567, "upload_time": "2017-11-28T07:25:37", "url": "https://files.pythonhosted.org/packages/a3/f3/d90a2445e74e58b4bd5b8593ebb389bd0339124ea56a33f3efafdce0bfba/typet-0.2.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ca4fa8863c06cd94bb79713c6fea4126", "sha256": "591f8ebe7a1e8eaa140476b5366c3a848763306cb33edfa6d4ce4af19adb0fc9" }, "downloads": -1, "filename": "typet-0.2.1.tar.gz", "has_sig": false, "md5_digest": "ca4fa8863c06cd94bb79713c6fea4126", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14939, "upload_time": "2017-11-28T07:25:34", "url": "https://files.pythonhosted.org/packages/6b/06/a7a4989102f7115b101d5457275c9edbd627df110875cf17631fabbbf588/typet-0.2.1.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "3a26716d6d96f9612bc9ca3daa1c6343", "sha256": "5d3231eb0a3df04f2baae62787318ba2b641a7b00516b1c4482d9040050e083c" }, "downloads": -1, "filename": "typet-0.3.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "3a26716d6d96f9612bc9ca3daa1c6343", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 17621, "upload_time": "2017-11-30T15:44:43", "url": "https://files.pythonhosted.org/packages/94/1e/1f37a89f60aff38e003c0b62164c13785101d6887b11cacfadfb39cc7c3a/typet-0.3.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c74e9ffa44a1e8eb87d28760a6b5f105", "sha256": "0137db856bb2b4b9b13b3b8744a8041940d7791ed6b1ce974778a24057165c07" }, "downloads": -1, "filename": "typet-0.3.0.tar.gz", "has_sig": false, "md5_digest": "c74e9ffa44a1e8eb87d28760a6b5f105", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15746, "upload_time": "2017-11-30T15:44:41", "url": "https://files.pythonhosted.org/packages/60/c0/0f5c1ad34064599ecb16a8c8cd1413fe462113963116af623a843a4409d2/typet-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "939ed4cc9beeb92fea016f5fcf688b8b", "sha256": "6e80be43200c21c76aff1d8fbd9c4c68acbd5b77513c1305c973e7ace0081b0b" }, "downloads": -1, "filename": "typet-0.3.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "939ed4cc9beeb92fea016f5fcf688b8b", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 20343, "upload_time": "2017-12-03T11:22:46", "url": "https://files.pythonhosted.org/packages/3c/86/1fb56e354e848ac6d6e0ad7a029d0adf0c5b9d82ad8b506484b2ef96125e/typet-0.3.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9b5af77e483c2c343db9aaaab95bade4", "sha256": "df3c25a5367cdf6ecda3fdea2195cc0dd2e16937c84b2e8ded2ab73929b5ea88" }, "downloads": -1, "filename": "typet-0.3.1.tar.gz", "has_sig": false, "md5_digest": "9b5af77e483c2c343db9aaaab95bade4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17535, "upload_time": "2017-12-03T11:22:45", "url": "https://files.pythonhosted.org/packages/38/ad/dfe145e41bc1013dfc5d034d675a1108d909344e466f8cb6a6ce0469b427/typet-0.3.1.tar.gz" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "bb581988ae135fbce420cec004b44a3f", "sha256": "6ba74ed9325c1961f63b32a040e64da905ee0b16a435071ad8e5c05f3fffc48d" }, "downloads": -1, "filename": "typet-0.3.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "bb581988ae135fbce420cec004b44a3f", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 21764, "upload_time": "2017-12-03T12:49:54", "url": "https://files.pythonhosted.org/packages/22/b7/69bfaf15c7ba32a51923e9b35a92cac7d7e84fe7bdb369d1f022f066ed2a/typet-0.3.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3ea65e22ce03ae0d2dc77af43213164c", "sha256": "b6ca97ed62df67f35186f6c9994bb8293a74b4ec5c3e9e810dbbba1cdf0c9232" }, "downloads": -1, "filename": "typet-0.3.2.tar.gz", "has_sig": false, "md5_digest": "3ea65e22ce03ae0d2dc77af43213164c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18592, "upload_time": "2017-12-03T12:49:52", "url": "https://files.pythonhosted.org/packages/28/25/ad8e9fa54a9fc063d849e0f05d1d6d8413262afa7afaec63b09b44d8bfd8/typet-0.3.2.tar.gz" } ], "0.3.3": [ { "comment_text": "", "digests": { "md5": "6f66e9cd302120d50799da643c6c6cae", "sha256": "163e42ff54a741dd3fd9066e64775c8858eeb1862b4121abed241b94129c773f" }, "downloads": -1, "filename": "typet-0.3.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "6f66e9cd302120d50799da643c6c6cae", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 21858, "upload_time": "2017-12-21T04:21:04", "url": "https://files.pythonhosted.org/packages/ea/41/4317850a82b0183ff79068956d2b38958e131099b28b3f85f82db02760e1/typet-0.3.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "41dcf7a93bea0001ff1d766df8a026ff", "sha256": "a8e5241d1267bc6e0a82c2d4a909bdc78516d49504230f370db8e79af47441b3" }, "downloads": -1, "filename": "typet-0.3.3.tar.gz", "has_sig": false, "md5_digest": "41dcf7a93bea0001ff1d766df8a026ff", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18718, "upload_time": "2017-12-21T04:21:02", "url": "https://files.pythonhosted.org/packages/2c/02/e0e4b1d6da6c460930f2d062eaff02c9f2f3178cee6b127b6d81bd8c804c/typet-0.3.3.tar.gz" } ], "0.3.4": [ { "comment_text": "", "digests": { "md5": "582156cf48dfa644aa6f9c56464e7098", "sha256": "4e437ee6e6dc6f415715bb49326c100f6a3a3d94077bebfd2fa16c8af92e1f41" }, "downloads": -1, "filename": "typet-0.3.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "582156cf48dfa644aa6f9c56464e7098", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 21862, "upload_time": "2018-01-07T19:53:16", "url": "https://files.pythonhosted.org/packages/fa/d0/fffa38360022f36a2523d8b935792dc197e0ea3969d05a6c7bbcb3813190/typet-0.3.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "546b2fd1aee46a7cdd14e5cb2b51621b", "sha256": "1e7cf80ae4792b60fc4cc032e921bbc94b0064591699f14a190efa62d032a22a" }, "downloads": -1, "filename": "typet-0.3.4.tar.gz", "has_sig": false, "md5_digest": "546b2fd1aee46a7cdd14e5cb2b51621b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18738, "upload_time": "2018-01-07T19:53:13", "url": "https://files.pythonhosted.org/packages/cb/25/773a2286a90cfda470262c308c1763980eb719ed436ae0cc4d04be564579/typet-0.3.4.tar.gz" } ], "0.3.5": [ { "comment_text": "", "digests": { "md5": "21126bbd645d6e0276271c18d1f4c980", "sha256": "e2a97e172c71c2b33dc8067715a0d4eff86cf8506b623e811cac2951dbbc548a" }, "downloads": -1, "filename": "typet-0.3.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "21126bbd645d6e0276271c18d1f4c980", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 21861, "upload_time": "2018-01-11T10:29:01", "url": "https://files.pythonhosted.org/packages/e6/a2/e60c7f78705a579d54a17fa5b685e7443aa2cdfa4246afa3cc3013e5cdbc/typet-0.3.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "75d2cdeeb53c7d4af73d50d2eeaf2411", "sha256": "876675518a1690207b82674bb302317883603b5adc4587924b333cddab34c0a6" }, "downloads": -1, "filename": "typet-0.3.5.tar.gz", "has_sig": false, "md5_digest": "75d2cdeeb53c7d4af73d50d2eeaf2411", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18743, "upload_time": "2018-01-11T10:28:59", "url": "https://files.pythonhosted.org/packages/ae/aa/e0cdbf980c3faa43f73e23fd8a799e55dfcb8f13a29c89e494cd01c3c68b/typet-0.3.5.tar.gz" } ], "0.3.6": [ { "comment_text": "", "digests": { "md5": "91de6053c5547782a8dc6b8f93003558", "sha256": "ad56c4551d36a184f8b291dfa36b897e0f423b5fa5b267416d56dfb0f43bc031" }, "downloads": -1, "filename": "typet-0.3.6-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "91de6053c5547782a8dc6b8f93003558", "packagetype": "bdist_wheel", "python_version": "3.7", "requires_python": null, "size": 17897, "upload_time": "2018-10-11T02:16:34", "url": "https://files.pythonhosted.org/packages/10/7e/aa7d8b809de2e81bc1649165e0377b63dc793a305c470a0726d1f53bfe16/typet-0.3.6-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "064004468f6106b3dbe6329ae8eb73df", "sha256": "aacbb4c676714e6866a7a76e75710172ddb7f019e199ffb0470460aed4f3be81" }, "downloads": -1, "filename": "typet-0.3.6.tar.gz", "has_sig": false, "md5_digest": "064004468f6106b3dbe6329ae8eb73df", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22753, "upload_time": "2018-10-11T02:16:31", "url": "https://files.pythonhosted.org/packages/8d/3a/823fbfe0a0c4de28f8832444e8c672278a3c37dbfbaf0bb94293d2421aaa/typet-0.3.6.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "97492afb8a43cd6c6cf1f1de9cf3f1b9", "sha256": "049b765f59445ba278d57ca9f4ad1ea77b555484295db98df0e3050732fbc1a4" }, "downloads": -1, "filename": "typet-0.4.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "97492afb8a43cd6c6cf1f1de9cf3f1b9", "packagetype": "bdist_wheel", "python_version": "3.8", "requires_python": null, "size": 22773, "upload_time": "2019-10-21T06:41:24", "url": "https://files.pythonhosted.org/packages/f6/58/ebf6560d6e1c7f51e46c6de814366cce3e7cbcd01d88a9186fca4d74bb56/typet-0.4.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9ed96ba5f9878537d63bc6da6709792b", "sha256": "06924127019a77f4c7ca14c7789c122a60d0e74d1b2921c69e6f5ef4f61ca011" }, "downloads": -1, "filename": "typet-0.4.0.tar.gz", "has_sig": false, "md5_digest": "9ed96ba5f9878537d63bc6da6709792b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27816, "upload_time": "2019-10-21T06:39:12", "url": "https://files.pythonhosted.org/packages/90/be/b63726c5c2d4ef0bece9c410a097f182a2dc718c0213f11aaa0554a4bb7b/typet-0.4.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "97492afb8a43cd6c6cf1f1de9cf3f1b9", "sha256": "049b765f59445ba278d57ca9f4ad1ea77b555484295db98df0e3050732fbc1a4" }, "downloads": -1, "filename": "typet-0.4.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "97492afb8a43cd6c6cf1f1de9cf3f1b9", "packagetype": "bdist_wheel", "python_version": "3.8", "requires_python": null, "size": 22773, "upload_time": "2019-10-21T06:41:24", "url": "https://files.pythonhosted.org/packages/f6/58/ebf6560d6e1c7f51e46c6de814366cce3e7cbcd01d88a9186fca4d74bb56/typet-0.4.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9ed96ba5f9878537d63bc6da6709792b", "sha256": "06924127019a77f4c7ca14c7789c122a60d0e74d1b2921c69e6f5ef4f61ca011" }, "downloads": -1, "filename": "typet-0.4.0.tar.gz", "has_sig": false, "md5_digest": "9ed96ba5f9878537d63bc6da6709792b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27816, "upload_time": "2019-10-21T06:39:12", "url": "https://files.pythonhosted.org/packages/90/be/b63726c5c2d4ef0bece9c410a097f182a2dc718c0213f11aaa0554a4bb7b/typet-0.4.0.tar.gz" } ] }