{ "info": { "author": "Dotan Nahum", "author_email": "jondotan@gmail.com", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License", "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": "![](media/cover.png)\n\n# attrs-serde\n\nA serialization addon for [attrs](https://attrs.org).\n\n\n```py\nperson_dict = {\"contact\": {\"personal\": {\"name\": \"John\"}, \"phone\": \"555-112233\"}}\n\nname_path = [\"contact\", \"personal\", \"name\"]\nphone_path = [\"contact\", \"phone\"]\n\n@serde\n@attrs\nclass Person(object):\n name = attrib(metadata={\"to\": name_path, \"from\": name_path})\n phone = attrib(metadata={\"to\": phone_path, \"from\": phone_path})\n\n>>> p = Person.from_dict(person_dict)\nPerson(name=John phone=555-112233)\n\n>>> p.to_dict\n{\"contact\": {\"personal\": {\"name\": \"John\"}, \"phone\": \"555-112233\"}}\n```\n\n\n## Quick Start\n\nInstall using pip/pipenv/etc. (we recommend [poetry](https://github.com/sdispater/poetry) for sane dependency management):\n\n```\n$ poetry add attrs-serde\n```\n\nDecorate with `serde` for automatic `to_dict` and `from_dict`. Provide paths in `metadata`:\n\n1. `from` - path to fetch field value from\n2. `to` - path to serialize value into (creates nested dictionaries as needed)\n\nExample:\n\n```py\nfrom attrs_serde import serde\nfrom attr import attrs, attrib\n@serde\n@attrs\nclass Person(object):\n name = attrib(metadata={\"to\": name_path, \"from\": name_path})\n phone = attrib(metadata={\"to\": phone_path, \"from\": phone_path})\n```\n\nCustom `from` and `to` keys (in case you or a different extension use those):\n\n```py\nfrom attrs_serde import serde\nfrom attr import attrs, attrib\n@serde(from_key=\"get\", to_key=\"set\")\n@attrs\nclass Person(object):\n name = attrib(metadata={\"get\": name_path, \"set\": name_path})\n phone = attrib(metadata={\"get\": phone_path, \"set\": phone_path})\n```\n\n## Performance\n\n`attrs-serde` works with `cytoolz` (mostly C implementation) and so presents very low overhead over what `attrs` already does.\n\n\nAgainst manual object construction:\n\n```\n------------------------------------------------------------------------------------- benchmark 'deserialization': 2 tests ------------------------------------------------------------------------------------\nName (time in ns) Min Max Mean StdDev Median IQR Outliers OPS (Kops/s) Rounds Iterations\n---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\ntest_deser_baseline 583.2500 (1.0) 5,037.3500 (1.0) 641.4743 (1.0) 161.4237 (1.0) 603.8500 (1.0) 33.7500 (1.0) 2315;3276 1,558.9089 (1.0) 77828 20\ntest_deser_serde 1,976.0000 (3.39) 88,504.0000 (17.57) 2,226.3774 (3.47) 1,195.7336 (7.41) 2,127.0000 (3.52) 110.0000 (3.26) 484;1576 449.1601 (0.29) 86806 1\n---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n```\n\nSerialization against attr's `asdict`:\n\n```\n-------------------------------------------------------------------------- benchmark 'serialization': 2 tests --------------------------------------------------------------------------\nName (time in us) Min Max Mean StdDev Median IQR Outliers OPS (Kops/s) Rounds Iterations\n----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\ntest_ser_baseline 2.6600 (1.0) 130.4550 (1.33) 2.9098 (1.0) 1.3230 (1.0) 2.7940 (1.0) 0.1320 (1.0) 302;882 343.6625 (1.0) 46642 1\ntest_ser_serde 5.0390 (1.89) 98.4540 (1.0) 5.6411 (1.94) 2.2398 (1.69) 5.4465 (1.95) 0.2890 (2.19) 491;912 177.2706 (0.52) 32936 1\n----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n```\n\n### Thanks:\n\nTo all [Contributors](https://github.com/jondot/attrs-serde/graphs/contributors) - you make this happen, thanks!\n\n# Copyright\n\nCopyright (c) 2018 [@jondot](http://twitter.com/jondot). See [LICENSE](LICENSE.txt) for further details.", "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/jondot/attrs-serde", "keywords": "attrs,serialization,dict,data,nested,functional", "license": "MIT", "maintainer": "Dotan Nahum", "maintainer_email": "jondotan@gmail.com", "name": "attrs-serde", "package_url": "https://pypi.org/project/attrs-serde/", "platform": "", "project_url": "https://pypi.org/project/attrs-serde/", "project_urls": { "Documentation": "https://github.com/jondot/attrs-serde", "Homepage": "https://github.com/jondot/attrs-serde", "Repository": "https://github.com/jondot/attrs-serde" }, "release_url": "https://pypi.org/project/attrs-serde/0.2.2/", "requires_dist": [ "toolz (>=0.9.0,<0.10.0)", "cytoolz (>=0.9.0,<0.10.0)", "attrs (>=19.1,<20.0)" ], "requires_python": "", "summary": "A serialization addon for attrs", "version": "0.2.2" }, "last_serial": 5160631, "releases": { "0.1.1": [ { "comment_text": "", "digests": { "md5": "ca4a8db20641c44555a6a35f9fbe7d7b", "sha256": "fd398bd0c84367075d8536afe30c87379a7c3653fa589a5156a92768ea30976a" }, "downloads": -1, "filename": "attrs_serde-0.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "ca4a8db20641c44555a6a35f9fbe7d7b", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 3744, "upload_time": "2018-11-09T17:17:38", "url": "https://files.pythonhosted.org/packages/f9/c6/e588c48052259dd74c69694cee114eb9393141064b78ec2ceaa0c697a2bd/attrs_serde-0.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3e04ee2b19cef63a26693da32f0f9d4c", "sha256": "8a9ff06e2d92f662fc860f5a541bf209e12d9ff885c8ff6ec66d077d56f14a6d" }, "downloads": -1, "filename": "attrs-serde-0.1.1.tar.gz", "has_sig": false, "md5_digest": "3e04ee2b19cef63a26693da32f0f9d4c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3163, "upload_time": "2018-11-09T17:17:36", "url": "https://files.pythonhosted.org/packages/c1/7c/9a8c7ce790a4fd8467ed97ece775fc95d7fa195b8f93a97d053d6db09046/attrs-serde-0.1.1.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "df2c8dbd1f3bad43ab1547d8ad0db206", "sha256": "83905a07e7c5205e47fb84c1b6db08420cca881a08715f18d0fa2a123a91902b" }, "downloads": -1, "filename": "attrs_serde-0.2.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "df2c8dbd1f3bad43ab1547d8ad0db206", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 4214, "upload_time": "2018-11-11T19:36:09", "url": "https://files.pythonhosted.org/packages/72/79/469e93d48a9992f57baf49ecefb701b3aba1efd353d41880ffc239cf38b6/attrs_serde-0.2.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "aae03d8fd331b50933d70594706c3be4", "sha256": "6b0bef663063ac5fd10a8cd488a9b950b0073dbd65b631b3410ba3c6dc037830" }, "downloads": -1, "filename": "attrs-serde-0.2.1.tar.gz", "has_sig": false, "md5_digest": "aae03d8fd331b50933d70594706c3be4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3373, "upload_time": "2018-11-11T19:36:07", "url": "https://files.pythonhosted.org/packages/ec/84/d963f908b330a11f0185f3842313752201b890823aae3cdb44d0c1704254/attrs-serde-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "bb9583a2da73a6960c8591f575ec687d", "sha256": "71e96f91022436e5cf23c87c626398faf7f35b5c811afd32e1ade5a702fb87dd" }, "downloads": -1, "filename": "attrs_serde-0.2.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "bb9583a2da73a6960c8591f575ec687d", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 3418, "upload_time": "2019-04-18T14:36:00", "url": "https://files.pythonhosted.org/packages/61/8d/62a0fa81c6f1b0f1a431db13d7ba896b0aea0782b52b3affbb82f8f786c5/attrs_serde-0.2.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7f9101e928a871132fd9bb538de3cb39", "sha256": "5cf1b5f7672885a2bee848562e726a878fa5f0566426d3bf01f41861c1818eca" }, "downloads": -1, "filename": "attrs-serde-0.2.2.tar.gz", "has_sig": false, "md5_digest": "7f9101e928a871132fd9bb538de3cb39", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3439, "upload_time": "2019-04-18T14:35:59", "url": "https://files.pythonhosted.org/packages/4f/ac/21a8259c2ec38e0d2dcc49b3a8b4f3bc5453cc5559409a4ca879ee28b44a/attrs-serde-0.2.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "bb9583a2da73a6960c8591f575ec687d", "sha256": "71e96f91022436e5cf23c87c626398faf7f35b5c811afd32e1ade5a702fb87dd" }, "downloads": -1, "filename": "attrs_serde-0.2.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "bb9583a2da73a6960c8591f575ec687d", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 3418, "upload_time": "2019-04-18T14:36:00", "url": "https://files.pythonhosted.org/packages/61/8d/62a0fa81c6f1b0f1a431db13d7ba896b0aea0782b52b3affbb82f8f786c5/attrs_serde-0.2.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7f9101e928a871132fd9bb538de3cb39", "sha256": "5cf1b5f7672885a2bee848562e726a878fa5f0566426d3bf01f41861c1818eca" }, "downloads": -1, "filename": "attrs-serde-0.2.2.tar.gz", "has_sig": false, "md5_digest": "7f9101e928a871132fd9bb538de3cb39", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3439, "upload_time": "2019-04-18T14:35:59", "url": "https://files.pythonhosted.org/packages/4f/ac/21a8259c2ec38e0d2dcc49b3a8b4f3bc5453cc5559409a4ca879ee28b44a/attrs-serde-0.2.2.tar.gz" } ] }