{ "info": { "author": "Maurice Lam", "author_email": "mauriceprograms@gmail.com", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: Apache Software License", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3 :: Only", "Topic :: System :: Shells" ], "description": "# Hashbang \n[![Build status](https://travis-ci.com/mauricelam/hashbang.svg?branch=master)](https://travis-ci.com/mauricelam/hashbang)\n[![PyPI](https://img.shields.io/pypi/v/hashbang.svg?color=%230073b7)](https://pypi.org/project/hashbang/)\n\nHashbang is a Python 3 library for quickly creating command-line ready scripts. In the most basic form, a simple hashbang command can be just a simple annotation. For more complex types, it relies on Python3's [keyword-only arguments](https://www.python.org/dev/peps/pep-3102/) to provide a seamless syntax for command line usage.\n\n```python3\n#!/usr/bin/env python3\n\nfrom hashbang import command\n\n@command\ndef echo(message):\n print(message)\n\nif __name__ == '__main__':\n echo.execute()\n```\n\nInstallation\n------------\n\nHashbang can be installed from pip\n\n```sh\npython3 -m pip install hashbang[completion]\n```\n\nThis will also include [argcomplete](https://github.com/kislyuk/argcomplete) which powers the autocomplete for hashbang. The completion feature is optional; if you would like to exclude it, install using `pip install hashbang`.\n\nQuick Start Examples\n--------------------\n\nLet's start with some examples.\n\n#### Simple, no argument script\n```python3\n#!/usr/bin/env python3\n\nimport os\nfrom hashbang import command\n\n@command\ndef pwd():\n return os.getcwd()\n\nif __name__ == '__main__':\n pwd.execute()\n```\n\n
$ pwd.py\n\n```\n$ pwd.py\n/home/mauricelam/code/hashbang\n```\n\n
\n\nThe return value from the function is printed to stdout.\n\nThe additional value you get from using hashbang in this simple case is the help message, and the usage message when unexpected arguments are supplied.\n\n
$ pwd.py --help\n\n```\n$ pwd.py --help\nusage: pwd.py [-h]\n\noptional arguments:\n -h, --help show this help message and exit\n```\n\n
\n\n#### Positional argument (`nargs='?'`)\n\n```python3\n@command\ndef ls(dir=None):\n return os.listdir(path=dir)\n```\n\n
$ ls.py\n\n```\n$ ls.py\nbin\netc\nhome\nusr\nvar\n```\n\n
\n
$ ls.py bin\n\n```\n$ ls.py bin\ncp\ndf\necho\nmkdir\nmv\npwd\nrm\n```\n
\n\n#### Multiple positional argument (`nargs=None`)\n\n```python3\n@command\ndef cp(src, dest):\n shutil.copy2(src, dest)\n```\n\n
$ cp.py textfile.txt copy_of_textfile.txt\n\n```\n$ cp.py textfile.txt copy_of_textfile.txt\n$ ls\ntextfile.txt copy_of_textfile.txt\n```\n\n
\n\n#### Variadic positional argument (`nargs='*'`)\n\n```python3\n@command\ndef echo(*message):\n print(' '.join(message))\n```\n\n
$ echo.py Hello world\n\n```\n$ echo.py Hello world\nHello world\n```\n\n
\n\n#### Boolean flag (default False) (`action='store_true'`)\n\n```python3\n@command\ndef pwd(*, resolve_symlink=False):\n cwd = os.cwd()\n if resolve_symlink:\n cwd = os.path.realpath(cwd)\n return cwd\n```\n\n
$ pwd.py\n\n```\n$ pwd.py\n/var\n```\n\n
\n\n
$ pwd.py --resolve_symlink\n\n```\n$ pwd.py --resolve_symlink\n/private/var\n```\n\n
\n\n#### Boolean flag (default True) (`action='store_false'`)\n\n```python3\n@command\ndef echo(*message, trailing_newline=True):\n print(' '.join(message), end=('\\n' if trailing_newline else ''))\n```\n\n
$ echo.py Hello world && echo '.'\n\n```\n$ echo.py Hello world && echo '.'\nHello world\n.\n```\n\n
\n\n
$ echo.py --notrailing_newline Hello world && echo '.'\n\n```\n$ echo.py --notrailing_newline Hello world && echo '.'\nHello world.\n```\n\n
\n\n#### Keyword argument (`action='store'`)\n\n```python3\n@command\ndef cut(*, fields=None, chars=None, delimeter='\\t'):\n result = []\n for line in sys.stdin:\n seq = line.strip('\\n').split(delimeter) if fields else line.strip('\\n')\n pos = fields or chars\n result.append(''.join(seq[int(p)] for p in pos.split(',')))\n return '\\n'.join(result)\n```\n\n
$ echo -e 'a,b,c,d\\ne,f,g,h' | cut.py --fields '1,2,3' --delimeter=','\n\n```\n$ echo -e 'a,b,c,d\\ne,f,g,h' | cut.py --fields '1,2,3' --delimeter=','\nbc\nfg\n```\n\n
\n\nCheatsheet\n----------\n\n| Parameter type | Python syntax | Command line example | argparse equivalent |\n| -------------------------------------- | ------------------------ | ------------------------ | -------------------------- |\n| Positional (no default value) | `def func(foo)` | `command.py foo` | `nargs=None` |\n| Positional (with default value) | `def func(foo=None)` | `command.py foo` | `nargs='?'` |\n| Var positional | `def func(*foo)` | `command.py foo bar baz` | `nargs='*'` |\n| Var positional (named `\\_REMAINDER\\_`) | `def func(*_REMAINDER_)` | | `nargs=argparse.REMAINDER` |\n| Keyword-only (default false) | `def func(*, foo=False)` | `command.py --foo` | `action='store_true'` |\n| Keyword-only (default true) | `def func(*, foo=True)` | `command.py --nofoo` | `action='store_false'` |\n| Keyword-only (other default types) | `def func(*, foo='bar')` | `command.py --foo value` | `action='store'` |\n| Var keyword | `def func(**kwargs)` | Not allowed in hashbang | |\n\nSee the [API reference](https://github.com/mauricelam/hashbang/wiki/API-reference) wiki page for the full APIs.\n\nCommand delegation\n------------------\n\nThe `hashbang.subcommands` function can be used to create a chain of commands, like `git branch`.\n\n```python3\n@command\ndef branch(newbranch=None):\n if newbranch is None:\n return '\\n'.join(Repository('.').heads.keys())\n return Repository('.').create_head(newbranch)\n\n@command\ndef log(*, max_count=None, graph=False):\n logs = Repository('.').log()\n if graph:\n return format_as_graph(logs)\n else:\n return '\\n'.join(logs)\n\nif __name__ == '__main__':\n subcommands(branch=branch, log=log).execute()\n```\n\n
$ git.py branch\n\n```\n$ git.py branch\nmaster\n```\n\n
\n\n
$ git.py branch hello\n\n```\n$ git.py branch hello\n$ git.py branch\nmaster\nhello\n```\n\n
\n\n
$ git.py log\n\n```\n$ git.py log\ncommit 602cbd7c68b0980ab1dbe0d3b9e83b69c04d9698 (HEAD -> master, origin/master)\nMerge: 333d617 34c0a0f\nAuthor: Maurice Lam \nDate: Mon May 13 23:32:56 2019 -0700\n\n Merge branch 'master' of ssh://github.com/mauricelam/hashbang\n\ncommit 333d6172a8afa9e81baea0d753d6cfdc7751d38d\nAuthor: Maurice Lam \nDate: Mon May 13 23:31:17 2019 -0700\n\n Move directory structure to match pypi import\n```\n\n
\n\n#### Custom command delegator\n\nIf `subocommands` is not sufficient for your purposes, you can use the `@command.delegator` decorator. Its usage is the same as the `@command` decorator, but the implementing function must then either call `.execute(_REMAINDER_)` on another command, or raise `NoMatchingDelegate` exception.\n\n```python3\n@command\ndef normal_who(*, print_dead_process=False, print_runlevel=False):\n return ...\n\n@command\ndef whoami():\n '''\n Prints who I am.\n '''\n return getpass.getuser()\n\n@command.delegator\ndef who(am=None, i=None, *_REMAINDER_):\n if (am, i) == ('am', 'i'):\n return whoami.execute([])\n elif (am, i) == (None, None):\n return normal_who.execute(_REMAINDER_)\n else:\n raise NoMatchingDelegate\n```\n\n
$ who.py\n\n```\n$ who.py\nmauricelam console May 8 00:02 \nmauricelam ttys000 May 8 00:03 \nmauricelam ttys001 May 8 00:04\n```\n\n
\n\n
$ who.py am i\n\n```\n$ who.py am i \nmauricelam ttys001 May 8 00:04\n```\n\n
\n\n
$ who.py --print_dead_process\n\n```\n$ who.py --print_dead_process\nmauricelam ttys002 May 8 00:40 \tterm=0 exit=0\n```\n\n
\n\n
$ who.py are you\n\n```\n$ who.py are you\nError: No matching delegate\n```\n\n
\n\nWhile using the regular `@command` decorator will still work in this situation, but tab-completion and help message will be wrong.\n\n
\u2713 Using @command.delegator\n\n```\n$ who.py --help\nusage: who.py [--print_dead_process] [--print_runlevel]\n\noptional arguments:\n --print_dead_process\n --print_runlevel\n```\n\n```\n$ who.py am i --help\nusage: who.py am i\n\nPrints who I am.\n```\n\n
\n\n
\u2717 Using @command\n\n```\n$ who.py am i --help\nusage: who.py [-h] [am] [i]\n\npositional arguments:\n am\n i\n\noptional arguments:\n -h, --help show this help message and exit\n```\n\n
\n\nArgument customization\n----------------------\n\nAn argument can be further customized using the `Argument` class in the `@command` decorator.\n\nFor example, an alias can be added to the argument.\n\n```python3\n@command(Argument('trailing_newline', aliases=('n',))\ndef echo(*message, trailing_newline=True):\n print(' '.join(message), end=('\\n' if trailing_newline else ''))\n```\n\n
$ echo.py Hello world && echo '.'\n\n```\n$ echo.py Hello world && echo '.'\nHello world\n.\n```\n\n
\n\n
$ echo.py -n Hello world && echo '.'\n\n```\n$ echo.py -n Hello world && echo '.'\nHello world.\n```\n\n
\n\n
Alternatively, you can also choose to specify the Argument using argument annotation syntax defined in PEP 3107.\n\n```python3\n@command\ndef echo(\n *message,\n trailing_newline: Argument(aliases=('n',)) = True):\n print(' '.join(message), end=('\\n' if trailing_newline else ''))\n```\n\n
\n\n> See https://github.com/mauricelam/hashbang/wiki/API-reference#argument for the full `Argument` API.\n\nHelp message\n------------\nThe help message for the command is take directly from the docstring of the function. Additionally, the `help` argument in `Argument` can be used to document each argument. A paragraph in the docstring prefixed with `usage:` (case insensitive) is used as the usage message.\n\n```python3\n@command\ndef git(\n command: Argument(help='Possible commands are \"branch\", \"log\", etc', choices=('branch', 'log')),\n *_REMAINDER_):\n '''\n git - the stupid content tracker\n\n Usage: git [--version] [--help] [-C ] [-c =]\n [--exec-path[=]] [--html-path] [--man-path] [--info-path]\n [-p|--paginate|-P|--no-pager] [--no-replace-objects] [--bare]\n [--git-dir=] [--work-tree=] [--namespace=]\n [--super-prefix=]\n []\n '''\n return ...\n```\n\n
$ git.py --help\n\n```\n$ git.py --help\nusage: git [--version] [--help] [-C ] [-c =]\n [--exec-path[=]] [--html-path] [--man-path] [--info-path]\n [-p|--paginate|-P|--no-pager] [--no-replace-objects] [--bare]\n [--git-dir=] [--work-tree=] [--namespace=]\n [--super-prefix=]\n []\n\ngit - the stupid content tracker\n\npositional arguments:\n {branch,log} Possible commands are \"branch\", \"log\", etc\n\noptional arguments:\n -h, --help show this help message and exit\n```\n\n
\n\n
$ git.py --nonexistent\n\n```\n$ git.py --nonexistent\nunknown option: --nonexistent\nusage: git [--version] [--help] [-C ] [-c =]\n [--exec-path[=]] [--html-path] [--man-path] [--info-path]\n [-p | --paginate | -P | --no-pager] [--no-replace-objects] [--bare]\n [--git-dir=] [--work-tree=] [--namespace=]\n []\n```\n\n
\n\nTab completion\n--------------\n\n#### Setup\n\nHashbang also comes with tab completion functionality, powered by [argcomplete](https://github.com/kislyuk/argcomplete). Since argcomplete is an optional dependency of hashbang, you can install the completion feature using\n\n```sh\npython3 -m pip install hashbang[completion]\n```\n\nAfter installing, to register a command for tab-completion, run\n\n```sh\neval \"$(register-python-argcomplete my-awesome-script)\"\n```\n\nAlternatively, to activate global completion for all commands, follow the one-time setup directions in the [Global completion](https://github.com/kislyuk/argcomplete#global-completion) section of argcomplete's documentation, and then add the string `PYTHON_ARGCOMPLETE_OK` to the top of the file as a comment (after the `#!` line).\n\n#### Specifying the choices\n\nThe simplest way to use tab completion is via the `choices` argument in the `Argument` constructor.\n\n```python3\n@command\ndef apt_get(command: Argument(choices=('update', 'upgrade', 'install', 'remove')), *_REMAINDER_):\n return subprocess.check_output(['apt-get', command, *_REMAINDER])\n```\n\n
$ apt_get.py <TAB><TAB>\n\n```\n$ apt_get.py \nupdate upgrade install remove\n```\n```\n$ apt_get.py up\nupdate upgrade\n```\n```\n$ apt_get.py upg\n$ apt_get.py upgrade\n```\n\n
\n\n#### Using a completer\n\nIf the choices are not known ahead of time (before execution), or is too expensive to precompute, you can instead specify a completer for the argument.\n\n```python3\n@command\ndef cp(src: Argument(completer=lambda x: os.listdir()), dest):\n shutils.copy2(src, dest)\n```\n\n
$ cp.py <TAB><TAB>\n\n```\n$ cp.py \nLICENSE build hashbang requirements.txt tests\n```\n```\n$ cp.py LIC\n$ cp.py LICENSE \n```\n\n
\n\nExit codes\n----------\n\nJust like normal Python programs, the preferred way to set an exit code is using `sys.exit()`. By default, exit code `0` is returned for functions that run without raising an exception, or printed a help message with `help`. If a function raises an exception, the result code is `1`. If a function quits with `sys.exit()`, the exit code of is preserved.\n\nIn addition, you can also call `sys.exit()` inside the `exception_handler` if you want to return different exit codes based on the exception that was thrown. See `tests/extension/custom_exit_codes.py` for an example.\n\nFurther reading\n---------------\n\nFor further reading, check out the [wiki](https://github.com/mauricelam/hashbang/wiki) pages.\n\n\n", "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/mauricelam/hashbang", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "hashbang", "package_url": "https://pypi.org/project/hashbang/", "platform": "", "project_url": "https://pypi.org/project/hashbang/", "project_urls": { "Homepage": "https://github.com/mauricelam/hashbang" }, "release_url": "https://pypi.org/project/hashbang/0.1.14/", "requires_dist": [ "argcomplete ; extra == 'completion'" ], "requires_python": "~=3.4", "summary": "Turn Python functions into command line interfaces", "version": "0.1.14" }, "last_serial": 5399047, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "c454751b0dd378063e39ecbf290dd621", "sha256": "c8a0fbae1cf1800fc265256615657318e2a4e9b6d859210344a8cc2053717a88" }, "downloads": -1, "filename": "hashbang-0.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "c454751b0dd378063e39ecbf290dd621", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 5482, "upload_time": "2019-05-10T06:03:32", "url": "https://files.pythonhosted.org/packages/ee/a3/26438b0240ccaf2ca8d02f5a6b5b118913565055f8f887c63fafbb462e0b/hashbang-0.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5fe643f30a747fde22bc2a65382b6ae2", "sha256": "8a9e3ace98d2d37277fdf66a5fab81955fa6baa35094339db4297073dd14936f" }, "downloads": -1, "filename": "hashbang-0.0.1.tar.gz", "has_sig": false, "md5_digest": "5fe643f30a747fde22bc2a65382b6ae2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 1044, "upload_time": "2019-05-10T06:03:34", "url": "https://files.pythonhosted.org/packages/e3/93/39faf3b377865e104a232268d49245f4f01b5d769ea359acf995a88dd346/hashbang-0.0.1.tar.gz" } ], "0.0.10": [ { "comment_text": "", "digests": { "md5": "bee4c76cc5b73c58da70f0e85bbe8df2", "sha256": "9a280f104e566e9a1e26965e810cc3d0ca31a98f93394976d227cda44b43ae60" }, "downloads": -1, "filename": "hashbang-0.0.10-py3-none-any.whl", "has_sig": false, "md5_digest": "bee4c76cc5b73c58da70f0e85bbe8df2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.4", "size": 6128, "upload_time": "2019-05-25T07:28:36", "url": "https://files.pythonhosted.org/packages/0e/9d/b457dd974b513b47ef96061e836f6df35601b956b7f564e7817c0179e998/hashbang-0.0.10-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e1a3586c867710c0c1425000fe29f3f8", "sha256": "ed20bb7c8596d80e297b14e4a7f9ddd2bee23343a83ca9c973448d351a48e8bf" }, "downloads": -1, "filename": "hashbang-0.0.10.tar.gz", "has_sig": false, "md5_digest": "e1a3586c867710c0c1425000fe29f3f8", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.4", "size": 5954, "upload_time": "2019-05-25T07:28:38", "url": "https://files.pythonhosted.org/packages/04/18/4bd173ce617873b10b6620d098617b93497287c9774c180c2cee0b5b42c4/hashbang-0.0.10.tar.gz" } ], "0.0.11": [ { "comment_text": "", "digests": { "md5": "c27e8fdad0f5130b6aa91b39c6eb0c8b", "sha256": "0b440492569048676834f695a07b7152de4d2176bed9ccc38b1815c6883d88a5" }, "downloads": -1, "filename": "hashbang-0.0.11-py3-none-any.whl", "has_sig": false, "md5_digest": "c27e8fdad0f5130b6aa91b39c6eb0c8b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.4", "size": 6128, "upload_time": "2019-05-25T07:29:49", "url": "https://files.pythonhosted.org/packages/28/dc/223839d41bfecd656ccd2a296148d38ba46ebd8f4879ae51d789fa8284e8/hashbang-0.0.11-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "93f94f84078ac6205c160486709e220b", "sha256": "6939d4b80e95db433dbdfd05f871a5481a2cb126343b97dcbb5f30d50a703a2a" }, "downloads": -1, "filename": "hashbang-0.0.11.tar.gz", "has_sig": false, "md5_digest": "93f94f84078ac6205c160486709e220b", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.4", "size": 5952, "upload_time": "2019-05-25T07:29:52", "url": "https://files.pythonhosted.org/packages/a7/8f/49a9677ee7b729e1398684f2f13943b7e6f9263dcc3f1964521c3f59bda1/hashbang-0.0.11.tar.gz" } ], "0.0.12": [ { "comment_text": "", "digests": { "md5": "2a01c420ddc51fbda05f0bbf43e96603", "sha256": "bcf01998868b4957db043dbe24080a06ebe768ebe9abbe3af3d11b0add1db05c" }, "downloads": -1, "filename": "hashbang-0.0.12-py3-none-any.whl", "has_sig": false, "md5_digest": "2a01c420ddc51fbda05f0bbf43e96603", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.4", "size": 5836, "upload_time": "2019-05-29T04:20:42", "url": "https://files.pythonhosted.org/packages/7f/a6/0ffbae11407b97e208eccb98ad759434c00f4e973a3f39a1f8df9296ca84/hashbang-0.0.12-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "25b1eed8e7642a007904acad7f252dff", "sha256": "685272ea4adb6bd44b7f89f4b34dae60bfaa78aeaef9db09435750b6fdf66723" }, "downloads": -1, "filename": "hashbang-0.0.12.tar.gz", "has_sig": false, "md5_digest": "25b1eed8e7642a007904acad7f252dff", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.4", "size": 5655, "upload_time": "2019-05-29T04:20:44", "url": "https://files.pythonhosted.org/packages/0b/92/8b978c09088e4bf5614a7fa9a6585b107bb10f370c93ab882c6661e94d66/hashbang-0.0.12.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "1576f4b3024da83e7eda140828d07474", "sha256": "cf53a22d0609e584a399c5518ede9c8221ee2586e6dba33e67df530a44e39b78" }, "downloads": -1, "filename": "hashbang-0.0.4-py3-none-any.whl", "has_sig": false, "md5_digest": "1576f4b3024da83e7eda140828d07474", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.4", "size": 26085, "upload_time": "2019-05-25T06:26:15", "url": "https://files.pythonhosted.org/packages/15/f6/7d4092efed320b4dd0445fd2b8b5e28cf7e62c4457be9958c7d13b2a8a84/hashbang-0.0.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b542ff9a4aa0a252bd5dd7fd5eff6e85", "sha256": "fd3b363324c49cd8c597a94ba3c519c7664981413bc4063311b7ad806f14961e" }, "downloads": -1, "filename": "hashbang-0.0.4.tar.gz", "has_sig": false, "md5_digest": "b542ff9a4aa0a252bd5dd7fd5eff6e85", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.4", "size": 20377, "upload_time": "2019-05-25T06:26:17", "url": "https://files.pythonhosted.org/packages/77/0d/7605cefad7f4f9306dbcc189a2a0b4ed81a009e93c06ea3c3bb741993497/hashbang-0.0.4.tar.gz" } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "430325b1f28e8cf601cd39e921c0f488", "sha256": "25fdbcecf6482d7b97544859e4b0908928e48bbac40fa023b31a12bb0091adef" }, "downloads": -1, "filename": "hashbang-0.0.6-py3-none-any.whl", "has_sig": false, "md5_digest": "430325b1f28e8cf601cd39e921c0f488", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.4", "size": 6077, "upload_time": "2019-05-25T07:06:50", "url": "https://files.pythonhosted.org/packages/4c/1c/431ba5d8d9f8004efba197f5ed0d2ae7346f82011527f3a8786dca514ee5/hashbang-0.0.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "942de589c4003a39332ce472158a29cf", "sha256": "3b6ed6bb7d3b7de934bfb7d8d52e653e93ecc33e67850f8aea2a4f5e62ad9b01" }, "downloads": -1, "filename": "hashbang-0.0.6.tar.gz", "has_sig": false, "md5_digest": "942de589c4003a39332ce472158a29cf", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.4", "size": 5909, "upload_time": "2019-05-25T07:06:52", "url": "https://files.pythonhosted.org/packages/c5/d3/f8af5e0951542c8bc7129bd25f3d430d6ae6e0e2e31026d6b37fd50e7116/hashbang-0.0.6.tar.gz" } ], "0.0.7": [ { "comment_text": "", "digests": { "md5": "75e2b979842db2b966089f31213f6ee1", "sha256": "89923a51d701149ee336824cd2d12ca84ea77acfe09e474c61877493d54e8e66" }, "downloads": -1, "filename": "hashbang-0.0.7-py3-none-any.whl", "has_sig": false, "md5_digest": "75e2b979842db2b966089f31213f6ee1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.4", "size": 6077, "upload_time": "2019-05-25T07:09:21", "url": "https://files.pythonhosted.org/packages/04/cb/ff52f40442bdcd5339c1e007d6f7e857ecb8e717c01065f852bc9c95ef87/hashbang-0.0.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "88892db0fe532c1c1ae783b01be8ff22", "sha256": "7dbf652664d90658288dedd696834ef437ba0cab19df1679eb927510ae9eeb96" }, "downloads": -1, "filename": "hashbang-0.0.7.tar.gz", "has_sig": false, "md5_digest": "88892db0fe532c1c1ae783b01be8ff22", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.4", "size": 5908, "upload_time": "2019-05-25T07:09:23", "url": "https://files.pythonhosted.org/packages/ae/75/cbefafbaa573c0a2e9894b91fad62d415bef82073649a64505ef6612ece9/hashbang-0.0.7.tar.gz" } ], "0.0.8": [ { "comment_text": "", "digests": { "md5": "db87c98cf8b602b428929ffeccbb43f2", "sha256": "a275aa7cb08b0f0d8861ff5cadd9a51fca91681dd324a325d4f7881ab353058f" }, "downloads": -1, "filename": "hashbang-0.0.8-py3-none-any.whl", "has_sig": false, "md5_digest": "db87c98cf8b602b428929ffeccbb43f2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.4", "size": 6077, "upload_time": "2019-05-25T07:14:44", "url": "https://files.pythonhosted.org/packages/16/05/a6c86d27b31ff68972c06050da734a984e0f3368a4afa440b32692e1562e/hashbang-0.0.8-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e4b5a9a046d70f66d1020f67fcf7b305", "sha256": "ebf0c9ce9c9f063a2246723703b42ed8f6ca56bd788a1e874af8cd11760ded9b" }, "downloads": -1, "filename": "hashbang-0.0.8.tar.gz", "has_sig": false, "md5_digest": "e4b5a9a046d70f66d1020f67fcf7b305", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.4", "size": 5907, "upload_time": "2019-05-25T07:14:45", "url": "https://files.pythonhosted.org/packages/69/8f/c27de4f290973e36bb32b13f2713a1937e6ba568b87e1ebe24977bc000f3/hashbang-0.0.8.tar.gz" } ], "0.0.9": [ { "comment_text": "", "digests": { "md5": "753536de1f60405d9072002e640082b8", "sha256": "5deacf7cc51ed062323f7dea0e66d99b29e2c7a84455deed09db09c752dae3b2" }, "downloads": -1, "filename": "hashbang-0.0.9-py3-none-any.whl", "has_sig": false, "md5_digest": "753536de1f60405d9072002e640082b8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.4", "size": 6077, "upload_time": "2019-05-25T07:23:29", "url": "https://files.pythonhosted.org/packages/d9/f6/0b8314470dce8f9dc7c33f6d2951aa14c901dda21d0f2859bf3cddaf773d/hashbang-0.0.9-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f4cd63c27f63b5a6f5fe9844b6ddce1d", "sha256": "0b7180c53ffca8d7fb1975795125b49d9cedc3b88ec6a9b5d68fbdb53651aced" }, "downloads": -1, "filename": "hashbang-0.0.9.tar.gz", "has_sig": false, "md5_digest": "f4cd63c27f63b5a6f5fe9844b6ddce1d", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.4", "size": 5910, "upload_time": "2019-05-25T07:23:31", "url": "https://files.pythonhosted.org/packages/03/a7/bbaca273cba2e8c30b4daddd8773da7f7681aa8dba3177fb50b070448101/hashbang-0.0.9.tar.gz" } ], "0.1.12": [ { "comment_text": "", "digests": { "md5": "23d94812b4e3af2eaa8babd026b9b1a8", "sha256": "233a95b13728af7e6fb6db709c92b3e9c8376e55984b3274b128a73b337b60c8" }, "downloads": -1, "filename": "hashbang-0.1.12-py3-none-any.whl", "has_sig": false, "md5_digest": "23d94812b4e3af2eaa8babd026b9b1a8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.4", "size": 5839, "upload_time": "2019-05-30T05:23:50", "url": "https://files.pythonhosted.org/packages/50/b1/45315f859742d01e47e8973aec19fbb2f4750bba5a18b2366359f3023691/hashbang-0.1.12-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5c7f00826efc7c898e75c20681a3a4c7", "sha256": "a775b23f6c31425cf527800d441be5c5613fd07d4cdf55ccb4bbe6edb64f2df7" }, "downloads": -1, "filename": "hashbang-0.1.12.tar.gz", "has_sig": false, "md5_digest": "5c7f00826efc7c898e75c20681a3a4c7", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.4", "size": 5658, "upload_time": "2019-05-30T05:23:51", "url": "https://files.pythonhosted.org/packages/73/82/db96c0a9e0dd750c43cd67ca5b222c4bf42faafb443860ee86d4db48aff7/hashbang-0.1.12.tar.gz" } ], "0.1.13": [ { "comment_text": "", "digests": { "md5": "e1cbe1012ce09bdc4b45662aeef29992", "sha256": "ab9c7b10b4073786abcc5118a21c3dd94aefeaef86ffb0ce6f853585a1bf7b4e" }, "downloads": -1, "filename": "hashbang-0.1.13-py3-none-any.whl", "has_sig": false, "md5_digest": "e1cbe1012ce09bdc4b45662aeef29992", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.4", "size": 21406, "upload_time": "2019-06-01T06:27:12", "url": "https://files.pythonhosted.org/packages/b9/79/46857d9a7d47fe0d843cebe55473a16160a59b0cfe3b287f9437af84b00d/hashbang-0.1.13-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a8d08bf898766ab5d3e2095249f5e8f0", "sha256": "178064ceb30a415a64a93fee7d783eca6d0c220861e55babac7c8f78f10008ee" }, "downloads": -1, "filename": "hashbang-0.1.13.tar.gz", "has_sig": false, "md5_digest": "a8d08bf898766ab5d3e2095249f5e8f0", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.4", "size": 21462, "upload_time": "2019-06-01T06:27:14", "url": "https://files.pythonhosted.org/packages/54/bb/c48cfcaebd1c0db38f87940b52d1e51a6b8754c6c33dedd5f4012e4d9976/hashbang-0.1.13.tar.gz" } ], "0.1.14": [ { "comment_text": "", "digests": { "md5": "28bc8217c05912f52ee3e834237a3d9b", "sha256": "5374623c1d5a5110fa2ea871ad37570644477d3a463004d7b525bbc1eb21a7ee" }, "downloads": -1, "filename": "hashbang-0.1.14-py3-none-any.whl", "has_sig": false, "md5_digest": "28bc8217c05912f52ee3e834237a3d9b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.4", "size": 21413, "upload_time": "2019-06-14T06:10:09", "url": "https://files.pythonhosted.org/packages/c3/64/573ccdeb8a2cacc7dcd2753b4a64e78434f167e3fed25248d1a38cb8d907/hashbang-0.1.14-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a2dcd210b859f59911a69df7ba956890", "sha256": "24d9b809ab68e0051cbd33d088baebe37a1976effc31bb5a019a5ae37840030f" }, "downloads": -1, "filename": "hashbang-0.1.14.tar.gz", "has_sig": false, "md5_digest": "a2dcd210b859f59911a69df7ba956890", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.4", "size": 21464, "upload_time": "2019-06-14T06:10:11", "url": "https://files.pythonhosted.org/packages/91/ee/8e652230ed3f1eed6243f8548c01081809064fb4045370da1c5ea9e98190/hashbang-0.1.14.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "28bc8217c05912f52ee3e834237a3d9b", "sha256": "5374623c1d5a5110fa2ea871ad37570644477d3a463004d7b525bbc1eb21a7ee" }, "downloads": -1, "filename": "hashbang-0.1.14-py3-none-any.whl", "has_sig": false, "md5_digest": "28bc8217c05912f52ee3e834237a3d9b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.4", "size": 21413, "upload_time": "2019-06-14T06:10:09", "url": "https://files.pythonhosted.org/packages/c3/64/573ccdeb8a2cacc7dcd2753b4a64e78434f167e3fed25248d1a38cb8d907/hashbang-0.1.14-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a2dcd210b859f59911a69df7ba956890", "sha256": "24d9b809ab68e0051cbd33d088baebe37a1976effc31bb5a019a5ae37840030f" }, "downloads": -1, "filename": "hashbang-0.1.14.tar.gz", "has_sig": false, "md5_digest": "a2dcd210b859f59911a69df7ba956890", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.4", "size": 21464, "upload_time": "2019-06-14T06:10:11", "url": "https://files.pythonhosted.org/packages/91/ee/8e652230ed3f1eed6243f8548c01081809064fb4045370da1c5ea9e98190/hashbang-0.1.14.tar.gz" } ] }