{ "info": { "author": "A. Tikhonov", "author_email": "17@itishka.org", "bugtrack_url": null, "classifiers": [ "Intended Audience :: Developers", "License :: OSI Approved :: Apache Software License", "Operating System :: OS Independent", "Programming Language :: Python :: 3" ], "description": "# dataclass_factory\n\n[![PyPI version](https://badge.fury.io/py/dataclass-factory.svg)](https://badge.fury.io/py/dataclass-factory)\n[![Build Status](https://travis-ci.org/Tishka17/dataclass_factory.svg?branch=master)](https://travis-ci.org/Tishka17/dataclass_factory)\n\n**dataclass_factory** is modern way to convert dataclasses or other objects to and from more common types like dicts\n\n## TL;DR\n\nInstall\n```bash\npip install dataclass_factory\n```\n\nUse\n```python\nfrom dataclasses import dataclass\nimport dataclass_factory\n\n\n@dataclass\nclass Book:\n title: str\n price: int\n author: str = \"Unknown author\"\n\n\ndata = {\n \"title\": \"Fahrenheit 451\",\n \"price\": 100,\n}\n\nfactory = dataclass_factory.Factory()\nbook: Book = factory.load(data, Book) # Same as Book(title=\"Fahrenheit 451\", price=100)\nserialized = factory.dump(book) \n``` \n\n* [Requirements](#requirements)\n* [Advantages](#advantages)\n* [Usage](#usage)\n * [Parsers and serializers](#parsers-and-serializers)\n * [Configuring](#configuring)\n * [More verbose errors](#more-verbose-errors)\n * [Schemas](#Schemas)\n * [Common schemas](#common-schemas)\n * [Name styles](#name-styles)\n * [Generic classes](#generic-classes)\n * [Structure flattening](#structure-flattening)\n * [Additional steps](#additional-steps)\n * [Schema inheritance](#schema-inheritance)\n* [Supported types](#supported-types)\n* [Updating from previous versions](#updating-from-previous-versions)\n\n## Requirements\n\n* python >= 3.6\n\nYou can use `dataclass_factory` with python 3.6 and `dataclass` library installed from pip. \n\nOn python 3.7 it has no external dependencies outside of the Python standard library.\n\n## Advantages\n\n* No schemas or configuration needed for simple cases. Just create `Factory` and call `load`/`dump` methods\n* Speed. It is up to 10 times faster than `marshmallow` and `dataclasses.asdict` (see [benchmarks](benchmarks))\n* Automatic name style conversion (e.g. `snake_case` to `CamelCase`)\n* Automatic skipping of \"internal use\" fields (with leading underscore)\n* Enums, typed dicts, tuples and lists are supported from the box\n* Unions and Optionals are supported without need to define them in schema\n* Generic dataclasses can be automatically parsed as well\n* Cyclic-referensed structures (such as linked-lists or trees) also can be converted\n\n## Usage\n\n### Parsers and serializers\n\nTo parse dict create `Factory`, get and use `parser` or just call `load` method \n\n```python\nfactory = Factory() # create it only once\nparser = factory.parser(Book) # save it to reuse multiple times\nbook = parser(data)\n# or \nbook = factory.load(data, Book) \n```\n\n**Important**:\nWhen parsing data of `Union` type parsing stops when no ValueError/TypeError detected. \nSo the order of type arguments is important.\n\n\nSerialization is also very simple: use `serializer` or `load` methods\n```python\nfactory = Factory() # create it only once\nserializer = factory.serializer(Book) # you can reuse ot\ndata = serializer(book)\n# or \ndata = factory.dump(book, Book) \n```\n\nIf no class is provided in `dump` method it will find serializer based on real type of object.\n\nEvery parser/serializer is created when it is used (or retrieved from factory) for first time. \nFactory caches all created parsers and serializers so create it only once for every settings bundle. \n\n**Important**:\nWhen serializing data of `Union` type, type arguments are ignored and serializer is detected based on real data type.\n\n### Configuring\n\n```python\nFactory(debug_path: bool, default_schema: Schema, schemas: Dict[Type, Schema])\n```\n\n#### More verbose errors\n\n`debug_path` parameter is used to enable verbose error mode. \n\nIt this mode `InvalidFieldError` is thrown when some dataclass field cannot be parsed. \nIt contains `field_path` which is path to the field in provided data (key and indexes).\n\n#### Schemas\n\n`Schema` instances used to change behavior of parsing/serializing certain classes or in general. \n\n* `default_schema` is `Schema` which is used by default.\n* `schemas` is dict, with types as keys, and corresponding `Schema` instances as values. \n\nIf some setting is not set for schema (or set to `None`), setting from `default_schema` is used. \nIf it is also not set, library default will be used\n\nSchema consists of:\n* `names_mapping` - specifies mapping between dataclass field name (key in mapping) and key in serialized form.\n* `only_mapped` (*by default, False*) - if True, all fields which are not specified in `names_mapping` are skipped. \n* `only` - list of fields which are used during parsing and serialization. Has higher priority than `only_mapped` and `skip_internal` params\n* `exclude_fields` - list of fields that are NOT used during parsing and serialization. Has higher priority than `only`\n* `skip_internal` (*by default, True*) - exclude fields with leading underscore (_). Affects fields, that are not specified in `only` and `names_mapping`. \n* `trim_trainling_underscore` (*by default, True*) - if True, trailing underscore (_) will be removed for all fields except specified in `names_mapping`.\n* `name_style` (*by default, snake_case*) - target field name style. Applied for fields not specified in `names_mapping`.\n* `serializer` - custom function which is used to dump data of type assigned with schema. \n Normally it should not be used in default schema \n It is also returned from `factory.serializer`\n* `parser` - custom function which is used to load data of type assigned with schema. \n Normally it should not be used in default schema \n It is also returned from `factory.parser` \n* `pre_parse`, `post_parse`, `pre_serialize`, `post_serialize` - callables that will be used as additional parsing/serializing steps.\n\nCurrently only `serializer` and `parser` are supported for non-dataclass types\n\nExample, \n```python\n@dataclass\nclass Person:\n _first_name: str\n last_name_: str\n\n\nfactory = Factory(schemas={\n Person: Schema(\n trim_trailing_underscore=True,\n skip_internal=False\n )}\n)\n\nperson = Person(\"ivan\", \"petrov\")\nserial_person = {\n \"_first_name\": \"ivan\",\n \"last_name\": \"petrov\"\n}\n\nassert factory.dump(person) == serial_person\n```\n\n#### Common schemas\n\n`schema_helpers` module contains several commonly used schemas:\n* `unixtime_schema` - converts datetime to unixtime and vice versa\n* `isotime_schema` - converts datetime to string containing ISO 8081. Supported only on Python 3.7+\n* `uuid_schema` - converts UUID to string\n\nExample:\n```python\nfactory = Factory(\n schemas={\n UUID: schema_helpers.uuid_schema,\n datetime: schema_helpers.isotime_schema,\n }\n)\n```\n\n#### Name styles\n\nYou have to follow PEP8 convention for fields names (snake_case) or style conversion wil not work appropriately\n\n```python\nfactory = Factory(default_schema=Schema(\n name_style=NameStyle.camel\n))\n\n\n@dataclass\nclass Person:\n first_name: str\n last_name: str\n\n\nperson = Person(\"ivan\", \"petrov\")\nserial_person = {\n \"FirstName\": \"ivan\",\n \"LastName\": \"petrov\"\n}\n\nassert factory.dump(person) == serial_person\n```\n\nFollowing name styles are supported:\n* `snake` (snake_case)\n* `kebab` (kebab-case)\n* `camel_lower` (camelCaseLower)\n* `camel` (CamelCase)\n* `lower` (lowercase)\n* `upper` (UPPERCASE)\n* `upper_snake` (UPPER_SNAKE_CASE)\n* `camel_snake` (Camel_Snake)\n* `dot` (dot.case)\n\n#### Generic classes\n\nIt is possible to dump and load instances of generic dataclasses with. \nYou can set schema for generic or concrete types with one limitation:\nIt is not possible to detect concrete type of dataclass when dumping. So if you need to have different schemas for different concrete types you should exclipitly set them when dumping your data.\n\n```python\nT = TypeVar(\"T\")\n\n\n@dataclass\nclass FakeFoo(Generic[T]):\n value: T\n\n\nfactory = Factory(schemas={\n FakeFoo[str]: Schema(name_mapping={\"value\": \"s\"}),\n FakeFoo: Schema(name_mapping={\"value\": \"i\"}),\n})\ndata = {\"i\": 42, \"s\": \"Hello\"}\nassert factory.load(data, FakeFoo[str]) == FakeFoo(\"Hello\")\nassert factory.load(data, FakeFoo[int]) == FakeFoo(42)\nassert factory.dump(FakeFoo(\"hello\"), FakeFoo[str]) == {\"s\": \"hello\"} # concrete type is set explicitly\nassert factory.dump(FakeFoo(\"hello\")) == {\"i\": \"hello\"} # generic type is detected automatically\n```\n\n#### Structure flattening\n\nSince version 2.2 you can flatten hierarchy of data when parsing.\nAlso it is possible to serialize flat dataclass to complex structure.\n\nTo enable configure thi behavior just use tuples instead of strings in field mapping.\nProvide numbers to create lists and strings to create dicts.\n\nFor example if you have simple dataclass:\n```python\n@dataclass\nclass A:\n x: str\n y: str\n```\n\nAnd you want to parse following structure getting `A(\"hello\", \"world\")` as a result:\n```json\n{\n \"a\": {\n \"b\": [\"hello\"]\n },\n \"y\": \"world\"\n}\n```\n\nThe only thing you need is to create such a schema and use `Factory`:\n```python\nschema = Schema[A](\n name_mapping={\n \"x\": (\"a\", \"b\", 0),\n }\n)\nfactory = Factory(schemas={A: schema})\nparsed_a = factory.load(data, A)\n```\n\n**Important:** When serializing to list all list items with no fields to place will be filled with None.\n\n#### Additional steps\n\nYou can set `pre_parse`, `post_parse`, `pre_serialize` and `post_serialize` schema attributes to provide additional parsing/serializing steps.\n\nFor example, if you want to store some field as string containing json data and check value of other field you can write code like\n\n```python\n@dataclass\nclass Data:\n items: List[str]\n name: str\n\n\ndef post_serialize(data):\n data[\"items\"] = json.dumps(data[\"items\"])\n return data\n\n\ndef pre_parse(data):\n data[\"items\"] = json.loads(data[\"items\"])\n return data\n\n\ndef post_parse(data: Data) -> Data:\n if not data.name:\n raise ValueError(\"Name must not be empty\")\n return data\n\n\ndata_schema = Schema[Data](\n post_serialize=post_serialize,\n pre_parse=pre_parse,\n post_parse=post_parse,\n)\n\nfactory = Factory(schemas={Data: data_schema})\ndata = Data(['a', 'b'], 'My Name')\nserialized = {'items': '[\"a\", \"b\"]', 'name': 'My Name'}\nassert factory.dump(data) == serialized\nassert factory.load(serialized, Data) == data\ntry:\n factory.load({'items': '[]', 'name': ''}, Data)\nexcept ValueError as e:\n print(\"Error detected:\", e) # Error detected: Name must not be empty\n\n``` \n\n**Important**: Data, passed to `pre_serialize` is not a copy. Be careful modifying it.\n\n#### Schema inheritance \n\nIn some case it is useful not to create instance of Schema, but child class.\n\n```python\nclass DataSchema(Schema[Any]):\n skip_internal = True\n\n def post_parse(self, data):\n print(\"parsing done\")\n return data\n\n\nfactory = Factory(default_schema=DataSchema(trim_trailing_underscore=False))\n\nfactory.load(1, int) # prints: parsing done\n```\n\n**Important**:\n1. Factory creates a copy of schema for each type filling missed args. If you need to get access to some data in schema, \n get a working instance of schema with `Factory.schema` method\n2. Single schema instance can be used multiple time simultaneously because of multithreading or recursive structures. \n Be careful modifying data in schema\n\n## Supported types\n\n* numeric types (`int`, `float`, `Decimal`)\n* `bool`\n* `str`, `bytearray`\n* `List`\n* `Tuple`, including something like `Tuple[int, ...]` or `Tuple[int, str, int]`\n* `Dict`\n* `Enum` is converted using its value\n* `Optional`\n* `Any`, using this type no conversion is done during parsing. But serialization is based on real data type\n* `Union`\n* `dataclass` \n* `Generic` dataclasses \n* `datetime` and `UUID` can be converted using predefind schemas\n* Custom classes can be parsed automatically using info from their `__init__` method. \n Or you can provide custom praser/serializer\n\n## Updating from previous versions\nIn versions 1.1+:\n* separate `ParserFactory` and `SerializerFactory` should be refused in favor of `Factory`\n* `trim_trailing_underscore` of factories parameter moved to `default_schema`\n* `type_factories`, `name_styles` and `type_serializers` moved to `schemas` dict\n \nIn versions <1.1:\n* `dict_factory` used with `asdict` function must be replaced with `Factory`-based seralization as it is much faster\n\nIn versions <1.0:\n* `parse` method must be replaced with `Factory`-based parsing as it much faster\n \nAll old methods and classes are still avaiable but are deprecated ant will be removed in future versions", "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/tishka17/dataclass_factory", "keywords": "", "license": "Apache2", "maintainer": "", "maintainer_email": "", "name": "dataclass-factory", "package_url": "https://pypi.org/project/dataclass-factory/", "platform": "", "project_url": "https://pypi.org/project/dataclass-factory/", "project_urls": { "Homepage": "https://github.com/tishka17/dataclass_factory" }, "release_url": "https://pypi.org/project/dataclass-factory/2.4.1/", "requires_dist": null, "requires_python": ">=3.6", "summary": "An utility class for creating instances of dataclasses", "version": "2.4.1" }, "last_serial": 5818444, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "ff0eb4fc606d98b3760588c881ff60ee", "sha256": "2f63aaeee10b37d4c8753fdc1434f36968648c2662b6df2d161d50cb81351783" }, "downloads": -1, "filename": "dataclass_factory-0.1.tar.gz", "has_sig": false, "md5_digest": "ff0eb4fc606d98b3760588c881ff60ee", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2765, "upload_time": "2018-09-07T16:46:12", "url": "https://files.pythonhosted.org/packages/a5/ab/c9f3919fcaadc11651381754787f72df19d7a8d858796d355219adbc8535/dataclass_factory-0.1.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "9892243d0b946d026a962408d0d16f16", "sha256": "ab6c636681e5f561afc9f5ed4258edab291692743f70d8d22660aebabe3f034b" }, "downloads": -1, "filename": "dataclass_factory-0.2.tar.gz", "has_sig": false, "md5_digest": "9892243d0b946d026a962408d0d16f16", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3120, "upload_time": "2018-09-08T09:04:57", "url": "https://files.pythonhosted.org/packages/ad/1e/08285f16083cb58fba3bd0c50238147b37e6638514a188dd481c22d7e023/dataclass_factory-0.2.tar.gz" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "946ad5dfe1cdafa323a38bc3f10c2ed3", "sha256": "e559464febc4d1003fdc12e83eb4e2a2b8917e24e4fe4b0c794217286ab914d5" }, "downloads": -1, "filename": "dataclass_factory-0.3.tar.gz", "has_sig": false, "md5_digest": "946ad5dfe1cdafa323a38bc3f10c2ed3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3367, "upload_time": "2018-09-08T09:18:51", "url": "https://files.pythonhosted.org/packages/9b/db/f2c54faf958cb6e49251231be35a8dea4d2d621be05cca7fe11a5ad02fbe/dataclass_factory-0.3.tar.gz" } ], "0.4": [ { "comment_text": "", "digests": { "md5": "9268d49344c5189e53347f7653770505", "sha256": "a6807c6a2da4c8647a200f84fdea46d806d09032f36007c448dfd52901141c00" }, "downloads": -1, "filename": "dataclass_factory-0.4.tar.gz", "has_sig": false, "md5_digest": "9268d49344c5189e53347f7653770505", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3462, "upload_time": "2018-09-08T09:53:11", "url": "https://files.pythonhosted.org/packages/02/5b/02a8146469565a92a795b633c938a5701561cf6050dd4983d3378ba06d23/dataclass_factory-0.4.tar.gz" } ], "0.5": [ { "comment_text": "", "digests": { "md5": "7cf63c6703b1cd876f18a9a3e2e1a3ce", "sha256": "623e4bdf2615c7aed32d7d464cfea03feef5e73f8ee3f511027f7a366a86db19" }, "downloads": -1, "filename": "dataclass_factory-0.5.tar.gz", "has_sig": false, "md5_digest": "7cf63c6703b1cd876f18a9a3e2e1a3ce", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3886, "upload_time": "2018-09-15T08:53:00", "url": "https://files.pythonhosted.org/packages/4f/63/f749abf598cee6e7519b916cdfa8dcfd35eb7549a0f4a5dbc399eaf09bb7/dataclass_factory-0.5.tar.gz" } ], "0.6": [ { "comment_text": "", "digests": { "md5": "b9ee2f0d0bfafbe3fbaea8f804ae2b6a", "sha256": "de47a85a5b3d2a5dd5595a53835b7c5ddf769e97041760552c0ec2916f207906" }, "downloads": -1, "filename": "dataclass_factory-0.6.tar.gz", "has_sig": false, "md5_digest": "b9ee2f0d0bfafbe3fbaea8f804ae2b6a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4155, "upload_time": "2018-09-22T10:55:45", "url": "https://files.pythonhosted.org/packages/f9/86/54f1054437af6a9d897a25c63d372034406c8ecc76ef1422dd342185b488/dataclass_factory-0.6.tar.gz" } ], "0.7": [ { "comment_text": "", "digests": { "md5": "d502690edc81283e812fb318f2830ab1", "sha256": "50ef6ebf9d67e1b6b074d0e39c001f9496a4eb6ddf725310117b379fd20645aa" }, "downloads": -1, "filename": "dataclass_factory-0.7.tar.gz", "has_sig": false, "md5_digest": "d502690edc81283e812fb318f2830ab1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4444, "upload_time": "2018-09-30T16:05:03", "url": "https://files.pythonhosted.org/packages/88/45/b9af45ae7d67344b148fc0dec183bab4c2462a8f9aeae161df3d774f347e/dataclass_factory-0.7.tar.gz" } ], "0.8": [ { "comment_text": "", "digests": { "md5": "f4f7ee8a199670b95636ab83fc0df6a4", "sha256": "ae7a64713d11cefd1d5f6e39dd71db4e56a0cc39248144bb0ad6122d6c5c3b99" }, "downloads": -1, "filename": "dataclass_factory-0.8.tar.gz", "has_sig": false, "md5_digest": "f4f7ee8a199670b95636ab83fc0df6a4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5220, "upload_time": "2018-10-07T06:49:45", "url": "https://files.pythonhosted.org/packages/a5/2a/96380c03d1c04c8b972db40321720703a25cafb21071c33f4a17d8cb4934/dataclass_factory-0.8.tar.gz" } ], "1.0": [ { "comment_text": "", "digests": { "md5": "81b4cc6e00aa746d0468144b6f3b4799", "sha256": "14ec6231287a0e6d081b7d2f0966087b2fec255e5aebc2d4d66fc14a49e74eae" }, "downloads": -1, "filename": "dataclass_factory-1.0.tar.gz", "has_sig": false, "md5_digest": "81b4cc6e00aa746d0468144b6f3b4799", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6055, "upload_time": "2018-11-30T19:03:55", "url": "https://files.pythonhosted.org/packages/ab/f7/646b2aed03fcbd087565fd27d98b16f1ef9bea57c164d2ce66bc338bad76/dataclass_factory-1.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "3a07254061afc35be7b16bebb59896ef", "sha256": "112a54176d418474356bd5b8d5378a745e876780fc15ccac3ced906a284a299e" }, "downloads": -1, "filename": "dataclass_factory-1.0.1.tar.gz", "has_sig": false, "md5_digest": "3a07254061afc35be7b16bebb59896ef", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6103, "upload_time": "2018-11-30T19:14:27", "url": "https://files.pythonhosted.org/packages/b2/9d/31a92c595a48b43b190300c00a2bf9a0cfcee870651cb20b2db9798e96af/dataclass_factory-1.0.1.tar.gz" } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "6fea950faea6d6f27d8059eed6118dd5", "sha256": "b7b2e14cc19364fd45a6680ebf6566f8ac9a06b3c17778aafab76424b58b480b" }, "downloads": -1, "filename": "dataclass_factory-1.0.2.tar.gz", "has_sig": false, "md5_digest": "6fea950faea6d6f27d8059eed6118dd5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6118, "upload_time": "2018-11-30T19:20:49", "url": "https://files.pythonhosted.org/packages/a4/c6/06fe95657a4ff0870f5e611c5303f006802dd7542115d83837e29a69cca5/dataclass_factory-1.0.2.tar.gz" } ], "1.0.3": [ { "comment_text": "", "digests": { "md5": "7dc5b9ecbcd1189491cd3c8d5a2544b0", "sha256": "6e46359404d303685bc80296c410a9d2a6ec5cc3de10df4cf1ec191b6f6c3a94" }, "downloads": -1, "filename": "dataclass_factory-1.0.3.tar.gz", "has_sig": false, "md5_digest": "7dc5b9ecbcd1189491cd3c8d5a2544b0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6089, "upload_time": "2019-01-07T13:04:49", "url": "https://files.pythonhosted.org/packages/96/06/c0db7e682942db6d15fe337968d7754627aae233298032a1c1642ab727a3/dataclass_factory-1.0.3.tar.gz" } ], "1.0.4": [ { "comment_text": "", "digests": { "md5": "fe0f28bb0080b0da36b9164f77b4470a", "sha256": "b2ee9ca218b0afca978917283d145a2fc38bc5c8249d6e888e09c92d6d118864" }, "downloads": -1, "filename": "dataclass_factory-1.0.4.tar.gz", "has_sig": false, "md5_digest": "fe0f28bb0080b0da36b9164f77b4470a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6065, "upload_time": "2019-03-31T12:13:39", "url": "https://files.pythonhosted.org/packages/55/97/a69e681716b86e92e47cf247cd84f878eca84edbc916e8df2e4c2d2d7e59/dataclass_factory-1.0.4.tar.gz" } ], "1.0.5": [ { "comment_text": "", "digests": { "md5": "e7f5865d382ac0d0b1e106921a4cc986", "sha256": "7c33c6df68ffaa16ea267a93c4ad6d3edf9398e1df3637d6ed441a2d56843d42" }, "downloads": -1, "filename": "dataclass_factory-1.0.5.tar.gz", "has_sig": false, "md5_digest": "e7f5865d382ac0d0b1e106921a4cc986", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7129, "upload_time": "2019-05-19T10:39:56", "url": "https://files.pythonhosted.org/packages/33/e1/b7c113595fe7c45491885788e57b1f32c8b168528a2fc840611de5d01552/dataclass_factory-1.0.5.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "7c33ec504fd227fe03b8e452b2aa28e5", "sha256": "dd346cabacd1fd5bb1e0f0aae93875ed8d0aa0aa9b24c49eb9c373a3606c5691" }, "downloads": -1, "filename": "dataclass_factory-1.1.0.tar.gz", "has_sig": false, "md5_digest": "7c33ec504fd227fe03b8e452b2aa28e5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9071, "upload_time": "2019-05-19T13:53:47", "url": "https://files.pythonhosted.org/packages/c6/4d/bd63812bcd5aa4d9cd014ca02028a38e3630d92f522ce9a5659ecacee0ed/dataclass_factory-1.1.0.tar.gz" } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "eca57a4dd6a2ed47e0e3acab16c902ad", "sha256": "c868fb87539a3c4dec8b92906f3b489ce696528f656604060bf058a7916ed11c" }, "downloads": -1, "filename": "dataclass_factory-1.1.1.tar.gz", "has_sig": false, "md5_digest": "eca57a4dd6a2ed47e0e3acab16c902ad", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9582, "upload_time": "2019-05-26T17:24:41", "url": "https://files.pythonhosted.org/packages/57/56/958a7265bd6d374e354acda23fec50ccb6e03d6a89214963cebd36ae2925/dataclass_factory-1.1.1.tar.gz" } ], "2.0": [ { "comment_text": "", "digests": { "md5": "13e6314dc06579dc8a697d394dd93677", "sha256": "666244ae0235bc2cf05328c588ed8705713d4d49d34fb23f01a9cbd155fc734e" }, "downloads": -1, "filename": "dataclass_factory-2.0.tar.gz", "has_sig": false, "md5_digest": "13e6314dc06579dc8a697d394dd93677", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 12670, "upload_time": "2019-06-12T20:07:06", "url": "https://files.pythonhosted.org/packages/ae/16/b467486e5ec1a4f0cdac0c5a4a9836d14391a518daa5a624dd9f15971f4a/dataclass_factory-2.0.tar.gz" } ], "2.1": [ { "comment_text": "", "digests": { "md5": "ed3bed5a9ffe46ff7bf61c2a17296bed", "sha256": "fe38d84a29631bd4da8ed8d66b737e081ad30b7f4fbe534b4ddf3d2caf9ff786" }, "downloads": -1, "filename": "dataclass_factory-2.1.tar.gz", "has_sig": false, "md5_digest": "ed3bed5a9ffe46ff7bf61c2a17296bed", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 14214, "upload_time": "2019-06-15T10:23:01", "url": "https://files.pythonhosted.org/packages/7f/21/11626f98063da5f688923fc624695de223050694864e353b21cf2cc6d67b/dataclass_factory-2.1.tar.gz" } ], "2.2": [ { "comment_text": "", "digests": { "md5": "ecb19f96f5996f800a711f4ae2b4e8b4", "sha256": "6fd47ba688731b4b7305f3136e82aa5b0e7c03365655c1e3c5b2ba717675f9b0" }, "downloads": -1, "filename": "dataclass_factory-2.2.tar.gz", "has_sig": false, "md5_digest": "ecb19f96f5996f800a711f4ae2b4e8b4", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 16354, "upload_time": "2019-07-04T20:57:01", "url": "https://files.pythonhosted.org/packages/8b/5f/3be317250551ebf492d3556e5c99b6c1b735d1300ee23c5a884ce5a49a32/dataclass_factory-2.2.tar.gz" } ], "2.3": [ { "comment_text": "", "digests": { "md5": "144f4730615d4a56e9a3649a7d9dae71", "sha256": "62642865b0b8cabf404b3b7dc28cf6621b0f771d7a1e397a85a5244cbdb17e3f" }, "downloads": -1, "filename": "dataclass_factory-2.3.tar.gz", "has_sig": false, "md5_digest": "144f4730615d4a56e9a3649a7d9dae71", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 18389, "upload_time": "2019-07-12T21:06:55", "url": "https://files.pythonhosted.org/packages/af/40/21921703834553592c698dde2a37553befda60fdfd282d73bdd3a8a96fb8/dataclass_factory-2.3.tar.gz" } ], "2.4": [ { "comment_text": "", "digests": { "md5": "3a54e37c74efe0a753816dbbf70c8d55", "sha256": "7af53b8722534334bcc21a5635f94e50bd8bf1fd5521cb1f9dd854ca26307618" }, "downloads": -1, "filename": "dataclass_factory-2.4.tar.gz", "has_sig": false, "md5_digest": "3a54e37c74efe0a753816dbbf70c8d55", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 19039, "upload_time": "2019-08-12T21:47:28", "url": "https://files.pythonhosted.org/packages/34/02/11275a29fb4995f9bbefb796de824c87814b1576bb9c93d2dcde0343450f/dataclass_factory-2.4.tar.gz" } ], "2.4.1": [ { "comment_text": "", "digests": { "md5": "2f6b7688e86aad7a25ca49812365e7f1", "sha256": "484c88fcc2fbadf6cd89f9753c454a8249dcf1b6da2506c66351ceef7eccef2d" }, "downloads": -1, "filename": "dataclass_factory-2.4.1.tar.gz", "has_sig": false, "md5_digest": "2f6b7688e86aad7a25ca49812365e7f1", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 19142, "upload_time": "2019-09-12T06:17:17", "url": "https://files.pythonhosted.org/packages/61/36/ba202c9a013b7510f50773c05ff24caed3f4b59aa9c29ef1631aef6df844/dataclass_factory-2.4.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "2f6b7688e86aad7a25ca49812365e7f1", "sha256": "484c88fcc2fbadf6cd89f9753c454a8249dcf1b6da2506c66351ceef7eccef2d" }, "downloads": -1, "filename": "dataclass_factory-2.4.1.tar.gz", "has_sig": false, "md5_digest": "2f6b7688e86aad7a25ca49812365e7f1", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 19142, "upload_time": "2019-09-12T06:17:17", "url": "https://files.pythonhosted.org/packages/61/36/ba202c9a013b7510f50773c05ff24caed3f4b59aa9c29ef1631aef6df844/dataclass_factory-2.4.1.tar.gz" } ] }