审计pip冻结输出和测试版本需求的工具
defrost的Python项目详细描述
除霜
注意:这个包最初称为pipfreeze,但为了避免 与命令pip freeze混淆。
除霜是一个命令行工具,用于检查^{tt2}的输出$ 命令符合在yaml文件中定义的一组包要求。
使用量
defrost --help
首先在yaml文件requirements.yml中定义一组包需求。
---requirements:-requirement:foobar>=1.0reason:foobar pre-1.0 is no longer supported, please upgrade to 1.x-requirement:ordereddict<0.0reason:OrderedDict is part of Python 2.7 and above. If you are still running Python 2.6, please upgrade!
然后,您可以在提供yaml文件时将pip freeze的输出管道化为除霜。
$ pip freeze > freeze.out $ defrost requirements.yml freeze.out Package(foobar==1.2) does not satisfy Requirement(foobar>=2.0): foobar pre-1.0 is no longer supported, please upgrade to 1.x
除霜也可以通过一个破折号将PIP冻结输出作为标准输入 -作为参数代替pip freeze输出文件。
$ pip freeze | defrost requirements.yml - Package(foobar==1.2) does not satisfy Requirement(foobar>=2.0): foobar pre-1.0 is no longer supported, please upgrade to 1.x
您还可以检查提供的yaml文件是否与 defrost-lint。
$ defrost-lint requirements.yml
安装
pip install defrost
库
有3个基本对象可用:
- PipFreeze:一个pythonic容器,包含需要pip冻结的包。 作为输入输出。
- Package:表示精确版本的包实例(固定) 由pipfreeze容器保存(例如foo==1.2)
- Requirement:包的要求表示一个版本 或者给定包的一系列版本,例如foo>=2.0是 所有大于或等于2.0的foo版本的要求。foo没有 版本说明符表示foo的所有版本。
管道冻结
pip freeze将pip freeze输出作为输入,并在内部构建包。
>>>fromdefrostimportPipFreeze>>>pip_freeze_output="""\ foo==1.2.3 bar==2.0 """>>>pip_freeze=PipFreeze(pip_freeze_output)>>>len(pip_freeze)2>>>list(pip_freeze)[Package(foo==1.2.3),Package(bar==2.0)]# test presence of package foo that is less or equal to v2.0>>>'foo<=2.0'inpip_freezeTrue# test presence of any version of package zoo>>>'zoo'inpip_freezeFalse# test can also be done with a Package instance>>>Package('foo==0.1')inpip_freezeFalse# ... or with a Requirement>>>Requirement('bar>=2.0')inpip_freezeTrue
包弃用
通过加载yaml需求文件和 将结果传递给PipFreeze.load_requirements()。有包裹 如果不满足加载的 要求。您还可以提供为什么包是 已弃用。
>>>pip_freeze=PipFreeze("""\ foobar==0.8 bar==2.0 ordereddict==1.1 """)>>>importyaml>>>reqs=yaml.load(open('my-reqs.yaml'))>>>pip_freeze.load_requirements(reqs)>>>pip_freeze.deprecated[Package(foobar==0.8),Package(ordereddict==1.1)]>>>forpackageinpip_freeze.deprecated:...print("%s: deprecated=%s, deprecated_by=%s, reason=%s"%(package,package.deprecated,package.deprecated_by,package.deprecation_reason))...Package(foobar==0.8):deprecated=True,deprecated_by=Requirement(foobar>=1.0),reason=foobarpre-1.0isnolongersupported,pleaseupgradeto1.xPackage(ordereddict==1.1):deprecated=True,deprecated_by=Requirement(ordereddict<0.0),reason=ordereddictispartofPython2.7andabove.IfyouarestillrunningPython2.6,pleaseupgrade!
包装
包以精确的包版本作为输入。
>>>fromdefrostimportPackage>>>package=Package('foo==1.2')>>>package.name'foo'>>>package.version'1.2'
如果您在需求中没有传递一个确切的版本,它将引发一个ValueError。
>>>package=Package('foo')>>>Package('foo')Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>...ValueError:foodoesnotrepresentanexactpackageversion;theformatshouldbefoo==1.0
您也可以手动否决软件包:
>>>package=Package('foo==1.2')>>>package.deprecatedFalse>>>package.deprecate(reason='because')>>>package.deprecatedTrue>>>package.deprecation_reason'because'
要求
需求表示一系列的包版本。
>>>fromdefrostimportRequirement>>>req=Requirement('foo>=1.0,<2.0')>>>req.name'foo'>>>req.specifier[('>=','1.0'),('<','2.0')]
需求与包很好地配合。使用python运算符in,您可以 可以检查包是否满足要求。
>>>req=Requirement('foo>=1.0')>>>Package('foo==1.0')inreqTrue>>>Package('foo==2.0')inreqTrue>>>Package('foo==0.1')inreqFalse
0.4.0
- 实现PipFreeze.__getitem__和PipFreeze.get()。
0.3.2
- 优雅地处理空行和以破折号开头的行 (https://github.com/SurveyMonkey/defrost/pull/14)
0.3.1
- 优雅地处理pip freeze输出中可能出现的注释
0.3.0
- 引入defrost-lint命令来测试需求文件的有效性。
0.2.0
- 删除属性Package.raw和Requirement.raw,而使用 Package.__str__()和Requirement.__str__()。
- 忽略PIP冻结输出中找到的链接(-f或-e行)
- 引入折旧严重性的概念。Package.deprecate()现在 接受默认为"error"的严重性Kwarg和一个需求条目 在yaml文件中,现在接受一个可选的severity,可以设置为 error或warn。这会影响命令行的退出状态代码。 接口。
- ^{tt15}如果不提供原因,$会窒息
0.1.0
- 添加属性Package.deprecated_by
- 方法Package.deprecate()接受可选的deprecated_by参数。
- 添加命令行实用程序以列出给定需求文件的不推荐使用的包 以及pip冻结输出文件。
- 将项目pipfreeze重命名为defrost以避免与命令混淆 pip freeze。
0.0.4
- 根据名称对包进行排序,然后对其版本进行排序,使foo==2.0位于 foo-bar==1.0如果两者都被视为普通的,则不是这种情况 串。
0.0.3
- 实现Requirement
- 实现Package
- 实现PipFreeze.__contains__()
- 实现PipFreeze.__len__()
- 放弃PY26支持
- 删除PipFreeze.satisfies_requirement()
- 实现PipFreeze.load_requirements()
0.0.2
- 实现PipFreeze.__bool__()(py3)和PipFreeze.__nonzero__()(py2)
- 实现PipFreeze.__iter__()
0.0.1
- 实现pipfreeze.PipFreeze