From d87cabbf4cf11c0049c95d3359fc249b002b542e Mon Sep 17 00:00:00 2001 From: Daniel Holth Date: Fri, 29 Jun 2012 19:48:39 -0400 Subject: add missing == to prefix-less Requires-Dist version specifiers --HG-- branch : distribute extra : rebase_source : 131e2f27792688da5dd1f8bf984939ab51403a64 --- pkg_resources.py | 37 +++++++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) (limited to 'pkg_resources.py') 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.*?)\s*(\((?P.*?)\))?\s*(;\s*(?P.*))?$") + 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 -- cgit v1.2.1