{ "info": { "author": "Ionel Cristian M\u0103rie\u0219", "author_email": "contact@ionelmc.ro", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: POSIX", "Operating System :: Unix", "Programming Language :: Python", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Software Development :: Debuggers", "Topic :: System :: Monitoring", "Topic :: System :: Networking", "Topic :: Utilities" ], "description": "========\nOverview\n========\n\n\n\n\nFeatures\n========\n\n* Uses unix domain sockets, only root or same effective user can connect.\n* Can run the connection in a thread or in a signal handler (see ``oneshot_on`` option).\n* Can start the thread listening for connections from a signal handler (see ``activate_on`` option)\n* Compatible with apps that fork, reinstalls the Manhole thread after fork - had to monkeypatch os.fork/os.forkpty for\n this.\n* Compatible with gevent and eventlet with some limitations - you need to either:\n\n * Use ``oneshot_on``, *or*\n * Disable thread monkeypatching (eg: ``gevent.monkey.patch_all(thread=False)``, ``eventlet.monkey_patch(thread=False)``\n\n Note: on eventlet `you might `_ need to setup the hub first to prevent\n circular import problems:\n\n .. sourcecode:: python\n\n import eventlet\n eventlet.hubs.get_hub() # do this first\n eventlet.monkey_patch(thread=False)\n\n* The thread is compatible with apps that use signalfd (will mask all signals for the Manhole threads).\n\nOptions\n-------\n\n.. code-block:: python\n\n manhole.install(\n verbose=True,\n verbose_destination=2,\n patch_fork=True,\n activate_on=None,\n oneshot_on=None,\n sigmask=manhole.ALL_SIGNALS,\n socket_path=None,\n reinstall_delay=0.5,\n locals=None,\n strict=True,\n )\n\n* ``verbose`` - Set it to ``False`` to squelch the logging.\n* ``verbose_destination`` - Destination for verbose messages. Set it to a file descriptor or handle. Default is\n unbuffered stderr (stderr ``2`` file descriptor).\n* ``patch_fork`` - Set it to ``False`` if you don't want your ``os.fork`` and ``os.forkpy`` monkeypatched\n* ``activate_on`` - Set to ``\"USR1\"``, ``\"USR2\"`` or some other signal name, or a number if you want the Manhole thread\n to start when this signal is sent. This is desirable in case you don't want the thread active all the time.\n* ``thread`` - Set to ``True`` to start the always-on ManholeThread. Default: ``True``.\n Automatically switched to ``False`` if ``oneshot_on`` or ``activate_on`` are used.\n* ``oneshot_on`` - Set to ``\"USR1\"``, ``\"USR2\"`` or some other signal name, or a number if you want the Manhole to\n listen for connection in the signal handler. This is desireable in case you don't want threads at all.\n* ``sigmask`` - Will set the signal mask to the given list (using ``signalfd.sigprocmask``). No action is done if\n ``signalfd`` is not importable. **NOTE**: This is done so that the Manhole thread doesn't *steal* any signals;\n Normally that is fine because Python will force all the signal handling to be run in the main thread but signalfd\n doesn't.\n* ``socket_path`` - Use a specific path for the unix domain socket (instead of ``/tmp/manhole-``). This disables\n ``patch_fork`` as children cannot reuse the same path.\n* ``reinstall_delay`` - Delay the unix domain socket creation *reinstall_delay* seconds. This alleviates\n cleanup failures when using fork+exec patterns.\n* ``locals`` - Names to add to manhole interactive shell locals.\n* ``daemon_connection`` - The connection thread is daemonic (dies on app exit). Default: ``False``.\n* ``redirect_stderr`` - Redirect output from stderr to manhole console. Default: ``True``.\n* ``strict`` - If ``True`` then ``AlreadyInstalled`` will be raised when attempting to install manhole twice.\n Default: ``True``.\n\nEnvironment variable installation\n---------------------------------\n\nManhole can be installed via the ``PYTHONMANHOLE`` environment varialbe.\n\nThis::\n\n PYTHONMANHOLE='' python yourapp.py\n\nIs equivalent to having this in ``yourapp.py``::\n\n import manhole\n manhole.install()\n\nAny extra text in the environment variable is passed to ``manhole.install()``. Example::\n\n PYTHONMANHOLE='onshot_on=\"USR2\"' python yourapp.py\n\nWhat happens when you actually connect to the socket\n----------------------------------------------------\n\n1. Credentials are checked (if it's same user or root)\n2. ``sys.__std*__``/``sys.std*`` are redirected to the UDS\n3. Stacktraces for each thread are written to the UDS\n4. REPL is started so you can fiddle with the process\n\nKnown issues\n============\n\n* Using threads and file handle (not raw file descriptor) ``verbose_destination`` can cause deadlocks. See bug reports:\n `PyPy `_ and `Python 3.4\n `_.\n\nSIGTERM and socket cleanup\n--------------------------\n\nBy default Python doesn't call the ``atexit`` callbacks with the default SIGTERM handling. This makes manhole leave\nstray socket files around. If this is undesirable you should install a custom SIGTERM handler so ``atexit`` is\nproperly invoked.\n\nExample:\n\n.. code-block:: python\n\n import signal\n import sys\n\n def handle_sigterm(signo, frame):\n sys.exit(128 + signo) # this will raise SystemExit and cause atexit to be called\n\n signal.signal(signal.SIGTERM, handle_sigterm)\n\nUsing Manhole with uWSGI\n------------------------\n\nBecause uWSGI overrides signal handling Manhole is a bit more tricky to setup. One way is to use \"uWSGI signals\" (not\nthe POSIX signals) and have the workers check a file for the pid you want to open the Manhole in.\n\nStick something this in your WSGI application file:\n\n.. sourcecode:: python\n\n from __future__ import print_function\n import sys\n import os\n import manhole\n\n stack_dump_file = '/tmp/manhole-pid'\n uwsgi_signal_number = 17\n\n try:\n import uwsgi\n\n if not os.path.exists(stack_dump_file):\n open(stack_dump_file, 'w')\n\n def open_manhole(dummy_signum):\n with open(stack_dump_file, 'r') as fh:\n pid = fh.read().strip()\n if pid == str(os.getpid()):\n inst = manhole.install(strict=False, thread=False)\n inst.handle_oneshot(dummy_signum, dummy_signum)\n\n uwsgi.register_signal(uwsgi_signal_number, 'workers', open_manhole)\n uwsgi.add_file_monitor(uwsgi_signal_number, stack_dump_file)\n\n print(\"Listening for stack mahole requests via %r\" % (stack_dump_file,), file=sys.stderr)\n except ImportError:\n print(\"Not running under uwsgi; unable to configure manhole trigger\", file=sys.stderr)\n except IOError:\n print(\"IOError creating manhole trigger %r\" % (stack_dump_file,), file=sys.stderr)\n\n\n # somewhere bellow you'd have something like\n from django.core.wsgi import get_wsgi_application\n application = get_wsgi_application()\n # or\n def application(environ, start_response):\n start_response('200 OK', [('Content-Type', 'text/plain'), ('Content-Length', '2')])\n yield b'OK'\n\nTo open the Manhole just run `echo 1234 > /tmp/manhole-pid` and then `manhole-cli 1234`.\n\nRequirements\n============\n\n:OS: Linux, OS X\n:Runtime: Python 2.7, 3.4, 3.5, 3.6 or PyPy\n\nSimilar projects\n================\n\n* Twisted's `manhole `__ - it has colors and\n server-side history.\n* `wsgi-shell `_ - spawns a thread.\n* `pyrasite `_ - uses gdb to inject code.\n* `pydbattach `_ - uses gdb to inject code.\n* `pystuck `_ - very similar, uses `rpyc `_ for\n communication.\n* `pyringe `_ - uses gdb to inject code, more reliable, but relies on `dbg` python\n builds unfortunatelly.\n* `pdb-clone `_ - uses gdb to inject code, with a `different strategy\n `_.\n\n\nChangelog\n=========\n\n1.6.0 (2019-01-19)\n------------------\n\n* Testing improvements (changed some skips to xfail, added osx in Travis).\n* Fixed long standing Python 2.7 bug where ``sys.getfilesystemencoding()`` would be broken after installing a threaded\n manhole. See `#51 `_.\n* Dropped support for Python 2.6, 3.3 and 3.4.\n* Fixed handling when ``socket.setdefaulttimeout()`` is used.\n Contributed by \"honnix\" in `#53 `_.\n* Fixed some typos. Contributed by Jes\u00fas Cea in `#43 `_.\n* Fixed handling in ``manhole-cli`` so that timeout is actually seconds and not milliseconds.\n Contributed by Nir Soffer in `#45 `_.\n* Cleaned up useless polling options in ``manhole-cli``.\n Contributed by Nir Soffer in `#46 `_.\n* Documented and implemented a solution for using Manhole with Eventlet.\n See `#49 `_.\n\n1.5.0 (2017-08-31)\n------------------\n\n* Added two string aliases for ``connection_handler`` option. Now you can conveniently use ``connection_handler=\"exec\"``.\n* Improved ``handle_connection_exec``. It now has a clean way to exit (``exit()``) and properly closes the socket.\n\n1.4.0 (2017-08-29)\n------------------\n\n* Added the ``connection_handler`` install option. Default value is ``manhole.handle_connection_repl``, and alternate\n ``manhole.handle_connection_exec`` is provided (very simple: no output redirection, no stacktrace dumping).\n* Dropped Python 3.2 from the test grid. It may work but it's a huge pain to support (pip/pytest don't support it anymore).\n* Added Python 3.5 and 3.6 in the test grid.\n* Fixed issues with piping to ``manhole-cli``. Now ``echo foobar | manhole-cli`` will wait 1 second for output from manhole\n (you can customize this with the ``--timeout`` option).\n* Fixed issues with newer PyPy (caused by gevent/eventlet socket unwrapping).\n\n1.3.0 (2015-09-03)\n------------------\n\n* Allowed Manhole to be configured without any thread or activation (in case you want to manually activate).\n* Added an example and tests for using Manhole with uWSGi.\n* Fixed error handling in ``manhole-cli`` on Python 3 (exc vars don't leak anymore).\n* Fixed support for running in gevent/eventlet-using apps on Python 3 (now that they support Python 3).\n* Allowed reinstalling the manhole (in non-``strict`` mode). Previous install is undone.\n\n1.2.0 (2015-07-06)\n------------------\n\n* Changed ``manhole-cli``:\n\n * Won't spam the terminal with errors if socket file doesn't exist.\n * Allowed sending any signal (new ``--signal`` argument).\n * Fixed some validation issues for the ``PID`` argument.\n\n1.1.0 (2015-06-06)\n------------------\n\n* Added support for installing the manhole via the ``PYTHONMANHOLE`` environment variable.\n* Added a ``strict`` install option. Set it to false to avoid getting the ``AlreadyInstalled`` exception.\n* Added a ``manhole-cli`` script that emulates ``socat readline unix-connect:/tmp/manhole-1234``.\n\n1.0.0 (2014-10-13)\n------------------\n\n* Added ``socket_path`` install option (contributed by `Nir Soffer`_).\n* Added ``reinstall_delay`` install option.\n* Added ``locals`` install option (contributed by `Nir Soffer`_).\n* Added ``redirect_stderr`` install option (contributed by `Nir Soffer`_).\n* Lots of internals cleanup (contributed by `Nir Soffer`_).\n\n0.6.2 (2014-04-28)\n------------------\n\n* Fix OS X regression.\n\n0.6.1 (2014-04-28)\n------------------\n\n* Support for OS X (contributed by `Saulius Menkevi\u010dius`_).\n\n.. _Saulius Menkevi\u010dius: https://github.com/razzmatazz\n.. _Nir Soffer: https://github.com/nirs\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/ionelmc/python-manhole", "keywords": "debugging,manhole,thread,socket,unix domain socket", "license": "BSD 2-Clause License", "maintainer": "", "maintainer_email": "", "name": "manhole", "package_url": "https://pypi.org/project/manhole/", "platform": "", "project_url": "https://pypi.org/project/manhole/", "project_urls": { "Changelog": "https://python-manhole.readthedocs.io/en/latest/changelog.html", "Documentation": "https://python-manhole.readthedocs.io/", "Homepage": "https://github.com/ionelmc/python-manhole", "Issue Tracker": "https://github.com/ionelmc/python-manhole/issues" }, "release_url": "https://pypi.org/project/manhole/1.6.0/", "requires_dist": null, "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", "summary": "Manhole is in-process service that will accept unix domain socket connections and present the", "version": "1.6.0" }, "last_serial": 4718135, "releases": { "0.0.1": [], "0.1": [ { "comment_text": "", "digests": { "md5": "828b40a9fb22a764824b8c1677142f6b", "sha256": "d3b7c98841205a5cd46c3fbd54c95f6bcc4bd0487029deef958f1d61f3e3c4d5" }, "downloads": -1, "filename": "manhole-0.1.tar.gz", "has_sig": false, "md5_digest": "828b40a9fb22a764824b8c1677142f6b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16525, "upload_time": "2013-07-01T22:15:55", "url": "https://files.pythonhosted.org/packages/25/57/033b6570088aff5dc460112605dd647832d79726f1d25d920f3f12fb29fb/manhole-0.1.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "f8e76565aaba507c69263734694b49ac", "sha256": "24d7f8e1f7467f170ec0db4149c7ee0bab9311013ab67569c257b0b8a0a236be" }, "downloads": -1, "filename": "manhole-0.1.1.tar.gz", "has_sig": false, "md5_digest": "f8e76565aaba507c69263734694b49ac", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16524, "upload_time": "2013-07-01T22:17:02", "url": "https://files.pythonhosted.org/packages/f7/8a/da6e54c83b51db445e636698637285c0706897500e7c0758760ac75e8630/manhole-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "515f0bf4bba4da740dd168ec575fa000", "sha256": "b3e21e4046b89f4bbf10e962f125a678a8824d8553784d3f9a5e12dad3e5a244" }, "downloads": -1, "filename": "manhole-0.1.2.tar.gz", "has_sig": false, "md5_digest": "515f0bf4bba4da740dd168ec575fa000", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8270, "upload_time": "2013-07-02T13:53:13", "url": "https://files.pythonhosted.org/packages/94/c9/d981b13d20a58ce6a71df2f24412d4dd3ff761c50cb94df4159744254a29/manhole-0.1.2.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "d1f68477972465aa839b58e58a52a122", "sha256": "2c69cbc13d4dad5cc646266488a5dbbc32b2c1ca5f9525b54d122117671ca392" }, "downloads": -1, "filename": "manhole-0.2.tar.gz", "has_sig": false, "md5_digest": "d1f68477972465aa839b58e58a52a122", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9711, "upload_time": "2013-07-18T19:06:52", "url": "https://files.pythonhosted.org/packages/7c/1b/bac2d10d1f0bce87043ba1dc065ec447ed422589f11b031c167cce55a4bb/manhole-0.2.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "2a6e0d8899b7ea0e63d9f5dbaeb9d833", "sha256": "986b039e5f451222248c2d9c55db33dfcfefeeef919c67e2c0d275b3c8d53669" }, "downloads": -1, "filename": "manhole-0.3.0.tar.gz", "has_sig": false, "md5_digest": "2a6e0d8899b7ea0e63d9f5dbaeb9d833", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9916, "upload_time": "2013-07-18T20:00:42", "url": "https://files.pythonhosted.org/packages/fa/0b/0c627b90880cd0983b71f920dfd2bcd2c177b78fb3b8589cd282a0c63112/manhole-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "31a0ede368be34455281337a80cb4895", "sha256": "ee0599eb0bf6f4cd71df6954408f01afd8c9d574b78dd672d3c05ebe9e81a989" }, "downloads": -1, "filename": "manhole-0.3.1.tar.gz", "has_sig": false, "md5_digest": "31a0ede368be34455281337a80cb4895", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10054, "upload_time": "2013-07-18T20:06:01", "url": "https://files.pythonhosted.org/packages/7c/05/b0d8a1007124620f84d562abfe44359d24fa3a1187c119f39a2a0a4d8636/manhole-0.3.1.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "27625f75599dfd2df4ba7ef7e657561f", "sha256": "a796a8f57ebd683765492bf33bad1b86664a6f7323c4ddac182364b960793c8a" }, "downloads": -1, "filename": "manhole-0.4.0.tar.gz", "has_sig": false, "md5_digest": "27625f75599dfd2df4ba7ef7e657561f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10609, "upload_time": "2013-08-12T08:00:02", "url": "https://files.pythonhosted.org/packages/22/ba/a42f2252cda0a0d8d4a768b2dbc43a2233f0b23277f2022fe2fddd2e8f36/manhole-0.4.0.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "5c8da852cb87b1191d7f61a2bffad9b7", "sha256": "4a5895112827b29d49ce93825815d2c4b3fc85e9ec057a8f25959779ff1d9e36" }, "downloads": -1, "filename": "manhole-0.5.0.tar.gz", "has_sig": false, "md5_digest": "5c8da852cb87b1191d7f61a2bffad9b7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11908, "upload_time": "2013-08-17T00:05:49", "url": "https://files.pythonhosted.org/packages/5d/7d/6736b3dfcc04407d73a7b42d9e24941d306d25987bd88a852fc869a28448/manhole-0.5.0.tar.gz" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "e8d28729a096cf81377dc1dc73f6aade", "sha256": "aa2807074f076264fa070ee34b9886819383860df66331e79db037a465cd2ab4" }, "downloads": -1, "filename": "manhole-0.5.1.tar.gz", "has_sig": false, "md5_digest": "e8d28729a096cf81377dc1dc73f6aade", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12403, "upload_time": "2013-08-18T19:35:43", "url": "https://files.pythonhosted.org/packages/ce/5f/536f2b2dec61707602e94479df1b0d5e5312132624b5ed47eedade7b9456/manhole-0.5.1.tar.gz" } ], "0.5.2": [ { "comment_text": "", "digests": { "md5": "f96e1be25c29011e1efb69a69671f9e6", "sha256": "d7fd87b4423e7b8bfd4ac42269ce2f94b7255b3cc902282b7b928bb7d837a186" }, "downloads": -1, "filename": "manhole-0.5.2.tar.gz", "has_sig": false, "md5_digest": "f96e1be25c29011e1efb69a69671f9e6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12628, "upload_time": "2013-08-23T23:30:55", "url": "https://files.pythonhosted.org/packages/ea/52/ca7c556efbbd8381166e99678ae714d48d1f32b7835619b1eac878016f22/manhole-0.5.2.tar.gz" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "4e9e23fc2b2685511e66996c533b94aa", "sha256": "d8907326246d3257e6b53ed014b9be6afa4c0061e3feed90cbdf7955708d5cdb" }, "downloads": -1, "filename": "manhole-0.6.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "4e9e23fc2b2685511e66996c533b94aa", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 10249, "upload_time": "2014-02-14T02:13:08", "url": "https://files.pythonhosted.org/packages/b7/93/dc027e1b53d36798ac9855aee2e490cc790455ff8d84f7f187c121e77521/manhole-0.6.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b25186744e5a8ffda5f0b7e126ec5777", "sha256": "66ed78dee2f299c06a4adef13c80fb260adbf07823bdf85ddfc0a14ce7333752" }, "downloads": -1, "filename": "manhole-0.6.0.tar.gz", "has_sig": false, "md5_digest": "b25186744e5a8ffda5f0b7e126ec5777", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12528, "upload_time": "2014-02-14T01:21:47", "url": "https://files.pythonhosted.org/packages/b6/cb/c0f31f45e6d47919c54ca66e57829d4c841b46a1a453bd3399411af5f7c3/manhole-0.6.0.tar.gz" } ], "0.6.1": [ { "comment_text": "", "digests": { "md5": "31afac8d234e188b0a4eb5a0706c52f4", "sha256": "dd1e645d1fb2d7b1db029f153d29654f120f2c05e5aa54a205010dc04b2f9de7" }, "downloads": -1, "filename": "manhole-0.6.1.tar.gz", "has_sig": false, "md5_digest": "31afac8d234e188b0a4eb5a0706c52f4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14916, "upload_time": "2014-04-28T08:32:29", "url": "https://files.pythonhosted.org/packages/40/90/9bdbb48472638d80ab0d1c129f1ed7e7a459374a303097fb8ff84b469216/manhole-0.6.1.tar.gz" } ], "0.6.2": [ { "comment_text": "", "digests": { "md5": "780fc481996e4f80a76c8b58ed2ec7d8", "sha256": "4cefb79b72afd73042664c5332fc632ca3ee7ae1a6009916cd69bbe9ab86673c" }, "downloads": -1, "filename": "manhole-0.6.2.tar.gz", "has_sig": false, "md5_digest": "780fc481996e4f80a76c8b58ed2ec7d8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15077, "upload_time": "2014-04-28T17:49:45", "url": "https://files.pythonhosted.org/packages/73/6b/888b9be9ef84d30546d7350c1a736b5929c220980d3164ecc6450ae33dc8/manhole-0.6.2.tar.gz" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "2c2954ffb0dbe54afaaeee330ad4232d", "sha256": "d59ea9151b1975f580aed06bc87d99d12d23fe6972d4530c5975919062b1136f" }, "downloads": -1, "filename": "manhole-1.0.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "2c2954ffb0dbe54afaaeee330ad4232d", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 13669, "upload_time": "2014-10-13T15:20:44", "url": "https://files.pythonhosted.org/packages/ce/e0/ea50a5d34a2dc9c424087496dcfcb74d25f9d1eb5c1830c15550976c18ec/manhole-1.0.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f016f7996a88e04bb2480e47219d2529", "sha256": "8c01a0b8922c7ec23e38c603b3638847861dffa996204e06643365e3c521f6b6" }, "downloads": -1, "filename": "manhole-1.0.0.tar.gz", "has_sig": false, "md5_digest": "f016f7996a88e04bb2480e47219d2529", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25313, "upload_time": "2014-10-13T15:20:40", "url": "https://files.pythonhosted.org/packages/21/5d/bb16afc2e58100614f2a06a998b0c4ffdff68e6eb91334295291351d7c74/manhole-1.0.0.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "5e914735d4171e7e46439fd3b0545dcc", "sha256": "600bc02b965ab77a3f112bb489dcfeb4ac4c46ee05f684cb3133fbb16bc27723" }, "downloads": -1, "filename": "manhole-1.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "5e914735d4171e7e46439fd3b0545dcc", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 18138, "upload_time": "2015-06-06T16:54:48", "url": "https://files.pythonhosted.org/packages/0c/ac/b6de9c11382a3fe5b8fa5c2db2901e2e1359af9e4614695369ca6cc3aac4/manhole-1.1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ba4781b9e3c9318a36671df62a56e765", "sha256": "026a516632fdbaa69af9c85960b5bdf3dc04724a3e564b8ff7656d9d426534d7" }, "downloads": -1, "filename": "manhole-1.1.0.tar.gz", "has_sig": false, "md5_digest": "ba4781b9e3c9318a36671df62a56e765", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32555, "upload_time": "2015-06-06T16:54:52", "url": "https://files.pythonhosted.org/packages/8a/63/3dd277c26a26c9c91326756bc8b9038a5a5baee18aa707665e3adc795afe/manhole-1.1.0.tar.gz" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "cbcdd78708e23e74d244ca90f7ee4e12", "sha256": "474777907b4202d54acd59a195c384b6c81821cb74f91ff9ad9718dac5dc3124" }, "downloads": -1, "filename": "manhole-1.2.0.tar.gz", "has_sig": false, "md5_digest": "cbcdd78708e23e74d244ca90f7ee4e12", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34711, "upload_time": "2015-07-06T01:00:45", "url": "https://files.pythonhosted.org/packages/4d/b5/d72aa571e6960eca7335a7ee8e12c40e75bd36c8ec0aad426cf01fbe5d5e/manhole-1.2.0.tar.gz" } ], "1.3.0": [ { "comment_text": "", "digests": { "md5": "16ed9b85a9ed26da1347e9b48f6bd1c6", "sha256": "16f921e2630a9da177db50194ea319aac114f342f90b565e97652f55824b75a8" }, "downloads": -1, "filename": "manhole-1.3.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "16ed9b85a9ed26da1347e9b48f6bd1c6", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 21201, "upload_time": "2015-09-03T08:45:28", "url": "https://files.pythonhosted.org/packages/a5/d0/af1347efd7fda86ebbdd3287412af58910fd17c185155ec8d929de408e41/manhole-1.3.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e73624fd9fcc65198cbf883a86d592de", "sha256": "a4f4d6083ed1074c4aba0427bc4ebb379bf500ac35f92d1a89a75aa08ff43c41" }, "downloads": -1, "filename": "manhole-1.3.0.tar.gz", "has_sig": false, "md5_digest": "e73624fd9fcc65198cbf883a86d592de", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 38734, "upload_time": "2015-09-03T08:45:33", "url": "https://files.pythonhosted.org/packages/47/d3/4ae78c8265613a0f41382ec42f3027cece8a368e88173bb6ee5be3a64629/manhole-1.3.0.tar.gz" } ], "1.4.0": [ { "comment_text": "", "digests": { "md5": "2c897d75f2454e39681cc862070c8e4c", "sha256": "3643a8b610226b50a54a986eab4f87823a5e65af40e53a5630db15813cf09d37" }, "downloads": -1, "filename": "manhole-1.4.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "2c897d75f2454e39681cc862070c8e4c", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 18983, "upload_time": "2017-08-29T11:23:29", "url": "https://files.pythonhosted.org/packages/5f/b2/74718cbde3ac69409f48742d3e78310cec4268755a60f53d438864fe2dd9/manhole-1.4.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "05b625105186c9824830094c72167641", "sha256": "6c49e8afbe2a4bff66989c38f50ce512f964d1371b2f937665a47830868f6de2" }, "downloads": -1, "filename": "manhole-1.4.0.tar.gz", "has_sig": false, "md5_digest": "05b625105186c9824830094c72167641", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 37047, "upload_time": "2017-08-29T11:23:30", "url": "https://files.pythonhosted.org/packages/a4/d3/b926670fc5e5157942be0a91bf0ceed236b956f84e93700f6ab73a768d29/manhole-1.4.0.tar.gz" } ], "1.5.0": [ { "comment_text": "", "digests": { "md5": "6bf452ed9f9df419a43261c720d60688", "sha256": "d1b55dfbbb841167a6e3cc2140b4db08ca1815ed599bbe2b7d46b0f2adb06515" }, "downloads": -1, "filename": "manhole-1.5.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "6bf452ed9f9df419a43261c720d60688", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 19713, "upload_time": "2017-08-31T20:31:46", "url": "https://files.pythonhosted.org/packages/59/89/5ab85d68f64ca97359071b780a7f8d77d5bed4bd907505a832e71f061f85/manhole-1.5.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5f959a16a0438b995fb7a9acb346471b", "sha256": "156d44da9ca9b1f654744d7b7e3e1c8e4bc25adab0d1c0a8a0f2a01d31f23b86" }, "downloads": -1, "filename": "manhole-1.5.0.tar.gz", "has_sig": false, "md5_digest": "5f959a16a0438b995fb7a9acb346471b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 37696, "upload_time": "2017-08-31T20:31:48", "url": "https://files.pythonhosted.org/packages/06/47/98c3237deae99cd01958f530681847986c413d3b3f871f3d8336744e1687/manhole-1.5.0.tar.gz" } ], "1.6.0": [ { "comment_text": "", "digests": { "md5": "91ce25e60e6c1493cecd40e8b4b2adf4", "sha256": "3ff8960ebd250f63d054b08af92be299b9a9a62ac2ae1dde8678e000c001d500" }, "downloads": -1, "filename": "manhole-1.6.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "91ce25e60e6c1493cecd40e8b4b2adf4", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", "size": 16398, "upload_time": "2019-01-20T11:58:25", "url": "https://files.pythonhosted.org/packages/f7/fe/32d484b370ec162c68f83d3efaead1ef84dee106b024b94d068cbea92cf1/manhole-1.6.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1f5d7993eae5f84d262aa0685fb83859", "sha256": "d4ab98198481ed54a5b95c0439f41131f56d7d3755eedaedce5a45ca7ff4aa42" }, "downloads": -1, "filename": "manhole-1.6.0.tar.gz", "has_sig": false, "md5_digest": "1f5d7993eae5f84d262aa0685fb83859", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", "size": 35989, "upload_time": "2019-01-20T11:58:27", "url": "https://files.pythonhosted.org/packages/94/6c/a491e9c9c430f0f10d9b6b14bc074886b8ef318061812c34326a5fb352d3/manhole-1.6.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "91ce25e60e6c1493cecd40e8b4b2adf4", "sha256": "3ff8960ebd250f63d054b08af92be299b9a9a62ac2ae1dde8678e000c001d500" }, "downloads": -1, "filename": "manhole-1.6.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "91ce25e60e6c1493cecd40e8b4b2adf4", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", "size": 16398, "upload_time": "2019-01-20T11:58:25", "url": "https://files.pythonhosted.org/packages/f7/fe/32d484b370ec162c68f83d3efaead1ef84dee106b024b94d068cbea92cf1/manhole-1.6.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1f5d7993eae5f84d262aa0685fb83859", "sha256": "d4ab98198481ed54a5b95c0439f41131f56d7d3755eedaedce5a45ca7ff4aa42" }, "downloads": -1, "filename": "manhole-1.6.0.tar.gz", "has_sig": false, "md5_digest": "1f5d7993eae5f84d262aa0685fb83859", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", "size": 35989, "upload_time": "2019-01-20T11:58:27", "url": "https://files.pythonhosted.org/packages/94/6c/a491e9c9c430f0f10d9b6b14bc074886b8ef318061812c34326a5fb352d3/manhole-1.6.0.tar.gz" } ] }