{ "info": { "author": "Cedric Meuter", "author_email": "cedric.meuter@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Console", "Intended Audience :: Developers", "Intended Audience :: Information Technology", "License :: OSI Approved :: MIT License", "Operating System :: MacOS :: MacOS X", "Operating System :: POSIX", "Programming Language :: Python", "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", "Topic :: Utilities" ], "description": "# citizenshell [![Build Status](https://travis-ci.org/meuter/citizenshell.svg?branch=master)](https://travis-ci.org/meuter/citizenshell)\n\n__citizenshell__ is a python library allowing to execute shell commands either locally or remotely over several protocols (telnet, ssh, serial or adb) using a simple and consistent API. This library is compatible with both python 2 (2.7) and 3 (>=3.4) as well as with [PyPy](https://pypy.org/). For now, it focuses on POSIX platforms like Linux and MacOS, but may be extended to work to Windows based platform in the future. It is distributed under\n[MIT](https://opensource.org/licenses/MIT) license.\n\n## Installation\n\n__citizenshell__ can simply installed using `pip install citizenshell`\n\n## Obtaining a shell\n\nFirst you need a shell. For that you have several options:\n\n1. use the built-in `LocalShell` for quick access:\n\n ```python\n from citizenshell import sh\n ```\n\n2. you can instanciate your own `LocalShell`:\n\n ```python\n from citizenshell import LocalShell\n\n shell = LocalShell()\n ```\n\n3. you can instanciate the `TelnetShell` for shell over telnet:\n\n ```python\n from citizenshell import TelnetShell\n\n shell = TelnetShell(hostname=\"acme.org\", username=\"john\",\n password=\"secretpassword\")\n ```\n\n4. you can instanciate the `SecureShell` for shell over SSH:\n\n ```python\n from citizenshell import SecureShell\n\n shell = SecureShell(hostname=\"acme.org\", username=\"john\",\n password=\"secretpassword\")\n ```\n\n5. you can instanciate the `AdbShell` for shell over ADB:\n\n ```python\n from citizenshell import AdbShell\n\n shell = AdbShell(hostname=\"acme.org\", username=\"john\",\n password=\"secretpassword\")\n ```\n\n6. you can instanciate the `SerialShell` for shell over serial line:\n\n ```python\n from serial import EIGHTBITS, PARITY_NONE\n from citizenshell import SerialShell\n\n shell = SerialShell(port=\"/dev/ttyUSB3\", username=\"john\",\n password=\"secretpassword\",\n baudrate=115200, parity=PARITY_NONE, bytesize=EIGHTBITS)\n ```\n\n7. you can also obtain shell objects by URI using the `Shell` function:\n\n ```python\n from citizenshell import Shell\n\n localshell = Shell()\n telnetshell = Shell(\"telnet://john:secretpassword@acme.org:1234\")\n secureshell = Shell(\"ssh://john:secretpassword@acme.org:1234\")\n adbshell = Shell(\"adb://myandroiddevice:5555\")\n serialshell = Shell(\"serial://jogn:secretpassword@/dev/ttyUSB3?baudrate=115200\")\n ```\n\n you can also mix and match betweens providing arguments in the URI or via kwargs:\n\n ```python\n telnetshell = Shell(\"telnet://john@acme.org\", password=\"secretpassword\", port=1234)\n serialshell = Shell(\"serial://john:secretpassword@/dev/ttyUSB3\", baudrate=115200)\n ```\n\n## Using a shell\n\nOnce you have shell, any shell, you can call it directly and get the standart output:\n\n```python\nassert shell(\"echo Hello World\") == \"Hello World\"\n```\n\nYou can also iterate over the standard output:\n\n```python\nresult = [int(x) for x in shell(\"\"\"\n for i in 1 2 3 4; do\n echo $i;\n done\n\"\"\")]\nassert result == [1, 2, 3, 4]\n```\n\nYou don't have to wait for the command to finish to receive the output.\n\nThis loop\n\n```python\nfor line in shell(\"for i in 1 2 3 4; do echo -n 'It is '; date +%H:%M:%S; sleep 1; done\", wait=False)\n print \">>>\", line + \"!\"\n```\n\nwould produce something like:\n\n```text\n>>> It is 14:24:52!\n>>> It is 14:24:53!\n>>> It is 14:24:54!\n>>> It is 14:24:55!\n```\n\nYou can extract stdout, stderr and exit code seperately:\n\n```python\nresult = shell(\">&2 echo error && echo output && exit 13\")\nassert result.stdout() == [\"output\"]\nassert result.stderr() == [\"error\"]\nassert result.exit_code() == 13\n```\n\nYou can inject environment variable to the shell\n\n```python\nassert shell(\"echo $VAR\", VAR=\"bar\") == \"bar\"\n```\n\nBy default, shell inherits \"$CWD\" from the environment (aka $PWD).\n\nStill, if ever a command needs to be run from a custom path, one\nway to achieve this is:\n\n```python\n shell = LocalShell()\n os.chdir(first_custom_path)\n shell('first_command')\n os.chdir(second_custom_path)\n shell('second_command')\n```\n\nThis works ... but it is ugly! Two levels of abstraction are mixed.\n\nThis is better:\n\n```python\n shell = LocalShell()\n shell('first_command', cwd=first_custom_path)\n shell('second_command', cwd=second_custom_path)\n```\n\nThe shell can raise an exception if the exit code is non-zero:\n\n```python\nassert shell(\"exit 13\").exit_code() == 13 # will not raise any exception\ntry:\n shell(\"exit 13\", check_xc=True) # will raise an exception\n assert False, \"will not be reached\"\nexcept ShellError as e:\n assert True, \"will be reached\"\n```\n\nThe shell can also raise an exception if something is printed on the standard error:\n\n```python\nshell(\"echo DANGER >&2\").stderr() == [\"DANGER\"] # will not raise any exception\ntry:\n shell(\"echo DANGER >&2\", check_err=True) # will raise an exception\n assert False, \"will not be reached\"\nexcept ShellError as e:\n assert True, \"will be reached\"\n```\n\nYou can pull file from the remote host (for `LocalShell` it's just doing a copy):\n\n```python\nshell(\"echo -n test > remote_file.txt\")\nshell.pull(\"local_file.txt\", \"remote_file.txt\")\nassert open(\"local_file.txt\", \"r\").read() == \"test\"\n```\n\nor push file to the remote host (again, for `LocalShell` it's just doing a copy):\n\n```python\nopen(\"local_file.txt\", \"w\").write(\"test\")\nshell.push(\"local_file.txt\", \"remote_file.txt\")\nassert str(shell(\"cat remote_file.txt\")) == \"test\"\n```\n\n## Logs\n\nEvery shell object has a set of loggers: stdin, stderr and stdout, as well as for out of band logging message. \nBy default they are all set to `logging.CRITICAL` which does not log anything. However, this log level\ncan be configured either using the `log_level=` keyword argument in the shell constructor:\n\n```python\nfrom citizenshell import LocalShell\nfrom logging import INFO\n\nshell = LocalShell(log_level=INFO)\n```\n\nor by calling the `set_log_level()` method:\n\n```python\nfrom citizenshell import sh\nfrom logging import INFO\n\nsh.set_log_level(INFO)\n```\n\nWhen configured with `logging.INFO`:\n- all commands are logged on stdout prefixed by a `$` and colored in cyan with `termcolor`\n- all characters produced on stdout are logged to stdout\n- all characters produced on stderr are logged to stderr and colored in red with `termcolor`\n- all out of band messages are logged to stdout prefixed with `>` and colored in yello with `termcolor`\n\nFor example:\n\n```python\nfrom citizenshell import LocalShell\nfrom logging import INFO\n\nshell = LocalShell(log_level=INFO)\nshell(\">&2 echo error && echo output && exit 13\")\nshell(\"echo Hello > /tmp/from.txt\")\nshell.push(\"/tmp/from.txt\", \"/tmp/to.txt\")\n```\n\nwill produce the following logs (colors are omitted):\n\n```\n$ >&2 echo error && echo output && exit 13\noutput\nerror\n$ echo Hello > /tmp/from.txt\n> '/tmp/from.txt' -> '/tmp/to.txt'\n$ command -v chmod\n/bin/chmod\n$ chmod 664 '/tmp/to.txt'\n```\n\nFor more even more logs messages, `logging.DEBUG` can be used. \n\n", "description_content_type": "", "docs_url": null, "download_url": "https://github.com/meuter/citizenshell/archive/2.2.7.tar.gz", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/meuter/citizenshell", "keywords": "shell", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "citizenshell", "package_url": "https://pypi.org/project/citizenshell/", "platform": "", "project_url": "https://pypi.org/project/citizenshell/", "project_urls": { "Download": "https://github.com/meuter/citizenshell/archive/2.2.7.tar.gz", "Homepage": "https://github.com/meuter/citizenshell" }, "release_url": "https://pypi.org/project/citizenshell/2.2.7/", "requires_dist": null, "requires_python": "", "summary": "Interact with shell locally or over different connection types (telnet, ssh, serial, adb)", "version": "2.2.7" }, "last_serial": 4539201, "releases": { "0.3.5": [ { "comment_text": "", "digests": { "md5": "84b358aabbc077de20698c43a3f4383c", "sha256": "877506a468ec6003051469be2c84f1e75264fc8721f8bdcbcc84bc91599a0069" }, "downloads": -1, "filename": "citizenshell-0.3.5.tar.gz", "has_sig": false, "md5_digest": "84b358aabbc077de20698c43a3f4383c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7176, "upload_time": "2018-02-08T21:45:45", "url": "https://files.pythonhosted.org/packages/11/1b/05260970287f68bbda5f3501799c0a1562a1fdd090a8bc8fd06975301d5f/citizenshell-0.3.5.tar.gz" } ], "0.3.6": [ { "comment_text": "", "digests": { "md5": "c2c1e6f9da9de5b01f6be434345e4ac6", "sha256": "f9e5f793ec273ba62e8d303674f0bc97ccb651e111eb0fc069d05e7e13ed6dd9" }, "downloads": -1, "filename": "citizenshell-0.3.6.tar.gz", "has_sig": false, "md5_digest": "c2c1e6f9da9de5b01f6be434345e4ac6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8991, "upload_time": "2018-02-08T21:55:54", "url": "https://files.pythonhosted.org/packages/0a/a0/a675e26c63452f155b28abc9329a44eb2f4021b4f5eda708763d953e6653/citizenshell-0.3.6.tar.gz" } ], "0.4": [ { "comment_text": "", "digests": { "md5": "d8d2465ec9112e7501305baeebd8b65d", "sha256": "d1d834debef9634f57077044eba8dc867232e4d2af99cb9b50ec9e79c65308ae" }, "downloads": -1, "filename": "citizenshell-0.4.tar.gz", "has_sig": false, "md5_digest": "d8d2465ec9112e7501305baeebd8b65d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8974, "upload_time": "2018-02-08T21:59:20", "url": "https://files.pythonhosted.org/packages/ef/90/03f6c81ef246ccb469dd1e6f3734ff882a78b465d81f9f35c1de1af0ace1/citizenshell-0.4.tar.gz" } ], "1.1": [ { "comment_text": "", "digests": { "md5": "fbba6235347a4dd4eda7c12a9c168df2", "sha256": "f15f53d6b962e1053650ac17c383ea84e3dc83f149460630493bea47e517b43c" }, "downloads": -1, "filename": "citizenshell-1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "fbba6235347a4dd4eda7c12a9c168df2", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 15500, "upload_time": "2018-02-17T08:13:00", "url": "https://files.pythonhosted.org/packages/53/ed/d28c8bbcad5ea1a9e0d3b9039c5c2cd412b7d629c208d9920721d00566d1/citizenshell-1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "703499aaab49693bfba7333a542e7be1", "sha256": "da364914c59abd1761282e11a40c5d741b76577a02d9d68469fb0633d4bff571" }, "downloads": -1, "filename": "citizenshell-1.1.tar.gz", "has_sig": false, "md5_digest": "703499aaab49693bfba7333a542e7be1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13484, "upload_time": "2018-02-17T08:13:02", "url": "https://files.pythonhosted.org/packages/16/ab/6db5ae4a1ac8d474e64ddd38055c8ac20ab5a8f291171ce680f1fe919282/citizenshell-1.1.tar.gz" } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "0f62dad406c166c07b26f2cfeebce2c2", "sha256": "adb4f9c7ecbc09272ad0ebef0b866c8a40cfbfdca7cec658785e676a22d490be" }, "downloads": -1, "filename": "citizenshell-1.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "0f62dad406c166c07b26f2cfeebce2c2", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 14921, "upload_time": "2018-02-17T08:28:50", "url": "https://files.pythonhosted.org/packages/e8/a0/0bb6b1298d3f3fb9749614deac355599a1466baef9113cc31eadbf0e5247/citizenshell-1.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5b58985a1d726705882fca7602aa9a63", "sha256": "1499ca904b0d8e5c98c88fc8245d494d63e3474746c3916acc7087ff421ecd34" }, "downloads": -1, "filename": "citizenshell-1.1.1.tar.gz", "has_sig": false, "md5_digest": "5b58985a1d726705882fca7602aa9a63", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12916, "upload_time": "2018-02-17T08:28:51", "url": "https://files.pythonhosted.org/packages/43/19/742b8586ce3eb2db018e47583cf6a00d68589e8a2eeeff4bfd47a83843b1/citizenshell-1.1.1.tar.gz" } ], "1.1.3": [ { "comment_text": "", "digests": { "md5": "9b9e5e750e90c1bf6db1856c52bf0b7b", "sha256": "096a130eeff9a19fc8a7f386ffdf8d30d2008e9e6d61051a1315fd79a3287f06" }, "downloads": -1, "filename": "citizenshell-1.1.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "9b9e5e750e90c1bf6db1856c52bf0b7b", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 15010, "upload_time": "2018-02-17T08:35:09", "url": "https://files.pythonhosted.org/packages/55/4f/acb11069323ae00e40ca1034728ba03f943ce8d7722bad80b5dc53d682dd/citizenshell-1.1.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "76bc541c2299be3b2ddfc8004bc7d67b", "sha256": "6e23a46ae9727830a82046498e0f6a22b3ce1f99dd9db10894912a67485e0ea0" }, "downloads": -1, "filename": "citizenshell-1.1.3.tar.gz", "has_sig": false, "md5_digest": "76bc541c2299be3b2ddfc8004bc7d67b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13118, "upload_time": "2018-02-17T08:35:10", "url": "https://files.pythonhosted.org/packages/f3/3e/d6cae466dd1b51d22d27c16900f04ad121f08cc9b8175a80b40cff81d088/citizenshell-1.1.3.tar.gz" } ], "2.0": [ { "comment_text": "", "digests": { "md5": "e4e41ec95e0e7b9847926afde938d5b4", "sha256": "dc3c5815380b2e8ddc676e564876e767b21fef85714ae7730c724ce4beb88ce3" }, "downloads": -1, "filename": "citizenshell-2.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "e4e41ec95e0e7b9847926afde938d5b4", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 17745, "upload_time": "2018-03-03T13:15:51", "url": "https://files.pythonhosted.org/packages/9a/52/89f9960533ae62c5516c7acb91fde4ad18d902d32267af1cf7a20f16d15e/citizenshell-2.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "366eb08ac483fa5d2c8b0d62b9ca5f8d", "sha256": "a5632f044a1dcd6245c6eb82245247fb1740c6f9130e02f356d6fdd9bef14bc8" }, "downloads": -1, "filename": "citizenshell-2.0.tar.gz", "has_sig": false, "md5_digest": "366eb08ac483fa5d2c8b0d62b9ca5f8d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12354, "upload_time": "2018-03-03T13:15:53", "url": "https://files.pythonhosted.org/packages/a2/7b/650cd90ea93c12254d351dcb5433a0cec7886f1b3c11658108d82876070d/citizenshell-2.0.tar.gz" } ], "2.0.1": [ { "comment_text": "", "digests": { "md5": "98352b87ce43cc400d7c1c76b1abf8f9", "sha256": "9c4e0e097e454cab99d9cf66ff4340b76642cddac75e406f41a90ed570a6e0d9" }, "downloads": -1, "filename": "citizenshell-2.0.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "98352b87ce43cc400d7c1c76b1abf8f9", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 18525, "upload_time": "2018-03-03T14:50:36", "url": "https://files.pythonhosted.org/packages/0c/15/a9c4343e1d4f8721d90936a22491371125f1ba82e1168a87cf235d279011/citizenshell-2.0.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5f39456a7bc8474c6648eaa21bb69552", "sha256": "da9392414bd1c11080c8f88b7d9d68f807d498364b21bde2cacad62807b51ea5" }, "downloads": -1, "filename": "citizenshell-2.0.1.tar.gz", "has_sig": false, "md5_digest": "5f39456a7bc8474c6648eaa21bb69552", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12828, "upload_time": "2018-03-03T14:50:38", "url": "https://files.pythonhosted.org/packages/69/90/29410a8e795b522e1c84dcf78c964c4af616d0e5b21c1555c6e819ebca80/citizenshell-2.0.1.tar.gz" } ], "2.0.2": [ { "comment_text": "", "digests": { "md5": "c5e9dda73e67dab5ab482ac0b1ddde3b", "sha256": "5c35b5591fd1b95a85aa36fb757754d13014499c8a4e56643659046e19f41ec5" }, "downloads": -1, "filename": "citizenshell-2.0.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "c5e9dda73e67dab5ab482ac0b1ddde3b", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 18509, "upload_time": "2018-03-03T15:01:42", "url": "https://files.pythonhosted.org/packages/e6/12/0504ccfda5c6f8a9a4daa7ba4504848e7efd30caaf80e23c94c239c3136b/citizenshell-2.0.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b3b2a8f8321a0b09b429752538448a7b", "sha256": "c3ed97a37734cf620ca797867c65e977912f972d147a916079fb2cf8b437cee9" }, "downloads": -1, "filename": "citizenshell-2.0.2.tar.gz", "has_sig": false, "md5_digest": "b3b2a8f8321a0b09b429752538448a7b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12811, "upload_time": "2018-03-03T15:01:45", "url": "https://files.pythonhosted.org/packages/35/7f/817158dc341cd350790c17203357e97ad6bfe7d160a240e0d182ec1a34b6/citizenshell-2.0.2.tar.gz" } ], "2.0.3": [ { "comment_text": "", "digests": { "md5": "a0b8f7f4f4894ad38db620c4e278a6de", "sha256": "94f703abd24eb4da1c5e0663221a57d3248852b3f26d5e193b1886c4abc7d107" }, "downloads": -1, "filename": "citizenshell-2.0.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "a0b8f7f4f4894ad38db620c4e278a6de", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 20586, "upload_time": "2018-03-04T16:58:31", "url": "https://files.pythonhosted.org/packages/f4/c3/64714afb412babb0d47e96f8977ec7dac1ff439436a4435e04d5957acddf/citizenshell-2.0.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "93365ca80a2448b1d8cfccdbb0c28d73", "sha256": "8e4f04cccc2cfa34e146706402895c623005a335d4dde3714d9835899059072c" }, "downloads": -1, "filename": "citizenshell-2.0.3.tar.gz", "has_sig": false, "md5_digest": "93365ca80a2448b1d8cfccdbb0c28d73", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13650, "upload_time": "2018-03-04T16:58:33", "url": "https://files.pythonhosted.org/packages/69/57/0a25cf1a0f095eaf8e326559d5cdad9239a2dfadc0edecdceafc94b48eb1/citizenshell-2.0.3.tar.gz" } ], "2.1.0": [ { "comment_text": "", "digests": { "md5": "7b4904c97763dcb434d9f89ac5808e35", "sha256": "dbe45abc819d31db60bb01d26e15dbd72d5364058dc2820c71bb5be9a396c8bd" }, "downloads": -1, "filename": "citizenshell-2.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "7b4904c97763dcb434d9f89ac5808e35", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 20585, "upload_time": "2018-03-04T17:04:35", "url": "https://files.pythonhosted.org/packages/78/4b/1f6e2c9ace1471887ef6ae73f1761cb6d931889d14d8ed6967826c41c41e/citizenshell-2.1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f09447a116f404fcb19be5f5c8623e50", "sha256": "20c05d733bf37d7bb8ae3db31958623aff63a7dd8eb4ee21b40fe51f187c2ba9" }, "downloads": -1, "filename": "citizenshell-2.1.0.tar.gz", "has_sig": false, "md5_digest": "f09447a116f404fcb19be5f5c8623e50", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13642, "upload_time": "2018-03-04T17:04:36", "url": "https://files.pythonhosted.org/packages/d0/03/6eb241c97cc1e03cc8cde742a69d0f6a8f4946d682b8421c4299025b43d6/citizenshell-2.1.0.tar.gz" } ], "2.1.1": [ { "comment_text": "", "digests": { "md5": "56f457f93b9d7a1cde29606619fab73f", "sha256": "bb29068e22cd20069cfdaf9890e4533967532e00733f8f21a9c16626600bd267" }, "downloads": -1, "filename": "citizenshell-2.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "56f457f93b9d7a1cde29606619fab73f", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 20588, "upload_time": "2018-04-08T08:18:32", "url": "https://files.pythonhosted.org/packages/6d/b3/def0d1d95da074311b716fb47a77a44fd23e361dbe078e421a48180b88d7/citizenshell-2.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3d7013ba686e9befb30aa720026e6d3b", "sha256": "19bc89226ee2840a1bf80dbc8d487991f9c679243a2029c53cb98ee2f483b5f6" }, "downloads": -1, "filename": "citizenshell-2.1.1.tar.gz", "has_sig": false, "md5_digest": "3d7013ba686e9befb30aa720026e6d3b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13573, "upload_time": "2018-04-08T08:18:33", "url": "https://files.pythonhosted.org/packages/e7/49/3636034ae4cb9d7a70065ff312caf010f50d6a27355ff3576ade5ec26fb0/citizenshell-2.1.1.tar.gz" } ], "2.2.0": [ { "comment_text": "", "digests": { "md5": "1a24e15d8210324e320a78c06e019511", "sha256": "2851b705b50ddebd3adcdc6daebfa8162c91c3ea8ce6a61821b35b0ee49dc5f2" }, "downloads": -1, "filename": "citizenshell-2.2.0-py2-none-any.whl", "has_sig": false, "md5_digest": "1a24e15d8210324e320a78c06e019511", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 15108, "upload_time": "2018-06-10T08:07:57", "url": "https://files.pythonhosted.org/packages/12/42/82e81ae5ef6743784025f5be769a0adda679b405984fd9ab801e368f5788/citizenshell-2.2.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "cf37ea99ba6215ace3df1582006f3f65", "sha256": "52bc81f87c0facdd9a44ed6313bcab0a318e5ed7a439dbe9d2307eaecb3f38e9" }, "downloads": -1, "filename": "citizenshell-2.2.0.tar.gz", "has_sig": false, "md5_digest": "cf37ea99ba6215ace3df1582006f3f65", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16249, "upload_time": "2018-06-10T08:08:13", "url": "https://files.pythonhosted.org/packages/a2/50/ea714d86d66d8f38599bcd1ed378318d9e128d3ce495dd5bbb04fc79112e/citizenshell-2.2.0.tar.gz" } ], "2.2.1": [ { "comment_text": "", "digests": { "md5": "fff88d91e82142c6e3cbe2790d557612", "sha256": "fc6c4a4cdbba44c4f475b715e312ad7f86eae0dfb914f4535f1c2ec2ca7ea92f" }, "downloads": -1, "filename": "citizenshell-2.2.1-py2-none-any.whl", "has_sig": false, "md5_digest": "fff88d91e82142c6e3cbe2790d557612", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 19141, "upload_time": "2018-10-26T16:00:34", "url": "https://files.pythonhosted.org/packages/05/49/9c36ebdf116b96e8076a15cdbe0792892798500ff4db26f36ac0b1cc3d32/citizenshell-2.2.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4a35913fd8a5a466458d15cb27da3852", "sha256": "77967f1b727f558f26acade0706f8fd581a5e15fd705b1f05969ec3f74b0f88c" }, "downloads": -1, "filename": "citizenshell-2.2.1.tar.gz", "has_sig": false, "md5_digest": "4a35913fd8a5a466458d15cb27da3852", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15871, "upload_time": "2018-10-26T15:59:56", "url": "https://files.pythonhosted.org/packages/3b/c3/22b8cf827d3a6dd7ecb05b8f4f01ccf7f2c32fb1db465197d8582d4da019/citizenshell-2.2.1.tar.gz" } ], "2.2.2": [ { "comment_text": "", "digests": { "md5": "769f25362c5ef6b924cd5490c86ae27f", "sha256": "557e60de3963662c868926f820f952308a09dd91f519f7446125be51679fb2a1" }, "downloads": -1, "filename": "citizenshell-2.2.2.tar.gz", "has_sig": false, "md5_digest": "769f25362c5ef6b924cd5490c86ae27f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16103, "upload_time": "2018-10-29T10:02:12", "url": "https://files.pythonhosted.org/packages/49/ac/2252d2fdaf2a707a99181b6f84528a337e044839faa41bc6ab76577717d2/citizenshell-2.2.2.tar.gz" } ], "2.2.3": [ { "comment_text": "", "digests": { "md5": "be90bd7e70671c5dedc7691d4bb21c53", "sha256": "77922a179e6611e776f2f7a0ccb0d52639bfa1103771e57b4ec2327341f56b74" }, "downloads": -1, "filename": "citizenshell-2.2.3.tar.gz", "has_sig": false, "md5_digest": "be90bd7e70671c5dedc7691d4bb21c53", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15902, "upload_time": "2018-10-29T13:37:41", "url": "https://files.pythonhosted.org/packages/21/25/151d608bdd8fe3c88850ed0547efbc7775491cc09d2451610ee22a89af99/citizenshell-2.2.3.tar.gz" } ], "2.2.4": [ { "comment_text": "", "digests": { "md5": "e81fae2826adbca002482134df3f509a", "sha256": "9cd9dc444b16bf3a9022614d5a926c381fb12b0229af0008eb597ef3142a20e6" }, "downloads": -1, "filename": "citizenshell-2.2.4-py2-none-any.whl", "has_sig": false, "md5_digest": "e81fae2826adbca002482134df3f509a", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 17178, "upload_time": "2018-11-06T14:40:43", "url": "https://files.pythonhosted.org/packages/d9/f9/685217c2c2b9f2643523f06ab06d9c2074ec377f7ed420f64cec3fbfbbf4/citizenshell-2.2.4-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5880494c9b86572c4d13fdba297ba1d7", "sha256": "b3aa75dbbc306f40bcb0ad42cb268dafbd1e1c01e8356096c3448b06989730cc" }, "downloads": -1, "filename": "citizenshell-2.2.4.tar.gz", "has_sig": false, "md5_digest": "5880494c9b86572c4d13fdba297ba1d7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16240, "upload_time": "2018-11-06T14:40:41", "url": "https://files.pythonhosted.org/packages/72/8c/8f1ca34112b809e90990ef25712db92fede8aa663efbccbcf6c59a92dde1/citizenshell-2.2.4.tar.gz" } ], "2.2.5": [ { "comment_text": "", "digests": { "md5": "130fcc97d83adeab6408283a1b2012f0", "sha256": "cd327e5adc46bb07d9738453bed8571233605ba09d44d34c0f0cf150e3da34f6" }, "downloads": -1, "filename": "citizenshell-2.2.5.tar.gz", "has_sig": false, "md5_digest": "130fcc97d83adeab6408283a1b2012f0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16053, "upload_time": "2018-11-06T17:36:51", "url": "https://files.pythonhosted.org/packages/17/1c/8e8f1565aa28cb0b194aa23db3d73b20ede2d8c5da61a39f50a39db1e658/citizenshell-2.2.5.tar.gz" } ], "2.2.7": [ { "comment_text": "", "digests": { "md5": "43179d844ed655e2c270067ba08a2893", "sha256": "514ff1f2c8086875f53427f337b2c2912b12d8e04505afcb3def8cf440dc9573" }, "downloads": -1, "filename": "citizenshell-2.2.7.tar.gz", "has_sig": false, "md5_digest": "43179d844ed655e2c270067ba08a2893", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17116, "upload_time": "2018-11-28T15:42:08", "url": "https://files.pythonhosted.org/packages/7d/cd/675327c38adc1828ff5e7936f85c0f92d25197909f0f1ed9d7724c259cc9/citizenshell-2.2.7.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "43179d844ed655e2c270067ba08a2893", "sha256": "514ff1f2c8086875f53427f337b2c2912b12d8e04505afcb3def8cf440dc9573" }, "downloads": -1, "filename": "citizenshell-2.2.7.tar.gz", "has_sig": false, "md5_digest": "43179d844ed655e2c270067ba08a2893", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17116, "upload_time": "2018-11-28T15:42:08", "url": "https://files.pythonhosted.org/packages/7d/cd/675327c38adc1828ff5e7936f85c0f92d25197909f0f1ed9d7724c259cc9/citizenshell-2.2.7.tar.gz" } ] }