Package: requirementslib
RequirementsLib: Requirement Management Library for Pip and Pipenv🐉 InstallationInstall fromPyPI:$pipenvinstallrequirementslibInstall fromGithub:$pipenvinstall-egit+https://github.com/sarugaku/requirementslib.git#egg=requirementslib🐉 SummaryRequirementsLib provides a simple layer for building and interacting with
requirements in both thePipfileformat
and therequirements.txtformat.  This library
was originally built for converting between these formats inPipenv.🐉 UsageImporting a lockfile into yoursetup.pyfileYou can use RequirementsLib to import your lockfile into your setup file for including yourinstall_requiresdependencies:from requirementslib import Lockfile
lockfile = Lockfile.create('/path/to/project/dir')
install_requires = lockfile.as_requirements(dev=False)Interacting with aPipfiledirectlyYou can also interact directly with a Pipfile:>>>fromrequirementslibimportPipfile>>>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),...]And you can even write it back out into Pipfile’s native format:>>>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 = trueCreate a requirement object fromrequirements.txtformat>>>fromrequirementslibimportRequirement>>>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'}}Or move fromPipfileformat torequirements.txt:>>>r=Requirement.from_pipfile(name='pythonfinder',indexes=[],pipfile={'path':'../pythonfinder','editable':True})>>>r.as_line()'-e ../pythonfinder'Resolving Editable Package DependenciesRequirementslib also can resolve the dependencies of editable packages by calling therun_requiresmethod.
This method returns a detailed dictionary containing metadata parsed from the package built in
a transient folder (unless it is already on the system or the call is run in a virtualenv).The output ofrun_requiresis very detailed and in most cases will be sufficient:>>>frompprintimportpprint>>>fromrequirementslib.models.requirementsimportRequirement>>>r=Requirement.from_line("-e git+git@github.com:sarugaku/vistir.git#egg=vistir[spinner]")>>>setup_info_dict=r.run_requires()>>>frompprintimportpprint>>>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')}As a side-effect of calls torun_requires, new metadata is made available on the
requirement itself via the propertyrequirement.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'])🐉 IntegrationsPipPipenvPipfile🐉 ContributingFork the repository and clone the fork to your local machine:git clone git@github.com:yourusername/requirementslib.gitMove into the repository directory and update the submodules:git submodule update--init--recursiveInstall the package locally in a virtualenv usingpipenv:pipenv install--devYou can also install the package into avirtualenvby runningpip install-e.[dev,tests,typing]to ensure all the development and test dependencies are installedBefore making any changes to the code, make sure to file an issue. The best way to ensure a smooth collaboration is to communicatebeforeinvesting significant time and energy into any changes! Make sure to consider not just your own use case but others who might be using the libraryCreate a new branch. For bugs, you can simply branch tobugfix/<issuenumber>. Features can be branched tofeature/<issuenumber>. This convention
is to streamline the branching process and to encourage good practices around filing issues and associating pull requests with specific issues. If you
find yourself addressing many issues in one pull request, that should give you pauseMake your desired changes. Don’t forget to add additional tests to account for your new code – continuous integrationwillfail without itTest your changes by runningpipenv run pytest-ratestsor simplypytest-ratestsif you are inside an activated virtual environmentCreate a corresponding.rstfile in thenewsdirectory with a one sentence description of your change, e.g.Resolved an issue which sometimes prevented requirements from being converted from Pipfile entries to pip lines correctlyCommit your changes. The first line of your commit should be a summary of your changes, no longer than 72 characters, followed by a blank line, followed by a bulleted description of your changes.
Don’t forget to add separate lines with the phrase- Fixes #<issuenumber>for each issue you are addressing in your pull requestBefore submitting your pull request, make sure togit remote add upstream git@github.com:sarugaku/requirementslib.gitand thengit fetch upstream && git pull upstream masterto ensure your code is in sync with the latest version of the master branch,Create a pull request describing your fix, referencing the issues in question. If your commit message from step 8 was detailed, you should be able to copy and paste it