Commit 9d9d74de authored by Jason R. Coombs's avatar Jason R. Coombs

Create a PEP 302 importer for managing conditional import of vendored packages...

Create a PEP 302 importer for managing conditional import of vendored packages from the 'extern' namespace. This technique avoids the use of 'imp' and works even when setuptools is installed as a zipped egg. Ref #229.

--HG--
branch : feature/issue-229
parent 9a531b50
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__.
"""
def find_module(self, fullname, path=None):
root, base, target = fullname.partition(__name__ + '.')
if root:
return
if not any(map(target.startswith, _VENDORED_NAMES)):
return
return self
def load_module(self, fullname):
root, base, target = fullname.partition(__name__ + '.')
for prefix in _SEARCH_PATH:
try:
__import__(prefix + target)
mod = sys.modules[prefix + target]
sys.modules[fullname] = mod
return mod
except ImportError:
pass
else:
raise ImportError(
"The '{target}' package is required; "
"normally this is bundled with this package so if you get "
"this warning, consult the packager of your "
"distribution.".format(**locals())
)
@classmethod
def install(cls):
if not any(isinstance(imp, cls) for imp in sys.meta_path):
sys.meta_path.append(cls())
VendorImporter.install()
"""
Handle loading a package from system or from the bundled copy
"""
import imp
_SEARCH_PATH = ['pkg_resources._vendor.packaging', 'packaging']
def _find_module(name, path=None):
"""
Alternative to `imp.find_module` that can also search in subpackages.
"""
parts = name.split('.')
for part in parts:
if path is not None:
path = [path]
fh, path, descr = imp.find_module(part, path)
return fh, path, descr
def _import_in_place(search_path=_SEARCH_PATH):
for mod_name in search_path:
try:
mod_info = _find_module(mod_name)
except ImportError:
continue
imp.load_module(__name__, *mod_info)
break
else:
raise ImportError(
"The '{name}' package is required; "
"normally this is bundled with this package so if you get "
"this warning, consult the packager of your "
"distribution.".format(name=_SEARCH_PATH[-1]))
_import_in_place()
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__.
"""
def find_module(self, fullname, path=None):
root, base, target = fullname.partition(__name__ + '.')
if root:
return
if not any(map(target.startswith, _VENDORED_NAMES)):
return
return self
def load_module(self, fullname):
root, base, target = fullname.partition(__name__ + '.')
for prefix in _SEARCH_PATH:
try:
__import__(prefix + target)
mod = sys.modules[prefix + target]
sys.modules[fullname] = mod
return mod
except ImportError:
pass
else:
raise ImportError(
"The '{target}' package is required; "
"normally this is bundled with this package so if you get "
"this warning, consult the packager of your "
"distribution.".format(**locals())
)
@classmethod
def install(cls):
if not any(isinstance(imp, cls) for imp in sys.meta_path):
sys.meta_path.append(cls())
VendorImporter.install()
"""
Handle loading a package from system or from the bundled copy
"""
import imp
_SEARCH_PATH = ['setuptools._vendor.six', 'six']
def _find_module(name, path=None):
"""
Alternative to `imp.find_module` that can also search in subpackages.
"""
parts = name.split('.')
for part in parts:
if path is not None:
path = [path]
fh, path, descr = imp.find_module(part, path)
return fh, path, descr
def _import_in_place(search_path=_SEARCH_PATH):
for mod_name in search_path:
try:
mod_info = _find_module(mod_name)
except ImportError:
continue
imp.load_module(__name__, *mod_info)
break
else:
raise ImportError(
"The '{name}' package is required; "
"normally this is bundled with this package so if you get "
"this warning, consult the packager of your "
"distribution.".format(name=_SEARCH_PATH[-1]))
_import_in_place()
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