mirror of
https://github.com/python/cpython.git
synced 2025-08-28 12:45:07 +00:00
gh-109625: Move _ready_to_import() from test_import to support.import_helper (#109626)
This commit is contained in:
parent
712cb173f8
commit
115c49ad5a
3 changed files with 35 additions and 34 deletions
|
@ -8,7 +8,7 @@ import sys
|
||||||
import unittest
|
import unittest
|
||||||
import warnings
|
import warnings
|
||||||
|
|
||||||
from .os_helper import unlink
|
from .os_helper import unlink, temp_dir
|
||||||
|
|
||||||
|
|
||||||
@contextlib.contextmanager
|
@contextlib.contextmanager
|
||||||
|
@ -274,3 +274,26 @@ def mock_register_at_fork(func):
|
||||||
# memory.
|
# memory.
|
||||||
from unittest import mock
|
from unittest import mock
|
||||||
return mock.patch('os.register_at_fork', create=True)(func)
|
return mock.patch('os.register_at_fork', create=True)(func)
|
||||||
|
|
||||||
|
|
||||||
|
@contextlib.contextmanager
|
||||||
|
def ready_to_import(name=None, source=""):
|
||||||
|
from test.support import script_helper
|
||||||
|
|
||||||
|
# 1. Sets up a temporary directory and removes it afterwards
|
||||||
|
# 2. Creates the module file
|
||||||
|
# 3. Temporarily clears the module from sys.modules (if any)
|
||||||
|
# 4. Reverts or removes the module when cleaning up
|
||||||
|
name = name or "spam"
|
||||||
|
with temp_dir() as tempdir:
|
||||||
|
path = script_helper.make_script(tempdir, name, source)
|
||||||
|
old_module = sys.modules.pop(name, None)
|
||||||
|
try:
|
||||||
|
sys.path.insert(0, tempdir)
|
||||||
|
yield name, path
|
||||||
|
sys.path.remove(tempdir)
|
||||||
|
finally:
|
||||||
|
if old_module is not None:
|
||||||
|
sys.modules[name] = old_module
|
||||||
|
else:
|
||||||
|
sys.modules.pop(name, None)
|
||||||
|
|
|
@ -30,9 +30,10 @@ from test.support import (
|
||||||
STDLIB_DIR, swap_attr, swap_item, cpython_only, is_emscripten,
|
STDLIB_DIR, swap_attr, swap_item, cpython_only, is_emscripten,
|
||||||
is_wasi, run_in_subinterp, run_in_subinterp_with_config, Py_TRACE_REFS)
|
is_wasi, run_in_subinterp, run_in_subinterp_with_config, Py_TRACE_REFS)
|
||||||
from test.support.import_helper import (
|
from test.support.import_helper import (
|
||||||
forget, make_legacy_pyc, unlink, unload, DirsOnSysPath, CleanImport)
|
forget, make_legacy_pyc, unlink, unload, ready_to_import,
|
||||||
|
DirsOnSysPath, CleanImport)
|
||||||
from test.support.os_helper import (
|
from test.support.os_helper import (
|
||||||
TESTFN, rmtree, temp_umask, TESTFN_UNENCODABLE, temp_dir)
|
TESTFN, rmtree, temp_umask, TESTFN_UNENCODABLE)
|
||||||
from test.support import script_helper
|
from test.support import script_helper
|
||||||
from test.support import threading_helper
|
from test.support import threading_helper
|
||||||
from test.test_importlib.util import uncache
|
from test.test_importlib.util import uncache
|
||||||
|
@ -125,27 +126,6 @@ def no_rerun(reason):
|
||||||
return deco
|
return deco
|
||||||
|
|
||||||
|
|
||||||
@contextlib.contextmanager
|
|
||||||
def _ready_to_import(name=None, source=""):
|
|
||||||
# sets up a temporary directory and removes it
|
|
||||||
# creates the module file
|
|
||||||
# temporarily clears the module from sys.modules (if any)
|
|
||||||
# reverts or removes the module when cleaning up
|
|
||||||
name = name or "spam"
|
|
||||||
with temp_dir() as tempdir:
|
|
||||||
path = script_helper.make_script(tempdir, name, source)
|
|
||||||
old_module = sys.modules.pop(name, None)
|
|
||||||
try:
|
|
||||||
sys.path.insert(0, tempdir)
|
|
||||||
yield name, path
|
|
||||||
sys.path.remove(tempdir)
|
|
||||||
finally:
|
|
||||||
if old_module is not None:
|
|
||||||
sys.modules[name] = old_module
|
|
||||||
elif name in sys.modules:
|
|
||||||
del sys.modules[name]
|
|
||||||
|
|
||||||
|
|
||||||
if _testsinglephase is not None:
|
if _testsinglephase is not None:
|
||||||
def restore__testsinglephase(*, _orig=_testsinglephase):
|
def restore__testsinglephase(*, _orig=_testsinglephase):
|
||||||
# We started with the module imported and want to restore
|
# We started with the module imported and want to restore
|
||||||
|
@ -401,7 +381,7 @@ class ImportTests(unittest.TestCase):
|
||||||
|
|
||||||
def test_from_import_star_invalid_type(self):
|
def test_from_import_star_invalid_type(self):
|
||||||
import re
|
import re
|
||||||
with _ready_to_import() as (name, path):
|
with ready_to_import() as (name, path):
|
||||||
with open(path, 'w', encoding='utf-8') as f:
|
with open(path, 'w', encoding='utf-8') as f:
|
||||||
f.write("__all__ = [b'invalid_type']")
|
f.write("__all__ = [b'invalid_type']")
|
||||||
globals = {}
|
globals = {}
|
||||||
|
@ -410,7 +390,7 @@ class ImportTests(unittest.TestCase):
|
||||||
):
|
):
|
||||||
exec(f"from {name} import *", globals)
|
exec(f"from {name} import *", globals)
|
||||||
self.assertNotIn(b"invalid_type", globals)
|
self.assertNotIn(b"invalid_type", globals)
|
||||||
with _ready_to_import() as (name, path):
|
with ready_to_import() as (name, path):
|
||||||
with open(path, 'w', encoding='utf-8') as f:
|
with open(path, 'w', encoding='utf-8') as f:
|
||||||
f.write("globals()[b'invalid_type'] = object()")
|
f.write("globals()[b'invalid_type'] = object()")
|
||||||
globals = {}
|
globals = {}
|
||||||
|
@ -818,7 +798,7 @@ class FilePermissionTests(unittest.TestCase):
|
||||||
)
|
)
|
||||||
def test_creation_mode(self):
|
def test_creation_mode(self):
|
||||||
mask = 0o022
|
mask = 0o022
|
||||||
with temp_umask(mask), _ready_to_import() as (name, path):
|
with temp_umask(mask), ready_to_import() as (name, path):
|
||||||
cached_path = importlib.util.cache_from_source(path)
|
cached_path = importlib.util.cache_from_source(path)
|
||||||
module = __import__(name)
|
module = __import__(name)
|
||||||
if not os.path.exists(cached_path):
|
if not os.path.exists(cached_path):
|
||||||
|
@ -837,7 +817,7 @@ class FilePermissionTests(unittest.TestCase):
|
||||||
def test_cached_mode_issue_2051(self):
|
def test_cached_mode_issue_2051(self):
|
||||||
# permissions of .pyc should match those of .py, regardless of mask
|
# permissions of .pyc should match those of .py, regardless of mask
|
||||||
mode = 0o600
|
mode = 0o600
|
||||||
with temp_umask(0o022), _ready_to_import() as (name, path):
|
with temp_umask(0o022), ready_to_import() as (name, path):
|
||||||
cached_path = importlib.util.cache_from_source(path)
|
cached_path = importlib.util.cache_from_source(path)
|
||||||
os.chmod(path, mode)
|
os.chmod(path, mode)
|
||||||
__import__(name)
|
__import__(name)
|
||||||
|
@ -853,7 +833,7 @@ class FilePermissionTests(unittest.TestCase):
|
||||||
@os_helper.skip_unless_working_chmod
|
@os_helper.skip_unless_working_chmod
|
||||||
def test_cached_readonly(self):
|
def test_cached_readonly(self):
|
||||||
mode = 0o400
|
mode = 0o400
|
||||||
with temp_umask(0o022), _ready_to_import() as (name, path):
|
with temp_umask(0o022), ready_to_import() as (name, path):
|
||||||
cached_path = importlib.util.cache_from_source(path)
|
cached_path = importlib.util.cache_from_source(path)
|
||||||
os.chmod(path, mode)
|
os.chmod(path, mode)
|
||||||
__import__(name)
|
__import__(name)
|
||||||
|
@ -868,7 +848,7 @@ class FilePermissionTests(unittest.TestCase):
|
||||||
def test_pyc_always_writable(self):
|
def test_pyc_always_writable(self):
|
||||||
# Initially read-only .pyc files on Windows used to cause problems
|
# Initially read-only .pyc files on Windows used to cause problems
|
||||||
# with later updates, see issue #6074 for details
|
# with later updates, see issue #6074 for details
|
||||||
with _ready_to_import() as (name, path):
|
with ready_to_import() as (name, path):
|
||||||
# Write a Python file, make it read-only and import it
|
# Write a Python file, make it read-only and import it
|
||||||
with open(path, 'w', encoding='utf-8') as f:
|
with open(path, 'w', encoding='utf-8') as f:
|
||||||
f.write("x = 'original'\n")
|
f.write("x = 'original'\n")
|
||||||
|
|
|
@ -33,7 +33,7 @@ except ImportError:
|
||||||
|
|
||||||
from test.support import cpython_only
|
from test.support import cpython_only
|
||||||
from test.support import MISSING_C_DOCSTRINGS, ALWAYS_EQ
|
from test.support import MISSING_C_DOCSTRINGS, ALWAYS_EQ
|
||||||
from test.support.import_helper import DirsOnSysPath
|
from test.support.import_helper import DirsOnSysPath, ready_to_import
|
||||||
from test.support.os_helper import TESTFN
|
from test.support.os_helper import TESTFN
|
||||||
from test.support.script_helper import assert_python_ok, assert_python_failure
|
from test.support.script_helper import assert_python_ok, assert_python_failure
|
||||||
from test import inspect_fodder as mod
|
from test import inspect_fodder as mod
|
||||||
|
@ -43,8 +43,6 @@ from test import inspect_stock_annotations
|
||||||
from test import inspect_stringized_annotations
|
from test import inspect_stringized_annotations
|
||||||
from test import inspect_stringized_annotations_2
|
from test import inspect_stringized_annotations_2
|
||||||
|
|
||||||
from test.test_import import _ready_to_import
|
|
||||||
|
|
||||||
|
|
||||||
# Functions tested in this suite:
|
# Functions tested in this suite:
|
||||||
# ismodule, isclass, ismethod, isfunction, istraceback, isframe, iscode,
|
# ismodule, isclass, ismethod, isfunction, istraceback, isframe, iscode,
|
||||||
|
@ -4954,7 +4952,7 @@ def foo():
|
||||||
|
|
||||||
def test_getsource_reload(self):
|
def test_getsource_reload(self):
|
||||||
# see issue 1218234
|
# see issue 1218234
|
||||||
with _ready_to_import('reload_bug', self.src_before) as (name, path):
|
with ready_to_import('reload_bug', self.src_before) as (name, path):
|
||||||
module = importlib.import_module(name)
|
module = importlib.import_module(name)
|
||||||
self.assertInspectEqual(path, module)
|
self.assertInspectEqual(path, module)
|
||||||
with open(path, 'w', encoding='utf-8') as src:
|
with open(path, 'w', encoding='utf-8') as src:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue