Commit 0ced2c09 authored by Jason R. Coombs's avatar Jason R. Coombs Committed by GitHub

Merge pull request #1855 from isidentical/issue-479

Upgrade setuptools.depends to importlib from depracated imp
parents 7748921d cfa9245a
Replace usage of deprecated ``imp`` module with local re-implementation in ``setuptools._imp``.
...@@ -19,6 +19,7 @@ collect_ignore = [ ...@@ -19,6 +19,7 @@ collect_ignore = [
if sys.version_info < (3,): if sys.version_info < (3,):
collect_ignore.append('setuptools/lib2to3_ex.py') collect_ignore.append('setuptools/lib2to3_ex.py')
collect_ignore.append('setuptools/_imp.py')
if sys.version_info < (3, 6): if sys.version_info < (3, 6):
......
"""
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_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)
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 = 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 not spec:
raise ImportError("Can't find %s" % module)
return module_from_spec(spec)
import sys import sys
import imp
import marshal import marshal
import contextlib
from distutils.version import StrictVersion from distutils.version import StrictVersion
from imp import PKG_DIRECTORY, PY_COMPILED, PY_SOURCE, PY_FROZEN
from .py33compat import Bytecode from .py33compat import Bytecode
from .py27compat import find_module, PY_COMPILED, PY_FROZEN, PY_SOURCE
from . import py27compat
__all__ = [ __all__ = [
'Require', 'find_module', 'get_module_constant', 'extract_constant' 'Require', 'find_module', 'get_module_constant', 'extract_constant'
...@@ -15,7 +17,8 @@ __all__ = [ ...@@ -15,7 +17,8 @@ __all__ = [
class Require: class Require:
"""A prerequisite to building or installing a distribution""" """A prerequisite to building or installing a distribution"""
def __init__(self, name, requested_version, module, homepage='', def __init__(
self, name, requested_version, module, homepage='',
attribute=None, format=None): attribute=None, format=None):
if format is None and requested_version is not None: if format is None and requested_version is not None:
...@@ -79,23 +82,15 @@ class Require: ...@@ -79,23 +82,15 @@ class Require:
return self.version_ok(version) return self.version_ok(version)
def find_module(module, paths=None): def maybe_close(f):
"""Just like 'imp.find_module()', but with package support""" @contextlib.contextmanager
def empty():
parts = module.split('.') yield
return
while parts: if not f:
part = parts.pop(0) return empty()
f, path, (suffix, mode, kind) = info = imp.find_module(part, paths)
if kind == PKG_DIRECTORY:
parts = parts or ['__init__']
paths = [path]
elif parts:
raise ImportError("Can't find %r in %s" % (parts, module))
return info return contextlib.closing(f)
def get_module_constant(module, symbol, default=-1, paths=None): def get_module_constant(module, symbol, default=-1, paths=None):
...@@ -106,28 +101,23 @@ def get_module_constant(module, symbol, default=-1, paths=None): ...@@ -106,28 +101,23 @@ def get_module_constant(module, symbol, default=-1, paths=None):
constant. Otherwise, return 'default'.""" constant. Otherwise, return 'default'."""
try: try:
f, path, (suffix, mode, kind) = find_module(module, paths) f, path, (suffix, mode, kind) = info = find_module(module, paths)
except ImportError: except ImportError:
# Module doesn't exist # Module doesn't exist
return None return None
try: with maybe_close(f):
if kind == PY_COMPILED: if kind == PY_COMPILED:
f.read(8) # skip magic & date f.read(8) # skip magic & date
code = marshal.load(f) code = marshal.load(f)
elif kind == PY_FROZEN: elif kind == PY_FROZEN:
code = imp.get_frozen_object(module) code = py27compat.get_frozen_object(module, paths)
elif kind == PY_SOURCE: elif kind == PY_SOURCE:
code = compile(f.read(), path, 'exec') code = compile(f.read(), path, 'exec')
else: else:
# Not something we can parse; we'll have to import it. :( # Not something we can parse; we'll have to import it. :(
if module not in sys.modules: imported = py27compat.get_module(module, paths, info)
imp.load_module(module, f, path, (suffix, mode, kind)) return getattr(imported, symbol, None)
return getattr(sys.modules[module], symbol, None)
finally:
if f:
f.close()
return extract_constant(code, symbol, default) return extract_constant(code, symbol, default)
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
Compatibility Support for Python 2.7 and earlier Compatibility Support for Python 2.7 and earlier
""" """
import sys
import platform import platform
from setuptools.extern import six from setuptools.extern import six
...@@ -26,3 +27,34 @@ linux_py2_ascii = ( ...@@ -26,3 +27,34 @@ linux_py2_ascii = (
rmtree_safe = str if linux_py2_ascii else lambda x: x rmtree_safe = str if linux_py2_ascii else lambda x: x
"""Workaround for http://bugs.python.org/issue24672""" """Workaround for http://bugs.python.org/issue24672"""
try:
from ._imp import find_module, PY_COMPILED, PY_FROZEN, PY_SOURCE
from ._imp import get_frozen_object, get_module
except ImportError:
import imp
from imp import PY_COMPILED, PY_FROZEN, PY_SOURCE # noqa
def find_module(module, paths=None):
"""Just like 'imp.find_module()', but with package support"""
parts = module.split('.')
while parts:
part = parts.pop(0)
f, path, (suffix, mode, kind) = info = imp.find_module(part, paths)
if kind == imp.PKG_DIRECTORY:
parts = parts or ['__init__']
paths = [path]
elif parts:
raise ImportError("Can't find %r in %s" % (parts, module))
return info
def get_frozen_object(module, paths):
return imp.get_frozen_object(module)
def get_module(module, paths, info):
imp.load_module(module, *info)
return sys.modules[module]
import importlib
try:
import importlib.util
except ImportError:
pass
try:
module_from_spec = importlib.util.module_from_spec
except AttributeError:
def module_from_spec(spec):
return spec.loader.load_module(spec.name)
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