diff options
Diffstat (limited to 'pkg_resources.py')
| -rw-r--r-- | pkg_resources.py | 118 |
1 files changed, 17 insertions, 101 deletions
diff --git a/pkg_resources.py b/pkg_resources.py index 02976016..36a7b306 100644 --- a/pkg_resources.py +++ b/pkg_resources.py @@ -22,6 +22,10 @@ import zipfile import zipimport import warnings import stat +import functools +import pkgutil +from pkgutil import get_importer + try: from urlparse import urlparse, urlunparse except ImportError: @@ -35,28 +39,15 @@ try: basestring next = lambda o: o.next() from cStringIO import StringIO as BytesIO - def exec_(code, globs=None, locs=None): - if globs is None: - frame = sys._getframe(1) - globs = frame.f_globals - if locs is None: - locs = frame.f_locals - del frame - elif locs is None: - locs = globs - exec("""exec code in globs, locs""") except NameError: basestring = str from io import BytesIO - exec_ = eval("exec") def execfile(fn, globs=None, locs=None): if globs is None: globs = globals() if locs is None: locs = globs - exec_(compile(open(fn).read(), fn, 'exec'), globs, locs) - import functools - reduce = functools.reduce + exec(compile(open(fn).read(), fn, 'exec'), globs, locs) # capture these to bypass sandboxing from os import utime @@ -716,7 +707,7 @@ class Environment(object): `platform` is an optional string specifying the name of the platform that platform-specific distributions must be compatible with. If unspecified, it defaults to the current platform. `python` is an - optional string naming the desired version of Python (e.g. ``'2.4'``); + optional string naming the desired version of Python (e.g. ``'3.3'``); it defaults to the current version. You may explicitly set `platform` (and/or `python`) to ``None`` if you @@ -1189,11 +1180,11 @@ def evaluate_marker(text, extra=None, _ops={}): def and_test(nodelist): # MUST NOT short-circuit evaluation, or invalid syntax can be skipped! - return reduce(operator.and_, [interpret(nodelist[i]) for i in range(1,len(nodelist),2)]) + return functools.reduce(operator.and_, [interpret(nodelist[i]) for i in range(1,len(nodelist),2)]) def test(nodelist): # MUST NOT short-circuit evaluation, or invalid syntax can be skipped! - return reduce(operator.or_, [interpret(nodelist[i]) for i in range(1,len(nodelist),2)]) + return functools.reduce(operator.or_, [interpret(nodelist[i]) for i in range(1,len(nodelist),2)]) def atom(nodelist): t = nodelist[1][0] @@ -1354,7 +1345,7 @@ class NullProvider: len(script_text), 0, script_text.split('\n'), script_filename ) script_code = compile(script_text,script_filename,'exec') - exec_(script_code, namespace, namespace) + exec(script_code, namespace, namespace) def _has(self, path): raise NotImplementedError( @@ -1712,83 +1703,6 @@ class EggMetadata(ZipProvider): self.module_path = importer.archive self._setup_prefix() - -class ImpWrapper: - """PEP 302 Importer that wraps Python's "normal" import algorithm""" - - def __init__(self, path=None): - self.path = path - - def find_module(self, fullname, path=None): - subname = fullname.split(".")[-1] - if subname != fullname and self.path is None: - return None - if self.path is None: - path = None - else: - path = [self.path] - try: - file, filename, etc = imp.find_module(subname, path) - except ImportError: - return None - return ImpLoader(file, filename, etc) - - -class ImpLoader: - """PEP 302 Loader that wraps Python's "normal" import algorithm""" - - def __init__(self, file, filename, etc): - self.file = file - self.filename = filename - self.etc = etc - - def load_module(self, fullname): - try: - mod = imp.load_module(fullname, self.file, self.filename, self.etc) - finally: - if self.file: self.file.close() - # Note: we don't set __loader__ because we want the module to look - # normal; i.e. this is just a wrapper for standard import machinery - return mod - - -def get_importer(path_item): - """Retrieve a PEP 302 "importer" for the given path item - - If there is no importer, this returns a wrapper around the builtin import - machinery. The returned importer is only cached if it was created by a - path hook. - """ - try: - importer = sys.path_importer_cache[path_item] - except KeyError: - for hook in sys.path_hooks: - try: - importer = hook(path_item) - except ImportError: - pass - else: - break - else: - importer = None - - sys.path_importer_cache.setdefault(path_item,importer) - if importer is None: - try: - importer = ImpWrapper(path_item) - except ImportError: - pass - return importer - -try: - from pkgutil import get_importer, ImpImporter -except ImportError: - pass # Python 2.3 or 2.4, use our own implementation -else: - ImpWrapper = ImpImporter # Python 2.5, use pkgutil's implementation - del ImpLoader, ImpImporter - - _declare_state('dict', _distribution_finders = {}) def register_finder(importer_type, distribution_finder): @@ -1865,7 +1779,7 @@ def find_on_path(importer, path_item, only=False): for item in find_distributions(os.path.join(path_item,line.rstrip())): yield item break -register_finder(ImpWrapper,find_on_path) +register_finder(pkgutil.ImpImporter,find_on_path) if importlib_bootstrap is not None: register_finder(importlib_bootstrap.FileFinder, find_on_path) @@ -1902,14 +1816,17 @@ def _handle_ns(packageName, path_item): module = sys.modules.get(packageName) if module is None: module = sys.modules[packageName] = imp.new_module(packageName) - module.__path__ = []; _set_parent_ns(packageName) + module.__path__ = [] + _set_parent_ns(packageName) elif not hasattr(module,'__path__'): raise TypeError("Not a package:", packageName) handler = _find_adapter(_namespace_handlers, importer) subpath = handler(importer,path_item,packageName,module) if subpath is not None: - path = module.__path__; path.append(subpath) - loader.load_module(packageName); module.__path__ = path + path = module.__path__ + path.append(subpath) + loader.load_module(packageName) + module.__path__ = path return subpath def declare_namespace(packageName): @@ -1966,7 +1883,7 @@ def file_ns_handler(importer, path_item, packageName, module): # Only return the path if it's not already there return subpath -register_namespace_handler(ImpWrapper,file_ns_handler) +register_namespace_handler(pkgutil.ImpImporter,file_ns_handler) register_namespace_handler(zipimport.zipimporter,file_ns_handler) if importlib_bootstrap is not None: @@ -2420,7 +2337,6 @@ class Distribution(object): bdir = os.path.dirname(nloc) npath= [(p and _normalize_cached(p) or p) for p in path] - bp = None for p, item in enumerate(npath): if item==nloc: break |
