https://github.com/python/cpython/commit/292a7248cda89f497e06eff4aa0147d6ff22f6bb commit: 292a7248cda89f497e06eff4aa0147d6ff22f6bb branch: main author: Maksim <130899353+maximg...@users.noreply.github.com> committer: picnixz <10796600+picn...@users.noreply.github.com> date: 2025-04-12T07:46:19Z summary:
gh-131290: ensure that test files can be executed as standalone scripts (#131371) --------- Co-authored-by: Bénédikt Tran <10796600+picn...@users.noreply.github.com> files: A Misc/NEWS.d/next/Tests/2025-03-17-19-47-27.gh-issue-131290.NyCIXR.rst M Lib/test/test_metaclass.py M Lib/test/test_pyclbr.py M Lib/test/test_regrtest.py diff --git a/Lib/test/test_metaclass.py b/Lib/test/test_metaclass.py index 07a333f98fa0a9..627c29fdb18ab3 100644 --- a/Lib/test/test_metaclass.py +++ b/Lib/test/test_metaclass.py @@ -297,4 +297,6 @@ def load_tests(loader, tests, pattern): if __name__ == "__main__": + # set __name__ to match doctest expectations + __name__ = "test.test_metaclass" unittest.main() diff --git a/Lib/test/test_pyclbr.py b/Lib/test/test_pyclbr.py index 74910980567763..a9ac13395a8fac 100644 --- a/Lib/test/test_pyclbr.py +++ b/Lib/test/test_pyclbr.py @@ -3,7 +3,9 @@ Nick Mathewson ''' +import importlib.machinery import sys +from contextlib import contextmanager from textwrap import dedent from types import FunctionType, MethodType, BuiltinFunctionType import pyclbr @@ -22,6 +24,29 @@ # is imperfect (as designed), testModule is called with a set of # members to ignore. + +@contextmanager +def temporary_main_spec(): + """ + A context manager that temporarily sets the `__spec__` attribute + of the `__main__` module if it's missing. + """ + main_mod = sys.modules.get("__main__") + if main_mod is None: + yield # Do nothing if __main__ is not present + return + + original_spec = getattr(main_mod, "__spec__", None) + if original_spec is None: + main_mod.__spec__ = importlib.machinery.ModuleSpec( + name="__main__", loader=None, origin="built-in" + ) + try: + yield + finally: + main_mod.__spec__ = original_spec + + class PyclbrTest(TestCase): def assertListEq(self, l1, l2, ignore): @@ -145,8 +170,9 @@ def test_easy(self): self.checkModule('pyclbr') # XXX: Metaclasses are not supported # self.checkModule('ast') - self.checkModule('doctest', ignore=("TestResults", "_SpoofOut", - "DocTestCase", '_DocTestSuite')) + with temporary_main_spec(): + self.checkModule('doctest', ignore=("TestResults", "_SpoofOut", + "DocTestCase", '_DocTestSuite')) self.checkModule('difflib', ignore=("Match",)) def test_cases(self): @@ -223,12 +249,13 @@ def test_others(self): with warnings.catch_warnings(): warnings.simplefilter('ignore', DeprecationWarning) cm('sre_parse', ignore=('dump', 'groups', 'pos')) # from sre_constants import *; property - cm( - 'pdb', - # pyclbr does not handle elegantly `typing` or properties - ignore=('Union', '_ModuleTarget', '_ScriptTarget', '_ZipTarget', 'curframe_locals'), - ) - cm('pydoc', ignore=('input', 'output',)) # properties + with temporary_main_spec(): + cm( + 'pdb', + # pyclbr does not handle elegantly `typing` or properties + ignore=('Union', '_ModuleTarget', '_ScriptTarget', '_ZipTarget', 'curframe_locals'), + ) + cm('pydoc', ignore=('input', 'output',)) # properties # Tests for modules inside packages cm('email.parser') diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py index 510c8f69631bac..7e317d5ab943ff 100644 --- a/Lib/test/test_regrtest.py +++ b/Lib/test/test_regrtest.py @@ -2546,4 +2546,5 @@ def test_test_result_get_state(self): if __name__ == '__main__': + setup.setup_process() unittest.main() diff --git a/Misc/NEWS.d/next/Tests/2025-03-17-19-47-27.gh-issue-131290.NyCIXR.rst b/Misc/NEWS.d/next/Tests/2025-03-17-19-47-27.gh-issue-131290.NyCIXR.rst new file mode 100644 index 00000000000000..c6f0e0cc25623d --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2025-03-17-19-47-27.gh-issue-131290.NyCIXR.rst @@ -0,0 +1 @@ +Tests in :file:`Lib/test` can now be correctly executed as standalone scripts. _______________________________________________ Python-checkins mailing list -- python-checkins@python.org To unsubscribe send an email to python-checkins-le...@python.org https://mail.python.org/mailman3/lists/python-checkins.python.org/ Member address: arch...@mail-archive.com