Skip to content

Commit

Permalink
Re-use pre-parsed requirements when writing requires.txt
Browse files Browse the repository at this point in the history
  • Loading branch information
abravalheri committed Apr 24, 2023
1 parent 910f9e2 commit f930f71
Showing 1 changed file with 12 additions and 10 deletions.
22 changes: 12 additions & 10 deletions setuptools/command/_requirestxt.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
from itertools import filterfalse
from typing import Dict, List, Tuple, Mapping, TypeVar

from .. import _reqs
from ..extern.jaraco.text import yield_lines
from ..extern.packaging.requirements import Requirement

Expand All @@ -20,11 +19,11 @@
_T = TypeVar("_T")
_Ordered = Dict[_T, None]
_ordered = dict
_StrOrIter = _reqs._StrOrIter


def _prepare(
install_requires: _StrOrIter, extras_require: Mapping[str, _StrOrIter]
install_requires: Dict[str, Requirement],
extras_require: Mapping[str, Dict[str, Requirement]],
) -> Tuple[List[str], Dict[str, List[str]]]:
"""Given values for ``install_requires`` and ``extras_require``
create modified versions in a way that can be written in ``requires.txt``
Expand All @@ -34,7 +33,7 @@ def _prepare(


def _convert_extras_requirements(
extras_require: _StrOrIter,
extras_require: Dict[str, Dict[str, Requirement]],
) -> Mapping[str, _Ordered[Requirement]]:
"""
Convert requirements in `extras_require` of the form
Expand All @@ -45,14 +44,15 @@ def _convert_extras_requirements(
for section, v in extras_require.items():
# Do not strip empty sections.
output[section]
for r in _reqs.parse(v):
for r in v.values():
output[section + _suffix_for(r)].setdefault(r)

return output


def _move_install_requirements_markers(
install_requires: _StrOrIter, extras_require: Mapping[str, _Ordered[Requirement]]
install_requires: Dict[str, Requirement],
extras_require: Mapping[str, _Ordered[Requirement]]
) -> Tuple[List[str], Dict[str, List[str]]]:
"""
The ``requires.txt`` file has an specific format:
Expand All @@ -66,7 +66,7 @@ def _move_install_requirements_markers(
# divide the install_requires into two sets, simple ones still
# handled by install_requires and more complex ones handled by extras_require.

inst_reqs = list(_reqs.parse(install_requires))
inst_reqs = install_requires.values()
simple_reqs = filter(_no_marker, inst_reqs)
complex_reqs = filterfalse(_no_marker, inst_reqs)
simple_install_requires = list(map(str, simple_reqs))
Expand All @@ -90,8 +90,9 @@ def _suffix_for(req):

def _clean_req(req):
"""Given a Requirement, remove environment markers and return it"""
req.marker = None
return req
r = Requirement(str(req)) # create a copy before modifying.
r.marker = None
return r


def _no_marker(req):
Expand All @@ -109,9 +110,10 @@ def append_cr(line):

def write_requirements(cmd, basename, filename):
dist = cmd.distribution
meta = dist.metadata
data = io.StringIO()
install_requires, extras_require = _prepare(
dist.install_requires or (), dist.extras_require or {}
meta._normalized_install_requires, meta._normalized_extras_require
)
_write_requirements(data, install_requires)
for extra in sorted(extras_require):
Expand Down

0 comments on commit f930f71

Please sign in to comment.