{ "info": { "author": "Denis Mishchishin", "author_email": "dennz78@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Environment :: Console", "Intended Audience :: Developers", "Intended Audience :: Information Technology", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Utilities" ], "description": "## rx-dataclasses\n\n### type verification and convert\n\n```python\nfrom typing import *\nfrom rx.operators import map as rxmap\nfrom rxdata import dataclass, field, operators\n\n@rxmap\ndef try_convert(n):\n return int(n) if isinstance(n, str) and n.isalpha() else n\n\n@dataclass\nclass Data:\n # only int.\n number: int = field(default=1,\n invoke=operators.typeguard())\n\n # only int or string convertable to int. Always results in int.\n convert_or_die: Union[int] = field(default=1,\n invoke=[try_convert,\n operators.typeguard()])\n\n # If is string and convertable to int - perform conversion. `typing.Any` type defined explicitly during `invoke` (just for example).\n convert_or_accept: Union[int, str] = field(default=1,\n invoke=[try_convert,\n operators.typeguard(Any)])\n\n\n> data = Data(None)\nTypeError: type of number must be int; got NoneType instead\n\n> data = Data(convert_or_die=None)\nTypeError: type of convert_or_die must be int; got NoneType instead\n\n> Data(convert_or_accept=None)\nData(number=1, convert_or_die=1, convert_or_accept=None)\n\n\ndata = Data()\n\ndata.number = '3'\n> TypeError: type of number must be int; got str instead\n\ndata.number = 2\n> Data(number=2, convert_or_die=1, convert_or_accept=1)\n\ndata.convert_or_die = 2\n> Data(number=2, convert_or_die=2, convert_or_accept=1)\n\ndata.convert_or_accept = '3'\n> Data(number=2, convert_or_die=2, convert_or_accept=3)\n\ndata.convert_or_accept = '3s'\n> Data(number=2, convert_or_die=2, convert_or_accept='3s')\n\ndata.convert_or_accept = type\n> Data(number=2, convert_or_die=2, convert_or_accept=)\n```\n\n\n## description\n\nreactive python3 dataclasses - with `attrs`-like behaviour\n\n* implicit and explicit typing verification during both `init` and/or `setattr`\n* customize preprocessing (convert) during both `init` and/or `setattr`\n* reactive attributes\n\n## install\n\n```\n> pip3 install rx-dataclasses\n```", "description_content_type": "text/markdown; charset=UTF-8", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "rx-dataclasses", "package_url": "https://pypi.org/project/rx-dataclasses/", "platform": "", "project_url": "https://pypi.org/project/rx-dataclasses/", "project_urls": { "Documentation": "https://rxdata.gitlab.io", "Home": "https://gitlab.com/denz1/rxdata" }, "release_url": "https://pypi.org/project/rx-dataclasses/0.0.4/", "requires_dist": null, "requires_python": "", "summary": "dataclasses with verifiers/converters", "version": "0.0.4", "yanked": false, "yanked_reason": null }, "last_serial": 6042065, "releases": { "0.0.2": [ { "comment_text": "", "digests": { "md5": "18a337ad397ecb5170897dd464eb53cb", "sha256": "7d4068542897957ad6341b4f1161cf4a976662c92a8de7070a5ccfa704f8e18b" }, "downloads": -1, "filename": "rx-dataclasses-0.0.2.tar.gz", "has_sig": false, "md5_digest": "18a337ad397ecb5170897dd464eb53cb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10135, "upload_time": "2019-09-07T11:00:28", "upload_time_iso_8601": "2019-09-07T11:00:28.255457Z", "url": "https://files.pythonhosted.org/packages/89/66/620096821724ace225aad883d9d6f68d2469b2417ec72426afacf1bb12ca/rx-dataclasses-0.0.2.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "f5b9e3f4a712177f9def18418237a85e", "sha256": "a643be30a01e411542a7494af072e2955d60ff56d4f9b1f73fb5d197368ab837" }, "downloads": -1, "filename": "rx-dataclasses-0.0.3.tar.gz", "has_sig": false, "md5_digest": "f5b9e3f4a712177f9def18418237a85e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17560, "upload_time": "2019-10-11T10:13:36", "upload_time_iso_8601": "2019-10-11T10:13:36.943332Z", "url": "https://files.pythonhosted.org/packages/79/cd/48cfbf3e202096b685027a5020d2b3c3887b30d1ee1b4599809bc190b4b0/rx-dataclasses-0.0.3.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "663e5726b542fa6e69214c7efaf918d4", "sha256": "2e84cb066b0aa4bd6b2e75c8f2b35c1c03977ae018ef41fc8158595424e767cc" }, "downloads": -1, "filename": "rx-dataclasses-0.0.4.tar.gz", "has_sig": false, "md5_digest": "663e5726b542fa6e69214c7efaf918d4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18241, "upload_time": "2019-10-28T14:15:18", "upload_time_iso_8601": "2019-10-28T14:15:18.542720Z", "url": "https://files.pythonhosted.org/packages/84/0b/5533bd82be30e6ed9d904dcff8a85cf61bbadebeeba5dfb636e16cd8c463/rx-dataclasses-0.0.4.tar.gz", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "663e5726b542fa6e69214c7efaf918d4", "sha256": "2e84cb066b0aa4bd6b2e75c8f2b35c1c03977ae018ef41fc8158595424e767cc" }, "downloads": -1, "filename": "rx-dataclasses-0.0.4.tar.gz", "has_sig": false, "md5_digest": "663e5726b542fa6e69214c7efaf918d4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18241, "upload_time": "2019-10-28T14:15:18", "upload_time_iso_8601": "2019-10-28T14:15:18.542720Z", "url": "https://files.pythonhosted.org/packages/84/0b/5533bd82be30e6ed9d904dcff8a85cf61bbadebeeba5dfb636e16cd8c463/rx-dataclasses-0.0.4.tar.gz", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }