Monkey-patching¶
A monkey patch (also spelled monkey-patch, MonkeyPatch) is a way to extend or modify the runtime code of dynamic languages (e.g. Smalltalk, JavaScript, Objective-C, Ruby, Perl, Python, Groovy, etc.) without altering the original source code.
Plone community promotes conflict free way to do monkey patching using collective.monkeypatcher package.
Patching constants¶
Some modules (typically config.py files) include constant definitions used throughout the package. Given that collective.monkeypatcher is intended to patch methods you'll not be able to patch a constant straightforward. Instead you'll have to make use of the handler option:
<monkey:patch
description="Add new terabyte constant"
class="Products.CMFPlone.CatalogTool.CatalogTool"
original="SIZE_CONST"
replacement=".patches.patched_size_const"
handler=".patches.apply_patched_const"
/>
And your patches.py module should include this:
NEW_SIZE_CONST = {'kB': 1024, 'MB': 1024*1024, 'GB': 1024*1024*1024, 'TB': 1024*1024*1024*1024}
patched_size_const = lambda : NEW_SIZE_CONST # Now we have a callable method!
def apply_patched_const(scope, original, replacement):
setattr(scope, original, replacement())
return
This way the original SIZE_CONST constant would be replaced by the result of the lambda function, which is our new constant.
Patching @property methods¶
If you are to patch a @property decorated method you can use the handler configuration option:
<monkey:patch
description="Performance boost in foldercontents"
class="plone.app.content.browser.foldercontents.FolderContentsTable"
original="items"
replacement=".patches.patched_items"
handler=".patches.apply_patched_property"
/>
And your patches.py module should include this:
def items(self):
... # The body of your patched method
def apply_patched_property(scope, original, replacement):
# This is actually the same as apply_patched_const above
setattr(scope, original, replacement())
return
patched_items = lambda : property(items) # We get a @property decorated method!
This way the original items method would be replaced by the result of the lambda function, which is a @property decorated method written in a different way.