diff options
-rw-r--r-- | pkg_resources/extern/__init__.py | 21 | ||||
-rw-r--r-- | setuptools/extern/__init__.py | 21 |
2 files changed, 30 insertions, 12 deletions
diff --git a/pkg_resources/extern/__init__.py b/pkg_resources/extern/__init__.py index 1fbb4fcc..c45f58e2 100644 --- a/pkg_resources/extern/__init__.py +++ b/pkg_resources/extern/__init__.py @@ -1,3 +1,4 @@ +import importlib.machinery import sys @@ -20,17 +21,18 @@ class VendorImporter: yield self.vendor_pkg + '.' yield '' + def _module_matches_namespace(self, fullname): + """Figure out if the target module is vendored.""" + root, base, target = fullname.partition(self.root_name + '.') + return not root and any(map(target.startswith, self.vendored_names)) + def find_module(self, fullname, path=None): """ Return self when fullname starts with root_name and the target module is one vendored through this importer. """ - root, base, target = fullname.partition(self.root_name + '.') - if root: - return - if not any(map(target.startswith, self.vendored_names)): - return - return self + spec = self.find_spec(fullname, path) + return spec.loader if spec is not None else None def load_module(self, fullname): """ @@ -60,6 +62,13 @@ class VendorImporter: def exec_module(self, module): pass + def find_spec(self, fullname, path=None, target=None): + """Return a module spec for vendored names.""" + return ( + importlib.machinery.ModuleSpec(fullname, self) + if self._module_matches_namespace(fullname) else None + ) + def install(self): """ Install this importer into sys.meta_path if not already present. diff --git a/setuptools/extern/__init__.py b/setuptools/extern/__init__.py index 399701a0..bd8636c7 100644 --- a/setuptools/extern/__init__.py +++ b/setuptools/extern/__init__.py @@ -1,3 +1,4 @@ +import importlib.machinery import sys @@ -20,17 +21,18 @@ class VendorImporter: yield self.vendor_pkg + '.' yield '' + def _module_matches_namespace(self, fullname): + """Figure out if the target module is vendored.""" + root, base, target = fullname.partition(self.root_name + '.') + return not root and any(map(target.startswith, self.vendored_names)) + def find_module(self, fullname, path=None): """ Return self when fullname starts with root_name and the target module is one vendored through this importer. """ - root, base, target = fullname.partition(self.root_name + '.') - if root: - return - if not any(map(target.startswith, self.vendored_names)): - return - return self + spec = self.find_spec(fullname, path) + return spec.loader if spec is not None else None def load_module(self, fullname): """ @@ -60,6 +62,13 @@ class VendorImporter: def exec_module(self, module): pass + def find_spec(self, fullname, path=None, target=None): + """Return a module spec for vendored names.""" + return ( + importlib.machinery.ModuleSpec(fullname, self) + if self._module_matches_namespace(fullname) else None + ) + def install(self): """ Install this importer into sys.meta_path if not already present. |