跳转到主要内容

通过使用ZCML配置操作,在启动周期后期应用猴子补丁的支持

项目描述

https://travis-ci.cn/plone/collective.monkeypatcher.svg?branch=master https://coveralls.io/repos/github/zopefoundation/collective.monkeypatcher/badge.svg?branch=master Current version on PyPI Supported Python versions

简介

有时候,猴子补丁是一个必要的恶。

此包使在 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.buildoutplone.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 修补原始方法之前加载的。

请参阅这个在 plone 邮件列表上的相关帖子

解决方案

在您的包的 __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

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 (11.2 kB 查看散列值)

上传时间 源代码

构建分发

collective.monkeypatcher-1.2.1-py2.py3-none-any.whl (12.3 kB 查看散列值)

上传时间 Python 2 Python 3

由以下支持