{ "info": { "author": "Robert Wright", "author_email": "madman.bob@hotmail.co.uk", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7" ], "description": "# dataclasses_serialization\n\n`dataclasses_serialization` provides serializers/deserializers for transforming between Python dataclasses, and JSON and BSON objects.\n\n## Basic Usage\n\nSuppose we have the following dataclass:\n\n```python\nfrom dataclasses import dataclass\n\n\n@dataclass\nclass InventoryItem:\n name: str\n unit_price: float\n quantity_on_hand: int\n```\n\nThen we may serialize/deserialize it to/from JSON by using `JSONSerializer`\n\n```pycon\n>>> from dataclasses_serialization.json import JSONSerializer\n>>> JSONSerializer.serialize(InventoryItem(\"Apple\", 0.2, 20))\n{'name': 'Apple', 'unit_price': 0.2, 'quantity_on_hand': 20}\n\n>>> JSONSerializer.deserialize(InventoryItem, {'name': 'Apple', 'unit_price': 0.2, 'quantity_on_hand': 20})\nInventoryItem(name='Apple', unit_price=0.2, quantity_on_hand=20)\n```\n\n### Mongo\n\nAs Mongo collections store objects as BSON, you can use `BSONSerializer` to dump dataclasses directly into Mongo.\n\n```python\nfrom dataclasses_serialization.bson import BSONSerializer\n\n\ncollection.insert_one(BSONSerializer.serialize(item))\n\nitem = BSONSerializer.deserialize(InventoryItem, collection.find_one())\n```\n\n## Custom Serializers\n\nTo create a custom serializer, create an instance of `dataclasses_serialization.serializer_base.Serializer`:\n\n```python\nfrom dataclasses_serialization.serializer_base import noop_serialization, noop_deserialization, dict_serialization, dict_deserialization, list_deserialization, Serializer\n\n\nJSONSerializer = Serializer(\n serialization_functions={\n dict: lambda dct: dict_serialization(dct, key_serialization_func=JSONSerializer.serialize, value_serialization_func=JSONSerializer.serialize),\n list: lambda lst: list(map(JSONSerializer.serialize, lst)),\n (str, int, float, bool, type(None)): noop_serialization\n },\n deserialization_functions={\n dict: lambda cls, dct: dict_deserialization(cls, dct, key_deserialization_func=JSONSerializer.deserialize, value_deserialization_func=JSONSerializer.deserialize),\n list: lambda cls, lst: list_deserialization(cls, lst, deserialization_func=JSONSerializer.deserialize),\n (str, int, float, bool, type(None)): noop_deserialization\n }\n)\n```\n\n## Reference\n\n### `dataclasses_serialization.serializer_base`\n\nA collection of utilities to make it easier to create serializers.\n\n- `isinstance(o, t)`, `issubclass(cls, clsinfo)`\n\n Extended versions of the builtin `isinstance` and `issubclass`, to treat `dataclass` as a metaclass for dataclasses, and to be usable with supported `typing` types.\n\n- `noop_serialization(obj)`, `noop_deserialization(cls, obj)`\n\n The trivial serialization/deserialization functions, which serialize by doing nothing.\n\n- `dict_to_dataclass(cls, dct, deserialization_func=noop_deserialization)`\n\n The inverse of `dataclasses.asdict`, which deserializes a dictionary `dct` to a dataclass `cls`, using `deserialization_func` to deserialize the fields of `cls`.\n\n Fields are deserialized using the type provided by the dataclass.\n So bound generic dataclasses may be deserialized, while unbound ones may not.\n\n- `union_deserialization(type_, obj, deserialization_func=noop_deserialization)`\n\n Deserialize a `Union` `type_`, by trying each type in turn, and returning the first that does not raise a `DeserializationError`.\n\n As `Optional`s are implemented as `Union`s, this function also works for them.\n\n- `dict_serialization(obj, key_serialization_func=noop_serialization, value_serialization_func=noop_serialization)`, `dict_deserialization(type_, obj, key_deserialization_func=noop_deserialization, value_deserialization_func=noop_deserialization)`\n\n Serialize/deserialize a dictionary `obj` by applying the appropriate serialization/deserialization functions to keys and values.\n\n- `list_deserialization(type_, obj, deserialization_func=noop_deserialization)`\n\n Deserialize a list `obj` by applying the deserialization function to its values.\n\n- `Serializer(serialization_functions, deserialization_functions)`\n\n The general serialization class.\n\n Takes two dictionaries of serialization and deserialization functions, and defers to them appropriately when serializing/deserializing and object by the `serialize` and `deserialize` methods.\n Serializer functions take a single parameter, the object to be serialized, and returns a serialized version of it.\n Deserializer functions take two parameters, the desired type of the deserialized object, and the object to be deserialized.\n\n By default `dataclass`es are serialized as though they are `dict`s.\n Similarly, `dataclass`es are deserialized using `dict_to_dataclass`, and `Union`s using `union_deserialization`, using itself as the nested deserialization function.\n\n Serialize a Python object with `serializer.serialize(obj)`, and deserialize with `serializer.deserialize(cls, serialized_obj)`.\n\n Register more serialization/deserialization functions with `serializer.register_serializer(cls, func)`, `serializer.register_deserializer(cls, func)`, and `serializer.register(cls, serialization_func, deserialization_func)`.\n They can also be used as decorators like so:\n\n ```python\n @serializer.register_serializer(int)\n def int_serializer(obj):\n ...\n ```\n\n ```python\n @serializer.register_deserializer(int)\n def int_deserializer(cls, obj):\n ...\n ```\n\n- `SerializationError`, `DeserializationError`\n\n Errors to be raised when serialization/deserialization fails, respectively.\n\n### `dataclasses_serialization.json`\n\n- `JSONSerializer`\n\n Serializer/deserializer between Python dataclasses and JSON objects.\n\n ```pycon\n >>> JSONSerializer.serialize(InventoryItem(\"Apple\", 0.2, 20))\n {'name': 'Apple', 'unit_price': 0.2, 'quantity_on_hand': 20}\n\n >>> JSONSerializer.deserialize(InventoryItem, {'name': 'Apple', 'unit_price': 0.2, 'quantity_on_hand': 20})\n InventoryItem(name='Apple', unit_price=0.2, quantity_on_hand=20)\n ```\n\n- `JSONSerializerMixin`\n\n Adds `as_json` and `from_json` methods to dataclasses when used as a mixin.\n\n ```python\n @dataclass\n class InventoryItem(JSONSerializerMixin):\n ...\n ```\n\n ```pycon\n >>> InventoryItem(\"Apple\", 0.2, 20).as_json()\n {'name': 'Apple', 'unit_price': 0.2, 'quantity_on_hand': 20}\n\n >>> InventoryItem.from_json({'name': 'Apple', 'unit_price': 0.2, 'quantity_on_hand': 20})\n InventoryItem(name='Apple', unit_price=0.2, quantity_on_hand=20)\n ```\n\n- `JSONStrSerializer`\n\n Serializer/deserializer between Python dataclasses and JSON strings.\n\n ```pycon\n >>> JSONStrSerializer.serialize(InventoryItem(\"Apple\", 0.2, 20))\n '{\"name\": \"Apple\", \"unit_price\": 0.2, \"quantity_on_hand\": 20}'\n\n >>> JSONStrSerializer.deserialize(InventoryItem, '{\"name\": \"Apple\", \"unit_price\": 0.2, \"quantity_on_hand\": 20}')\n InventoryItem(name='Apple', unit_price=0.2, quantity_on_hand=20)\n ```\n\n- `JSONStrSerializerMixin`\n\n Adds `as_json_str` and `from_json_str` methods to dataclasses when used as a mixin.\n\n ```python\n @dataclass\n class InventoryItem(JSONStrSerializerMixin):\n ...\n ```\n\n ```pycon\n >>> InventoryItem(\"Apple\", 0.2, 20).as_json_str()\n '{\"name\": \"Apple\", \"unit_price\": 0.2, \"quantity_on_hand\": 20}'\n\n >>> InventoryItem.from_json_str('{\"name\": \"Apple\", \"unit_price\": 0.2, \"quantity_on_hand\": 20}')\n InventoryItem(name='Apple', unit_price=0.2, quantity_on_hand=20)\n ```\n\n### `dataclasses_serialization.bson`\n\n- `BSONSerializer`\n\n Serializer/deserializer between Python dataclasses and BSON objects.\n\n ```pycon\n >>> BSONSerializer.serialize(InventoryItem(\"Apple\", 0.2, 20))\n {'name': 'Apple', 'unit_price': 0.2, 'quantity_on_hand': 20}\n\n >>> BSONSerializer.deserialize(InventoryItem, {'name': 'Apple', 'unit_price': 0.2, 'quantity_on_hand': 20})\n InventoryItem(name='Apple', unit_price=0.2, quantity_on_hand=20)\n ```\n\n- `BSONSerializerMixin`\n\n Adds `as_bson` and `from_bson` methods to dataclasses when used as a mixin.\n\n ```python\n @dataclass\n class InventoryItem(BSONSerializerMixin):\n ...\n ```\n\n ```pycon\n >>> InventoryItem(\"Apple\", 0.2, 20).as_bson()\n {'name': 'Apple', 'unit_price': 0.2, 'quantity_on_hand': 20}\n\n >>> InventoryItem.from_bson({'name': 'Apple', 'unit_price': 0.2, 'quantity_on_hand': 20})\n InventoryItem(name='Apple', unit_price=0.2, quantity_on_hand=20)\n ```\n\n- `BSONStrSerializer`\n\n Serializer/deserializer between Python dataclasses and binary BSON strings.\n\n- `BSONStrSerializerMixin`\n\n Adds `as_bson_str` and `from_bson_str` methods to dataclasses when used as a mixin.\n\n ```python\n @dataclass\n class InventoryItem(BSONStrSerializerMixin):\n ...\n ```\n\n## Installation\n\nInstall and update using the standard Python package manager [pip](https://pip.pypa.io/en/stable/):\n\n```bash\npip install dataclasses_serialization\n```\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/madman-bob/python-dataclasses-serialization", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "dataclasses-serialization", "package_url": "https://pypi.org/project/dataclasses-serialization/", "platform": "", "project_url": "https://pypi.org/project/dataclasses-serialization/", "project_urls": { "Homepage": "https://github.com/madman-bob/python-dataclasses-serialization" }, "release_url": "https://pypi.org/project/dataclasses-serialization/1.2.3/", "requires_dist": [ "dataclasses", "typing-inspect", "toolz" ], "requires_python": ">=3.6", "summary": "Serialize/deserialize Python dataclasses to various other data formats", "version": "1.2.3" }, "last_serial": 5841028, "releases": { "1.0.0": [ { "comment_text": "", "digests": { "md5": "d1c3c709dab981b0d7e1737500833c64", "sha256": "5bac3a78510bda02d6cde6df3fc5af2ae8a034909e16523d3adc3933093f4a04" }, "downloads": -1, "filename": "dataclasses_serialization-1.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "d1c3c709dab981b0d7e1737500833c64", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 6609, "upload_time": "2019-03-12T16:53:42", "url": "https://files.pythonhosted.org/packages/cc/2d/a271ba193878832001d62dd0f310ba04f405bd5e13c63dcc22791c4c9ea3/dataclasses_serialization-1.0.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b49f8a6cafa35f999e0eef5d044b6421", "sha256": "67125564ee93fd6185723753ba58c62bd7e9e944af66f1c937704f96457f9b94" }, "downloads": -1, "filename": "dataclasses_serialization-1.0.0.tar.gz", "has_sig": false, "md5_digest": "b49f8a6cafa35f999e0eef5d044b6421", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 4508, "upload_time": "2019-03-12T16:53:44", "url": "https://files.pythonhosted.org/packages/a3/0b/06ad61ca921e823ddedca14ac5cbd43eac91edc3a59aa27dd4e204bfe710/dataclasses_serialization-1.0.0.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "0458e5199b5d52baf2296373ad0a8350", "sha256": "9693bb364149efef87928eb2f7fe5f08a77a3dbeca5be9ce59bb3bb7473915ff" }, "downloads": -1, "filename": "dataclasses_serialization-1.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "0458e5199b5d52baf2296373ad0a8350", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 7341, "upload_time": "2019-03-20T16:29:53", "url": "https://files.pythonhosted.org/packages/85/2c/518b606ea075a068a23daf25a7cb1a40fcb47b5cccf7effed45ee89a2c9f/dataclasses_serialization-1.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "43f5d67bebfdd385fafb7a0cb44dd950", "sha256": "5986879616a792faa14bb1f7ef330f405517fecda759e3876a246b180d1fc6d9" }, "downloads": -1, "filename": "dataclasses_serialization-1.1.0.tar.gz", "has_sig": false, "md5_digest": "43f5d67bebfdd385fafb7a0cb44dd950", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 5238, "upload_time": "2019-03-20T16:29:55", "url": "https://files.pythonhosted.org/packages/59/70/f13bc99914e710b4065f80b6c9f5f8232d73562a6bf6c83d07c6518b3b5b/dataclasses_serialization-1.1.0.tar.gz" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "b1bc9d386b3f5553494510c65d90a08f", "sha256": "85f899b1a28938d97b7ef87841445f26d2d268f6c9021783c0171482989ef42a" }, "downloads": -1, "filename": "dataclasses_serialization-1.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "b1bc9d386b3f5553494510c65d90a08f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 7783, "upload_time": "2019-04-18T14:10:53", "url": "https://files.pythonhosted.org/packages/35/9b/be791366ea3f3711b879b5249da554a37d31c047c17b3b6c5c3bc85cc523/dataclasses_serialization-1.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0b5adac5ddea77a1e2fd7ce765a6168b", "sha256": "e7a28ae7e94da7279f1e86f5610b5b9faa5ed1f4e4c9e67958351cfbdae1b5b3" }, "downloads": -1, "filename": "dataclasses_serialization-1.2.0.tar.gz", "has_sig": false, "md5_digest": "0b5adac5ddea77a1e2fd7ce765a6168b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 5668, "upload_time": "2019-04-18T14:10:54", "url": "https://files.pythonhosted.org/packages/59/5a/1ec1533f43366119951dcc1fd3c13dc093adc4ccb5e96cdcc0542fefb301/dataclasses_serialization-1.2.0.tar.gz" } ], "1.2.1": [ { "comment_text": "", "digests": { "md5": "bef862ccaf57146c544634dd2c6f750a", "sha256": "54d898ed8042f2b9868021ee2a37af8f669c14f3fbe92b178ebfc2e3fd969c7d" }, "downloads": -1, "filename": "dataclasses_serialization-1.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "bef862ccaf57146c544634dd2c6f750a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 7895, "upload_time": "2019-08-20T12:56:29", "url": "https://files.pythonhosted.org/packages/26/7c/b2913d5ac3e8c8fe0bb26aea9a5150ee345b7c39ac75fb388b3a4c6a2b91/dataclasses_serialization-1.2.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "42cf5cf5b0b81daa06de3c57f32e6566", "sha256": "ee9f82723f52fa3ab0248d22e392b279a82d24711e5854c76b79676dd37a6dae" }, "downloads": -1, "filename": "dataclasses_serialization-1.2.1.tar.gz", "has_sig": false, "md5_digest": "42cf5cf5b0b81daa06de3c57f32e6566", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 5781, "upload_time": "2019-08-20T12:56:31", "url": "https://files.pythonhosted.org/packages/c8/a6/490d6daaa8d1a45849ca0d5c2ed756321a53d89310ad6e30857c168f8189/dataclasses_serialization-1.2.1.tar.gz" } ], "1.2.2": [ { "comment_text": "", "digests": { "md5": "757879a18a249846e463b0401179abd6", "sha256": "40b4df986c732a1f4bb3e7f4cb59b10f1d1c53b8ad7c184010ad0f7a98d6099c" }, "downloads": -1, "filename": "dataclasses_serialization-1.2.2-py3-none-any.whl", "has_sig": false, "md5_digest": "757879a18a249846e463b0401179abd6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 7973, "upload_time": "2019-09-14T13:09:31", "url": "https://files.pythonhosted.org/packages/a1/4b/3db900c268d12c0d7ae3a805a3a416505aceca5ceb94b776ce04fe68afdd/dataclasses_serialization-1.2.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a16b28e62d8646850562f8f6afd47b87", "sha256": "594be741bd2a060c5e45a217a17cc2fcaba229639fd5789949b05be748db7022" }, "downloads": -1, "filename": "dataclasses_serialization-1.2.2.tar.gz", "has_sig": false, "md5_digest": "a16b28e62d8646850562f8f6afd47b87", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 5849, "upload_time": "2019-09-14T13:09:33", "url": "https://files.pythonhosted.org/packages/5d/2a/19b47e5100646c176c51b8d26520db837e2ee0e659193c356e6d197ae8a6/dataclasses_serialization-1.2.2.tar.gz" } ], "1.2.3": [ { "comment_text": "", "digests": { "md5": "3370c7c22812e3124f28aa7f62a8a3a2", "sha256": "f521ffbf9b307653fe728ce8ab467da7489aa3f73a3eeac36568e8ca2b5eb023" }, "downloads": -1, "filename": "dataclasses_serialization-1.2.3-py3-none-any.whl", "has_sig": false, "md5_digest": "3370c7c22812e3124f28aa7f62a8a3a2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 7974, "upload_time": "2019-09-17T10:54:42", "url": "https://files.pythonhosted.org/packages/d5/02/0a3b5dbba253bfeaa4c2d4aa8ec735f299d683a5407160735e45a0ca9a7a/dataclasses_serialization-1.2.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "71ee2c847ac3f86a3cee237ac330f601", "sha256": "84e939dcbe9886af93a474529b40a8a107302ffd77380a226c45c28efbc2b83b" }, "downloads": -1, "filename": "dataclasses_serialization-1.2.3.tar.gz", "has_sig": false, "md5_digest": "71ee2c847ac3f86a3cee237ac330f601", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 6588, "upload_time": "2019-09-17T10:54:44", "url": "https://files.pythonhosted.org/packages/c7/df/668a616101798687c6c0413157b9c88276f68f6316e93cfd3268cf32a520/dataclasses_serialization-1.2.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "3370c7c22812e3124f28aa7f62a8a3a2", "sha256": "f521ffbf9b307653fe728ce8ab467da7489aa3f73a3eeac36568e8ca2b5eb023" }, "downloads": -1, "filename": "dataclasses_serialization-1.2.3-py3-none-any.whl", "has_sig": false, "md5_digest": "3370c7c22812e3124f28aa7f62a8a3a2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 7974, "upload_time": "2019-09-17T10:54:42", "url": "https://files.pythonhosted.org/packages/d5/02/0a3b5dbba253bfeaa4c2d4aa8ec735f299d683a5407160735e45a0ca9a7a/dataclasses_serialization-1.2.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "71ee2c847ac3f86a3cee237ac330f601", "sha256": "84e939dcbe9886af93a474529b40a8a107302ffd77380a226c45c28efbc2b83b" }, "downloads": -1, "filename": "dataclasses_serialization-1.2.3.tar.gz", "has_sig": false, "md5_digest": "71ee2c847ac3f86a3cee237ac330f601", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 6588, "upload_time": "2019-09-17T10:54:44", "url": "https://files.pythonhosted.org/packages/c7/df/668a616101798687c6c0413157b9c88276f68f6316e93cfd3268cf32a520/dataclasses_serialization-1.2.3.tar.gz" } ] }