{ "info": { "author": "Kyle Altendorf", "author_email": "", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "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": "exttr\n=====\n\n|PyPI| |Pythons| |Travis| |GitHub|\n\nIntegrating extra metadata into attr.ib()\n\n.. |PyPI| image:: https://img.shields.io/pypi/v/exttr.svg\n :alt: PyPI version\n :target: https://pypi.org/project/exttr/\n\n.. |Pythons| image:: https://img.shields.io/pypi/pyversions/exttr.svg\n :alt: supported Python versions\n :target: https://pypi.org/project/exttr/\n\n.. |Travis| image:: https://travis-ci.org/altendky/exttr.svg?branch=master\n :alt: Travis build status\n :target: https://travis-ci.org/altendky/exttr\n\n.. |GitHub| image:: https://img.shields.io/github/last-commit/altendky/exttr/master.svg\n :alt: source on GitHub\n :target: https://github.com/altendky/exttr\n\n\nExample\n-------\n\nWith a little luck a better example will be provided later but for now, here's something.\n\nA dev in ``#python`` was interested in having click_ build them attrs_-defined configuration objects.\nHere's a basic solution for that with the click options being defined on the attrs class attributes via a custom exttr keyword argument ``click=``.\n\n.. _attrs: https://github.com/python-attrs/attrs\n.. _click: https://github.com/pallets/click\n\n.. code-block:: python\n\n import collections\n import sys\n\n import attr\n import click\n import exttr\n\n\n exttr.register_keywords(\n exttr.Keyword(name='click'),\n )\n\n\n @attr.s\n class Configuration:\n foo = exttr.ib(click=click.option('--red'))\n\n\n def main(configuration):\n print(configuration)\n\n def clicked_fields(cls):\n fields = collections.OrderedDict()\n\n for field in attr.fields(cls):\n decorator = exttr.get(cls, field.name, 'click')\n\n if decorator is None:\n continue\n\n fields[field.name] = decorator\n\n return fields\n\n\n def build_click(f, cls, command_or_group):\n fields = clicked_fields(cls)\n\n def cli(*args, **kwargs):\n configuration = cls(*args, **kwargs)\n\n return f(configuration)\n\n for name, decorator in reversed(fields.items()):\n before = getattr(cli, '__click_params__', [])\n\n cli = decorator(cli)\n\n after = getattr(cli, '__click_params__', [])\n new = after[len(before):]\n\n if len(new) == 1:\n new, = new\n new.name = name\n\n return command_or_group(cli)\n\n\n click_main = build_click(\n f=main,\n cls=Configuration,\n command_or_group=click.command(),\n )\n\n\n sys.argv[1:] = ['--red', 'burgundy']\n try:\n click_main()\n except SystemExit:\n pass\n\nOutput:\n\n.. code-block:: python\n\n Configuration(foo='burgundy')\n\n\n", "description_content_type": "text/x-rst", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/altendky/exttr", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "exttr", "package_url": "https://pypi.org/project/exttr/", "platform": "", "project_url": "https://pypi.org/project/exttr/", "project_urls": { "Homepage": "https://github.com/altendky/exttr" }, "release_url": "https://pypi.org/project/exttr/2019.2.2/", "requires_dist": [ "attrs", "coverage ; extra == 'dev'", "gitignoreio ; extra == 'dev'", "pytest ; extra == 'dev'", "pytest-cov ; extra == 'dev'", "tox ; extra == 'dev'" ], "requires_python": "", "summary": "Integrating extra metadata into attr.ib()", "version": "2019.2.2" }, "last_serial": 4874313, "releases": { "2019.2": [ { "comment_text": "", "digests": { "md5": "d4779dd562d9cab469326da8826d7756", "sha256": "e2b4ae70e96f2566c714a61758980cc532f437d53a607f012cf28edd98dcea9d" }, "downloads": -1, "filename": "exttr-2019.2-py3-none-any.whl", "has_sig": false, "md5_digest": "d4779dd562d9cab469326da8826d7756", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 5274, "upload_time": "2019-02-24T22:51:28", "url": "https://files.pythonhosted.org/packages/63/2e/4f51d7a36a5bd7c2aa52a0cf975b1bcce9333130fc01ff3ab8797ff0ec0d/exttr-2019.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ff0a2e75b6a2db8abbd2416b320f6c9c", "sha256": "7cc42792b062d8f8427423d0cc8091578f2c6561a445ad82ab1757c3511ebce9" }, "downloads": -1, "filename": "exttr-2019.2.tar.gz", "has_sig": false, "md5_digest": "ff0a2e75b6a2db8abbd2416b320f6c9c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19473, "upload_time": "2019-02-24T22:51:30", "url": "https://files.pythonhosted.org/packages/95/45/b0d11629602bb56638623c8748b3d9a71040c2a21868962867d163666805/exttr-2019.2.tar.gz" } ], "2019.2.1": [ { "comment_text": "", "digests": { "md5": "bea3750584766d1e1dbf81fca83a375b", "sha256": "50deb5f04a9cb268c02179a35e54d0e85997ec8584b5578f8b7e20d12b6eca14" }, "downloads": -1, "filename": "exttr-2019.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "bea3750584766d1e1dbf81fca83a375b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 6103, "upload_time": "2019-02-25T06:44:36", "url": "https://files.pythonhosted.org/packages/ae/f7/98ad5ecc0638ca5d741ebcc05b50da73f2076cc6d6d11e152a17d449b3d9/exttr-2019.2.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8752446fbce9f406936f73da9df61445", "sha256": "8a367dbef2d26fd101f41a4b75553b8629e7b3724595608f5d4324e94e89ec4f" }, "downloads": -1, "filename": "exttr-2019.2.1.tar.gz", "has_sig": false, "md5_digest": "8752446fbce9f406936f73da9df61445", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20440, "upload_time": "2019-02-25T06:44:37", "url": "https://files.pythonhosted.org/packages/3e/a2/a44aca8405d57f21df687d1bfaa1ceb9a3e48a0e925fd662b56d5796bd28/exttr-2019.2.1.tar.gz" } ], "2019.2.2": [ { "comment_text": "", "digests": { "md5": "7de8bb2afe6ddffa7f7ae3b49e953737", "sha256": "5b6898fc3d9db71614805cd09ca7490495fa65a0580a2ad58c9ad9778913e468" }, "downloads": -1, "filename": "exttr-2019.2.2-py3-none-any.whl", "has_sig": false, "md5_digest": "7de8bb2afe6ddffa7f7ae3b49e953737", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 6611, "upload_time": "2019-02-27T14:18:31", "url": "https://files.pythonhosted.org/packages/c9/ce/4c1b8fb5be4aae1570c438c7162296e1c7a3a247bd65a2521af0d216ec1a/exttr-2019.2.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f1573fa6b294875d1d04cd1bb193a15f", "sha256": "961c733f3ea00727f099904a4279fd44551754913c3aeed910837bf4ed0f7e45" }, "downloads": -1, "filename": "exttr-2019.2.2.tar.gz", "has_sig": false, "md5_digest": "f1573fa6b294875d1d04cd1bb193a15f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20730, "upload_time": "2019-02-27T14:18:32", "url": "https://files.pythonhosted.org/packages/ef/6c/b5872c040b75ce5b447c41ab9abedc6bcdb243a53734ae6a91bab1b072c8/exttr-2019.2.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "7de8bb2afe6ddffa7f7ae3b49e953737", "sha256": "5b6898fc3d9db71614805cd09ca7490495fa65a0580a2ad58c9ad9778913e468" }, "downloads": -1, "filename": "exttr-2019.2.2-py3-none-any.whl", "has_sig": false, "md5_digest": "7de8bb2afe6ddffa7f7ae3b49e953737", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 6611, "upload_time": "2019-02-27T14:18:31", "url": "https://files.pythonhosted.org/packages/c9/ce/4c1b8fb5be4aae1570c438c7162296e1c7a3a247bd65a2521af0d216ec1a/exttr-2019.2.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f1573fa6b294875d1d04cd1bb193a15f", "sha256": "961c733f3ea00727f099904a4279fd44551754913c3aeed910837bf4ed0f7e45" }, "downloads": -1, "filename": "exttr-2019.2.2.tar.gz", "has_sig": false, "md5_digest": "f1573fa6b294875d1d04cd1bb193a15f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20730, "upload_time": "2019-02-27T14:18:32", "url": "https://files.pythonhosted.org/packages/ef/6c/b5872c040b75ce5b447c41ab9abedc6bcdb243a53734ae6a91bab1b072c8/exttr-2019.2.2.tar.gz" } ] }