Gorilla
=======
.. image:: https://img.shields.io/travis/christophercrouzet/gorilla/master.svg
:target: https://travis-ci.org/christophercrouzet/gorilla
:alt: Build status
.. image:: https://img.shields.io/coveralls/christophercrouzet/gorilla/master.svg
:target: https://coveralls.io/r/christophercrouzet/gorilla
:alt: Coverage Status
.. image:: https://img.shields.io/pypi/v/gorilla.svg
:target: https://pypi.python.org/pypi/gorilla
:alt: PyPI latest version
.. image:: https://readthedocs.org/projects/gorilla/badge/?version=latest
:target: https://gorilla.readthedocs.io
:alt: Documentation status
.. image:: https://img.shields.io/pypi/l/gorilla.svg
:target: https://pypi.python.org/pypi/gorilla
:alt: License
Gorilla is a Python library that provides a convenient approach to monkey
patching.
Monkey patching is the process of **modifying module and class attributes at
runtime** with the purpose of replacing or extending third-party code.
Although *not* a recommended practice, it is sometimes useful to fix or modify
the behaviour of a piece of code from a third-party library, or to extend its
public interface while making the additions feel like they are built-in into
the library.
The Python language makes monkey patching extremely easy but the advantages of
Gorilla are multiple, not only in assuring a **consistent behaviour** on both
Python 2 and Python 3 versions, but also in preventing common source of errors,
and making the process both **intuitive and convenient** even when faced with
*large* numbers of patches to create.
Features
--------
* intuitive and convenient decorator approach to create patches.
* can create patches for all class or module members at once.
* compatible with both Python 2 and Python 3.
* customizable behaviour.
Usage
-----
Thanks to the dynamic nature of Python that makes monkey patching possible, the
process happens at runtime without ever having to directly modify the source
code of the third-party library:
.. code-block:: python
>>> import gorilla
>>> import destination
>>> @gorilla.patches(destination.Class)
... class MyClass(object):
... def method(self):
... print("Hello")
... @classmethod
... def class_method(cls):
... print("world!")
The code above creates two patches, one for each member of the class
``MyClass``, but does not apply them yet. In other words, they define the
information required to carry on the operation but are not yet inserted into
the specified destination class ``destination.Class``.
Such patches created with the decorators can then be automatically retrieved by
recursively scanning a package or a module, then applied:
.. code-block:: python
>>> import gorilla
>>> import mypackage
>>> patches = gorilla.find_patches([mypackage])
>>> for patch in patches:
... gorilla.apply(patch)
See the `Tutorial`_ section from the documentation for more detailed examples
and explanations on how to use Gorilla.
Documentation
-------------
Read the documentation online at `gorilla.readthedocs.io`_ or check its source
in the ``doc`` directory.
Out There
---------
Projects using Gorilla include:
* `bana <https://github.com/christophercrouzet/bana>`_
* `mlflow <https://github.com/mlflow/mlflow>`_
Author
------
Christopher Crouzet
<`christophercrouzet.com <https://christophercrouzet.com>`_>
.. _gorilla.readthedocs.io: https://gorilla.readthedocs.io
.. _Tutorial: https://gorilla.readthedocs.io/en/latest/tutorial.html
Raw data
{
"_id": null,
"home_page": "https://github.com/christophercrouzet/gorilla",
"name": "gorilla2",
"maintainer": "",
"docs_url": null,
"requires_python": "",
"maintainer_email": "",
"keywords": "gorilla monkey patch patching",
"author": "Christopher Crouzet",
"author_email": "christopher@crouzet.pm",
"download_url": "https://files.pythonhosted.org/packages/79/6e/55c15cc3b87e0240d6b5a763371e672016cbfd24bd9cca6e1f39cd0f8e4a/gorilla2-3.4.0.tar.gz",
"platform": null,
"description": "Gorilla\r\n=======\r\n\r\n.. image:: https://img.shields.io/travis/christophercrouzet/gorilla/master.svg\r\n :target: https://travis-ci.org/christophercrouzet/gorilla\r\n :alt: Build status\r\n\r\n.. image:: https://img.shields.io/coveralls/christophercrouzet/gorilla/master.svg\r\n :target: https://coveralls.io/r/christophercrouzet/gorilla\r\n :alt: Coverage Status\r\n\r\n.. image:: https://img.shields.io/pypi/v/gorilla.svg\r\n :target: https://pypi.python.org/pypi/gorilla\r\n :alt: PyPI latest version\r\n\r\n.. image:: https://readthedocs.org/projects/gorilla/badge/?version=latest\r\n :target: https://gorilla.readthedocs.io\r\n :alt: Documentation status\r\n\r\n.. image:: https://img.shields.io/pypi/l/gorilla.svg\r\n :target: https://pypi.python.org/pypi/gorilla\r\n :alt: License\r\n\r\n\r\nGorilla is a Python library that provides a convenient approach to monkey\r\npatching.\r\n\r\nMonkey patching is the process of **modifying module and class attributes at\r\nruntime** with the purpose of replacing or extending third-party code.\r\n\r\nAlthough *not* a recommended practice, it is sometimes useful to fix or modify\r\nthe behaviour of a piece of code from a third-party library, or to extend its\r\npublic interface while making the additions feel like they are built-in into\r\nthe library.\r\n\r\nThe Python language makes monkey patching extremely easy but the advantages of\r\nGorilla are multiple, not only in assuring a **consistent behaviour** on both\r\nPython 2 and Python 3 versions, but also in preventing common source of errors,\r\nand making the process both **intuitive and convenient** even when faced with\r\n*large* numbers of patches to create.\r\n\r\n\r\nFeatures\r\n--------\r\n\r\n* intuitive and convenient decorator approach to create patches.\r\n* can create patches for all class or module members at once.\r\n* compatible with both Python 2 and Python 3.\r\n* customizable behaviour.\r\n\r\n\r\nUsage\r\n-----\r\n\r\nThanks to the dynamic nature of Python that makes monkey patching possible, the\r\nprocess happens at runtime without ever having to directly modify the source\r\ncode of the third-party library:\r\n\r\n.. code-block:: python\r\n\r\n >>> import gorilla\r\n >>> import destination\r\n >>> @gorilla.patches(destination.Class)\r\n ... class MyClass(object):\r\n ... def method(self):\r\n ... print(\"Hello\")\r\n ... @classmethod\r\n ... def class_method(cls):\r\n ... print(\"world!\")\r\n\r\n\r\nThe code above creates two patches, one for each member of the class\r\n``MyClass``, but does not apply them yet. In other words, they define the\r\ninformation required to carry on the operation but are not yet inserted into\r\nthe specified destination class ``destination.Class``.\r\n\r\nSuch patches created with the decorators can then be automatically retrieved by\r\nrecursively scanning a package or a module, then applied:\r\n\r\n.. code-block:: python\r\n\r\n >>> import gorilla\r\n >>> import mypackage\r\n >>> patches = gorilla.find_patches([mypackage])\r\n >>> for patch in patches:\r\n ... gorilla.apply(patch)\r\n\r\n\r\nSee the `Tutorial`_ section from the documentation for more detailed examples\r\nand explanations on how to use Gorilla.\r\n\r\n\r\nDocumentation\r\n-------------\r\n\r\nRead the documentation online at `gorilla.readthedocs.io`_ or check its source\r\nin the ``doc`` directory.\r\n\r\n\r\nOut There\r\n---------\r\n\r\nProjects using Gorilla include:\r\n\r\n* `bana <https://github.com/christophercrouzet/bana>`_\r\n* `mlflow <https://github.com/mlflow/mlflow>`_\r\n\r\n\r\nAuthor\r\n------\r\n\r\nChristopher Crouzet\r\n<`christophercrouzet.com <https://christophercrouzet.com>`_>\r\n\r\n\r\n.. _gorilla.readthedocs.io: https://gorilla.readthedocs.io\r\n.. _Tutorial: https://gorilla.readthedocs.io/en/latest/tutorial.html\r\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Convenient approach to monkey patching",
"version": "3.4.0",
"split_keywords": [
"gorilla",
"monkey",
"patch",
"patching"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "796e55c15cc3b87e0240d6b5a763371e672016cbfd24bd9cca6e1f39cd0f8e4a",
"md5": "c303b1f9d2780bc924d4a130176cf5fc",
"sha256": "10c3fee8cb6230d5502b47da03a2446119b72f7f80f59cc716eee57601027cba"
},
"downloads": -1,
"filename": "gorilla2-3.4.0.tar.gz",
"has_sig": false,
"md5_digest": "c303b1f9d2780bc924d4a130176cf5fc",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 30708,
"upload_time": "2023-01-12T02:21:54",
"upload_time_iso_8601": "2023-01-12T02:21:54.017833Z",
"url": "https://files.pythonhosted.org/packages/79/6e/55c15cc3b87e0240d6b5a763371e672016cbfd24bd9cca6e1f39cd0f8e4a/gorilla2-3.4.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-01-12 02:21:54",
"github": true,
"gitlab": false,
"bitbucket": false,
"github_user": "christophercrouzet",
"github_project": "gorilla",
"travis_ci": true,
"coveralls": false,
"github_actions": false,
"tox": true,
"lcname": "gorilla2"
}