{ "info": { "author": "Gregor Giesen", "author_email": "giesen@zaehlwerk.net", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)", "Programming Language :: Python", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy" ], "description": "=============\nargparse-deco\n=============\n\nargparse-deco is basically syntatic sugar for argparse using\ndecorators. Although it inherited some ideas and concepts from\nKevin L. Mitchell's **cli_tools**\n(https://github.com/klmitch/cli_tools), it does not share its source\ncode.\n\nIts main difference is the possibility to abuse Python's class\nsyntax to define complex CLI tools with nested subcommands and\nthe use of `inspect.signature` to autogenerate a command's arguments\nfrom a function's signature.\n\nSimple CLI\n==========\n\nThe API suffices to use three imports.\n\n>>> from argparse_deco import CLI, Arg, Flag\n\nAn an example for a simple CLI, one may use `CLI` as decorator for a\nfunction in order to transform it:\n\n>>> @CLI(prog=\"prog\")\n... def prog(\n... integers: Arg(metavar='N', nargs='+', type=int,\n... help=\"an integerfor the accumulator\"),\n... accumulate: Arg('--sum', action='store_const', const=sum,\n... help=\"sum the integers (default: find the max)\"\n... )=max):\n... \"\"\"Process some integers.\"\"\"\n... print(accumulate(integers))\n\nThe decorator `CLI` transforms the function `prog` into an `Command`\ninstance. Effectively `prog` takes some command line argument like\n`[ \"1\", \"2\", \"4\", \"--sum\" ]` as `cli_args` keyword, which is transformed\nby the `argparse` module into arguments `integer` and `accumulate`\npassed down to the original function `prog`:\n\n>>> prog([\"1\", \"2\", \"4\", \"--sum\"])\n7\n>>> prog([\"1\", \"2\", \"4\"])\n4\n\nIn order to obtain the `ArgumentParser` instance, `prog` has the class\nmethod `setup_parser`:\n\n>>> parser = prog.setup_parser()\n>>> print(parser)\nArgumentParser(prog='prog', usage=None, description='Process some integers.', formatter_class=, conflict_handler='error', add_help=True)\n>>> parser.print_usage()\nusage: prog [-h] [--sum] N [N ...]\n\n>>> parser.print_help()\nusage: prog [-h] [--sum] N [N ...]\n\nProcess some integers.\n\npositional arguments:\n N an integerfor the accumulator\n\noptional arguments:\n -h, --help show this help message and exit\n --sum sum the integers (default: find the max)\n\n\nArguments\n---------\n\nIn order for a function's arguments to be processed as\n`ArgumentParser` argument, they have to annotated by `Arg`. Basically\n`Arg` allows a the type as keyword, and arbitrary keyword arguments\nwhich are passed almost unchanged to `ArgumentParser.add_argument`.\n\n\nParser\n------\n\nWhile the `ArgumentParser` instance's `description` is usually the\nfunction's docstring, one may want to further customise it using the\n`CLI.parser` decorator which accepts any argument `ArgumentParser`\nwould.\n\n\nGroups\n------\n\nArguments can be groupsed by using the `Group` instead of `Arg` in the\nargument's annotation, which accepts a group name as first keyword and\nthe type as second one. The group can be customised (title,\ndescription) using the `CLI.group` decorator:\n\n>>> @CLI(\"prog\")\n... @CLI.group('foo', title=\"Foo\", description=\"Foo group\")\n... def prog(\n... bar: Arg['foo'](help=\"Bar option\"),\n... baz: Arg['foo'](help=\"Baz option\")):\n... pass\n>>> prog.setup_parser().print_help()\nusage: prog [-h] bar baz\n\noptional arguments:\n -h, --help show this help message and exit\n\nFoo:\n Foo group\n\n bar Bar option\n baz Baz option\n\nSimilarily using the `CLI.mutually_exclusive` decorator, arguments can\nbe turned into a mutually exclusive group.\n\n\nSubcommands\n===========\n\n>>> @CLI(\"prog\")\n... @CLI.subparsers(help=\"sub-command help\")\n... class prog:\n... def __call__(foo: Flag('--foo', help=\"foo help\")):\n... pass\n... def a(bar: Arg(type=int, help=\"bar help\")):\n... \"\"\"a help\"\"\"\n... def b(baz: Arg('--baz', choices='XYZ', help=\"baz help\")):\n... \"\"\"b help\"\"\"\n>>> prog.parser.print_help()\nusage: prog [-h] [--foo] {a,b} ...\n\npositional arguments:\n {a,b} sub-command help\n a a help\n b b help\n\noptional arguments:\n -h, --help show this help message and exit\n --foo foo help\n\n>>> prog.parser.parse_args(['a', '12'])\nNamespace(_func=, _parser=..., bar=12, foo=False)\n>>> prog.parser.parse_args(['--foo', 'b', '--baz', 'Z'])\nNamespace(_func=, _parser=..., baz='Z', foo=True)\n\nDeeper levels of subcommands can be generated using class definitions within:\n\n>>> @CLI(\"prog\")\n... class prog:\n... class foo:\n... \"\"\"foo subcommand\"\"\"\n... def bar():\n... \"\"\"foo bar subsubcommand\"\"\"\n... def baz():\n... \"\"\"foo baz subsubcommand\"\"\"\n... class oof:\n... def rab():\n... \"\"\"oof rab subsubcommand\"\"\"\n... def zab():\n... \"\"\"oof zab subsubcommand\"\"\"\n>>> prog.parser.print_help()\nusage: prog [-h] {foo,oof} ...\n\npositional arguments:\n {foo,oof}\n foo foo subcommand\n\noptional arguments:\n -h, --help show this help message and exit\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/zaehlwerk/argparse-deco", "keywords": "cli", "license": "GPLv3", "maintainer": "", "maintainer_email": "", "name": "argparse-deco", "package_url": "https://pypi.org/project/argparse-deco/", "platform": "", "project_url": "https://pypi.org/project/argparse-deco/", "project_urls": { "Homepage": "https://github.com/zaehlwerk/argparse-deco" }, "release_url": "https://pypi.org/project/argparse-deco/0.5.2/", "requires_dist": [ "pytest; extra == 'test'", "pytest-cov; extra == 'test'", "pytest-flakes; extra == 'test'", "pytest-mock; extra == 'test'", "pytest-pep8; extra == 'test'", "pytest-runner; extra == 'test'" ], "requires_python": "", "summary": "argparse-deco - Syntactic sugar for argparse", "version": "0.5.2" }, "last_serial": 4175761, "releases": { "0.5.0": [ { "comment_text": "", "digests": { "md5": "294d481182daf4bfe411f3cd56da567d", "sha256": "2ef145bb8481c20fe434a5f172df7591664bfc913158bbec26da7469b4333796" }, "downloads": -1, "filename": "argparse_deco-0.5.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "294d481182daf4bfe411f3cd56da567d", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 10897, "upload_time": "2018-07-26T19:50:15", "url": "https://files.pythonhosted.org/packages/8d/0e/6040a94c3b249d65569242b4522b911c015ac1e031f682d2b20192539cf0/argparse_deco-0.5.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3f472ad689646fdee0c764fe1ad87527", "sha256": "6382b885c683c1918d2db04c74e209e05d77c4a5b1f727289beb9c8c5096e88e" }, "downloads": -1, "filename": "argparse-deco-0.5.0.tar.gz", "has_sig": false, "md5_digest": "3f472ad689646fdee0c764fe1ad87527", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8491, "upload_time": "2018-07-26T19:50:17", "url": "https://files.pythonhosted.org/packages/94/4b/1596957d25078ace4bc821e0e29dc2b265ea1bd1fbda0febdbbf99b369a9/argparse-deco-0.5.0.tar.gz" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "ce2bb86e5f20cbc07eb55e3d026df869", "sha256": "55969dfc9636c695a38ab5f02dde0fad02e65bdc4582d3d225c4694f01b3eb76" }, "downloads": -1, "filename": "argparse_deco-0.5.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "ce2bb86e5f20cbc07eb55e3d026df869", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 10773, "upload_time": "2018-07-26T20:38:38", "url": "https://files.pythonhosted.org/packages/bb/4b/0f640da28cd48f1e0e4c9f2099a54758c1b4111491f9b4289a884daca82c/argparse_deco-0.5.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "507067f526d3cf1bc986472f2825e8a2", "sha256": "9dce351433dd72f968b8a7eb56629d105dbf26f788d80ff98a90f226c2fc1dfb" }, "downloads": -1, "filename": "argparse-deco-0.5.1.tar.gz", "has_sig": false, "md5_digest": "507067f526d3cf1bc986472f2825e8a2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8363, "upload_time": "2018-07-26T20:38:40", "url": "https://files.pythonhosted.org/packages/e8/81/334588b6a7d3ed28ced89727908cc26b99d2265661cf436a6c49b6e1c85f/argparse-deco-0.5.1.tar.gz" } ], "0.5.2": [ { "comment_text": "", "digests": { "md5": "dd7ab18bc59ab785c3b1fd5561e81b52", "sha256": "c88c052137ab0e28cb7ed80f74326b57677fcd5f92b703f333bb48fc9c5ecd8c" }, "downloads": -1, "filename": "argparse_deco-0.5.2-py3-none-any.whl", "has_sig": false, "md5_digest": "dd7ab18bc59ab785c3b1fd5561e81b52", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 23095, "upload_time": "2018-08-16T08:09:00", "url": "https://files.pythonhosted.org/packages/53/72/5b35e1b651c0bc9ded7bfddaee76cf19a1fc20e237639a9e5141142d64f5/argparse_deco-0.5.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "05c08fff25f890bff1eb96eb03490afc", "sha256": "6c8b367ea5c081b3256be1b47407f4d879b75a6d25cc35f1763b087dc3293269" }, "downloads": -1, "filename": "argparse-deco-0.5.2.tar.gz", "has_sig": false, "md5_digest": "05c08fff25f890bff1eb96eb03490afc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8369, "upload_time": "2018-08-16T08:09:01", "url": "https://files.pythonhosted.org/packages/ed/21/8746df546141ca2c0fc13c8b52c8382ba4b3928634e936b85fb5468c0c92/argparse-deco-0.5.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "dd7ab18bc59ab785c3b1fd5561e81b52", "sha256": "c88c052137ab0e28cb7ed80f74326b57677fcd5f92b703f333bb48fc9c5ecd8c" }, "downloads": -1, "filename": "argparse_deco-0.5.2-py3-none-any.whl", "has_sig": false, "md5_digest": "dd7ab18bc59ab785c3b1fd5561e81b52", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 23095, "upload_time": "2018-08-16T08:09:00", "url": "https://files.pythonhosted.org/packages/53/72/5b35e1b651c0bc9ded7bfddaee76cf19a1fc20e237639a9e5141142d64f5/argparse_deco-0.5.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "05c08fff25f890bff1eb96eb03490afc", "sha256": "6c8b367ea5c081b3256be1b47407f4d879b75a6d25cc35f1763b087dc3293269" }, "downloads": -1, "filename": "argparse-deco-0.5.2.tar.gz", "has_sig": false, "md5_digest": "05c08fff25f890bff1eb96eb03490afc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8369, "upload_time": "2018-08-16T08:09:01", "url": "https://files.pythonhosted.org/packages/ed/21/8746df546141ca2c0fc13c8b52c8382ba4b3928634e936b85fb5468c0c92/argparse-deco-0.5.2.tar.gz" } ] }