diff options
-rw-r--r-- | Lib/test/test_metaclass.py | 2 | ||||
-rw-r--r-- | Lib/test/test_pyclbr.py | 43 | ||||
-rw-r--r-- | Lib/test/test_regrtest.py | 1 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Tests/2025-03-17-19-47-27.gh-issue-131290.NyCIXR.rst | 1 |
4 files changed, 39 insertions, 8 deletions
diff --git a/Lib/test/test_metaclass.py b/Lib/test/test_metaclass.py index 07a333f98fa..627c29fdb18 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 74910980567..a9ac13395a8 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 @@ ClassMethodType = type(classmethod(lambda c: None)) # 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 @@ class PyclbrTest(TestCase): 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 @@ class PyclbrTest(TestCase): 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 510c8f69631..7e317d5ab94 100644 --- a/Lib/test/test_regrtest.py +++ b/Lib/test/test_regrtest.py @@ -2546,4 +2546,5 @@ class TestColorized(unittest.TestCase): 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 00000000000..c6f0e0cc256 --- /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. |