{
"info": {
"author": "",
"author_email": "",
"bugtrack_url": null,
"classifiers": [
"Development Status :: 2 - Pre-Alpha",
"Intended Audience :: Developers",
"License :: OSI Approved :: MIT License",
"Natural Language :: English",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 2.7",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.4",
"Programming Language :: Python :: 3.5",
"Programming Language :: Python :: 3.6",
"Programming Language :: Python :: 3.7"
],
"description": "
\n
\n
\n
\n\n
\n\n`Related` is a Python library for creating nested object models\nthat can be serialized to and de-serialized from\nnested python dictionaries.\nWhen paired with other libraries (e.g. [PyYAML]),\n`Related` object models can be used to convert to and from\nnested data formats (e.g. JSON, YAML).\n\nExample use cases for `related` object models include:\n\n* Configuration file reading and writing\n* REST API message response generation and request processing\n* Object-Document Mapping for a document store (e.g. MongoDB, elasticsearch)\n* Data import parsing or export generation\n\n
\n\n![flow-image]\n\n
\n\n# Requirements\n\n* Python (2.7, 3.5, 3.6)\n\n\n# Installation\n\nInstall using `pip`...\n\n pip install related\n\n\n# First Example\n\n```python\nimport related\n\n@related.immutable\nclass Person(object):\n first_name = related.StringField()\n last_name = related.StringField()\n\n@related.immutable\nclass RoleModels(object):\n scientists = related.SetField(Person)\n\npeople = [Person(first_name=\"Grace\", last_name=\"Hopper\"),\n Person(first_name=\"Katherine\", last_name=\"Johnson\"),\n Person(first_name=\"Katherine\", last_name=\"Johnson\")]\n\nprint(related.to_yaml(RoleModels(scientists=people)))\n```\n\nYields:\n\n```yaml\nscientists:\n- first_name: Grace\n last_name: Hopper\n- first_name: Katherine\n last_name: Johnson\n```\n\n\n# Second Example\n\nThe below example is based off of this [Docker Compose example].\nIt shows how a YAML file can be loaded into an object model, tested, and\nthen generated back into a string that matches the original YAML.\n\n```yaml\nversion: '2'\nservices:\n web:\n build: .\n ports:\n - 5000:5000\n volumes:\n - .:/code\n redis:\n image: redis\n```\n\nBelow is the `related` object model that represents the above configuration.\nNotice how the name-based mapping of services (i.e. web, redis) are\nrepresented by the model.\n\n\n```python\nimport related\n\n\n@related.immutable\nclass Service(object):\n name = related.StringField()\n image = related.StringField(required=False)\n build = related.StringField(required=False)\n ports = related.SequenceField(str, required=False)\n volumes = related.SequenceField(str, required=False)\n command = related.StringField(required=False)\n\n\n@related.immutable\nclass Compose(object):\n version = related.StringField(required=False, default=None)\n services = related.MappingField(Service, \"name\", required=False)\n```\n\nThe above yaml can then be loaded by using one of the convenience\nmethod and then round-tripped back to yaml to check that the format\nhas been maintained. The `related` module uses `OrderedDict` objects\nin order to maintain sort order by default.\n\n```python\nfrom os.path import join, dirname\n\nfrom model import Compose\nfrom related import to_yaml, from_yaml, to_model\n\nYML_FILE = join(dirname(__file__), \"docker-compose.yml\")\n\n\ndef test_compose_from_yml():\n original_yaml = open(YML_FILE).read().strip()\n yml_dict = from_yaml(original_yaml)\n compose = to_model(Compose, yml_dict)\n\n assert compose.version == '2'\n assert compose.services['web'].ports == [\"5000:5000\"]\n assert compose.services['redis'].image == \"redis\"\n\n generated_yaml = to_yaml(compose,\n suppress_empty_values=True,\n suppress_map_key_values=True).strip()\n\n assert original_yaml == generated_yaml\n```\n\n\n# More Examples\n\nMore examples can be found by reviewing the [tests/] folder of this project.\nBelow are links and descriptions of the tests provided so far.\n\n| Example | description |\n| -------------- | ------------------------------------------------------------------ |\n| [Example 00] | First example above that shows how SetFields work. |\n| [Example 01] | Second example above that demonstrates YAML (de)serialization. |\n| [Example 02] | Compose v3 with long-form ports and singledispatch to_dict |\n| [Example 03] | A single class (Company) with a bunch of value fields. |\n| [Example 04] | A multi-class object model with Enum class value field. |\n| [Example 05] | Handling of renaming of attributes including Python keywords. |\n| [Example 06] | Basic JSON (de)serialization with TimeField, DateTimeField and DecimalField. |\n| [Example 07] | Function decorator that converts inputs to obj and outputs to dict |\n| [Example 08] | Handle self-referencing and out-of-order references using strings. |\n\n\n# Documentation\n\nBelow is a quick version of documentation until more time can be dedicated.\n\n\n## Overview\n\nThe [attrs] library is the underlying engine for `related`.\nAs explained in [this article by Glyph],\n`attrs` cleanly and cleverly\neliminates a lot of the boilerplate\nrequired when creating Python classes\nwithout using inheritance.\nSome core functionality provided by attrs:\n\n* Generated initializer method\n (``__init__``)\n* Generated comparison methods\n (``__eq__``, ``__ne__``, ``__lt__``, ``__le__``, ``__gt__``, ``__ge__`` )\n* Human-readable representation method\n (``__repr__``)\n* Attribute converter and validator framework\n\n\nThe `related` project is an opinionated layer\nbuilt on top of the `attrs` library\nthat provides the following:\n\n* Value fields that handle both validation and conversion\n to and from basic data types like\n ``str``, ``float``, and ``bool``.\n* Nested fields that support relationships such as\n Child, Sequences, Mappings, and Sets of objects.\n* ``to_dict`` function that converts nested object graphs\n to python dictionaries.\n Made customizable (without resorting to [monkey-patching])\n by the [singledispatch library].\n* ``to_model`` function that instantiated classes\n used by the de-serialization process going from\n python dictionaries to the related model.\n* Conversion helper functions\n (``to_yaml``, ``from_yaml``, ``to_json``, ``from_json``)\n for easily going between\n related models and data formats.\n* ``@mutable`` and ``@immutable`` for decorating classes\n as related models without the need for inheritance increasing\n maintainability and flexibility.\n\n\n## Class Decorators\n\n| decorator | description |\n| -------------- | ---------------------------------------------------------------- |\n| @mutable | Activate a related class that instantiates changeable objects. |\n| @immutable | Activate a related class that instantiates unchangeable objects. |\n\nSee the [decorators.py] file to view the source code until proper\ndocumentation is generated.\n\n\n## Field Types\n\n| field type | description |\n| -------------- | ---------------------------------------------------------------- |\n| BooleanField | `bool` value field. |\n| ChildField | Child object of a specified type `cls`. |\n| DateField | `date` field formatted using `formatter`. |\n| DateTimeField | `datetime` field formatted using `formatter`. |\n| TimeField | `time` field formatted using `formatter`. |\n| FloatField | `float` value field. |\n| IntegerField | `int` value field. |\n| MappingField(cls,key) | Dictionary of objects of type `cls` index by `key` field values. |\n| RegexField(regex) | `str` value field that is validated by re.match(`regex`). |\n| SequenceField(cls) | List of objects all of specified type `cls`. |\n| SetField | Set of objects all of a specified type `cls`. |\n| StringField | `str` value field. |\n| URLField | [ParseResult] object. |\n| UUIDField | [UUID] object, will create [uuid4] by default if not specified. |\n\n\nAdding your own field types is fairly straightforward\ndue to the power of the underlying `attrs` project.\nSee the [fields.py] file to see how the above are constructed.\n\n\n## Functions\n\n| function | description |\n| ------------------- | ----------------------------------------------------- |\n| from_json(s,cls) | Convert a JSON string or stream into specified class. |\n| from_yaml(s,cls) | Convert a YAML string or stream into specified class. |\n| is_related(obj) | Returns True if object is @mutable or @immutable. |\n| to_dict(obj) | Singledispatch function for converting to a dict. |\n| to_json(obj) | Convert object to a (pretty) JSON string via to_dict. |\n| to_model(cls,value) | Convert a value to a `cls` instance. |\n| to_yaml(obj) | Convert object to a YAML string via to_dict. |\n\n\nSee the [functions.py] file to view the source code until proper\ndocumentation is generated.\n\n\n# Credits/Prior Art\n\nThe `related` project has been heavily influenced by the following\nprojects that might be worth looking at if `related` doesn't meet your needs.\n\n* [attrs] - The engine that powers `related` functionality.\n* [Django ORM] - Object-relational mapping for Django that inspired `related's` design.\n* [cattrs] - Alternative take for handling nested-objects using `attrs`.\n* [addict] and [box] - Python dictionary wrappers that do not require a model.\n* [Jackson] - Java-based technology for serializing and de-serializing objects.\n\n\n# License\n\nThe MIT License (MIT)\nCopyright (c) 2017 [Ian Maurer], [Genomoncology LLC]\n\n\n\n\n[flow-image]: ./.images/flow.png\n[decorators.py]: ./src/related/decorators.py\n[fields.py]: ./src/related/fields.py\n[functions.py]: ./src/related/functions.py\n[attrs]: http://attrs.readthedocs.io/en/stable/\n[this article by Glyph]: https://glyph.twistedmatrix.com/2016/08/attrs.html\n[Genomoncology LLC]: http://genomoncology.com\n[Ian Maurer]: https://github.com/imaurer\n[singledispatch library]: https://pypi.python.org/pypi/singledispatch\n[monkey-patching]: http://stackoverflow.com/questions/5626193/what-is-a-monkey-patch\n[Django ORM]: https://docs.djangoproject.com/en/1.11/topics/db/models/\n[UUID]: https://docs.python.org/3/library/uuid.html#uuid.UUID\n[uuid4]: https://docs.python.org/3/library/uuid.html#uuid.uuid4\n[ParseResult]: https://docs.python.org/2/library/urlparse.html#urlparse.ParseResult\n[cattrs]: http://cattrs.readthedocs.io/en/latest/readme.html\n[addict]: https://github.com/mewwts/addict\n[box]: https://pypi.python.org/pypi/python-box\n[Jackson]: https://github.com/FasterXML/jackson\n[Docker Compose example]: https://docs.docker.com/compose/gettingstarted/#step-3-define-services-in-a-compose-file\n[PyYAML]: https://pypi.python.org/pypi/PyYAML\n\n[tests/]: ./tests/\n[Example 00]: ./tests/ex00_sets_hashes\n[Example 01]: ./tests/ex01_compose_v2\n[Example 02]: ./tests/ex02_compose_v3.2\n[Example 03]: ./tests/ex03_company\n[Example 04]: ./tests/ex04_contact\n[Example 05]: ./tests/ex05_field_names\n[Example 06]: ./tests/ex06_json\n[Example 07]: ./tests/ex07_serializer\n[Example 08]: ./tests/ex08_self_reference\n\n\n0.7.1 (2018-10-13)\n------------------\n- Add URL to related pypi page [#28]\n- Make singledispatch an optional dependency for < python 3.4. Thanks [GhostofGoes].\n- URLField bug [#20]\n- Deprecation warnings fixed for python 3.7 [#27]\n\n\n0.6.2 (2018-02-12)\n----------------\n- Contribution [GabrielDav]: TimeField and DateTimeField fields.\n\n\n0.6.1 (2018-01-31)\n----------------\n- Strict Mode [Issue #8] throws an exception when receiving an undefined key.\n\n\n0.3 (2017-06-23)\n----------------\n- New type: ImmutableDict\n- Add function on TypedMapping\n- Bug fixes in from_yaml and from_json functions.\n\n\n0.2 (2017-06-05)\n----------------\n- Allow None by default in Typed Collections.\n\n\n0.1 (2017-05-24)\n----------------\n- Initial release.\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/genomoncology/related",
"keywords": "related object models yaml json dict nested",
"license": "MIT license",
"maintainer": "",
"maintainer_email": "",
"name": "related",
"package_url": "https://pypi.org/project/related/",
"platform": "",
"project_url": "https://pypi.org/project/related/",
"project_urls": {
"Homepage": "https://github.com/genomoncology/related"
},
"release_url": "https://pypi.org/project/related/0.7.2/",
"requires_dist": [
"attrs",
"PyYAML",
"future",
"python-dateutil",
"singledispatch; python_version < \"3.4\""
],
"requires_python": "",
"summary": "Related: Straightforward nested object models in Python",
"version": "0.7.2"
},
"last_serial": 4599905,
"releases": {
"0.0.1": [
{
"comment_text": "",
"digests": {
"md5": "6d0b5d60f6e3e33a30f0ac0b7560f637",
"sha256": "0d96e23f64f9c3dba77653a4154824e609b6d4d1155adbb23a71e771efabb976"
},
"downloads": -1,
"filename": "related-0.0.1-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "6d0b5d60f6e3e33a30f0ac0b7560f637",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 3300,
"upload_time": "2017-05-02T21:34:53",
"url": "https://files.pythonhosted.org/packages/60/63/4a6a5dc2b5e3f6781c46c57ccadc97ea8d4c1c85afafd815856024872865/related-0.0.1-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "54467f51f2560adf753fb468d69e668a",
"sha256": "16bea90bacd5b82eeb59150c5aa7430a467f4ced24a90c08b378f29c3f5a3357"
},
"downloads": -1,
"filename": "related-0.0.1.tar.gz",
"has_sig": false,
"md5_digest": "54467f51f2560adf753fb468d69e668a",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 11147,
"upload_time": "2017-05-02T21:34:56",
"url": "https://files.pythonhosted.org/packages/13/c6/03eb5b5d15a6fd1882cca0f86dada5ac53b597a918cac7a6de36488475ec/related-0.0.1.tar.gz"
}
],
"0.0.2": [
{
"comment_text": "",
"digests": {
"md5": "0fbb5a97cb8d2cfbc4fb0b4507263741",
"sha256": "f4f44d88e33857a6c7e152e7b552ec98cf1d13ce690396100f0703a6d0e26cb6"
},
"downloads": -1,
"filename": "related-0.0.2-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "0fbb5a97cb8d2cfbc4fb0b4507263741",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 18223,
"upload_time": "2017-05-24T12:35:45",
"url": "https://files.pythonhosted.org/packages/e5/2e/79686cba1c5d9870ee4635615e440bd0d913119c9655e84f6843700fe202/related-0.0.2-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "67fafb984e51ba58e869dac017fa44b5",
"sha256": "b03e97dc24ecec4b5dca03f1eafb84e7d10aafd2053b034239dc6dd77ffa3711"
},
"downloads": -1,
"filename": "related-0.0.2.tar.gz",
"has_sig": false,
"md5_digest": "67fafb984e51ba58e869dac017fa44b5",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 20891,
"upload_time": "2017-05-24T12:35:47",
"url": "https://files.pythonhosted.org/packages/26/4b/d4ff040ccd96f0515dfa172354998c85219ef95ea3161d4acb31737b8b7f/related-0.0.2.tar.gz"
}
],
"0.1": [
{
"comment_text": "",
"digests": {
"md5": "dfec2886d914c1e451efeede2a1511d6",
"sha256": "510be2eb375b832bcd5ffb7573d54a987cc8b6c41e17a909c0d7cb1a02f48e39"
},
"downloads": -1,
"filename": "related-0.1-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "dfec2886d914c1e451efeede2a1511d6",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 18187,
"upload_time": "2017-05-24T12:35:46",
"url": "https://files.pythonhosted.org/packages/60/63/62ae8aae6bebc8bc43640df693869d61fb432f3c72b7c924cea79549a3f8/related-0.1-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "70f25d67efbf19ae4c73212caf715390",
"sha256": "6d1f9534b319ceebc226599f8ae887bd83a60389d9898900870c1a96d6458576"
},
"downloads": -1,
"filename": "related-0.1.tar.gz",
"has_sig": false,
"md5_digest": "70f25d67efbf19ae4c73212caf715390",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 20853,
"upload_time": "2017-05-24T12:35:48",
"url": "https://files.pythonhosted.org/packages/99/d0/10cac40a74766266f92763d18a93c4f89707edf458fbb0191d8477ae049d/related-0.1.tar.gz"
}
],
"0.2": [
{
"comment_text": "",
"digests": {
"md5": "b7e1a11dc2ac2095cdef112885eb49fb",
"sha256": "d2e94569359aaba654ae6c9ba2add7ff5542af578e3e1d1489f41388cdf0e1d1"
},
"downloads": -1,
"filename": "related-0.2-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "b7e1a11dc2ac2095cdef112885eb49fb",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 18283,
"upload_time": "2017-06-05T19:55:01",
"url": "https://files.pythonhosted.org/packages/fd/6c/fac0d0835e9346319a761979aebb9e4a2c25305777664506aced7a34fa34/related-0.2-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "7ff4e0f552ded53fc894f7d09fefce11",
"sha256": "9a1a9c73384629f5791ccad2ca75036f0b97cb71c9491be55b030970bfb5c24e"
},
"downloads": -1,
"filename": "related-0.2.tar.gz",
"has_sig": false,
"md5_digest": "7ff4e0f552ded53fc894f7d09fefce11",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 20946,
"upload_time": "2017-06-05T19:55:03",
"url": "https://files.pythonhosted.org/packages/ae/d2/30a340c859bae70f5703e0a43d0f91bd8a28bc961f75b250cd2171cccc53/related-0.2.tar.gz"
}
],
"0.3": [
{
"comment_text": "",
"digests": {
"md5": "83f7f835fea6e4c629ade5801d301351",
"sha256": "53b686a95b2162379382bde9e2ba59f0578d1e7046db6d1b076c55735be477d7"
},
"downloads": -1,
"filename": "related-0.3-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "83f7f835fea6e4c629ade5801d301351",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 18605,
"upload_time": "2017-06-23T12:58:13",
"url": "https://files.pythonhosted.org/packages/77/26/fb219781c57bba599656f2651a4a97a882b1642486cbe308bdebaa070200/related-0.3-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "52ad68fad2ee93dfce4fd7459295b503",
"sha256": "22a20fa469fc0980e4f349f7d9bcbc8b0fed02c85e3aa0923f92518592f3a1e7"
},
"downloads": -1,
"filename": "related-0.3.tar.gz",
"has_sig": false,
"md5_digest": "52ad68fad2ee93dfce4fd7459295b503",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 21416,
"upload_time": "2017-06-23T12:58:14",
"url": "https://files.pythonhosted.org/packages/a3/48/18652a7e5405eaf584f205997ba78af83c6fb139d2e9a8b1431253c59a2c/related-0.3.tar.gz"
}
],
"0.4": [
{
"comment_text": "",
"digests": {
"md5": "a76b660c88e95da2a37b2ae7819a2e25",
"sha256": "0ac9c7439cd49b5ee45a2e168ba7085f8b08c31954e3163c1c1355f46d3c0f29"
},
"downloads": -1,
"filename": "related-0.4-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "a76b660c88e95da2a37b2ae7819a2e25",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 18651,
"upload_time": "2017-07-07T17:26:46",
"url": "https://files.pythonhosted.org/packages/7d/4a/b8755dbdbc25575a934ff87dd65145620877925aa2749f643b1df2da50d1/related-0.4-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "410b56bba8d0942171b55c52ab5b3f61",
"sha256": "22b765882fb9f8c402971d7f5295aec9d95614d756271e701705376995b52927"
},
"downloads": -1,
"filename": "related-0.4.tar.gz",
"has_sig": false,
"md5_digest": "410b56bba8d0942171b55c52ab5b3f61",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 21470,
"upload_time": "2017-07-07T17:26:47",
"url": "https://files.pythonhosted.org/packages/9e/36/feada72c60ffa4c56380e57e66575b7f46542b9b2eab998ebec399a39fcf/related-0.4.tar.gz"
}
],
"0.5": [
{
"comment_text": "",
"digests": {
"md5": "9e3cbdd3bf46983dd98351b80fa96966",
"sha256": "d78f775635a89a45ae2d0030729f621e1ab45dd13c52b9b5eeb4799304582391"
},
"downloads": -1,
"filename": "related-0.5-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "9e3cbdd3bf46983dd98351b80fa96966",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 18692,
"upload_time": "2017-09-28T17:27:13",
"url": "https://files.pythonhosted.org/packages/50/2f/e039c88a015b0fd610d4e964c1fded7f4071b3406ceacfcf71d6440c20c4/related-0.5-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "56842c5b6d51eeb0bb88421f99171535",
"sha256": "f436a59ae1382e4921e290db86a2d3e705bd86eae08715f03cc6ce4903a74db7"
},
"downloads": -1,
"filename": "related-0.5.tar.gz",
"has_sig": false,
"md5_digest": "56842c5b6d51eeb0bb88421f99171535",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 21506,
"upload_time": "2017-09-28T17:27:16",
"url": "https://files.pythonhosted.org/packages/08/18/f3d00dd1a319fea8a237031f6ccb8f38cad6a13ad2f894fcdb747167b610/related-0.5.tar.gz"
}
],
"0.5.1": [
{
"comment_text": "",
"digests": {
"md5": "9cbb6d609aa7aad0166da7d425060382",
"sha256": "32a25b38e2241553d9aec48ab7dde4945321b17f285ae92a79bf86b8407107df"
},
"downloads": -1,
"filename": "related-0.5.1-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "9cbb6d609aa7aad0166da7d425060382",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 18862,
"upload_time": "2017-10-09T12:42:30",
"url": "https://files.pythonhosted.org/packages/a3/03/65fc54b859165bb13db96e59fc2a3205441caf34b9ff4fa7cdcbcb98cf17/related-0.5.1-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "39ee346d4a03edf7acfe47a22e135f89",
"sha256": "5dbfd5b4444a5b33c1bfec8fb761ca17689e178674c030e2e7f3522bed66dc48"
},
"downloads": -1,
"filename": "related-0.5.1.tar.gz",
"has_sig": false,
"md5_digest": "39ee346d4a03edf7acfe47a22e135f89",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 21654,
"upload_time": "2017-10-09T12:42:32",
"url": "https://files.pythonhosted.org/packages/0f/66/463b01df9228817c75bc4b22707f69d3685b591682940b990624193a67cf/related-0.5.1.tar.gz"
}
],
"0.5.2": [
{
"comment_text": "",
"digests": {
"md5": "ec49f06b0ce1d3abb97422df530682aa",
"sha256": "eabcfccc74546500e355171e35c8fdc8fcfc7048bc09c9333dc329ada4381300"
},
"downloads": -1,
"filename": "related-0.5.2-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "ec49f06b0ce1d3abb97422df530682aa",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 19140,
"upload_time": "2017-10-28T17:09:56",
"url": "https://files.pythonhosted.org/packages/00/c4/346ba1c78f57fc714a1523bbc74dc1ad6c728dda33a771d5a5dd3e31d26b/related-0.5.2-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "1516f76d8876e6718b0dd63bfc2f221b",
"sha256": "81f8895cd34e0065840a62bb2f9932b6dbe549cc934aa896599570509e4acd81"
},
"downloads": -1,
"filename": "related-0.5.2.tar.gz",
"has_sig": false,
"md5_digest": "1516f76d8876e6718b0dd63bfc2f221b",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 22408,
"upload_time": "2017-10-28T17:09:58",
"url": "https://files.pythonhosted.org/packages/83/5e/d451a61c40dece30f63b86e1f60872a474aae63a00b72d357dfa03aad42a/related-0.5.2.tar.gz"
}
],
"0.5.3": [
{
"comment_text": "",
"digests": {
"md5": "faace0f599cfb901472f518550c3ca85",
"sha256": "909f14d138f15be5cc123d5b494241e8f15f4c78737b67452c4ad526dc148c58"
},
"downloads": -1,
"filename": "related-0.5.3-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "faace0f599cfb901472f518550c3ca85",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 19136,
"upload_time": "2017-12-11T00:26:49",
"url": "https://files.pythonhosted.org/packages/d8/19/a751804d8dc719b79bc3cd7d697a1472d08f945043fa634d2ca6587c5fc7/related-0.5.3-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "b08c7f76f718c0cd0285668dc668b1c6",
"sha256": "82a699ef10af0230ebe6db4e00fdfbae0b5557dd61e48db3e4de5c302e6cb5db"
},
"downloads": -1,
"filename": "related-0.5.3.tar.gz",
"has_sig": false,
"md5_digest": "b08c7f76f718c0cd0285668dc668b1c6",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 22386,
"upload_time": "2017-12-11T00:26:51",
"url": "https://files.pythonhosted.org/packages/e3/43/b813caae830d51abc68063a702a6aec5e6edb076eb7d3a02c741a4f6a9f7/related-0.5.3.tar.gz"
}
],
"0.6.0": [
{
"comment_text": "",
"digests": {
"md5": "5efd3b4b1c470ca7c354f84884f08956",
"sha256": "3ece04d97e3ff9113e020cfe24fcabe35f0fbc1b4a62078553e3637f66ee47f5"
},
"downloads": -1,
"filename": "related-0.6.0-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "5efd3b4b1c470ca7c354f84884f08956",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 19079,
"upload_time": "2018-01-29T22:46:09",
"url": "https://files.pythonhosted.org/packages/5a/78/9157dd37d1ffeba89a5fc7f42f5205effff3075c025f1ddfa79f96884419/related-0.6.0-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "de9a5ed786586a21b4925ada7f6f29a4",
"sha256": "aa7980a74ac4739501401a48c808a48df53a85257e755c12cdce2511e0044491"
},
"downloads": -1,
"filename": "related-0.6.0.tar.gz",
"has_sig": false,
"md5_digest": "de9a5ed786586a21b4925ada7f6f29a4",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 22360,
"upload_time": "2018-01-29T22:46:11",
"url": "https://files.pythonhosted.org/packages/0f/28/4831adb1bdfb2dca8ec1d05614233d40ef16c510eb8a2fce4574eef88e58/related-0.6.0.tar.gz"
}
],
"0.6.1": [
{
"comment_text": "",
"digests": {
"md5": "84fae7c940fb74467ecbfb3284e7118a",
"sha256": "dc0b92ab98df7ef15ab2267d71893fc6a422b63474899b5fd671bf2312d8ec5d"
},
"downloads": -1,
"filename": "related-0.6.1-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "84fae7c940fb74467ecbfb3284e7118a",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 19208,
"upload_time": "2018-01-31T12:20:28",
"url": "https://files.pythonhosted.org/packages/34/ca/397ac0e855f88424fa67c3842a2f174cced3f4b95c2c1777d375c7ba86a0/related-0.6.1-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "4ca0f263ecc66663fe9bd5de7e8f6007",
"sha256": "44d09d4d770b46ce41b7a7b90fc972e4f5769762f7b954c496144bd15957e546"
},
"downloads": -1,
"filename": "related-0.6.1.tar.gz",
"has_sig": false,
"md5_digest": "4ca0f263ecc66663fe9bd5de7e8f6007",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 22699,
"upload_time": "2018-01-31T12:20:30",
"url": "https://files.pythonhosted.org/packages/a6/8b/23cea43b38065262e238533113b529233fb28d6f0e8b7031c75902c9e8e4/related-0.6.1.tar.gz"
}
],
"0.6.2": [
{
"comment_text": "",
"digests": {
"md5": "ef1e840dc287170c5b98d263c4db8183",
"sha256": "4ad8a01741c3726f334b56748bc6fb32e30c5d9389636eb8e15f0287f7864af7"
},
"downloads": -1,
"filename": "related-0.6.2-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "ef1e840dc287170c5b98d263c4db8183",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 19810,
"upload_time": "2018-02-12T13:06:42",
"url": "https://files.pythonhosted.org/packages/b5/8d/1b84e39f2e5019691cb044c7730a86a6140fd0161ad83d90cadd1e3fe4cc/related-0.6.2-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "50fcc28769e09fbd0ff0eeb0b163622f",
"sha256": "568461c3b1412777f7f950afa8e02b9813ac220839710ebc3d5bb63bff887ddb"
},
"downloads": -1,
"filename": "related-0.6.2.tar.gz",
"has_sig": false,
"md5_digest": "50fcc28769e09fbd0ff0eeb0b163622f",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 24033,
"upload_time": "2018-02-12T13:06:45",
"url": "https://files.pythonhosted.org/packages/f1/50/1d12eb7b9c32c61dca034b40f5d6c36612b003c1818db7aa1d03fc3de9a6/related-0.6.2.tar.gz"
}
],
"0.6.3": [
{
"comment_text": "",
"digests": {
"md5": "11788271e80b723463ef04561e0db2b4",
"sha256": "80e7b059b4b98ab3f13cf5c35d5e913cb328a98980e8c3d3154e1a292ce8defb"
},
"downloads": -1,
"filename": "related-0.6.3-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "11788271e80b723463ef04561e0db2b4",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 20358,
"upload_time": "2018-02-23T21:02:23",
"url": "https://files.pythonhosted.org/packages/1a/be/24b66a50eac18a453b7dae4768c7b4345599c3c6f64e5642326acc2697e1/related-0.6.3-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "cdc3ccd92cabc110d81920be9050b7aa",
"sha256": "0ad2e647da0f382ccc2c24b65562ae74ae849a1b007e74bb09e643ec465a17ce"
},
"downloads": -1,
"filename": "related-0.6.3.tar.gz",
"has_sig": false,
"md5_digest": "cdc3ccd92cabc110d81920be9050b7aa",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 25349,
"upload_time": "2018-02-23T21:02:25",
"url": "https://files.pythonhosted.org/packages/b8/b3/4d0463e74755f876d4da184e912d9f59115113505c14839382bbd23f59c3/related-0.6.3.tar.gz"
}
],
"0.7.0": [
{
"comment_text": "",
"digests": {
"md5": "5fa4ac6612b85a15ace4626f09d4c7ef",
"sha256": "b0deae9e9cf8c022a461b15e3aa402120a3c9d7f998afac3a25c25d231fe291f"
},
"downloads": -1,
"filename": "related-0.7.0-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "5fa4ac6612b85a15ace4626f09d4c7ef",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 15509,
"upload_time": "2018-08-25T12:01:08",
"url": "https://files.pythonhosted.org/packages/d0/58/89f6758fc3a253ded0992fed40c966644ad8ca209aa7ce160c5a93e0943c/related-0.7.0-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "294d2e839990ef1e6aa2be26a5671ee3",
"sha256": "c7b15946b3be041fb129f6be60e6a01e56eb7282ea1fed6396b686970320120b"
},
"downloads": -1,
"filename": "related-0.7.0.tar.gz",
"has_sig": false,
"md5_digest": "294d2e839990ef1e6aa2be26a5671ee3",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 26013,
"upload_time": "2018-08-25T12:01:09",
"url": "https://files.pythonhosted.org/packages/ce/74/90c5138e5ea192f166061846d0111fc1cd935ef109a60dcbc694c2fa584f/related-0.7.0.tar.gz"
}
],
"0.7.1": [
{
"comment_text": "",
"digests": {
"md5": "eec124d7d12e42d010fd5d66dc8cafce",
"sha256": "7eba6ed6201f5a4f5a2f926b5da9677db2410732c7e56516eb8715912248e652"
},
"downloads": -1,
"filename": "related-0.7.1-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "eec124d7d12e42d010fd5d66dc8cafce",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 15745,
"upload_time": "2018-10-13T15:30:44",
"url": "https://files.pythonhosted.org/packages/96/f1/fbe661f8490aefcc8da3acde3e6900541f948f4dda1853becf7a0e418a3e/related-0.7.1-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "a0a395971f3869982f50a6926d36b969",
"sha256": "05925e65a8f143826a8ff7fccfa2533cf1479386e1b3f98a844471db25943d48"
},
"downloads": -1,
"filename": "related-0.7.1.tar.gz",
"has_sig": false,
"md5_digest": "a0a395971f3869982f50a6926d36b969",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 26603,
"upload_time": "2018-10-13T15:30:45",
"url": "https://files.pythonhosted.org/packages/88/0d/a3b013d3d31eba06f46a1ec8a080491989eee71a841abf8c1d06360083e3/related-0.7.1.tar.gz"
}
],
"0.7.2": [
{
"comment_text": "",
"digests": {
"md5": "04b5cf907acd512d3c5c2b15e69bc482",
"sha256": "60b1d8b8c2f704c06af9f4e252450f085fe7ed9558946a5c4d56621164816e17"
},
"downloads": -1,
"filename": "related-0.7.2-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "04b5cf907acd512d3c5c2b15e69bc482",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 15803,
"upload_time": "2018-12-14T15:48:45",
"url": "https://files.pythonhosted.org/packages/23/6e/5419d1364d9c408cb4943d1301800bf88b8d91e034c355448b00440ca202/related-0.7.2-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "fbb07833a80008c8d5ff77265ef95765",
"sha256": "c345e6356875c45d3caa2b47db695081344da8eeaac98ad877675ceb1dc5a29d"
},
"downloads": -1,
"filename": "related-0.7.2.tar.gz",
"has_sig": false,
"md5_digest": "fbb07833a80008c8d5ff77265ef95765",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 27399,
"upload_time": "2018-12-14T15:48:46",
"url": "https://files.pythonhosted.org/packages/62/11/cf0a6f16ecd3d111c789612b986383cf0203ae7c141132e71cc45395c178/related-0.7.2.tar.gz"
}
]
},
"urls": [
{
"comment_text": "",
"digests": {
"md5": "04b5cf907acd512d3c5c2b15e69bc482",
"sha256": "60b1d8b8c2f704c06af9f4e252450f085fe7ed9558946a5c4d56621164816e17"
},
"downloads": -1,
"filename": "related-0.7.2-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "04b5cf907acd512d3c5c2b15e69bc482",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 15803,
"upload_time": "2018-12-14T15:48:45",
"url": "https://files.pythonhosted.org/packages/23/6e/5419d1364d9c408cb4943d1301800bf88b8d91e034c355448b00440ca202/related-0.7.2-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "fbb07833a80008c8d5ff77265ef95765",
"sha256": "c345e6356875c45d3caa2b47db695081344da8eeaac98ad877675ceb1dc5a29d"
},
"downloads": -1,
"filename": "related-0.7.2.tar.gz",
"has_sig": false,
"md5_digest": "fbb07833a80008c8d5ff77265ef95765",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 27399,
"upload_time": "2018-12-14T15:48:46",
"url": "https://files.pythonhosted.org/packages/62/11/cf0a6f16ecd3d111c789612b986383cf0203ae7c141132e71cc45395c178/related-0.7.2.tar.gz"
}
]
}