pip风格和pipfile需求之间的转换工具。
项目描述
RequirementsLib: Pip和Pipenv的需求管理库
🐉 安装
从PyPI安装
$ pipenv install requirementslib
从Github安装
$ pipenv install -e git+https://github.com/sarugaku/requirementslib.git#egg=requirementslib
🐉 摘要
RequirementsLib 提供了一个简单的层,用于构建和与两种格式的需求进行交互:Pipfile 格式和 requirements.txt 格式。这个库最初是为了在 Pipenv 中在这些格式之间转换而构建的。
🐉 使用方法
将锁定文件导入到您的 setup.py 文件中
您可以使用 RequirementsLib 将您的锁定文件导入到设置文件中,以包含您的 install_requires 依赖项
from requirementslib import Lockfile
lockfile = Lockfile.create('/path/to/project/dir')
install_requires = lockfile.as_requirements(dev=False)
直接与 Pipfile 交互
您还可以直接与 Pipfile 交互
>>> from requirementslib import Pipfile
>>> pf = Pipfile.load('/home/hawk/git/pypa-pipenv')
>>> pf.sections
[Section(name='packages', requirements=[]), Section(name='dev-packages', requirements=[Requirement(name='pipenv', vcs=None, req=FileRequirement(setup_path=None, path='.', editable=True, uri='file:///home/hawk/git/pypa-pipenv', link=<Link file:///home/hawk/git/pypa-pipenv>, name='pipenv', req=<Requirement: "-e file:///home/hawk/git/pypa-pipenv">), markers='', specifiers=None, index=None, editable=True, hashes=[], extras=None),...]
并且您甚至可以将其写回到 Pipfile 的原生格式
>>> print(pf.dump(to_dict=False))
[packages]
[dev-packages]
pipenv = {path = ".", editable = true}
flake8 = ">=3.3.0,<4"
pytest = "*"
mock = "*"
[scripts]
tests = "bash ./run-tests.sh"
[pipenv]
allow_prereleases = true
从 requirements.txt 格式创建需求对象
>>> from requirementslib import Requirement
>>> r = Requirement.from_line('-e git+https://github.com/pypa/pipenv.git@master#egg=pipenv')
>>> print(r)
Requirement(name='pipenv', vcs='git', req=VCSRequirement(editable=True, uri='git+https://github.com/pypa/pipenv.git', path=None, vcs='git', ref='master', subdirectory=None, name='pipenv', link=<Link git+https://github.com/pypa/pipenv.git@master#egg=pipenv>, req=<Requirement: "-e git+https://github.com/pypa/pipenv.git@master#egg=pipenv">), markers=None, specifiers=None, index=None, editable=True, hashes=[], extras=[])
>>> r.as_pipfile()
{'pipenv': {'editable': True, 'ref': 'master', 'git': 'https://github.com/pypa/pipenv.git'}}
或将从 Pipfile 格式移动到 requirements.txt
>>> r = Requirement.from_pipfile(name='pythonfinder', indexes=[], pipfile={'path': '../pythonfinder', 'editable': True})
>>> r.as_line()
'-e ../pythonfinder'
解析可编辑包的依赖关系
Requirementslib 还可以通过调用 run_requires 方法来解析可编辑包的依赖关系。此方法返回一个包含从临时文件夹中构建的包(除非它已经在系统中或调用在虚拟环境中运行)的元数据解析的详细字典。
run_requires 的输出非常详细,在大多数情况下将足够使用
>>> from pprint import pprint
>>> from requirementslib.models.requirements import Requirement
>>> r = Requirement.from_line("-e git+git@github.com:sarugaku/vistir.git#egg=vistir[spinner]")
>>> setup_info_dict = r.run_requires()
>>> from pprint import pprint
>>> pprint(setup_info_dict)
{'base_dir': '/tmp/requirementslib-t_ftl6no-src/src/vistir',
'build_backend': 'setuptools.build_meta',
'build_requires': ['setuptools>=36.2.2', 'wheel>=0.28.0'],
'extra_kwargs': {'build_dir': '/tmp/requirementslib-t_ftl6no-src/src',
'download_dir': '/home/hawk/.cache/pipenv/pkgs',
'src_dir': '/tmp/requirementslib-t_ftl6no-src/src',
'wheel_download_dir': '/home/hawk/.cache/pipenv/wheels'},
'extras': {'spinner': [Requirement.parse('cursor'),
Requirement.parse('yaspin')],
'tests': [Requirement.parse('pytest'),
Requirement.parse('pytest-xdist'),
Requirement.parse('pytest-cov'),
Requirement.parse('pytest-timeout'),
Requirement.parse('hypothesis-fspaths'),
Requirement.parse('hypothesis')]},
'ireq': <InstallRequirement object: vistir[spinner] from git+ssh://git@github.com/sarugaku/vistir.git#egg=vistir editable=True>,
'name': 'vistir',
'pyproject': PosixPath('/tmp/requirementslib-t_ftl6no-src/src/vistir/pyproject.toml'),
'python_requires': '>=2.6,!=3.0,!=3.1,!=3.2,!=3.3',
'requires': {'backports.functools_lru_cache;python_version<="3.4"': Requirement.parse('backports.functools_lru_cache; python_version <= "3.4"'),
'backports.shutil_get_terminal_size;python_version<"3.3"': Requirement.parse('backports.shutil_get_terminal_size; python_version < "3.3"'),
'backports.weakref;python_version<"3.3"': Requirement.parse('backports.weakref; python_version < "3.3"'),
'colorama': Requirement.parse('colorama'),
'pathlib2;python_version<"3.5"': Requirement.parse('pathlib2; python_version < "3.5"'),
'requests': Requirement.parse('requests'),
'six': Requirement.parse('six'),
'spinner': [Requirement.parse('cursor'),
Requirement.parse('yaspin')]},
'setup_cfg': PosixPath('/tmp/requirementslib-t_ftl6no-src/src/vistir/setup.cfg'),
'setup_py': PosixPath('/tmp/requirementslib-t_ftl6no-src/src/vistir/setup.py')}
作为对 run_requires 调用的副作用,要求本身上的属性 requirement.req.dependencies 可用新的元数据
>>> pprint(r.req.dependencies)
({'backports.functools_lru_cache;python_version<="3.4"': Requirement.parse('backports.functools_lru_cache; python_version <= "3.4"'),
'backports.shutil_get_terminal_size;python_version<"3.3"': Requirement.parse('backports.shutil_get_terminal_size; python_version < "3.3"'),
'backports.weakref;python_version<"3.3"': Requirement.parse('backports.weakref; python_version < "3.3"'),
'colorama': Requirement.parse('colorama'),
'pathlib2;python_version<"3.5"': Requirement.parse('pathlib2; python_version < "3.5"'),
'requests': Requirement.parse('requests'),
'six': Requirement.parse('six'),
'spinner': [Requirement.parse('cursor'), Requirement.parse('yaspin')]},
[],
['setuptools>=36.2.2', 'wheel>=0.28.0'])
🐉 集成
🐉 贡献
将存储库分支并克隆分支到您的本地计算机:git clone git@github.com:yourusername/requirementslib.git
进入存储库目录并更新子模块:git submodule update --init --recursive
使用 pipenv 在虚拟环境中本地安装包:pipenv install --dev
您还可以通过运行 pip install -e .[dev,tests,typing] 将包安装到 virtualenv 中,以确保安装所有开发和测试依赖项
在进行任何代码更改之前,请确保提交一个问题。确保顺利协作的最佳方式是在投入大量时间和精力进行任何更改之前进行沟通!请确保考虑的不仅仅是您的用例,还有可能使用此库的其他人
创建一个新分支。对于错误,您可以直接分支到 bugfix/<issuenumber>。功能可以分支到 feature/<issuenumber>。此约定是为了简化分支过程,并鼓励围绕提交问题和将拉取请求与特定问题相关联的良好实践。如果您发现自己在一个拉取请求中解决了许多问题,那么这应该让您三思而后行
进行您所需的更改。别忘了添加额外的测试来处理您的新代码——没有它,持续集成 将会 失败
通过运行 pipenv run pytest -ra tests 或简单地 pytest -ra tests(如果您在激活的虚拟环境中)来测试您的更改
在 news 目录中创建一个相应的 .rst 文件,其中包含您更改的一句描述,例如 解决了有时阻止要求从 Pipfile 条目正确转换为 pip 行的问题
提交您的更改。您的提交的第一行应该是更改的总结,不超过72个字符,然后是空行,接着是更改的详细描述列表。不要忘记为每个您在拉取请求中解决的问题添加带有短语 - 修复 #<issuenumber> 的单独行。
在提交您的拉取请求之前,请确保执行 git remote add upstream git@github.com:sarugaku/requirementslib.git 并然后 git fetch upstream && git pull upstream master 以确保您的代码与master分支的最新版本同步。
创建一个描述您修复的拉取请求,并引用相关的问题。如果第8步的提交消息很详细,您应该可以复制并粘贴它。