通过使用ZCML配置操作,在启动周期后期应用猴子补丁的支持
项目描述
简介
有时候,猴子补丁是一个必要的恶。
此包使在 Zope 启动过程中应用猴子补丁变得更加容易。它使用 ZCML 配置机制来确保补丁在启动周期中“较晚”加载,这样原始代码就有时间完全初始化和配置。这与在产品的 __init__.py 中使用 initialize() 方法类似,但不需要该包是一个完整的 Zope 产品,并具有持久的 Control_Panel 条目。
安装
要将 collective.monkeypatcher 安装到全局 Python 环境(或工作环境)中,使用传统的 Zope 实例,您可以这样做
当您阅读此内容时,您可能已经运行了 pip install collective.monkeypatcher。
在 /path/to/instance/etc/package-includes 目录中创建一个名为 collective.monkeypatcher-configure.zcml 的文件。该文件应仅包含以下内容
<include package="collective.monkeypatcher" />
或者,如果您正在使用 zc.buildout 和 plone.recipe.zope2instance 食谱来管理您的项目,您可以这样做
将 collective.monkeypatcher 添加到要安装的 eggs 列表中,例如
[buildout] ... eggs = ... collective.monkeypatcher
告诉 plone.recipe.zope2instance 食谱安装 ZCML slug
[instance] recipe = plone.recipe.zope2instance ... zcml = collective.monkeypatcher
重新运行 buildout,例如
$ ./bin/buildout
如果您打算从另一个包的 configure.zcml 文件中显式包含该包,则可以跳过 ZCML slug。
应用猴子补丁
以下是一个示例
<configure xmlns="http://namespaces.zope.org/zope" xmlns:monkey="http://namespaces.plone.org/monkey" i18n_domain="collective.monkeypatcher"> <include package="collective.monkeypatcher" /> <monkey:patch description="This works around issue http://some.tracker.tld/ticket/123" class="Products.CMFPlone.CatalogTool.CatalogTool" original="searchResults" replacement=".catalog.patchedSearchResults" /> </configure>
在这个示例中,我们修补了 Plone 的 CatalogTool 的 searchResults() 函数,用 catalog.py 中的我们自己的版本替换它。要修补模块级别的函数,您可以使用 module 而不是 class。将检查原始类/函数名和替换符号,以确保它们确实存在。
如果修补发生得太早(或太晚),请使用 order 属性指定更高的(较晚的)或较低的(较早的)数字。默认值为 1000。
默认情况下,DocFinderTab 和其他 TTW API 浏览器将强调猴子补丁的方法/函数,在文档字符串后附加“通过‘my.monkeypatched.function’修补”。如果您不希望这样,可以将 docstringWarning 属性设置为 false。
如果您想做的不仅仅是用一个函数替换另一个函数,您可以通过 handler 属性提供自己的修补函数。这应该是一个可调用的,如下所示
def apply_patch(scope, original, replacement): ...
在这里,scope 是指定的类/模块。 original 是要替换的函数的字符串名,而 replacement 是替换函数。
选项完整列表
class 被修补的类
module 被修补的模块(参见 修补模块级别的函数)
handler 执行修补的函数。必须接受三个参数:类/模块、original(字符串)和 replacement
original 要替换的方法或函数
replacement 要替换的方法或函数
preservedoc 保留文档字符串?
preserveOriginal 保留原始函数,使其可通过前缀 _old_ 访问。仅适用于默认处理器。
preconditions 应用此补丁之前需要满足的先决条件(多个,用空格分隔)。例如:Products.LinguaPlone=-1.4.3 或 Products.TextIndexNG3=+3.3.0
ignoreOriginal 如果被修补的类/模块上不存在原始函数,则忽略。
docstringWarning 在文档字符串中添加猴子补丁警告。
description 关于您的猴子补丁的一些注释。
order 执行顺序
处理猴子补丁事件
应用猴子补丁会触发一个事件。请参阅 interfaces.py 模块。如果您要处理此类事件,请添加以下 ZCML 配置
... <subscriber for="collective.monkeypatcher.interfaces.IMonkeyPatchEvent" handler="my.component.events.myHandler" /> ...
并添加以下 Python 代码
def myHandler(event): """see collective.monkeypatcher.interfaces.IMonkeyPatchEvent""" ...
修补模块级函数
如果您想修补位于 patched.package.utils 中的方法 do_something,该模块被导入到一个包中,如下所示
from patched.package.utils import do_something
该函数的引用是在 collective.monkeypatcher 修补原始方法之前加载的。
解决方案
在您的包的 __init__.py 中进行修补
from patched.package import utils def do_it_different(): return 'foo' utils.do_something = do_it_different
变更日志
1.2.1 (2020-03-21)
错误修复
小的包装更新。[各种] (#1)
1.2 (2018-12-10)
新功能
在 README 中包含安装说明。
更新测试基础设施。
1.1.6 (2018-10-31)
错误修复
为 Python 2/3 兼容性做准备 [frapell]
1.1.5 (2018-06-18)
错误修复
修复测试模块中的 Python 3 导入 [ale-rt]
1.1.4 (2018-04-08)
错误修复
修复 Python 3 中的导入 [pbauer]
1.1.3 (2017-11-26)
新功能
记录修补模块级函数时可能出现的可能问题 [frisi]
1.1.2 (2016-08-10)
修复
使用 zope.interface 装饰器。[gforcada]
1.1.1 (2015-03-27)
修复拼写错误。[gforcada]
1.1 - 2014-12-10
修复替换对象没有 __module__ 属性的情况(请参阅 https://github.com/plone/collective.monkeypatcher/pull/3)。[mitchellrj, fRiSi]
1.0.1 - 2011-01-25
将标准日志消息降级为调试级别。[hannosch]
1.0 - 2010-07-01
避免 zope.app 依赖。[hannosch]
添加了新的参数 preconditions,它仅在满足先决条件(如特定软件包的版本)时才会修补。[spamsch]
添加了新的参数 preserveOriginal。将此设置为 true 可通过 _old_ 加上修补方法的名称来访问修补方法。[spamsch]
1.0b2 - 2009-06-18
如果被修补的类/模块上不存在原始函数,则忽略错误。[jfroche]
在更改之前检查是否存在文档字符串。[jfroche]
添加 buildout.cfg 以进行测试和测试覆盖率。[jfroche]
1.0b1 - 2009-04-17
在应用猴子补丁时触发事件。请参阅 interfaces.py。[glenfant]
添加了 ZCML 属性 "docstringWarning" 和 "description"。[glenfant]
添加了单元测试。[glenfant]
1.0a1 - 2009-03-29
初始发布 [optilude]
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。
源代码分发
构建分发
collective.monkeypatcher-1.2.1.tar.gz的散列值
算法 | 散列摘要 | |
---|---|---|
SHA256 | 781c61355053caed80d32b29669263fe8aa366e3495742749ec475fcadc339c6 |
|
MD5 | 1215821f37ab751bf6ad507fc033de44 |
|
BLAKE2b-256 | bb7c11e15752c37fa662c0ecb4a74a57b10c4b4c990822aa630fe1ffaa1a5214 |
collective.monkeypatcher-1.2.1-py2.py3-none-any.whl的散列值
算法 | 散列摘要 | |
---|---|---|
SHA256 | 9eb837866a45984b068aeb93398907e8d5f3b24c2be1b35ba86eff1078767e86 |
|
MD5 | 4eea5873a01950f3682a3fe582642737 |
|
BLAKE2b-256 | de29c9135ad4429b828da4443d6c890c6455480e0d1361d43bfab16658c78cd9 |