diff options
author | Steve Kowalik <steven@wedontsleep.org> | 2016-03-01 16:07:42 +1100 |
---|---|---|
committer | Steve Kowalik <steven@wedontsleep.org> | 2016-03-01 16:07:42 +1100 |
commit | 0ed33b7a4db605e4608f56d6bdb5efe81762b4cb (patch) | |
tree | 935aa03bf0cf0c2a5d8a5fb0f33b737bf3f9557c | |
parent | a46fd8327e5c13b45fcc92322b4fe00a76f307da (diff) | |
download | external_python_setuptools-0ed33b7a4db605e4608f56d6bdb5efe81762b4cb.tar.gz external_python_setuptools-0ed33b7a4db605e4608f56d6bdb5efe81762b4cb.tar.bz2 external_python_setuptools-0ed33b7a4db605e4608f56d6bdb5efe81762b4cb.zip |
Shift requirement parsing inside Requirement
-rw-r--r-- | pkg_resources/__init__.py | 42 | ||||
-rw-r--r-- | pkg_resources/tests/test_resources.py | 25 | ||||
-rwxr-xr-x | setuptools/command/easy_install.py | 5 | ||||
-rw-r--r-- | setuptools/tests/test_dist_info.py | 4 |
4 files changed, 35 insertions, 41 deletions
diff --git a/pkg_resources/__init__.py b/pkg_resources/__init__.py index 5b68da15..2fb7bc51 100644 --- a/pkg_resources/__init__.py +++ b/pkg_resources/__init__.py @@ -2693,15 +2693,11 @@ class DistInfoDistribution(Distribution): reqs = [] # Including any condition expressions for req in self._parsed_pkg_info.get_all('Requires-Dist') or []: - current_req = packaging.requirements.Requirement(req) - specs = _parse_requirement_specs(current_req) - parsed = Requirement(current_req.name, specs, current_req.extras) - parsed._marker = current_req.marker - reqs.append(parsed) + reqs.extend(parse_requirements(req)) def reqs_for_extra(extra): for req in reqs: - if not req._marker or req._marker.evaluate({'extra': extra}): + if not req.marker or req.marker.evaluate({'extra': extra}): yield req common = frozenset(reqs_for_extra(None)) @@ -2739,10 +2735,6 @@ class RequirementParseError(ValueError): return ' '.join(self.args) -def _parse_requirement_specs(req): - return [(spec.operator, spec.version) for spec in req.specifier] - - def parse_requirements(strs): """Yield ``Requirement`` objects for each specification in `strs` @@ -2759,33 +2751,35 @@ def parse_requirements(strs): if line.endswith('\\'): line = line[:-2].strip() line += next(lines) - req = packaging.requirements.Requirement(line) - specs = _parse_requirement_specs(req) - yield Requirement(req.name, specs, req.extras) + yield Requirement(line) class Requirement: - def __init__(self, project_name, specs, extras): + def __init__(self, requirement_string): """DO NOT CALL THIS UNDOCUMENTED METHOD; use Requirement.parse()!""" - self.unsafe_name, project_name = project_name, safe_name(project_name) + try: + self.req = packaging.requirements.Requirement(requirement_string) + except packaging.requirements.InvalidRequirement as e: + raise RequirementParseError(str(e)) + self.unsafe_name = self.req.name + project_name = safe_name(self.req.name) self.project_name, self.key = project_name, project_name.lower() - self.specifier = packaging.specifiers.SpecifierSet( - ",".join(["".join([x, y]) for x, y in specs]) - ) - self.specs = specs - self.extras = tuple(map(safe_extra, extras)) + self.specifier = self.req.specifier + self.specs = [ + (spec.operator, spec.version) for spec in self.req.specifier] + self.extras = tuple(map(safe_extra, self.req.extras)) + self.marker = self.req.marker + self.url = self.req.url self.hashCmp = ( self.key, self.specifier, frozenset(self.extras), + str(self.marker) ) self.__hash = hash(self.hashCmp) def __str__(self): - extras = ','.join(self.extras) - if extras: - extras = '[%s]' % extras - return '%s%s%s' % (self.project_name, extras, self.specifier) + return str(self.req) def __eq__(self, other): return ( diff --git a/pkg_resources/tests/test_resources.py b/pkg_resources/tests/test_resources.py index 7a4ecb38..16fc3198 100644 --- a/pkg_resources/tests/test_resources.py +++ b/pkg_resources/tests/test_resources.py @@ -353,22 +353,22 @@ class TestRequirements: r = Requirement.parse("Twisted>=1.2") assert str(r) == "Twisted>=1.2" assert repr(r) == "Requirement.parse('Twisted>=1.2')" - assert r == Requirement("Twisted", [('>=','1.2')], ()) - assert r == Requirement("twisTed", [('>=','1.2')], ()) - assert r != Requirement("Twisted", [('>=','2.0')], ()) - assert r != Requirement("Zope", [('>=','1.2')], ()) - assert r != Requirement("Zope", [('>=','3.0')], ()) - assert r != Requirement.parse("Twisted[extras]>=1.2") + assert r == Requirement("Twisted>=1.2") + assert r == Requirement("twisTed>=1.2") + assert r != Requirement("Twisted>=2.0") + assert r != Requirement("Zope>=1.2") + assert r != Requirement("Zope>=3.0") + assert r != Requirement("Twisted[extras]>=1.2") def testOrdering(self): - r1 = Requirement("Twisted", [('==','1.2c1'),('>=','1.2')], ()) - r2 = Requirement("Twisted", [('>=','1.2'),('==','1.2c1')], ()) + r1 = Requirement("Twisted==1.2c1,>=1.2") + r2 = Requirement("Twisted>=1.2,==1.2c1") assert r1 == r2 assert str(r1) == str(r2) assert str(r2) == "Twisted==1.2c1,>=1.2" def testBasicContains(self): - r = Requirement("Twisted", [('>=','1.2')], ()) + r = Requirement("Twisted>=1.2") foo_dist = Distribution.from_filename("FooPkg-1.3_1.egg") twist11 = Distribution.from_filename("Twisted-1.1.egg") twist12 = Distribution.from_filename("Twisted-1.2.egg") @@ -394,6 +394,7 @@ class TestRequirements: "twisted", packaging.specifiers.SpecifierSet(">=1.2"), frozenset(["foo","bar"]), + 'None' )) ) @@ -485,17 +486,17 @@ class TestParsing: assert ( list(parse_requirements('Twis-Ted>=1.2-1')) == - [Requirement('Twis-Ted',[('>=','1.2-1')], ())] + [Requirement('Twis-Ted>=1.2-1')] ) assert ( list(parse_requirements('Twisted >=1.2, \ # more\n<2.0')) == - [Requirement('Twisted',[('>=','1.2'),('<','2.0')], ())] + [Requirement('Twisted>=1.2,<2.0')] ) assert ( Requirement.parse("FooBar==1.99a3") == - Requirement("FooBar", [('==','1.99a3')], ()) + Requirement("FooBar==1.99a3") ) with pytest.raises(ValueError): Requirement.parse(">=2.3") diff --git a/setuptools/command/easy_install.py b/setuptools/command/easy_install.py index 08bc9c51..97de3395 100755 --- a/setuptools/command/easy_install.py +++ b/setuptools/command/easy_install.py @@ -710,10 +710,7 @@ class easy_install(Command): elif requirement is None or dist not in requirement: # if we wound up with a different version, resolve what we've got distreq = dist.as_requirement() - requirement = requirement or distreq - requirement = Requirement( - distreq.project_name, distreq.specs, requirement.extras - ) + requirement = Requirement(str(distreq.req)) log.info("Processing dependencies for %s", requirement) try: distros = WorkingSet([]).resolve( diff --git a/setuptools/tests/test_dist_info.py b/setuptools/tests/test_dist_info.py index 002968a3..9f226a55 100644 --- a/setuptools/tests/test_dist_info.py +++ b/setuptools/tests/test_dist_info.py @@ -34,7 +34,9 @@ class TestDistInfo: for d in pkg_resources.find_distributions(self.tmpdir): assert d.requires() == requires[:1] - assert d.requires(extras=('baz',)) == requires + assert d.requires(extras=('baz',)) == [ + requires[0], + pkg_resources.Requirement.parse('quux>=1.1;extra=="baz"')] assert d.extras == ['baz'] metadata_template = DALS(""" |