{ "info": { "author": "Nathan West", "author_email": "", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3 :: Only", "Topic :: Software Development", "Topic :: Software Development :: Libraries", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": ".. image:: https://badge.fury.io/py/autocommand.svg\n :target: https://badge.fury.io/py/autocommand\n.. image:: https://travis-ci.org/Lucretiel/autocommand.svg?branch=master\n :target: https://travis-ci.org/Lucretiel/autocommand\n.. image:: https://coveralls.io/repos/Lucretiel/autocommand/badge.svg\n :target: https://coveralls.io/r/Lucretiel/autocommand\n\nautocommand\n===========\n\nA library to automatically generate and run simple argparse parsers from function signatures.\n\nInstallation\n------------\n\nAutocommand is installed via pip:\n\n::\n\n $ pip install autocommand\n\nUsage\n-----\n\nAutocommand turns a function into a command-line program. It converts the function's parameter signature into command-line arguments, and automatically runs the function if the module was called as ``__main__``. In effect, it lets your create a smart main function.\n\n.. code:: python\n\n from autocommand import autocommand\n\n # This program takes exactly one argument and echos it.\n @autocommand(__name__)\n def echo(thing):\n print(thing)\n\n::\n\n $ python echo.py hello\n hello\n $ python echo.py -h\n usage: echo [-h] thing\n\n positional arguments:\n thing\n\n optional arguments:\n -h, --help show this help message and exit\n $ python echo.py hello world # too many arguments\n usage: echo.py [-h] thing\n echo.py: error: unrecognized arguments: world\n\nAs you can see, autocommand converts the signature of the function into an argument spec. When you run the file as a program, autocommand collects the command-line arguments and turns them into function arguments. The function is executed with these arguments, and then the program exits with the return value of the function, via ``sys.exit``. Autocommand also automatically creates a usage message, which can be invoked with ``-h`` or ``--help``, and automatically prints an error message when provided with invalid arguments.\n\nTypes\n~~~~~\n\nYou can use a type annotation to give an argument a type. Any type (or in fact any callable) that returns an object when given a string argument can be used, though there are a few special cases that are described later.\n\n.. code:: python\n\n @autocommand(__name__)\n def net_client(host, port: int):\n ...\n\nAutocommand will catch ``TypeErrors`` raised by the type during argument parsing, so you can supply a callable and do some basic argument validation as well.\n\nTrailing Arguments\n~~~~~~~~~~~~~~~~~~\n\nYou can add a ``*args`` parameter to your function to give it trailing arguments. The command will collect 0 or more trailing arguments and supply them to `args` as a tuple. If a type annotation is supplied, the type is applied to each argument.\n\n.. code:: python\n\n #Write the contents of each file, one by one\n @autocommand(__name__)\n def cat(*files):\n for filename in files:\n with open(filename) as file:\n for line in file:\n print(line.rstrip())\n\n::\n\n $ python cat.py -h\n usage: ipython [-h] [file [file ...]]\n\n positional arguments:\n file\n\n optional arguments:\n -h, --help show this help message and exit\n\nOptions\n~~~~~~~\n\nTo create ``--option`` switches, just assign a default. Autocommand will automatically create ``--long`` and ``-s``\\ hort switches.\n\n.. code:: python\n\n @autocommand(__name__)\n def do_with_config(argument, config='~/foo.conf'):\n pass\n\n::\n\n $ python example.py -h\n usage: example.py [-h] [-c CONFIG] argument\n\n positional arguments:\n argument\n\n optional arguments:\n -h, --help show this help message and exit\n -c CONFIG, --config CONFIG\n\nThe option's type is automatically deduced from the default, unless one is explicitly given in an annotation:\n\n.. code:: python\n\n @autocommand(__name__)\n def http_connect(host, port=80):\n print('{}:{}'.format(host, port))\n\n::\n\n $ python http.py -h\n usage: http.py [-h] [-p PORT] host\n\n positional arguments:\n host\n\n optional arguments:\n -h, --help show this help message and exit\n -p PORT, --port PORT\n $ python http.py localhost\n localhost:80\n $ python http.py localhost -p 8080\n localhost:8080\n $ python http.py localhost -p blah\n usage: http.py [-h] [-p PORT] host\n http.py: error: argument -p/--port: invalid int value: 'blah'\n\nNone\n````\n\nIf an option is given a default value of ``None``, it reads in a value as normal, but supplies ``None`` if the option isn't provided.\n\nSwitches\n````````\n\nIf an argument is given a default value of ``True`` or ``False``, or\ngiven an explicit ``bool`` type, it becomes an option switch.\n\n.. code:: python\n\n @autocommand(__name__)\n def example(verbose=False, quiet=False):\n pass\n\n::\n\n $ python example.py -h\n usage: example.py [-h] [-v] [-q]\n\n optional arguments:\n -h, --help show this help message and exit\n -v, --verbose\n -q, --quiet\n\nAutocommand attempts to do the \"correct thing\" in these cases- if the default is ``True``, then supplying the switch makes the argument ``False``; if the type is ``bool`` and the default is some other ``True`` value, then supplying the switch makes the argument ``False``, while not supplying the switch makes the argument the default value.\n\nAutocommand also supports the creation of switch inverters. Pass ``add_nos=True`` to ``autocommand`` to enable this.\n\n.. code:: python\n\n @autocommand(__name__, add_nos=True)\n def example(verbose=False):\n pass\n\n::\n\n $ python example.py -h\n usage: ipython [-h] [-v] [--no-verbose]\n\n optional arguments:\n -h, --help show this help message and exit\n -v, --verbose\n --no-verbose\n\nUsing the `--no-` version of a switch will pass the opposite value in as a function argument. If multiple switches are present, the last one takes precedence.\n\nFiles\n`````\n\nIf the default value is a file object, such as ``sys.stdout``, then autocommand just looks for a string, for a file path. It doesn't do any special checking on the string, though (such as checking if the file exists); it's better to let the client decide how to handle errors in this case. Instead, it provides a special context manager called ``smart_open``, which behaves exactly like ``open`` if a filename or other openable type is provided, but also lets you use already open files:\n\n.. code:: python\n\n from autocommand import autocommand, smart_open\n import sys\n\n # Write the contents of stdin, or a file, to stdout\n @autocommand(__name__)\n def write_out(infile=sys.stdin):\n with smart_open(infile) as f:\n for line in f:\n print(line.rstrip())\n # If a file was opened, it is closed here. If it was just stdin, it is untouched.\n\n::\n\n $ echo \"Hello World!\" | python write_out.py | tee hello.txt\n Hello World!\n $ python write_out.py --infile hello.txt\n Hello World!\n\nDescriptions and docstrings\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe ``autocommand`` decorator accepts ``description`` and ``epilog`` kwargs, corresponding to the `description `_ and `epilog `_ of the ``ArgumentParser``. If no description is given, but the decorated function has a docstring, then it is taken as the ``description`` for the ``ArgumentParser``. You can also provide both the description and epilog in the docstring by splitting it into two sections with 4 or more - characters.\n\n.. code:: python\n\n @autocommand(__name__)\n def copy(infile=sys.stdin, outfile=sys.stdout):\n '''\n Copy an the contents of a file (or stdin) to another file (or stdout)\n ----------\n Some extra documentation in the epilog\n '''\n with smart_open(infile) as istr:\n with smart_open(outfile, 'w') as ostr:\n for line in istr:\n ostr.write(line)\n\n::\n\n $ python copy.py -h\n usage: copy.py [-h] [-i INFILE] [-o OUTFILE]\n\n Copy an the contents of a file (or stdin) to another file (or stdout)\n\n optional arguments:\n -h, --help show this help message and exit\n -i INFILE, --infile INFILE\n -o OUTFILE, --outfile OUTFILE\n\n Some extra documentation in the epilog\n $ echo \"Hello World\" | python copy.py --outfile hello.txt\n $ python copy.py --infile hello.txt --outfile hello2.txt\n $ python copy.py --infile hello2.txt\n Hello World\n\nParameter descriptions\n~~~~~~~~~~~~~~~~~~~~~~\n\nYou can also attach description text to individual parameters in the annotation. To attach both a type and a description, supply them both in any order in a tuple\n\n.. code:: python\n\n @autocommand(__name__)\n def copy_net(\n infile: 'The name of the file to send',\n host: 'The host to send the file to',\n port: (int, 'The port to connect to')):\n\n '''\n Copy a file over raw TCP to a remote destination.\n '''\n # Left as an exercise to the reader\n\nDecorators and wrappers\n~~~~~~~~~~~~~~~~~~~~~~~\n\nAutocommand automatically follows wrapper chains created by ``@functools.wraps``. This means that you can apply other wrapping decorators to your main function, and autocommand will still correctly detect the signature.\n\n.. code:: python\n\n from functools import wraps\n from autocommand import autocommand\n\n def print_yielded(func):\n '''\n Convert a generator into a function that prints all yielded elements\n '''\n @wraps(func)\n def wrapper(*args, **kwargs):\n for thing in func(*args, **kwargs):\n print(thing)\n return wrapper\n\n @autocommand(__name__,\n description= 'Print all the values from START to STOP, inclusive, in steps of STEP',\n epilog= 'STOP and STEP default to 1')\n @print_yielded\n def seq(stop, start=1, step=1):\n for i in range(start, stop + 1, step):\n yield i\n\n::\n\n $ seq.py -h\n usage: seq.py [-h] [-s START] [-S STEP] stop\n\n Print all the values from START to STOP, inclusive, in steps of STEP\n\n positional arguments:\n stop\n\n optional arguments:\n -h, --help show this help message and exit\n -s START, --start START\n -S STEP, --step STEP\n\n STOP and STEP default to 1\n\nEven though autocommand is being applied to the ``wrapper`` returned by ``print_yielded``, it still retreives the signature of the underlying ``seq`` function to create the argument parsing.\n\nCustom Parser\n~~~~~~~~~~~~~\n\nWhile autocommand's automatic parser generator is a powerful convenience, it doesn't cover all of the different features that argparse provides. If you need these features, you can provide your own parser as a kwarg to `autocommand`:\n\n.. code:: python\n\n from argparse import ArgumentParser\n from autocommand import autocommand\n\n parser = ArgumentParser()\n # autocommand can't do optional positonal parameters\n parser.add_argument('arg', nargs='?')\n # or mutually exclusive options\n group = parser.add_mutually_exclusive_group()\n group.add_argument('-v', '--verbose', action='store_true')\n group.add_argument('-q', '--quiet', action='store_true')\n\n @autocommand(__name__, parser=parser)\n def main(arg, verbose, quiet):\n print(arg, verbose, quiet)\n\n::\n\n $ python parser.py -h\n usage: write_file.py [-h] [-v | -q] [arg]\n\n positional arguments:\n arg\n\n optional arguments:\n -h, --help show this help message and exit\n -v, --verbose\n -q, --quiet\n $ python parser.py\n None False False\n $ python parser.py hello\n hello False False\n $ python parser.py -v\n None True False\n $ python parser.py -q\n None False True\n $ python parser.py -vq\n usage: parser.py [-h] [-v | -q] [arg]\n parser.py: error: argument -q/--quiet: not allowed with argument -v/--verbose\n\nAny parser should work fine, so long as each of the parser's arguments has a corresponding parameter in the decorated main function. The order of parameters doesn't matter, as long as they are all present. Note that when using a custom parser, autocommand doesn't modify the parser or the retrieved arguments. This means that no description/epilog will be added, and the function's type annotations and defaults (if present) will be ignored.\n\nTesting and Library use\n-----------------------\n\nThe decorated function is only called and exited from if the first argument to ``autocommand`` is ``'__main__'`` or ``True``. If it is neither of these values, or no argument is given, then a new main function is created by the decorator. This function has the signature ``main(argv=None)``, and is intended to be called with arguments as if via ``main(sys.argv[1:])``. The function has the attributes ``parser`` and ``main``, which are the generated ``ArgumentParser`` and the original main function that was decorated. This is to facilitate testing and library use of your main. Calling the function triggers a ``parse_args()`` with the supplied arguments, and returns the result of the main function. Note that, while it returns instead of calling ``sys.exit``, the ``parse_args()`` function will raise a ``SystemExit`` in the event of a parsing error or ``-h/--help`` argument.\n\n.. code:: python\n\n @autocommand()\n def test_prog(arg1, arg2: int, quiet=False, verbose=False):\n if not quiet:\n print(arg1, arg2)\n if verbose:\n print(\"LOUD NOISES\")\n\n return 0\n\n print(test_prog(['-v', 'hello', '80']))\n\n::\n\n $ python test_prog.py\n hello 80\n LOUD NOISES\n 0\n\nIf the function is called with no arguments, ``sys.argv[1:]`` is used. This is to allow the autocommand function to be used as a setuptools entry point.\n\nExceptions and limitations\n--------------------------\n\n- There are a few possible exceptions that ``autocommand`` can raise. All of them derive from ``autocommand.AutocommandError``.\n\n - If an invalid annotation is given (that is, it isn't a ``type``, ``str``, ``(type, str)``, or ``(str, type)``, an ``AnnotationError`` is raised. The ``type`` may be any callable, as described in the `Types`_ section.\n - If the function has a ``**kwargs`` parameter, a ``KWargError`` is raised.\n - If, somehow, the function has a positional-only parameter, a ``PositionalArgError`` is raised. This means that the argument doesn't have a name, which is currently not possible with a plain ``def`` or ``lambda``, though many built-in functions have this kind of parameter.\n\n- There are a few argparse features that are not supported by autocommand.\n\n - It isn't possible to have an optional positional argument (as opposed to a ``--option``). POSIX thinks this is bad form anyway.\n - It isn't possible to have mutually exclusive arguments or options\n - It isn't possible to have subcommands or subparsers, though I'm working on a few solutions involving classes or nested function definitions to allow this.\n\nDevelopment\n-----------\n\nAutocommand cannot be important from the project root; this is to enforce separation of concerns and prevent accidental importing of `setup.py` or tests. To develop, install the project in editable mode:\n\n::\n\n $ python setup.py develop\n\nThis will create a link to the source files in the deployment directory, so that any source changes are reflected when it is imported.\n\n\n", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/Lucretiel/autocommand", "keywords": "", "license": "LGPLv3", "maintainer": "", "maintainer_email": "", "name": "autocommand", "package_url": "https://pypi.org/project/autocommand/", "platform": "any", "project_url": "https://pypi.org/project/autocommand/", "project_urls": { "Homepage": "https://github.com/Lucretiel/autocommand" }, "release_url": "https://pypi.org/project/autocommand/2.2.1/", "requires_dist": null, "requires_python": "", "summary": "A library to create a command-line program from a function", "version": "2.2.1" }, "last_serial": 3098846, "releases": { "0.9.5": [ { "comment_text": "", "digests": { "md5": "87284c76e6f90fa3105bd5e77270a457", "sha256": "c80d1b17192b97eb9e397c39ee23399b2321a5d97fce2ce3093ad720b6c1fb6b" }, "downloads": -1, "filename": "autocommand-0.9.5-py3-none-any.whl", "has_sig": false, "md5_digest": "87284c76e6f90fa3105bd5e77270a457", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 14215, "upload_time": "2015-03-02T04:54:19", "url": "https://files.pythonhosted.org/packages/1c/db/e84afc9e0f42ace173a10fb33aad852f3bb13f807cc137a95dd26888f954/autocommand-0.9.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2e9f68349bee85752a8961de49becf43", "sha256": "49080c8e18e90ffe209ed100540fd88be065b7826f1410c382ad45f4f9defc7c" }, "downloads": -1, "filename": "autocommand-0.9.5.tar.gz", "has_sig": false, "md5_digest": "2e9f68349bee85752a8961de49becf43", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13494, "upload_time": "2015-03-02T04:54:16", "url": "https://files.pythonhosted.org/packages/0c/14/ab155d19f7be7aee1af791c4e63dbdc43cd1695c96ae17a38d604b1d6457/autocommand-0.9.5.tar.gz" } ], "0.9.6": [ { "comment_text": "", "digests": { "md5": "53c9a37df96f27ce3da165b41f35de73", "sha256": "d88dc3a9b617b5ad1225485fbdf3364c0082bd61175c9c4cb0cb3c7b9885a5a4" }, "downloads": -1, "filename": "autocommand-0.9.6-py3-none-any.whl", "has_sig": false, "md5_digest": "53c9a37df96f27ce3da165b41f35de73", "packagetype": "bdist_wheel", "python_version": "3.3", "requires_python": null, "size": 14830, "upload_time": "2015-03-11T04:42:38", "url": "https://files.pythonhosted.org/packages/a9/50/1f5aa4f50bcc9d049dc8450eb969f5a88c83996264e6c3f3084a2d6acb19/autocommand-0.9.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ae8bbc0f4552aad36f823bd06a3c9815", "sha256": "66bdd438e8828d553ea25660398a725710ab8abc4199dd8fff2407b7c98ce77f" }, "downloads": -1, "filename": "autocommand-0.9.6.tar.gz", "has_sig": false, "md5_digest": "ae8bbc0f4552aad36f823bd06a3c9815", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19463, "upload_time": "2015-03-11T04:42:35", "url": "https://files.pythonhosted.org/packages/4d/83/4cbfbd6e9eee23e7b2ff190f0cb1dd05634c96f7234a8127d7a9e947f485/autocommand-0.9.6.tar.gz" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "fc175503e0057d66999cbce113261ead", "sha256": "3aa1ae219560fba0ba339ad4646939e14d84f3cd0ab20511b127bb99e267a316" }, "downloads": -1, "filename": "autocommand-1.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "fc175503e0057d66999cbce113261ead", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 14836, "upload_time": "2015-03-11T05:19:56", "url": "https://files.pythonhosted.org/packages/f2/53/3f868a04222c79b8e53e7fbf934b8279ad5ed1bcadfe34490547350ec209/autocommand-1.0.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4f28fc93e7383eab252f1318b47742dd", "sha256": "c891f342c01f50ea464c03538aa7d1ea6ca9a3f3157b3662415893f9560bb1ca" }, "downloads": -1, "filename": "autocommand-1.0.0.tar.gz", "has_sig": false, "md5_digest": "4f28fc93e7383eab252f1318b47742dd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18538, "upload_time": "2015-03-11T05:19:53", "url": "https://files.pythonhosted.org/packages/a2/02/3da4f468f0fc50276f1acd52101a55488c6da32cd13dd211235cd37d2358/autocommand-1.0.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "ed1c6ad019ad5eed137b589ee87add7d", "sha256": "f1b941ce2760867c02244fa75fa60fe84915cc7e2d7e677dbbe360359181a928" }, "downloads": -1, "filename": "autocommand-1.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "ed1c6ad019ad5eed137b589ee87add7d", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 14809, "upload_time": "2015-03-11T05:50:23", "url": "https://files.pythonhosted.org/packages/31/9f/9c9b3a93b9d988bd607da287d2cb32b5192a9ab04f4200c231ed029c6489/autocommand-1.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fdeb6701a2f33ff99da60d826908433c", "sha256": "5fa64d1b337f3ce1a3869839a99246ec8fe34c79b631695d12ae133b1c3a7c4f" }, "downloads": -1, "filename": "autocommand-1.0.1.tar.gz", "has_sig": false, "md5_digest": "fdeb6701a2f33ff99da60d826908433c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18506, "upload_time": "2015-03-11T05:50:20", "url": "https://files.pythonhosted.org/packages/dc/16/e2074a3c6c0deb3cd48a4382a18e2ea6a4245bf1024bd25349f26539e693/autocommand-1.0.1.tar.gz" } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "65b0f6d6f1db1b6983488b53c24878cc", "sha256": "928473efea03a80e9b1774ac8c1ae8965ba8391db129ed079a02e5095e2dd7b8" }, "downloads": -1, "filename": "autocommand-1.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "65b0f6d6f1db1b6983488b53c24878cc", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 14805, "upload_time": "2015-03-11T05:58:39", "url": "https://files.pythonhosted.org/packages/14/f9/31a41e4f814231c335b5fe525922a8bceac6d3e055feb694ebeea8b0a322/autocommand-1.0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c3c7f9c3322d0cf9d22cfb1324b1a984", "sha256": "04a0d348a19acf571e44ce24f007b4cf8f23463d3345e1b7e2b46da255cd7aaf" }, "downloads": -1, "filename": "autocommand-1.0.2.tar.gz", "has_sig": false, "md5_digest": "c3c7f9c3322d0cf9d22cfb1324b1a984", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18505, "upload_time": "2015-03-11T05:58:37", "url": "https://files.pythonhosted.org/packages/b0/eb/cf3e101c7fae05b16e0d2d7591e22094ee3e3a8c6a1681464b87209e6e57/autocommand-1.0.2.tar.gz" } ], "2.0.0": [ { "comment_text": "", "digests": { "md5": "40b36b9eee4d44cfcd90e8cac4cdda35", "sha256": "90819e8cff3487a6616e2121b4ff81b7e8f013d5aeec73567071391a7dfc59bd" }, "downloads": -1, "filename": "autocommand-2.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "40b36b9eee4d44cfcd90e8cac4cdda35", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 15109, "upload_time": "2015-03-14T05:20:41", "url": "https://files.pythonhosted.org/packages/76/32/b8b9153f06e87905f9a29bbda9d2ab70c97ef841c27b6155fcd92fc85e42/autocommand-2.0.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c6bb3692743693a50cf82797c10e8476", "sha256": "638a250df7b8756c1d27f531e61628f9201ff84966505c51d61990b3a3fdaa21" }, "downloads": -1, "filename": "autocommand-2.0.0.tar.gz", "has_sig": false, "md5_digest": "c6bb3692743693a50cf82797c10e8476", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19835, "upload_time": "2015-03-14T05:20:38", "url": "https://files.pythonhosted.org/packages/28/a2/3c7deb66eb092d7a6347013fa24619af913df1ef10f3dc4a42adad10ebc6/autocommand-2.0.0.tar.gz" } ], "2.0.1": [ { "comment_text": "", "digests": { "md5": "fae6ea0f2b4f22ec6406cc6f9fa7610a", "sha256": "bd759c8821618c35c9ed7e2908bd10457bf6d5225b222b55beda6a313139318a" }, "downloads": -1, "filename": "autocommand-2.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "fae6ea0f2b4f22ec6406cc6f9fa7610a", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 15782, "upload_time": "2015-03-16T16:26:38", "url": "https://files.pythonhosted.org/packages/78/8f/462a544c12a4145f92907bc5f2d6e070856c266759822ff83b535b69ec60/autocommand-2.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c3b8559b9406109cd317b8baa4f30533", "sha256": "dfb36e73f5fcc233bd2da532175aaa993f688164baa29fa06e5e03dcba831092" }, "downloads": -1, "filename": "autocommand-2.0.1.tar.gz", "has_sig": false, "md5_digest": "c3b8559b9406109cd317b8baa4f30533", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16025, "upload_time": "2015-03-16T16:26:36", "url": "https://files.pythonhosted.org/packages/95/ae/cb9b142a79960b4c2d770e7f32cecbee3462fc5f87096cb87f2bdbb03b85/autocommand-2.0.1.tar.gz" } ], "2.1.0": [ { "comment_text": "", "digests": { "md5": "c91a9c306403f445f5fdd86d2bf46612", "sha256": "fabcedbbafafc456b382ab284c76f71a7413722c477039d05d9440c4f81cee60" }, "downloads": -1, "filename": "autocommand-2.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "c91a9c306403f445f5fdd86d2bf46612", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 21131, "upload_time": "2016-02-17T18:41:19", "url": "https://files.pythonhosted.org/packages/bd/64/68a707836c615fc826ff53be8f7f9299e8ac8b78ca9541f2024c3100953b/autocommand-2.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0d132cb55f22b7b9a03a1985fe37a739", "sha256": "0f148059d67aaae2785f6e588e0bc024962db7b6543565e02459828440693d91" }, "downloads": -1, "filename": "autocommand-2.1.0.tar.gz", "has_sig": false, "md5_digest": "0d132cb55f22b7b9a03a1985fe37a739", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21666, "upload_time": "2016-02-17T18:41:25", "url": "https://files.pythonhosted.org/packages/cb/cd/dd3114f86bc72eff35176966d27585369ea11e2d01c56232965168c42825/autocommand-2.1.0.tar.gz" } ], "2.1.1": [ { "comment_text": "", "digests": { "md5": "8adad85e3d89ce77d41a35bd87d313fb", "sha256": "5783f9c22242a1308cad96aa35f4917b4356c434ab29320e1bd01b84a2910302" }, "downloads": -1, "filename": "autocommand-2.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "8adad85e3d89ce77d41a35bd87d313fb", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 21253, "upload_time": "2016-09-07T02:36:25", "url": "https://files.pythonhosted.org/packages/5d/e8/0d6d7ac74a232a86c8a5fd852483ad9eb14df89f2c5e4ba3b7a6b64812e0/autocommand-2.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a77fce0d612b63465c5600545062a57d", "sha256": "43dd661660695ef036191d9d464ee443f35db150e710397f2984811b16925c37" }, "downloads": -1, "filename": "autocommand-2.1.1.tar.gz", "has_sig": false, "md5_digest": "a77fce0d612b63465c5600545062a57d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21767, "upload_time": "2016-09-07T02:36:27", "url": "https://files.pythonhosted.org/packages/bb/74/6ed56486ff49f1dc05e6c1a2291a089bd7e899ead29360f43e0a229f08b8/autocommand-2.1.1.tar.gz" } ], "2.1.2": [ { "comment_text": "", "digests": { "md5": "3942a8d123cd88e68331988987ac231e", "sha256": "3ecb7dc294f719a8e696e3c1ff4485f2319bf03699561b55f3d337b2af1fe744" }, "downloads": -1, "filename": "autocommand-2.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "3942a8d123cd88e68331988987ac231e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 21345, "upload_time": "2016-09-07T03:12:46", "url": "https://files.pythonhosted.org/packages/c7/f0/b5294d0f8bc942d473ff7e81d2e0f742286efc78cba3bec336ce9b581f03/autocommand-2.1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9238a61ef395537e4caaed704195df58", "sha256": "c101c674c1dc8eee94122918871e643b1ad5316c1fb82f2d6c839ccc5864af1c" }, "downloads": -1, "filename": "autocommand-2.1.2.tar.gz", "has_sig": false, "md5_digest": "9238a61ef395537e4caaed704195df58", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21908, "upload_time": "2016-09-07T03:12:48", "url": "https://files.pythonhosted.org/packages/d7/10/faa4257c11971d4023578ea2a1f62b44290b35e50635e404e84c59b7ad4b/autocommand-2.1.2.tar.gz" } ], "2.1.3": [ { "comment_text": "", "digests": { "md5": "f9bd5cc1763056fe1017e15f59e7f71a", "sha256": "e50917c3de4904551affbfaa4ab8f081790d6830675cbc5ab246a42986e33820" }, "downloads": -1, "filename": "autocommand-2.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "f9bd5cc1763056fe1017e15f59e7f71a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 21402, "upload_time": "2016-09-17T21:54:36", "url": "https://files.pythonhosted.org/packages/64/ae/35fdd4379a3d2deaf16a340cd187bdff772c92c10a9dceb1806e575b4135/autocommand-2.1.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b3b22e63136e620720e68574697a0cd6", "sha256": "374de0aa3100e5609b22fd9d9ea0e061771ee3381091e0af1206c61149aed67a" }, "downloads": -1, "filename": "autocommand-2.1.3.tar.gz", "has_sig": false, "md5_digest": "b3b22e63136e620720e68574697a0cd6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22048, "upload_time": "2016-09-17T21:54:38", "url": "https://files.pythonhosted.org/packages/d6/58/a9d130882a35df0205874d66cd6410004ba2e6b7b1475eefae78270afa72/autocommand-2.1.3.tar.gz" } ], "2.1.4": [ { "comment_text": "", "digests": { "md5": "098c835f347919a6de2637c963ad3261", "sha256": "6d2df716c09017a527994ffae34afd1c1ca7552051199763729968e0fb035cc7" }, "downloads": -1, "filename": "autocommand-2.1.4-py3-none-any.whl", "has_sig": false, "md5_digest": "098c835f347919a6de2637c963ad3261", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 21538, "upload_time": "2016-09-22T00:26:42", "url": "https://files.pythonhosted.org/packages/ed/67/dd121fa6de0cef8fdc451a5df22ea460d4bcd445f2dca0499d85d1927175/autocommand-2.1.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "cf568a2a7d3bfc9e10e76f3fcb3e7870", "sha256": "8446aedd85a3fbe80e3c214ff0182596da4a91a90c61a7c1aaefa4b60b4063c8" }, "downloads": -1, "filename": "autocommand-2.1.4.tar.gz", "has_sig": false, "md5_digest": "cf568a2a7d3bfc9e10e76f3fcb3e7870", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22283, "upload_time": "2016-09-22T00:26:44", "url": "https://files.pythonhosted.org/packages/26/65/762e1a535a31d5e81c8119bab9b6738aa1708e2df9cc63ddcf5d7fdbcbd5/autocommand-2.1.4.tar.gz" } ], "2.1.5": [ { "comment_text": "", "digests": { "md5": "0b504b8ebdd732ddd12f634c1ae2acac", "sha256": "0ae6fb0bf34dcf30604bf7007bc2ed4bc5b8354359cd3033ff87a25d3088801a" }, "downloads": -1, "filename": "autocommand-2.1.5-py3-none-any.whl", "has_sig": false, "md5_digest": "0b504b8ebdd732ddd12f634c1ae2acac", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 22066, "upload_time": "2017-04-21T03:46:54", "url": "https://files.pythonhosted.org/packages/e3/e1/29b9a68f7e7dd2b29763676c0a010344b31b5ad11117014c37006c768fc1/autocommand-2.1.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "14422d059ec4fd535debda7e1eef2c5e", "sha256": "cba7730c1eb9f1b3e8f18e3dcc62868130f9beb0364df8f06133b58df07dc748" }, "downloads": -1, "filename": "autocommand-2.1.5.tar.gz", "has_sig": false, "md5_digest": "14422d059ec4fd535debda7e1eef2c5e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22827, "upload_time": "2017-04-21T03:46:56", "url": "https://files.pythonhosted.org/packages/8e/8d/b6a5fa92c89bf0d54d67587c76b02e62cea71bc4caabeab8c1bc42797f77/autocommand-2.1.5.tar.gz" } ], "2.2.0": [ { "comment_text": "", "digests": { "md5": "02b8f6d0a783d37ce7e0dc02b24bcdab", "sha256": "f588d56c8df5442831b0f3abc09ff14e0fae6c947a45d51a29bae0f47a9bca0f" }, "downloads": -1, "filename": "autocommand-2.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "02b8f6d0a783d37ce7e0dc02b24bcdab", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 22449, "upload_time": "2017-08-10T21:07:09", "url": "https://files.pythonhosted.org/packages/c6/82/70ab956e7c76453d87640a2ef2fb8e1250fc0b3f39e9adc2482b164149d8/autocommand-2.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6fff48eafc640c5533c30acab435fd21", "sha256": "d8dea34ba12abf5fe6d8bcb9f87c1dce1a21e9b829ca773630518ff039a3839d" }, "downloads": -1, "filename": "autocommand-2.2.0.tar.gz", "has_sig": false, "md5_digest": "6fff48eafc640c5533c30acab435fd21", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23148, "upload_time": "2017-08-10T21:07:10", "url": "https://files.pythonhosted.org/packages/d5/7e/97ef9d8e77f312c50d8b989c2a1f961885732edc33ed67f202e62ded6bbb/autocommand-2.2.0.tar.gz" } ], "2.2.1": [ { "comment_text": "", "digests": { "md5": "a548db5045def68aab00a667866ad22a", "sha256": "85d03044c2a1fc1c7844ac41545045927aecde0cbaf8ea28b88e0cd8588ce5d3" }, "downloads": -1, "filename": "autocommand-2.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "a548db5045def68aab00a667866ad22a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 22455, "upload_time": "2017-08-15T18:59:58", "url": "https://files.pythonhosted.org/packages/61/55/9fb7c5a63fe0a797054034ce9aeacded2ca078690c63413ebfa06c47ee56/autocommand-2.2.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0695be9e3b7de1e589ee4cbf3734ad3d", "sha256": "fed420e9d02745821a782971b583c6970259ee0b229be2a0a401e1467a4f170f" }, "downloads": -1, "filename": "autocommand-2.2.1.tar.gz", "has_sig": false, "md5_digest": "0695be9e3b7de1e589ee4cbf3734ad3d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23151, "upload_time": "2017-08-15T18:59:59", "url": "https://files.pythonhosted.org/packages/c4/64/5974fa53f34f044008c6bc438cbb50709dd9a7ebb1bc49105957c07a0ab4/autocommand-2.2.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "a548db5045def68aab00a667866ad22a", "sha256": "85d03044c2a1fc1c7844ac41545045927aecde0cbaf8ea28b88e0cd8588ce5d3" }, "downloads": -1, "filename": "autocommand-2.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "a548db5045def68aab00a667866ad22a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 22455, "upload_time": "2017-08-15T18:59:58", "url": "https://files.pythonhosted.org/packages/61/55/9fb7c5a63fe0a797054034ce9aeacded2ca078690c63413ebfa06c47ee56/autocommand-2.2.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0695be9e3b7de1e589ee4cbf3734ad3d", "sha256": "fed420e9d02745821a782971b583c6970259ee0b229be2a0a401e1467a4f170f" }, "downloads": -1, "filename": "autocommand-2.2.1.tar.gz", "has_sig": false, "md5_digest": "0695be9e3b7de1e589ee4cbf3734ad3d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23151, "upload_time": "2017-08-15T18:59:59", "url": "https://files.pythonhosted.org/packages/c4/64/5974fa53f34f044008c6bc438cbb50709dd9a7ebb1bc49105957c07a0ab4/autocommand-2.2.1.tar.gz" } ] }