diff options
| author | Daniel Holth <dholth@fastmail.fm> | 2012-06-29 19:48:39 -0400 |
|---|---|---|
| committer | Daniel Holth <dholth@fastmail.fm> | 2012-06-29 19:48:39 -0400 |
| commit | d87cabbf4cf11c0049c95d3359fc249b002b542e (patch) | |
| tree | 534af93fb59007b35dd30e6726c95264e42837c2 /pkg_resources.py | |
| parent | 07f0901db42f1bc5d411868e92e7e77d27f90323 (diff) | |
| download | python-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.py | 37 |
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 |
