diff options
| author | Bastian Venthur <bastian.venthur@flixbus.com> | 2020-02-11 09:55:35 +0100 |
|---|---|---|
| committer | Bastian Venthur <bastian.venthur@flixbus.com> | 2020-02-11 09:55:35 +0100 |
| commit | 087c3b26eed9b6a8960815c2773edd04b5c91a98 (patch) | |
| tree | c0b0bf68b6f02980f742611c9232405ab9df299b /setuptools/_imp.py | |
| parent | c11270aa6bffd8913c6e074f09b9d920c8f19002 (diff) | |
| parent | a5dec2f14e3414e4ee5dd146bff9c289d573de9a (diff) | |
| download | python-setuptools-git-087c3b26eed9b6a8960815c2773edd04b5c91a98.tar.gz | |
Merge branch 'master' into fix/1700
Diffstat (limited to 'setuptools/_imp.py')
| -rw-r--r-- | setuptools/_imp.py | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/setuptools/_imp.py b/setuptools/_imp.py new file mode 100644 index 00000000..451e45a8 --- /dev/null +++ b/setuptools/_imp.py @@ -0,0 +1,82 @@ +""" +Re-implementation of find_module and get_frozen_object +from the deprecated imp module. +""" + +import os +import importlib.util +import importlib.machinery + +from .py34compat import module_from_spec + + +PY_SOURCE = 1 +PY_COMPILED = 2 +C_EXTENSION = 3 +C_BUILTIN = 6 +PY_FROZEN = 7 + + +def find_spec(module, paths): + finder = ( + importlib.machinery.PathFinder().find_spec + if isinstance(paths, list) else + importlib.util.find_spec + ) + return finder(module, paths) + + +def find_module(module, paths=None): + """Just like 'imp.find_module()', but with package support""" + spec = find_spec(module, paths) + if spec is None: + raise ImportError("Can't find %s" % module) + if not spec.has_location and hasattr(spec, 'submodule_search_locations'): + spec = importlib.util.spec_from_loader('__init__.py', spec.loader) + + kind = -1 + file = None + static = isinstance(spec.loader, type) + if spec.origin == 'frozen' or static and issubclass( + spec.loader, importlib.machinery.FrozenImporter): + kind = PY_FROZEN + path = None # imp compabilty + suffix = mode = '' # imp compability + elif spec.origin == 'built-in' or static and issubclass( + spec.loader, importlib.machinery.BuiltinImporter): + kind = C_BUILTIN + path = None # imp compabilty + suffix = mode = '' # imp compability + elif spec.has_location: + path = spec.origin + suffix = os.path.splitext(path)[1] + mode = 'r' if suffix in importlib.machinery.SOURCE_SUFFIXES else 'rb' + + if suffix in importlib.machinery.SOURCE_SUFFIXES: + kind = PY_SOURCE + elif suffix in importlib.machinery.BYTECODE_SUFFIXES: + kind = PY_COMPILED + elif suffix in importlib.machinery.EXTENSION_SUFFIXES: + kind = C_EXTENSION + + if kind in {PY_SOURCE, PY_COMPILED}: + file = open(path, mode) + else: + path = None + suffix = mode = '' + + return file, path, (suffix, mode, kind) + + +def get_frozen_object(module, paths=None): + spec = find_spec(module, paths) + if not spec: + raise ImportError("Can't find %s" % module) + return spec.loader.get_code(module) + + +def get_module(module, paths, info): + spec = find_spec(module, paths) + if not spec: + raise ImportError("Can't find %s" % module) + return module_from_spec(spec) |
