{ "info": { "author": "Anthony Sottile", "author_email": "asottile@umich.edu", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License", "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", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy" ], "description": "[![Build Status](https://travis-ci.org/asottile/pymonkey.svg?branch=master)](https://travis-ci.org/asottile/pymonkey)\n[![Coverage Status](https://img.shields.io/coveralls/asottile/pymonkey.svg?branch=master)](https://coveralls.io/r/asottile/pymonkey)\n\npymonkey\n========\n\nA tool for applying monkeypatches to python executables.\n\n### Installation\n\n```\npip install pymonkey\n```\n\n### Registering a patch\n\nMake a module:\n\n```python\n## mymod/pymonkey.py\n\n# Be sure to not import anything at the module scope\n# This ensures that import-hook patching will work better later\n\n\n# This is your chance to do argument parsing before running the target\n# executable.\n# This will be called after all of the patch hooks have been registered.\ndef pymonkey_argparse(argv):\n # You'll be passed the arguments as a tuple. Parse your specific arguments\n # and return your parsed state and the remaining arguments.\n # If you wish to forgo argparsing, simply `return None, argv`\n import argparse\n parser = argparse.ArgumentParser()\n parser.add_argument('--foo')\n return parser.parse_known_args(argv)\n\n\n# This is your entry point. It will be passed module objects after they have\n# been imported. Check the module name and then apply your patch (if\n# applicable).\n# This will be called as a post-import hook so you'll have a chance to modify\n# the module before another module would import from it.\n# The parsed state computed above will be passed as `args`\ndef pymonkey_patch(mod, args):\n # This callback will be called with *every* module that gets imported\n # Guard against the specific module you'd like to patch\n if mod.__name__ != 'module_to_patch':\n return\n\n # Apply your patches here to module_to_patch\n mod.foo = args.foo\n```\n\nAnd add the entrypoints to setup.py:\n\n```python\nsetup(\n ...,\n entry_points={\n 'pymonkey': ['mymod = mymod.pymonkey:pymonkey_patch'],\n 'pymonkey.argparse': ['mymod = mymod.pymonkey:pymonkey_argparse'],\n },\n ...\n)\n```\n\n### Commandline usage\n\nApplying a single patch:\n\n```\n$ pymonkey mymod -- pip install simplejson\n```\n\nApplying all the patches available:\n\n```\n$ pymonkey --all -- pip install simplejson\n```\n\nViewing the help\n\n```\n$ pymonkey --help\n```\n\n### Making entry points with pymonkey\n\nIn a module:\n\n```python\n## mymod_main.py\nfrom pymonkey import make_entry_point\n\n# The first argument is a list of pymonkey patches to apply\n# The second argument is the entry point to run\nmain = make_entry_point(('mymod',), 'pip')\n\nif __name__ == '__main__':\n exit(main())\n```\n\nIn setup.py\n\n```python\nsetup(\n ...,\n entry_points={\n 'console_scripts': ['pip-patched = mymod_main:main'],\n 'pymonkey': ['mymod = mymod.pymonkey:pymonkey_patch'],\n 'pymonkey.argparse': ['mymod = mymod.pymonkey:pymonkey_argparse'],\n },\n ...\n)\n```\n\nThen instead of\n\n```\n$ pymonkey mymod -- pip ...\n```\n\nYou can now do\n\n```\n$ pip-patched ...\n```\n\n### Things using pymonkey\n\n- https://github.com/asottile/pip-custom-platform\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/asottile/pymonkey", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "pymonkey", "package_url": "https://pypi.org/project/pymonkey/", "platform": "", "project_url": "https://pypi.org/project/pymonkey/", "project_urls": { "Homepage": "https://github.com/asottile/pymonkey" }, "release_url": "https://pypi.org/project/pymonkey/0.3.1/", "requires_dist": null, "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "summary": "A tool for applying monkeypatches to python executables.", "version": "0.3.1" }, "last_serial": 5740599, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "84b9694fc06e19f491906fada7a61f22", "sha256": "5590f444f162b10184d52363a5fc468433b6093f44cb90140dfcee5a952472cf" }, "downloads": -1, "filename": "pymonkey-0.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "84b9694fc06e19f491906fada7a61f22", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 5088, "upload_time": "2016-05-02T01:31:24", "url": "https://files.pythonhosted.org/packages/6a/d0/9f6eae36433130d4271c7b6b84fdf5d8c0395f77fd01a47dd6d2c6baef32/pymonkey-0.1.0-py2.py3-none-any.whl" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "064aa77655f710ddc1f81ef84f578228", "sha256": "339214b5cc51f4b2b422d5b6c00f6cff419206ffc96d4ddefd46ba661d541dc1" }, "downloads": -1, "filename": "pymonkey-0.2.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "064aa77655f710ddc1f81ef84f578228", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 5217, "upload_time": "2016-05-09T01:34:43", "url": "https://files.pythonhosted.org/packages/a4/6c/7c43900be4cc4879c76659b1fdb45e11528efd2adec1c8de3ebd769bbc9f/pymonkey-0.2.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1d075d00766e92ef837ca01f29a152ae", "sha256": "7ea0ee0678e6c2c4b1d426a14cb0b60a20fb9baf17a7172a3dfdf4dcf04a076e" }, "downloads": -1, "filename": "pymonkey-0.2.0.tar.gz", "has_sig": false, "md5_digest": "1d075d00766e92ef837ca01f29a152ae", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3797, "upload_time": "2016-05-09T01:38:05", "url": "https://files.pythonhosted.org/packages/37/0f/d7112d34f5f839fadf19532e4a8a9390cf68efefe7e2c04d670d2e4cf5c0/pymonkey-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "8be897e04bd292b9d5424de8305dfcab", "sha256": "47df4fb0bbb47bb19f6e5dd220fea43c07a280eba38a1b3d48e28218efcb3d9f" }, "downloads": -1, "filename": "pymonkey-0.2.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "8be897e04bd292b9d5424de8305dfcab", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 5301, "upload_time": "2016-05-10T00:50:39", "url": "https://files.pythonhosted.org/packages/06/7e/58f2a75a883389fbe9a12d1f58f3aeecd470fda38a7fe7517ab2551e1d1c/pymonkey-0.2.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1cc39dd2c9dedc9343de7f0e9c80ca8e", "sha256": "092f74238c8990e266262d8d668c99982097e014f7047fa1693f919778fc0fd7" }, "downloads": -1, "filename": "pymonkey-0.2.1.tar.gz", "has_sig": false, "md5_digest": "1cc39dd2c9dedc9343de7f0e9c80ca8e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3890, "upload_time": "2016-05-10T00:50:45", "url": "https://files.pythonhosted.org/packages/c7/b3/e309882c5f261ff046ec7d7831c598113614c20cca070959cd132397d859/pymonkey-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "cb4c7d9c67506927a5ba81e4d82750bd", "sha256": "e59a2c69610c906a74a29d5455c8cdfbe616faeceff1321bb5cc10b377ea0ddb" }, "downloads": -1, "filename": "pymonkey-0.2.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "cb4c7d9c67506927a5ba81e4d82750bd", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 5288, "upload_time": "2016-05-10T17:49:41", "url": "https://files.pythonhosted.org/packages/65/7c/1261818a285dd4bb264be0adb7050dba2bb347300ad4ccacf442fc7113ad/pymonkey-0.2.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "06169da25edc484eb63b41a1fe1acba7", "sha256": "0a79c181ac6a31d193d6edf4401c1d05e341054dc7d1227704dc5bdaf651a739" }, "downloads": -1, "filename": "pymonkey-0.2.2.tar.gz", "has_sig": false, "md5_digest": "06169da25edc484eb63b41a1fe1acba7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3872, "upload_time": "2016-05-10T17:49:48", "url": "https://files.pythonhosted.org/packages/db/5c/0a37e1c51663a824d04bd20455b6ab897719d3263983e295a4c2de66e064/pymonkey-0.2.2.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "0eb5a61834995f604a7c15c0fb86b8b4", "sha256": "c316df41ac2f936bb54fab18b3663985a212debba0dffa4041dd09c9d972e6f3" }, "downloads": -1, "filename": "pymonkey-0.3.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "0eb5a61834995f604a7c15c0fb86b8b4", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 6446, "upload_time": "2019-02-28T07:25:34", "url": "https://files.pythonhosted.org/packages/da/a9/1a74cf32dfb17eb7db7941174ab2c47d54b2d1f018dbd02ae7de9d2047b7/pymonkey-0.3.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "95b59bd1c4d69e99c2ac3f54a6dbd8f3", "sha256": "5c79e4d17a04afe29e263ab20ecfc1300ae3353f99a813d7099b41939f5be10e" }, "downloads": -1, "filename": "pymonkey-0.3.0.tar.gz", "has_sig": false, "md5_digest": "95b59bd1c4d69e99c2ac3f54a6dbd8f3", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 6064, "upload_time": "2019-02-28T07:25:36", "url": "https://files.pythonhosted.org/packages/2f/89/08559aa4ca4a38a5374190f5e9873586a92eea101c002a80077e6c2a3177/pymonkey-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "776548762b9db505f5d18d0b6cb6b058", "sha256": "59a4d58785cd6a5734cfcba6dba5eb11595e493be559a141441caaa0e209048d" }, "downloads": -1, "filename": "pymonkey-0.3.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "776548762b9db505f5d18d0b6cb6b058", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 6497, "upload_time": "2019-08-28T04:09:22", "url": "https://files.pythonhosted.org/packages/51/22/276152db3ee5852de9c127e25c9acd9afe3544e4affa9eea6f31babbe6ab/pymonkey-0.3.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a3ba3764dcb18fe5bc25d320f012ffcc", "sha256": "23dfc5a7e5c72c1735349691f3a13e69614e80c12de05b236ca5ab361007d0f1" }, "downloads": -1, "filename": "pymonkey-0.3.1.tar.gz", "has_sig": false, "md5_digest": "a3ba3764dcb18fe5bc25d320f012ffcc", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 6115, "upload_time": "2019-08-28T04:09:24", "url": "https://files.pythonhosted.org/packages/81/81/a893cd17c5196c7d42718f98a0cd5c009bdd7897e4766b363384b2ffc912/pymonkey-0.3.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "776548762b9db505f5d18d0b6cb6b058", "sha256": "59a4d58785cd6a5734cfcba6dba5eb11595e493be559a141441caaa0e209048d" }, "downloads": -1, "filename": "pymonkey-0.3.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "776548762b9db505f5d18d0b6cb6b058", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 6497, "upload_time": "2019-08-28T04:09:22", "url": "https://files.pythonhosted.org/packages/51/22/276152db3ee5852de9c127e25c9acd9afe3544e4affa9eea6f31babbe6ab/pymonkey-0.3.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a3ba3764dcb18fe5bc25d320f012ffcc", "sha256": "23dfc5a7e5c72c1735349691f3a13e69614e80c12de05b236ca5ab361007d0f1" }, "downloads": -1, "filename": "pymonkey-0.3.1.tar.gz", "has_sig": false, "md5_digest": "a3ba3764dcb18fe5bc25d320f012ffcc", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 6115, "upload_time": "2019-08-28T04:09:24", "url": "https://files.pythonhosted.org/packages/81/81/a893cd17c5196c7d42718f98a0cd5c009bdd7897e4766b363384b2ffc912/pymonkey-0.3.1.tar.gz" } ] }