Skip to content

Commit 85a9ca5

Browse files
committed
Extract 'imp' re-implementation to setuptools._imp and wrap it in py27compat for compatibility.
1 parent f430e58 commit 85a9ca5

File tree

4 files changed

+113
-87
lines changed

4 files changed

+113
-87
lines changed

conftest.py

+1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ def pytest_addoption(parser):
1919

2020
if sys.version_info < (3,):
2121
collect_ignore.append('setuptools/lib2to3_ex.py')
22+
collect_ignore.append('setuptools/_imp.py')
2223

2324

2425
if sys.version_info < (3, 6):

setuptools/_imp.py

+72
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
"""
2+
Re-implementation of find_module and get_frozen_object
3+
from the deprecated imp module.
4+
"""
5+
6+
import os
7+
import importlib.util
8+
import importlib.machinery
9+
10+
11+
PY_SOURCE = 1
12+
PY_COMPILED = 2
13+
C_EXTENSION = 3
14+
C_BUILTIN = 6
15+
PY_FROZEN = 7
16+
17+
18+
def find_module(module, paths=None):
19+
"""
20+
"""
21+
spec = importlib.util.find_spec(module, paths)
22+
if spec is None:
23+
raise ImportError("Can't find %s" % module)
24+
if not spec.has_location and hasattr(spec, 'submodule_search_locations'):
25+
spec = importlib.util.spec_from_loader('__init__.py', spec.loader)
26+
27+
kind = -1
28+
file = None
29+
static = isinstance(spec.loader, type)
30+
if spec.origin == 'frozen' or static and issubclass(
31+
spec.loader, importlib.machinery.FrozenImporter):
32+
kind = PY_FROZEN
33+
path = None # imp compabilty
34+
suffix = mode = '' # imp compability
35+
elif spec.origin == 'built-in' or static and issubclass(
36+
spec.loader, importlib.machinery.BuiltinImporter):
37+
kind = C_BUILTIN
38+
path = None # imp compabilty
39+
suffix = mode = '' # imp compability
40+
elif spec.has_location:
41+
path = spec.origin
42+
suffix = os.path.splitext(path)[1]
43+
mode = 'r' if suffix in importlib.machinery.SOURCE_SUFFIXES else 'rb'
44+
45+
if suffix in importlib.machinery.SOURCE_SUFFIXES:
46+
kind = PY_SOURCE
47+
elif suffix in importlib.machinery.BYTECODE_SUFFIXES:
48+
kind = PY_COMPILED
49+
elif suffix in importlib.machinery.EXTENSION_SUFFIXES:
50+
kind = C_EXTENSION
51+
52+
if kind in {PY_SOURCE, PY_COMPILED}:
53+
file = open(path, mode)
54+
else:
55+
path = None
56+
suffix = mode = ''
57+
58+
return file, path, (suffix, mode, kind)
59+
60+
61+
def get_frozen_object(module, paths):
62+
spec = importlib.util.find_spec(module, paths)
63+
if hasattr(spec, 'submodule_search_locations'):
64+
spec = importlib.util.spec_from_loader('__init__.py', spec.loader)
65+
return spec.loader.get_code(module)
66+
67+
68+
def get_module(module, paths, info):
69+
spec = importlib.util.find_spec(module, paths)
70+
if hasattr(spec, 'submodule_search_locations'):
71+
spec = importlib.util.spec_from_loader('__init__.py', spec.loader)
72+
return importlib.util.module_from_spec(spec)

setuptools/depends.py

+8-87
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,11 @@
11
import sys
22
import marshal
33
from distutils.version import StrictVersion
4-
from setuptools.extern import six
54

65
from .py33compat import Bytecode
76

8-
if six.PY2:
9-
import imp
10-
from imp import PKG_DIRECTORY, PY_COMPILED, PY_SOURCE, PY_FROZEN
11-
else:
12-
import os.path
13-
from importlib.util import find_spec, spec_from_loader
14-
from importlib.machinery import SOURCE_SUFFIXES, BYTECODE_SUFFIXES, EXTENSION_SUFFIXES, BuiltinImporter, FrozenImporter
15-
PY_SOURCE = 1
16-
PY_COMPILED = 2
17-
C_EXTENSION = 3
18-
C_BUILTIN = 6
19-
PY_FROZEN = 7
7+
from .py27compat import find_module, PY_COMPILED, PY_FROZEN, PY_SOURCE
8+
from . import py27compat
209

2110

2211
__all__ = [
@@ -27,7 +16,8 @@
2716
class Require:
2817
"""A prerequisite to building or installing a distribution"""
2918

30-
def __init__(self, name, requested_version, module, homepage='',
19+
def __init__(
20+
self, name, requested_version, module, homepage='',
3121
attribute=None, format=None):
3222

3323
if format is None and requested_version is not None:
@@ -91,63 +81,6 @@ def is_current(self, paths=None):
9181
return self.version_ok(version)
9282

9383

94-
def find_module(module, paths=None):
95-
"""Just like 'imp.find_module()', but with package support"""
96-
if six.PY3:
97-
spec = find_spec(module, paths)
98-
if spec is None:
99-
raise ImportError("Can't find %s" % module)
100-
if not spec.has_location and hasattr(spec, 'submodule_search_locations'):
101-
spec = spec_from_loader('__init__.py', spec.loader)
102-
103-
kind = -1
104-
file = None
105-
static = isinstance(spec.loader, type)
106-
if spec.origin == 'frozen' or static and issubclass(spec.loader, FrozenImporter):
107-
kind = PY_FROZEN
108-
path = None # imp compabilty
109-
suffix = mode = '' # imp compability
110-
elif spec.origin == 'built-in' or static and issubclass(spec.loader, BuiltinImporter):
111-
kind = C_BUILTIN
112-
path = None # imp compabilty
113-
suffix = mode = '' # imp compability
114-
elif spec.has_location:
115-
frozen = False
116-
path = spec.origin
117-
suffix = os.path.splitext(path)[1]
118-
mode = 'r' if suffix in SOURCE_SUFFIXES else 'rb'
119-
120-
if suffix in SOURCE_SUFFIXES:
121-
kind = PY_SOURCE
122-
elif suffix in BYTECODE_SUFFIXES:
123-
kind = PY_COMPILED
124-
elif suffix in EXTENSION_SUFFIXES:
125-
kind = C_EXTENSION
126-
127-
if kind in {PY_SOURCE, PY_COMPILED}:
128-
file = open(path, mode)
129-
else:
130-
path = None
131-
suffix = mode= ''
132-
133-
return file, path, (suffix, mode, kind)
134-
135-
else:
136-
parts = module.split('.')
137-
while parts:
138-
part = parts.pop(0)
139-
f, path, (suffix, mode, kind) = info = imp.find_module(part, paths)
140-
141-
if kind == PKG_DIRECTORY:
142-
parts = parts or ['__init__']
143-
paths = [path]
144-
145-
elif parts:
146-
raise ImportError("Can't find %r in %s" % (parts, module))
147-
148-
return info
149-
150-
15184
def get_module_constant(module, symbol, default=-1, paths=None):
15285
"""Find 'module' by searching 'paths', and extract 'symbol'
15386
@@ -156,35 +89,23 @@ def get_module_constant(module, symbol, default=-1, paths=None):
15689
constant. Otherwise, return 'default'."""
15790

15891
try:
159-
f, path, (suffix, mode, kind) = find_module(module, paths)
92+
f, path, (suffix, mode, kind) = info = find_module(module, paths)
16093
except ImportError:
16194
# Module doesn't exist
16295
return None
16396

164-
if six.PY3:
165-
spec = find_spec(module, paths)
166-
if hasattr(spec, 'submodule_search_locations'):
167-
spec = spec_from_loader('__init__.py', spec.loader)
168-
16997
try:
17098
if kind == PY_COMPILED:
17199
f.read(8) # skip magic & date
172100
code = marshal.load(f)
173101
elif kind == PY_FROZEN:
174-
if six.PY2:
175-
code = imp.get_frozen_object(module)
176-
else:
177-
code = spec.loader.get_code(module)
102+
code = py27compat.get_frozen_object(module, paths)
178103
elif kind == PY_SOURCE:
179104
code = compile(f.read(), path, 'exec')
180105
else:
181106
# Not something we can parse; we'll have to import it. :(
182-
if module not in sys.modules:
183-
if six.PY2:
184-
imp.load_module(module, f, path, (suffix, mode, kind))
185-
else:
186-
sys.modules[module] = module_from_spec(spec)
187-
return getattr(sys.modules[module], symbol, None)
107+
imported = py27compat.get_module(module, paths, info)
108+
return getattr(imported, symbol, None)
188109

189110
finally:
190111
if f:

setuptools/py27compat.py

+32
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
Compatibility Support for Python 2.7 and earlier
33
"""
44

5+
import sys
56
import platform
67

78
from setuptools.extern import six
@@ -26,3 +27,34 @@ def get_all_headers(message, key):
2627

2728
rmtree_safe = str if linux_py2_ascii else lambda x: x
2829
"""Workaround for http://bugs.python.org/issue24672"""
30+
31+
32+
try:
33+
from ._imp import find_module, PY_COMPILED, PY_FROZEN, PY_SOURCE
34+
from ._imp import get_frozen_object, get_module
35+
except ImportError:
36+
import imp
37+
from imp import PY_COMPILED, PY_FROZEN, PY_SOURCE # noqa
38+
39+
def find_module(module, paths=None):
40+
"""Just like 'imp.find_module()', but with package support"""
41+
parts = module.split('.')
42+
while parts:
43+
part = parts.pop(0)
44+
f, path, (suffix, mode, kind) = info = imp.find_module(part, paths)
45+
46+
if kind == imp.PKG_DIRECTORY:
47+
parts = parts or ['__init__']
48+
paths = [path]
49+
50+
elif parts:
51+
raise ImportError("Can't find %r in %s" % (parts, module))
52+
53+
return info
54+
55+
def get_frozen_object(module, paths):
56+
return imp.get_frozen_object(module)
57+
58+
def get_module(module, paths, info):
59+
imp.load_module(*info)
60+
return sys.modules[module]

0 commit comments

Comments
 (0)