mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	gh-131290: ensure that test files can be executed as standalone scripts (#131371)
--------- Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
This commit is contained in:
		
							parent
							
								
									2aab2db146
								
							
						
					
					
						commit
						292a7248cd
					
				
					 4 changed files with 39 additions and 8 deletions
				
			
		|  | @ -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() | ||||
|  |  | |||
|  | @ -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') | ||||
|  |  | |||
|  | @ -2546,4 +2546,5 @@ def test_test_result_get_state(self): | |||
| 
 | ||||
| 
 | ||||
| if __name__ == '__main__': | ||||
|     setup.setup_process() | ||||
|     unittest.main() | ||||
|  |  | |||
|  | @ -0,0 +1 @@ | |||
| Tests in :file:`Lib/test` can now be correctly executed as standalone scripts. | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Maksim
						Maksim