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
_VENDORED_NAMES = 'packaging',
_SEARCH_PATH = 'pkg_resources._vendor.', ''
class VendorImporter:
"""
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):
root, base, target = fullname.partition(__name__ + '.')
root, base, target = fullname.partition(self.root_name + '.')
if root:
return
if not any(map(target.startswith, _VENDORED_NAMES)):
if not any(map(target.startswith, self.vendored_names)):
return
return self
def load_module(self, fullname):
root, base, target = fullname.partition(__name__ + '.')
for prefix in _SEARCH_PATH:
root, base, target = fullname.partition(self.root_name + '.')
for prefix in self.search_path:
try:
__import__(prefix + target)
mod = sys.modules[prefix + target]
......@@ -34,9 +41,9 @@ class VendorImporter:
"distribution.".format(**locals())
)
@classmethod
def install(cls):
if not any(isinstance(imp, cls) for imp in sys.meta_path):
sys.meta_path.append(cls())
def install(self):
if self not in sys.meta_path:
sys.meta_path.append(self)
VendorImporter.install()
names = 'packaging',
VendorImporter(__name__, names).install()
import sys
_VENDORED_NAMES = 'six',
_SEARCH_PATH = 'setuptools._vendor.', ''
class VendorImporter:
"""
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):
root, base, target = fullname.partition(__name__ + '.')
root, base, target = fullname.partition(self.root_name + '.')
if root:
return
if not any(map(target.startswith, _VENDORED_NAMES)):
if not any(map(target.startswith, self.vendored_names)):
return
return self
def load_module(self, fullname):
root, base, target = fullname.partition(__name__ + '.')
for prefix in _SEARCH_PATH:
root, base, target = fullname.partition(self.root_name + '.')
for prefix in self.search_path:
try:
__import__(prefix + target)
mod = sys.modules[prefix + target]
......@@ -34,9 +41,9 @@ class VendorImporter:
"distribution.".format(**locals())
)
@classmethod
def install(cls):
if not any(isinstance(imp, cls) for imp in sys.meta_path):
sys.meta_path.append(cls())
def install(self):
if self not in sys.meta_path:
sys.meta_path.append(self)
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