From 85a9ca5e75abf00e0dde55dde4e2b0a11f93c04a Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Sun, 27 Oct 2019 19:50:53 -0400 Subject: Extract 'imp' re-implementation to setuptools._imp and wrap it in py27compat for compatibility. --- setuptools/_imp.py | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 setuptools/_imp.py (limited to 'setuptools/_imp.py') diff --git a/setuptools/_imp.py b/setuptools/_imp.py new file mode 100644 index 00000000..6bc90243 --- /dev/null +++ b/setuptools/_imp.py @@ -0,0 +1,72 @@ +""" +Re-implementation of find_module and get_frozen_object +from the deprecated imp module. +""" + +import os +import importlib.util +import importlib.machinery + + +PY_SOURCE = 1 +PY_COMPILED = 2 +C_EXTENSION = 3 +C_BUILTIN = 6 +PY_FROZEN = 7 + + +def find_module(module, paths=None): + """ + """ + spec = importlib.util.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): + spec = importlib.util.find_spec(module, paths) + if hasattr(spec, 'submodule_search_locations'): + spec = importlib.util.spec_from_loader('__init__.py', spec.loader) + return spec.loader.get_code(module) + + +def get_module(module, paths, info): + spec = importlib.util.find_spec(module, paths) + if hasattr(spec, 'submodule_search_locations'): + spec = importlib.util.spec_from_loader('__init__.py', spec.loader) + return importlib.util.module_from_spec(spec) -- cgit v1.2.1 From 37d617cd983446dfe8073038d03dd31fc7f66796 Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Sun, 27 Oct 2019 20:40:07 -0400 Subject: Extract _resolve --- setuptools/_imp.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) (limited to 'setuptools/_imp.py') diff --git a/setuptools/_imp.py b/setuptools/_imp.py index 6bc90243..c400d455 100644 --- a/setuptools/_imp.py +++ b/setuptools/_imp.py @@ -60,13 +60,17 @@ def find_module(module, paths=None): def get_frozen_object(module, paths): spec = importlib.util.find_spec(module, paths) - if hasattr(spec, 'submodule_search_locations'): - spec = importlib.util.spec_from_loader('__init__.py', spec.loader) - return spec.loader.get_code(module) + return spec.loader.get_code(_resolve(module)) + + +def _resolve(spec): + return ( + importlib.util.spec_from_loader('__init__.py', spec.loader) + if hasattr(spec, 'submodule_search_locations') + else spec + ) def get_module(module, paths, info): spec = importlib.util.find_spec(module, paths) - if hasattr(spec, 'submodule_search_locations'): - spec = importlib.util.spec_from_loader('__init__.py', spec.loader) - return importlib.util.module_from_spec(spec) + return importlib.util.module_from_spec(_resolve(spec)) -- cgit v1.2.1 From 4948b14a66f00eba749e52b77281f711413e071b Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Sun, 27 Oct 2019 20:40:58 -0400 Subject: Avoid _resolve in get_module (causes failures). --- setuptools/_imp.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'setuptools/_imp.py') diff --git a/setuptools/_imp.py b/setuptools/_imp.py index c400d455..cee91551 100644 --- a/setuptools/_imp.py +++ b/setuptools/_imp.py @@ -73,4 +73,4 @@ def _resolve(spec): def get_module(module, paths, info): spec = importlib.util.find_spec(module, paths) - return importlib.util.module_from_spec(_resolve(spec)) + return importlib.util.module_from_spec(spec) -- cgit v1.2.1 From 65fe7abeaba9e82b8f3755054759fed21c0c489b Mon Sep 17 00:00:00 2001 From: Batuhan Taskaya Date: Mon, 28 Oct 2019 10:28:55 +0300 Subject: py34 compat --- setuptools/_imp.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'setuptools/_imp.py') diff --git a/setuptools/_imp.py b/setuptools/_imp.py index cee91551..09073d44 100644 --- a/setuptools/_imp.py +++ b/setuptools/_imp.py @@ -4,6 +4,7 @@ from the deprecated imp module. """ import os +import sys import importlib.util import importlib.machinery @@ -70,7 +71,12 @@ def _resolve(spec): else spec ) +def _module_from_spec(spec): + if sys.version_info >= (3, 5): + return importlib.util.module_from_spec(spec) + else: + return spec.loader.load_module(spec.name) def get_module(module, paths, info): spec = importlib.util.find_spec(module, paths) - return importlib.util.module_from_spec(spec) + return _module_from_spec(spec) -- cgit v1.2.1 From ce01c0199f93612848e664bfd920083168eaa293 Mon Sep 17 00:00:00 2001 From: Batuhan Taskaya Date: Mon, 28 Oct 2019 10:59:21 +0300 Subject: add docstring to find_module --- setuptools/_imp.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'setuptools/_imp.py') diff --git a/setuptools/_imp.py b/setuptools/_imp.py index 09073d44..dc4b1b2c 100644 --- a/setuptools/_imp.py +++ b/setuptools/_imp.py @@ -17,8 +17,7 @@ PY_FROZEN = 7 def find_module(module, paths=None): - """ - """ + """Just like 'imp.find_module()', but with package support""" spec = importlib.util.find_spec(module, paths) if spec is None: raise ImportError("Can't find %s" % module) -- cgit v1.2.1 From 2f4952927e41643100e6e6f58124f34331c14add Mon Sep 17 00:00:00 2001 From: Batuhan Taskaya Date: Mon, 28 Oct 2019 11:07:27 +0300 Subject: remove _resolve --- setuptools/_imp.py | 7 ------- 1 file changed, 7 deletions(-) (limited to 'setuptools/_imp.py') diff --git a/setuptools/_imp.py b/setuptools/_imp.py index dc4b1b2c..49ddc852 100644 --- a/setuptools/_imp.py +++ b/setuptools/_imp.py @@ -63,13 +63,6 @@ def get_frozen_object(module, paths): return spec.loader.get_code(_resolve(module)) -def _resolve(spec): - return ( - importlib.util.spec_from_loader('__init__.py', spec.loader) - if hasattr(spec, 'submodule_search_locations') - else spec - ) - def _module_from_spec(spec): if sys.version_info >= (3, 5): return importlib.util.module_from_spec(spec) -- cgit v1.2.1 From 3a0520b43dfac9f6ba507c6d09a60290219a0802 Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Mon, 28 Oct 2019 21:52:40 -0400 Subject: Extract compatibility function into compatibility module. --- setuptools/_imp.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) (limited to 'setuptools/_imp.py') diff --git a/setuptools/_imp.py b/setuptools/_imp.py index 49ddc852..ee719c9a 100644 --- a/setuptools/_imp.py +++ b/setuptools/_imp.py @@ -8,6 +8,8 @@ import sys import importlib.util import importlib.machinery +from .py34compat import module_from_spec + PY_SOURCE = 1 PY_COMPILED = 2 @@ -63,12 +65,6 @@ def get_frozen_object(module, paths): return spec.loader.get_code(_resolve(module)) -def _module_from_spec(spec): - if sys.version_info >= (3, 5): - return importlib.util.module_from_spec(spec) - else: - return spec.loader.load_module(spec.name) - def get_module(module, paths, info): spec = importlib.util.find_spec(module, paths) - return _module_from_spec(spec) + return module_from_spec(spec) -- cgit v1.2.1 From 20d6407aa5f68dbeba61e8967290f2fbde4f85ab Mon Sep 17 00:00:00 2001 From: Batuhan Taskaya Date: Tue, 29 Oct 2019 10:51:54 +0300 Subject: Allow calling get_frozen_object without paths, raise ImportError when it cant find module --- setuptools/_imp.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'setuptools/_imp.py') diff --git a/setuptools/_imp.py b/setuptools/_imp.py index ee719c9a..ab29ef21 100644 --- a/setuptools/_imp.py +++ b/setuptools/_imp.py @@ -60,11 +60,15 @@ def find_module(module, paths=None): return file, path, (suffix, mode, kind) -def get_frozen_object(module, paths): +def get_frozen_object(module, paths=None): spec = importlib.util.find_spec(module, paths) - return spec.loader.get_code(_resolve(module)) + if not spec: + raise ImportError("Can't find %s" % module) + return spec.loader.get_code(module) def get_module(module, paths, info): spec = importlib.util.find_spec(module, paths) + if not spec: + raise ImportError("Can't find %s" % module) return module_from_spec(spec) -- cgit v1.2.1 From cfa9245a7dea8a35f11580c0bfd27472a3182c7e Mon Sep 17 00:00:00 2001 From: Batuhan Taskaya Date: Tue, 29 Oct 2019 10:53:40 +0300 Subject: Remove 'sys' import --- setuptools/_imp.py | 1 - 1 file changed, 1 deletion(-) (limited to 'setuptools/_imp.py') diff --git a/setuptools/_imp.py b/setuptools/_imp.py index ab29ef21..a3cce9b2 100644 --- a/setuptools/_imp.py +++ b/setuptools/_imp.py @@ -4,7 +4,6 @@ from the deprecated imp module. """ import os -import sys import importlib.util import importlib.machinery -- cgit v1.2.1 From bbf825eee764cae0bc44077ccc957a733d53d095 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20S=C3=BAkup?= Date: Fri, 15 Nov 2019 08:52:35 +0100 Subject: Fix _imp module behaviour if is defined paths in find_spec call fixes #1896 --- setuptools/_imp.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'setuptools/_imp.py') diff --git a/setuptools/_imp.py b/setuptools/_imp.py index a3cce9b2..6ccec579 100644 --- a/setuptools/_imp.py +++ b/setuptools/_imp.py @@ -19,7 +19,10 @@ PY_FROZEN = 7 def find_module(module, paths=None): """Just like 'imp.find_module()', but with package support""" - spec = importlib.util.find_spec(module, paths) + if isinstance(paths, list): + spec = importlib.machinery.PathFinder().find_spec(module, paths) + else: + spec = importlib.util.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'): @@ -60,14 +63,20 @@ def find_module(module, paths=None): def get_frozen_object(module, paths=None): - spec = importlib.util.find_spec(module, paths) + if isinstance(paths, list): + spec = importlib.machinery.PathFinder().find_spec(module, paths) + else: + spec = importlib.util.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 = importlib.util.find_spec(module, paths) + if isinstance(paths, list): + spec = importlib.machinery.PathFinder().find_spec(module, paths) + else: + spec = importlib.util.find_spec(module, paths) if not spec: raise ImportError("Can't find %s" % module) return module_from_spec(spec) -- cgit v1.2.1 From 7cfeee80514bbdcd91b5dfbb937a9848ba4b7cf3 Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Sun, 19 Jan 2020 14:42:56 -0500 Subject: Extract 'find_spec' function to consolidate behavior. Ref #1905. --- setuptools/_imp.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) (limited to 'setuptools/_imp.py') diff --git a/setuptools/_imp.py b/setuptools/_imp.py index 6ccec579..451e45a8 100644 --- a/setuptools/_imp.py +++ b/setuptools/_imp.py @@ -17,12 +17,18 @@ 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""" - if isinstance(paths, list): - spec = importlib.machinery.PathFinder().find_spec(module, paths) - else: - spec = importlib.util.find_spec(module, paths) + 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'): @@ -63,20 +69,14 @@ def find_module(module, paths=None): def get_frozen_object(module, paths=None): - if isinstance(paths, list): - spec = importlib.machinery.PathFinder().find_spec(module, paths) - else: - spec = importlib.util.find_spec(module, paths) + 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): - if isinstance(paths, list): - spec = importlib.machinery.PathFinder().find_spec(module, paths) - else: - spec = importlib.util.find_spec(module, paths) + spec = find_spec(module, paths) if not spec: raise ImportError("Can't find %s" % module) return module_from_spec(spec) -- cgit v1.2.1 From c063b3af1ecbcea0f0cc63b941f5e2038be9efcb Mon Sep 17 00:00:00 2001 From: luz paz Date: Fri, 14 May 2021 08:34:17 -0400 Subject: Fix misc. doc typos Found via `codespell` --- setuptools/_imp.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'setuptools/_imp.py') diff --git a/setuptools/_imp.py b/setuptools/_imp.py index 451e45a8..47efd792 100644 --- a/setuptools/_imp.py +++ b/setuptools/_imp.py @@ -41,12 +41,12 @@ def find_module(module, paths=None): spec.loader, importlib.machinery.FrozenImporter): kind = PY_FROZEN path = None # imp compabilty - suffix = mode = '' # imp compability + suffix = mode = '' # imp compatibility 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 + suffix = mode = '' # imp compatibility elif spec.has_location: path = spec.origin suffix = os.path.splitext(path)[1] -- cgit v1.2.1