diff options
| -rw-r--r-- | pkg_resources.py | 46 |
1 files changed, 36 insertions, 10 deletions
diff --git a/pkg_resources.py b/pkg_resources.py index 350a50ef..5e3967f3 100644 --- a/pkg_resources.py +++ b/pkg_resources.py @@ -15,7 +15,6 @@ method. import sys, os, zipimport, time, re, imp, types from urlparse import urlparse, urlunparse -from email.parser import Parser try: frozenset @@ -2456,6 +2455,7 @@ class DistInfoDistribution(Distribution): try: return self._pkg_info except AttributeError: + from email.parser import Parser self._pkg_info = Parser().parsestr(self.get_metadata(self.PKG_INFO)) return self._pkg_info @@ -2464,15 +2464,41 @@ class DistInfoDistribution(Distribution): try: return self.__dep_map except AttributeError: - dm = self.__dep_map = {None: []} - # Including condition expressions - # XXX parse condition expressions, extras - reqs = self._parsed_pkg_info.get_all('Requires-Dist') -# extras = self._parsed_pkg_info.get_all('Provides-Extra') or [] -# for extra,reqs in split_sections(self._get_metadata(name)): -# if extra: extra = safe_extra(extra) - dm.setdefault(None,[]).extend(parse_requirements(reqs)) - return dm + self.__dep_map = self._compute_dependencies() + return self.__dep_map + + def _compute_dependencies(self): + """Recompute this distribution's dependencies.""" + def dummy_marker(marker): + def marker_fn(environment=None, override=None): + return True + return marker_fn + try: + from wheel.markers import as_function + except ImportError: + as_function = dummy_marker + dm = self.__dep_map = {None: []} + + 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()) + reqs.append(parsed) + + def reqs_for_extra(extra): + for req in reqs: + if req.marker_fn(override={'extra':extra}): + yield req + + 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) + + return dm def requires(self,extras=()): """List of Requirements needed for this distro if `extras` are used""" |
