summaryrefslogtreecommitdiff
path: root/pkg_resources.py
diff options
context:
space:
mode:
authorDaniel Holth <dholth@fastmail.fm>2012-06-29 19:48:39 -0400
committerDaniel Holth <dholth@fastmail.fm>2012-06-29 19:48:39 -0400
commitd87cabbf4cf11c0049c95d3359fc249b002b542e (patch)
tree534af93fb59007b35dd30e6726c95264e42837c2 /pkg_resources.py
parent07f0901db42f1bc5d411868e92e7e77d27f90323 (diff)
downloadpython-setuptools-git-d87cabbf4cf11c0049c95d3359fc249b002b542e.tar.gz
add missing == to prefix-less Requires-Dist version specifiers
--HG-- branch : distribute extra : rebase_source : 131e2f27792688da5dd1f8bf984939ab51403a64
Diffstat (limited to 'pkg_resources.py')
-rw-r--r--pkg_resources.py37
1 files changed, 31 insertions, 6 deletions
diff --git a/pkg_resources.py b/pkg_resources.py
index dea54490..10c8aff5 100644
--- a/pkg_resources.py
+++ b/pkg_resources.py
@@ -2466,12 +2466,36 @@ class DistInfoDistribution(Distribution):
except AttributeError:
self.__dep_map = self._compute_dependencies()
return self.__dep_map
+
+ def _preparse_requirement(self, requires_dist):
+ """Return (dist, versions, marker).
+ Add == prefix to version specifiers as necessary.
+ """
+ m = re.compile(r"^(?P<d>.*?)\s*(\((?P<v>.*?)\))?\s*(;\s*(?P<m>.*))?$")
+ match = m.match(requires_dist)
+ if not match:
+ raise ValueError("Unexpected Requires-Dist: %s" % requires_dist)
+ dist = match.group('d')
+ if match.group('v'):
+ vers = match.group('v').split(',')
+ else:
+ vers = []
+ mark = match.group('m') or ''
+ for i, v in enumerate(vers):
+ if not VERSION(v):
+ v = "==%s" % v
+ if not VERSION(v):
+ raise ValueError("Unexpected version: (%s)" %
+ match.group('v'))
+ vers[i] = v
+ return (dist, ', '.join(vers), mark)
def _compute_dependencies(self):
"""Recompute this distribution's dependencies."""
def dummy_marker(marker):
def marker_fn(environment=None, override=None):
return True
+ marker_fn.__doc__ = marker
return marker_fn
try:
from markerlib import as_function
@@ -2481,10 +2505,10 @@ class DistInfoDistribution(Distribution):
reqs = []
# Including any condition expressions
- for req in self._parsed_pkg_info.get_all('Requires-Dist'):
- rs = req.split(';', 1) + ['']
- parsed = parse_requirements(rs[0]).next()
- parsed.marker_fn = as_function(rs[1].strip())
+ for req in self._parsed_pkg_info.get_all('Requires-Dist'):
+ dist, vers, mark = self._preparse_requirement(req)
+ parsed = parse_requirements("%s %s" % (dist, vers)).next()
+ parsed.marker_fn = as_function(mark)
reqs.append(parsed)
def reqs_for_extra(extra):
@@ -2492,11 +2516,12 @@ class DistInfoDistribution(Distribution):
if req.marker_fn(override={'extra':extra}):
yield req
- common = set(reqs_for_extra(None))
+ common = set(reqs_for_extra(None))
dm[None].extend(common)
for extra in self._parsed_pkg_info.get_all('Provides-Extra'):
- dm[extra] = list(set(reqs_for_extra(extra)) - common)
+ extra = safe_extra(extra.strip())
+ dm[extra] = list(set(reqs_for_extra(extra)) - common)
return dm