Commit de5caaee authored by Jason R. Coombs's avatar Jason R. Coombs

Make VendorImporter more generic

--HG--
branch : feature/issue-229
parent 9d9d74de
import sys import sys
_VENDORED_NAMES = 'packaging',
_SEARCH_PATH = 'pkg_resources._vendor.', ''
class VendorImporter: class VendorImporter:
""" """
A PEP 302 meta path importer for finding optionally-vendored A PEP 302 meta path importer for finding optionally-vendored
or otherwise naturally-installed packages from __name__. or otherwise naturally-installed packages from root_name.
""" """
def __init__(self, root_name, vendored_names=(), vendor_pkg=None):
self.root_name = root_name
self.vendored_names = set(vendored_names)
self.vendor_pkg = vendor_pkg or root_name.replace('extern', '_vendor')
@property
def search_path(self):
yield self.vendor_pkg + '.'
yield ''
def find_module(self, fullname, path=None): def find_module(self, fullname, path=None):
root, base, target = fullname.partition(__name__ + '.') root, base, target = fullname.partition(self.root_name + '.')
if root: if root:
return return
if not any(map(target.startswith, _VENDORED_NAMES)): if not any(map(target.startswith, self.vendored_names)):
return return
return self return self
def load_module(self, fullname): def load_module(self, fullname):
root, base, target = fullname.partition(__name__ + '.') root, base, target = fullname.partition(self.root_name + '.')
for prefix in _SEARCH_PATH: for prefix in self.search_path:
try: try:
__import__(prefix + target) __import__(prefix + target)
mod = sys.modules[prefix + target] mod = sys.modules[prefix + target]
...@@ -34,9 +41,9 @@ class VendorImporter: ...@@ -34,9 +41,9 @@ class VendorImporter:
"distribution.".format(**locals()) "distribution.".format(**locals())
) )
@classmethod def install(self):
def install(cls): if self not in sys.meta_path:
if not any(isinstance(imp, cls) for imp in sys.meta_path): sys.meta_path.append(self)
sys.meta_path.append(cls())
VendorImporter.install() names = 'packaging',
VendorImporter(__name__, names).install()
import sys import sys
_VENDORED_NAMES = 'six',
_SEARCH_PATH = 'setuptools._vendor.', ''
class VendorImporter: class VendorImporter:
""" """
A PEP 302 meta path importer for finding optionally-vendored A PEP 302 meta path importer for finding optionally-vendored
or otherwise naturally-installed packages from __name__. or otherwise naturally-installed packages from root_name.
""" """
def __init__(self, root_name, vendored_names=(), vendor_pkg=None):
self.root_name = root_name
self.vendored_names = set(vendored_names)
self.vendor_pkg = vendor_pkg or root_name.replace('extern', '_vendor')
@property
def search_path(self):
yield self.vendor_pkg + '.'
yield ''
def find_module(self, fullname, path=None): def find_module(self, fullname, path=None):
root, base, target = fullname.partition(__name__ + '.') root, base, target = fullname.partition(self.root_name + '.')
if root: if root:
return return
if not any(map(target.startswith, _VENDORED_NAMES)): if not any(map(target.startswith, self.vendored_names)):
return return
return self return self
def load_module(self, fullname): def load_module(self, fullname):
root, base, target = fullname.partition(__name__ + '.') root, base, target = fullname.partition(self.root_name + '.')
for prefix in _SEARCH_PATH: for prefix in self.search_path:
try: try:
__import__(prefix + target) __import__(prefix + target)
mod = sys.modules[prefix + target] mod = sys.modules[prefix + target]
...@@ -34,9 +41,9 @@ class VendorImporter: ...@@ -34,9 +41,9 @@ class VendorImporter:
"distribution.".format(**locals()) "distribution.".format(**locals())
) )
@classmethod def install(self):
def install(cls): if self not in sys.meta_path:
if not any(isinstance(imp, cls) for imp in sys.meta_path): sys.meta_path.append(self)
sys.meta_path.append(cls())
VendorImporter.install() names = 'six',
VendorImporter(__name__, names).install()
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment