Skip to content

Commit

Permalink
Merge pull request #3046 from abravalheri/add-tests-for-duplicated-im…
Browse files Browse the repository at this point in the history
…ports

Correct for duplicated distutils imports
  • Loading branch information
jaraco committed Feb 16, 2022
2 parents f0f28f7 + 9c8957a commit 01ff033
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 0 deletions.
2 changes: 2 additions & 0 deletions _distutils_hack/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ def ensure_local_distutils():
# check that submodules load as expected
core = importlib.import_module('distutils.core')
assert '_distutils' in core.__file__, core.__file__
assert 'setuptools._distutils.log' not in sys.modules


def do_override():
Expand Down Expand Up @@ -112,6 +113,7 @@ def spec_for_distutils(self):
class DistutilsLoader(importlib.abc.Loader):

def create_module(self, spec):
mod.__name__ = 'distutils'
return mod

def exec_module(self, module):
Expand Down
1 change: 1 addition & 0 deletions changelog.d/3035.misc.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
When loading distutils from the vendored copy, rewrite ``__name__`` to ensure consistent importing from inside and out.
63 changes: 63 additions & 0 deletions setuptools/tests/test_distutils_adoption.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,3 +93,66 @@ def test_distutils_has_origin():
Distutils module spec should have an origin. #2990.
"""
assert __import__('distutils').__spec__.origin


ENSURE_IMPORTS_ARE_NOT_DUPLICATED = r"""
# Depending on the importlib machinery and _distutils_hack, some imports are
# duplicated resulting in different module objects being loaded, which prevents
# patches as shown in #3042.
# This script provides a way of verifying if this duplication is happening.
from distutils import cmd
import distutils.command.sdist as sdist
# import last to prevent caching
from distutils import {imported_module}
for mod in (cmd, sdist):
assert mod.{imported_module} == {imported_module}, (
f"\n{{mod.dir_util}}\n!=\n{{{imported_module}}}"
)
print("success")
"""


@pytest.mark.parametrize(
"distutils_version, imported_module",
[
("stdlib", "dir_util"),
("stdlib", "file_util"),
("stdlib", "archive_util"),
("local", "dir_util"),
("local", "file_util"),
("local", "archive_util"),
]
)
def test_modules_are_not_duplicated_on_import(
distutils_version, imported_module, tmpdir_cwd, venv
):
env = dict(SETUPTOOLS_USE_DISTUTILS=distutils_version)
script = ENSURE_IMPORTS_ARE_NOT_DUPLICATED.format(imported_module=imported_module)
cmd = ['python', '-c', script]
output = popen_text(venv.run)(cmd, env=win_sr(env)).strip()
assert output == "success"


ENSURE_LOG_IMPORT_IS_NOT_DUPLICATED = r"""
# Similar to ENSURE_IMPORTS_ARE_NOT_DUPLICATED
import distutils.dist as dist
from distutils import log
assert dist.log == log, (
f"\n{dist.log}\n!=\n{log}"
)
print("success")
"""


@pytest.mark.parametrize("distutils_version", "local stdlib".split())
def test_log_module_is_not_duplicated_on_import(distutils_version, tmpdir_cwd, venv):
env = dict(SETUPTOOLS_USE_DISTUTILS=distutils_version)
cmd = ['python', '-c', ENSURE_LOG_IMPORT_IS_NOT_DUPLICATED]
output = popen_text(venv.run)(cmd, env=win_sr(env)).strip()
assert output == "success"

0 comments on commit 01ff033

Please sign in to comment.