跳转到主要内容

关于缺失或不需要的Python依赖项的报告

项目描述

z3c.dependencychecker

检查哪些导入已执行,并将它们与 setup.py 中的内容进行比较,当发现缺失或不必要的依赖项时发出警告。

https://github.com/reinout/z3c.dependencychecker/actions/workflows/testing.yml/badge.svg?branch=master https://coveralls.io/repos/github/reinout/z3c.dependencychecker/badge.svg?branch=master

功能

z3c.dependencychecker 报告的内容

  • 缺失(测试)要求:没有在 setup.py 中对应要求的导入。可能会有误报,但至少您有一个(希望是简短的)待检查项目列表。

    注意名称与导入方式不同的包。例如,对 pydns 的要求,在您的代码中作为 import DNS 使用:pydns 和 DNS 会导致单独的“缺失要求:DNS”和“不必要的依赖项:pydns”警告。

  • 不必要的(测试)要求:在您的 setup.py 中有导入,但您的代码中任何地方都没有导入。您可能需要它们,因为不是所有内容都需要导入。至少它为您提供了一个更小的待检查列表。

  • 应该仅用于测试的要求:如果某项内容仅在测试文件中导入,则它不应该在通用默认值中。因此,您会得到一个单独的要求列表,这些要求应该从常规要求移至测试要求。

它检查以下位置

  • 常规导入及其文档字符串的 Python 文件。

  • ZCML 文件,Plone 的通用设置文件以及 FTI XML 文件。

  • Python 文件、.txt.rst 文件中的 doctests 导入。

  • django 设置文件。

用户映射

一些在 PyPI 上可用的包的名称与使用它们的导入语句不同,例如 python-dateutil 作为 import dateutil 导入。其他提供多个包,例如 Zope2 提供了多个包,如 Products.FiveProducts.OFSP

对于这些情况,z3c.dependencychecker 有一个解决方案:用户映射。

在您的项目的根目录下添加一个 pyproject.toml 文件,内容如下

[tool.dependencychecker]
python-dateutil = ['dateutil']
Zope2 = ['Products.Five', 'Products.OFSP' ]

z3c.dependencychecker 将读取此信息并在报告中使用它。

忽略包

有时您需要在 setup.py 中添加一个包,尽管您没有直接导入它,但它可能是您的依赖项的一个额外依赖项,或者您的包对某个包有软依赖,而作为软依赖,它不是必须始终安装的。

在这两种情况下,z3c.dependencychecker 都会发出抱怨。它会报告一个依赖项不是必需的,或者一个缺失的包没有列在包要求中。

幸运的是,z3c.dependencychecker 也有解决方案。

在您的项目的根目录下添加一个 pyproject.toml 文件,内容如下

[tool.dependencychecker]
ignore-packages = ['one-package', 'another.package' ]

z3c.dependencychecker 会完全忽略其报告中的这些包,无论是看似未使用的依赖项,还是看似缺失的依赖项。

致谢

z3c.dependencychecker 是 zope 的 importchecker 工具的另一种应用程序/打包方式。它已在许多项目中使用,我从 lovely.recipe 的检出 中获取了一份副本。

  • Martijn Faassen 编写了原始的 importchecker 脚本。

  • Reinout van Rees 添加了依赖检查功能并将其打包(主要在 The Health Agency 工作期间完成)。

  • Jonas Baumann 做了一些修正。

  • Gil Forcada Codinachs 对代码进行了许多更新(基本上是将整个代码库重写以与 AST 一起工作),以更好地与现代 Plone 版本配合使用。

源代码、分支和报告错误

源代码可在 github 上找到:https://github.com/reinout/z3c.dependencychecker

您可以从那里进行分叉和修复。您还可以在 github 问题跟踪器中添加问题和功能请求。

每次您提交内容时,都会自动运行 bin/code-analysis。注意输出,并修复报告的问题。或者修复设置以过滤掉不适当的报告。

本地开发环境搭建

创建一个 virtualenv 并安装需求

$ python3 -m venv venv
$ . venv/bin/activate
$ pip install -r requirements.txt

如果您更改了 setup.py 中的实际需求或在 requirements.in 中的开发需求,请重新生成 requirements.txt

$ pip-compile requirements.in

为了运行测试,我们使用 plone/meta 的设置。所以像

$ tox -e test
$ tox -e format
$ pre-commit run --all

z3c.dependencychecker 的用法

安装

您可以全局安装 z3c.dependencychecker(easy_install z3c.dependencychecker)或在您的 buildout 中安装它。

用法

从您的项目的根目录运行 dependencycheckerbin/dependencychecker 脚本,它会报告您的依赖项。

您必须已安装您的项目,因为 z3c.dependencychecker 需要setuptools 生成的 YOURPROJECT.egg-info 目录。它在根目录和直接子目录(如 src/plone/)中查找该目录。

我们在临时目录中有一个示例项目

>>> sample1_dir
'/TESTTEMP/sample1'
>>> ls(sample1_dir)
setup.py
src

对于我们的测试,我们调用 main() 方法,就像 dependencychecker 脚本会做的那样

>>> import os
>>> os.chdir(sample1_dir)
>>> from z3c.dependencychecker import dependencychecker
>>> dependencychecker.main()
Unused imports
==============
src/sample1/unusedimports.py:7:  tempfile
src/sample1/unusedimports.py:4:  zest.releaser
src/sample1/unusedimports.py:6:  os
<BLANKLINE>
Missing requirements
====================
     Products.GenericSetup.interfaces.EXTENSION
     missing.req
     other.generic.setup.dependency
     plone.app.content.interfaces.INameFromTitle
     plone.app.dexterity.behaviors.metadata.IBasic
     plone.random1.interfaces.IMySchema
     plone.random2.content.MyType
     some_django_app
     something.origname
     zope.exceptions
     zope.interface
<BLANKLINE>
Missing test requirements
=========================
     plone.dexterity.browser.views.ContentTypeView
     plone.dexterity.interfaces.IContentType
     reinout.hurray
     transaction
     zope.filerepresentation.interfaces.IRawReadFile
<BLANKLINE>
Unneeded requirements
=====================
     some.other.extension
     unneeded.req
<BLANKLINE>
Requirements that should be test requirements
=============================================
     Needed.By.Test
<BLANKLINE>
Unneeded test requirements
==========================
     zope.testing
<BLANKLINE>
Note: requirements are taken from the egginfo dir, so you need
to re-run buildout (or setup.py or whatever) for changes in
setup.py to have effect.
<BLANKLINE>

z3c.dependencychecker 更新日志

2.15 (2024-04-11)

  • 在所有地方使用 pathlib.Path 以便更容易地推理路径。请注意,python 3.10 以某种方式成功地对 AttributeError: 'PosixPath' object has no attribute 'startswith' 抱怨,尽管 3.8/.9/.11/.12 和 pypy 工作良好。因此,如果您遇到该错误,请使用不同的 python 版本…… [gforcada]

  • Django 设置:查看 MIDDLEWARE 以及在 INSTALLED_APPS 中的其他设置,这有助于检测更多所需的包。

2.14.3 (2023-12-28)

  • 重构了需要与前一个版本相同的修正的其他 modules.py 类。 [gforcada]

2.14.1 (2023-12-28)

  • 在扫描文件时忽略任何以点开头的文件夹(如 .tox.git)。 [gforcada]

2.14 (2023-12-28)

  • 添加了对使用隐含命名空间的分发(PEP 420)的支持。 [gforcada]

2.13 (2023-12-19)

  • 放弃对 python 3.7 的支持,因为我们的依赖项至少需要 3.8。 [gforcada]

  • 添加对 python 3.12 的支持。 [gforcada]

2.12 (2023-08-02)

  • 修复,希望最终解决,Zope 用户映射用例。 [gforcada]

  • Plone 添加为与 Zope 一起的伞形分发。 [gforcada]

  • 扫描 ZCML 文件中的 <implements 指令。 [gforcada]

  • 处理不再具有 setup.py 的新分发。考虑将 pyproject.tomlsetup.cfgsetup.py 一起使用。 [gforcada]

2.11 (2023-03-03)

  • 在扫描具有依赖项的文件时忽略 node_modules__pycache__ 文件夹。 [gforcada]

  • 不要扫描 Plone FTI 文件中的点命名行为。 [gforcada]

2.10 (2023-01-30)

  • 不要忽略 Zope 用户映射,修复上一个版本。 [gforcada]

2.9 (2023-01-23)

  • 忽略 Zope 包,否则它会吞掉所有 zope. 命名空间包。 [gforcada]

2.8 (2022-11-30)

  • 放弃对 python 2.7 的支持。 [gforcada]

  • 用 GitHub actions 替换 travis。 [gforcada]

  • 针对 python 3.7-3.11 和 pypy3 进行测试。 [gforcada]

  • 更新开发者文档。 [reinout]

2.7 (2018-08-08)

  • 修复了“要求应该是测试要求”的报告。在使用用户映射时存在边缘情况。[gforcada]

2.6 (2018-07-09)

  • 在剩余的报告中使用用户映射

    • 不必要的依赖项

    • 不必要的测试依赖项

    • 应该为测试依赖项的依赖项

    [gforcada]

  • 始终将Python文档字符串中的导入视为测试依赖项。[gforcada]

2.5.1 (2018-07-06)

  • 重新发布2.5版本,因为它是一个棕色袋发布。[gforcada]

2.5 (2018-07-06)

  • 在每个顶级文件夹中检查是否存在.egg-info文件夹。[gforcada]

2.4.4 (2018-07-04)

注意:这包括2.4.1 - 2.4.4版本,我们不得不迭代几次才能正确格式化:-)

  • 修复pypi中长描述的渲染。[gforcada, reinout]

  • 文档格式修复。[reinout]

2.4 (2018-06-30)

  • 处理具有多个顶级目录的包,例如Zope2。[gforcada]

2.3 (2018-06-21)

  • 添加新的命令行选项--exit-zero。它强制程序始终以零状态退出。否则,如果程序发现任何要报告的内容,则报告1。[gforcada]

  • 修复ZCML解析器以忽略空字符串。[gforcada]

2.2 (2018-06-19)

  • 忽略相对导入(例如,from . import foo)。[gforcada]

  • 添加了ignore-packages配置选项,以完全忽略报告中的一或多个包(无论是未使用的导入还是不必要的依赖项)。对于软依赖项很有用。[gforcada]

2.1.1 (2018-03-10)

  • 注意:2.1存在技术发布问题,因此发布2.1.1。[reinout]

  • 现在也将它作为wheel发布。[reinout]

  • 对调试日志(-v/--verbose显示它)进行了一些小改进。[reinout]

  • 从DottedName中移除未使用的参数。[gforcada]

  • 所有由DocFiles导入提取器找到的导入都被标记为测试导入。[gforcada]

  • 处理单个ZCML参数中找到的多个点状名称。[gforcada]

  • 使用属性使代码更符合Python风格。[gforcada]

  • 允许用户在pyproject.toml文件上定义自己的映射。请参阅README.rst。[gforcada]

  • 在将导入添加到数据库时过滤导入,而不是在每个报告中过滤。[gforcada]

2.0 (2018-01-04)

  • 完全重写:代码不再使用已弃用功能,更模块化,更符合Python风格,更容易扩展和修改,最重要的是,具有100%的测试覆盖率以确保它按预期工作。[gforcada]

  • 添加对Python 3的支持。[gforcada]

1.16 (2017-06-21)

  • 不再在例如需要django设置文件可用或需要完成django应用配置步骤的django代码上崩溃。[reinout]

  • 改进了Django设置提取。[reinout]

  • 更好地检测Python内置模块。之前遗漏了具有样式的模块。[reinout]

1.15 (2015-09-02)

  • 有时在具有多个egg-info目录的目录(如/usr/lib/python2.7/dist-packages/*.egg-info/…)中找到了错误的包名称。现在检查egg-info目录中的top_level.txt文件,以检查顶级目录是否匹配。[reinout]

1.14 (2015-09-01)

  • 调试日志(-v)现在已打印到stdout而不是stderr。这使得在调试过程中更容易使用grep或搜索详细输出。[reinout]

1.13 (2015-08-29)

  • 现在也正确检测导入加分号加语句(如import transaction;transaction.commit())。[gforcada]

  • 现在也自动找到具有点状名称的包的起始目录(如zest.releaser)。[reinout]

  • 内部代码更改:将代码从src/目录移出。所有内容向上移动一级。[reinout]

  • Dependencychecker不再进入没有__init__.py的目录。这有助于处理有时有python文件深深埋在目录中但实际上不属于项目python代码的网站项目。[reinout]

  • 现在正确处理了从具有相同名称的库中按行多次导入的情况。在一行中导入zope.interface有时会“隐藏”下一行的zope.component导入。[gforcada]

1.12 (2015-08-16)

  • 改进了ZCML导入覆盖率(查看forclass)。[gforcada]

  • 内部项目更新(buildout版本、测试调整等)。[gforcada]

  • 添加了对FTI依赖(行为、模式和类)的支持。[gforcada]

1.11 (2013-04-16)

  • 支持没有全局setuptools安装的python安装,通过在setup.py中搜索名称作为后备。

1.10 (2013-02-24)

  • 将非测试的extras_require当作正常的install_requires处理。

1.9 (2013-02-13)

  • 改进了对带破折号的“Django样式”包名的检测。Django不擅长处理命名空间包,因此,而不是zc.something,您会看到像zc-something这样的包。导入时使用下划线,zc_something

  • 添加了对Django设置文件的支持。任何匹配*settings.py的内容都会搜索Django设置,如INSTALLED_APPS = [...]MIDDLEWARE_CLASSES = [...]

1.8 (2013-02-13)

  • 检测用于通用设置配置注册的ZCML“提供”。

1.7.1 (2012-11-26)

  • 添加了travis.ci配置。我们也在那里进行测试了!

1.7 (2012-11-26)

  • 对于ZCML模块也查找包名,就像对python模块所做的那样。

  • metadata.xml文件中检测通用设置依赖。

1.6 (2012-11-01)

  • 修复了导入“魔法模块”如email.Header时的AttributeError。

1.5 (2012-07-03)

  • 在查找包名时添加了对zip分发的支持。

1.4 (2012-07-03)

  • 如果可能,从egg-infos中查找包名(python >= 2.5)。这有助于解决PIL问题(当你导入时,它可以变为Imaging)。

1.3.2 (2012-06-29)

  • 修复了1.3.0和1.3.0版本的错误发布:缺少MANIFEST.in...

1.3.1 (2012-06-29)

1.3 (2012-06-29)

  • 添加了在OSX上使用python buildout时检测标准库的修复。(由Jonas Baumann提供补丁,下一个项目也是如此)。

  • 除了[test]之外,还支持[tests]测试需求。

1.2 (2011-09-19)

  • 优先查找以包名命名的包目录,而不是src/目录。

  • 补偿django风格的‘django-something’包名,使用‘django_something’包目录。破折号与下划线。

1.1 (2010-01-06)

  • Zcml文件也搜索‘component=’模式,因为安全策略声明可以使用它。

  • Dependencychecker现在不区分大小写,因为pypi也不区分大小写。

  • 现在使用optparse解析命令行。添加了–help和–version。

1.0 (2009-12-10)

  • 文档更新。

  • 改进了测试覆盖率。dependencychecker模块自我达到100%,原始导入检查模块达到91%覆盖率。

0.5 (2009-12-10)

  • 在doctests(.py、.txt、.rst)中搜索导入,这是必要的,但似乎可以捕捉到我可以测试的内容。

0.4 (2009-12-10)

  • 支持“从zope导入interface”风格的导入,您确实希望被告知缺少“zope.interface”依赖,而不是仅仅“zope”(这只是一个命名空间包)。

0.3 (2009-12-08)

  • 对“未使用的需求”报告进行排序,并过滤掉重复项。

  • 单独报告应从常规依赖项移动到测试依赖项的依赖项。

0.2 (2009-12-08)

  • 添加了测试。初始快速测试使覆盖率达到86%。

  • 修复了测试需求检测中的错误。

  • 添加了文档。

  • 将源代码移至zope的svn仓库。

0.1 (2009-12-02)

  • 也报告未使用导入。

  • 添加了关于在setup.py更改后重新运行buildout的说明。

  • 添加了用于检测更多缺失导入的zcml查找。

  • 添加了关于缺失常规和测试导入的报告。

  • 从egginfo目录中获取现有的需求。

  • 复制了Martijn Faassen的zope importchecker脚本。

项目详细信息


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码发行版

z3c.dependencychecker-2.15.tar.gz (48.9 kB 查看哈希值)

上传时间 源代码

支持者