关于缺失或不需要的Python依赖项的报告
项目描述
z3c.dependencychecker
检查哪些导入已执行,并将它们与 setup.py 中的内容进行比较,当发现缺失或不必要的依赖项时发出警告。
功能
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.Five 或 Products.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 中安装它。
用法
从您的项目的根目录运行 dependencychecker 或 bin/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.toml 和 setup.cfg 与 setup.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导入覆盖率(查看for和class)。[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)
由于我们迁移到github,更新了文档:https://github.com/reinout/z3c.dependencychecker .
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的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 91acdff17abe02572553da8c391e306bcb27f955bab9ef375601c59c775ab0e3 |
|
MD5 | e67f850e9788dfb552db25fb186e773b |
|
BLAKE2b-256 | e7e8689f06acf15fafe51c83e3c027e361867a2827a9e41fe2f2834b45c9cf7a |