审计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

0.3.1

  • 优雅地处理pip freeze输出中可能出现的注释

0.3.0

  • 引入defrost-lint命令来测试需求文件的有效性。

0.2.0

  • 删除属性Package.rawRequirement.raw,而使用 Package.__str__()Requirement.__str__()
  • 忽略PIP冻结输出中找到的链接(-f或-e行)
  • 引入折旧严重性的概念。Package.deprecate()现在 接受默认为"error"的严重性Kwarg和一个需求条目 在yaml文件中,现在接受一个可选的severity,可以设置为 errorwarn。这会影响命令行的退出状态代码。 接口。
  • ^{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

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java检查整数是0还是检查变量是null更好?   java Android Kotlin(初学者)使用File(),并从ACTION\u GET\u内容返回Uri   java JavaFx在“内部场景”和根场景之间切换   spring将XMLBean配置转换为java配置   java JPA HIBERNATE映射列两次(embeddedID和POJO)   c#单态模式模型在什么情况下适用?   java请求。getRemoteUser在特定时间后返回null?   spring boot中PUT api控制器的java my单元测试用例失败   java在字符串中互换地解析和替换值   java Android JNI在应用程序中检测到错误:调用JNI GetMethodID时出现挂起异常   JavaSpringDataMongo:使用非简单键持久化映射   爪哇玻璃鱼连接被拒绝   java如何在用户注册时发送特定电子邮件id的自动回复?   Java列表:实例化时和之后的赋值之间的差异