Skip to content

Commit 01ff033

Browse files
authored
Merge pull request #3046 from abravalheri/add-tests-for-duplicated-imports
Correct for duplicated distutils imports
2 parents f0f28f7 + 9c8957a commit 01ff033

File tree

3 files changed

+66
-0
lines changed

3 files changed

+66
-0
lines changed

_distutils_hack/__init__.py

+2
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ def ensure_local_distutils():
5757
# check that submodules load as expected
5858
core = importlib.import_module('distutils.core')
5959
assert '_distutils' in core.__file__, core.__file__
60+
assert 'setuptools._distutils.log' not in sys.modules
6061

6162

6263
def do_override():
@@ -112,6 +113,7 @@ def spec_for_distutils(self):
112113
class DistutilsLoader(importlib.abc.Loader):
113114

114115
def create_module(self, spec):
116+
mod.__name__ = 'distutils'
115117
return mod
116118

117119
def exec_module(self, module):

changelog.d/3035.misc.rst

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
When loading distutils from the vendored copy, rewrite ``__name__`` to ensure consistent importing from inside and out.

setuptools/tests/test_distutils_adoption.py

+63
Original file line numberDiff line numberDiff line change
@@ -93,3 +93,66 @@ def test_distutils_has_origin():
9393
Distutils module spec should have an origin. #2990.
9494
"""
9595
assert __import__('distutils').__spec__.origin
96+
97+
98+
ENSURE_IMPORTS_ARE_NOT_DUPLICATED = r"""
99+
# Depending on the importlib machinery and _distutils_hack, some imports are
100+
# duplicated resulting in different module objects being loaded, which prevents
101+
# patches as shown in #3042.
102+
# This script provides a way of verifying if this duplication is happening.
103+
104+
from distutils import cmd
105+
import distutils.command.sdist as sdist
106+
107+
# import last to prevent caching
108+
from distutils import {imported_module}
109+
110+
for mod in (cmd, sdist):
111+
assert mod.{imported_module} == {imported_module}, (
112+
f"\n{{mod.dir_util}}\n!=\n{{{imported_module}}}"
113+
)
114+
115+
print("success")
116+
"""
117+
118+
119+
@pytest.mark.parametrize(
120+
"distutils_version, imported_module",
121+
[
122+
("stdlib", "dir_util"),
123+
("stdlib", "file_util"),
124+
("stdlib", "archive_util"),
125+
("local", "dir_util"),
126+
("local", "file_util"),
127+
("local", "archive_util"),
128+
]
129+
)
130+
def test_modules_are_not_duplicated_on_import(
131+
distutils_version, imported_module, tmpdir_cwd, venv
132+
):
133+
env = dict(SETUPTOOLS_USE_DISTUTILS=distutils_version)
134+
script = ENSURE_IMPORTS_ARE_NOT_DUPLICATED.format(imported_module=imported_module)
135+
cmd = ['python', '-c', script]
136+
output = popen_text(venv.run)(cmd, env=win_sr(env)).strip()
137+
assert output == "success"
138+
139+
140+
ENSURE_LOG_IMPORT_IS_NOT_DUPLICATED = r"""
141+
# Similar to ENSURE_IMPORTS_ARE_NOT_DUPLICATED
142+
import distutils.dist as dist
143+
from distutils import log
144+
145+
assert dist.log == log, (
146+
f"\n{dist.log}\n!=\n{log}"
147+
)
148+
149+
print("success")
150+
"""
151+
152+
153+
@pytest.mark.parametrize("distutils_version", "local stdlib".split())
154+
def test_log_module_is_not_duplicated_on_import(distutils_version, tmpdir_cwd, venv):
155+
env = dict(SETUPTOOLS_USE_DISTUTILS=distutils_version)
156+
cmd = ['python', '-c', ENSURE_LOG_IMPORT_IS_NOT_DUPLICATED]
157+
output = popen_text(venv.run)(cmd, env=win_sr(env)).strip()
158+
assert output == "success"

0 commit comments

Comments
 (0)