| 
									
										
										
										
											2022-01-22 19:05:05 +03:00
										 |  |  | from test.test_importlib import util as test_util | 
					
						
							| 
									
										
										
										
											2013-06-15 18:39:21 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-16 11:40:40 -06:00
										 |  |  | init = test_util.import_importlib('importlib') | 
					
						
							|  |  |  | util = test_util.import_importlib('importlib.util') | 
					
						
							|  |  |  | machinery = test_util.import_importlib('importlib.machinery') | 
					
						
							| 
									
										
										
										
											2013-10-18 10:45:59 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-31 22:22:15 -06:00
										 |  |  | import os.path | 
					
						
							| 
									
										
										
										
											2009-02-07 01:15:27 +00:00
										 |  |  | import sys | 
					
						
							| 
									
										
										
										
											2020-08-04 23:53:12 +08:00
										 |  |  | from test.support import import_helper | 
					
						
							|  |  |  | from test.support import os_helper | 
					
						
							| 
									
										
										
										
											2013-02-01 14:43:59 -05:00
										 |  |  | import types | 
					
						
							| 
									
										
										
										
											2009-02-07 01:15:27 +00:00
										 |  |  | import unittest | 
					
						
							| 
									
										
										
										
											2009-01-18 00:24:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-18 10:45:59 -04:00
										 |  |  | class ImportModuleTests: | 
					
						
							| 
									
										
										
										
											2009-01-18 00:24:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     """Test importlib.import_module.""" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_module_import(self): | 
					
						
							|  |  |  |         # Test importing a top-level module. | 
					
						
							| 
									
										
										
										
											2020-12-04 15:39:21 -08:00
										 |  |  |         with test_util.mock_spec('top_level') as mock: | 
					
						
							| 
									
										
										
										
											2014-05-16 11:40:40 -06:00
										 |  |  |             with test_util.import_state(meta_path=[mock]): | 
					
						
							| 
									
										
										
										
											2013-10-18 10:45:59 -04:00
										 |  |  |                 module = self.init.import_module('top_level') | 
					
						
							| 
									
										
										
										
											2009-01-18 00:24:28 +00:00
										 |  |  |                 self.assertEqual(module.__name__, 'top_level') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_absolute_package_import(self): | 
					
						
							|  |  |  |         # Test importing a module from a package with an absolute name. | 
					
						
							|  |  |  |         pkg_name = 'pkg' | 
					
						
							|  |  |  |         pkg_long_name = '{0}.__init__'.format(pkg_name) | 
					
						
							|  |  |  |         name = '{0}.mod'.format(pkg_name) | 
					
						
							| 
									
										
										
										
											2020-12-04 15:39:21 -08:00
										 |  |  |         with test_util.mock_spec(pkg_long_name, name) as mock: | 
					
						
							| 
									
										
										
										
											2014-05-16 11:40:40 -06:00
										 |  |  |             with test_util.import_state(meta_path=[mock]): | 
					
						
							| 
									
										
										
										
											2013-10-18 10:45:59 -04:00
										 |  |  |                 module = self.init.import_module(name) | 
					
						
							| 
									
										
										
										
											2009-01-18 00:24:28 +00:00
										 |  |  |                 self.assertEqual(module.__name__, name) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-04 01:02:54 +00:00
										 |  |  |     def test_shallow_relative_package_import(self): | 
					
						
							| 
									
										
										
										
											2010-07-03 22:03:16 +00:00
										 |  |  |         # Test importing a module from a package through a relative import. | 
					
						
							| 
									
										
										
										
											2009-01-18 00:24:28 +00:00
										 |  |  |         pkg_name = 'pkg' | 
					
						
							|  |  |  |         pkg_long_name = '{0}.__init__'.format(pkg_name) | 
					
						
							|  |  |  |         module_name = 'mod' | 
					
						
							|  |  |  |         absolute_name = '{0}.{1}'.format(pkg_name, module_name) | 
					
						
							|  |  |  |         relative_name = '.{0}'.format(module_name) | 
					
						
							| 
									
										
										
										
											2020-12-04 15:39:21 -08:00
										 |  |  |         with test_util.mock_spec(pkg_long_name, absolute_name) as mock: | 
					
						
							| 
									
										
										
										
											2014-05-16 11:40:40 -06:00
										 |  |  |             with test_util.import_state(meta_path=[mock]): | 
					
						
							| 
									
										
										
										
											2013-10-18 10:45:59 -04:00
										 |  |  |                 self.init.import_module(pkg_name) | 
					
						
							|  |  |  |                 module = self.init.import_module(relative_name, pkg_name) | 
					
						
							| 
									
										
										
										
											2009-01-18 00:24:28 +00:00
										 |  |  |                 self.assertEqual(module.__name__, absolute_name) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-04 01:02:54 +00:00
										 |  |  |     def test_deep_relative_package_import(self): | 
					
						
							|  |  |  |         modules = ['a.__init__', 'a.b.__init__', 'a.c'] | 
					
						
							| 
									
										
										
										
											2020-12-04 15:39:21 -08:00
										 |  |  |         with test_util.mock_spec(*modules) as mock: | 
					
						
							| 
									
										
										
										
											2014-05-16 11:40:40 -06:00
										 |  |  |             with test_util.import_state(meta_path=[mock]): | 
					
						
							| 
									
										
										
										
											2013-10-18 10:45:59 -04:00
										 |  |  |                 self.init.import_module('a') | 
					
						
							|  |  |  |                 self.init.import_module('a.b') | 
					
						
							|  |  |  |                 module = self.init.import_module('..c', 'a.b') | 
					
						
							| 
									
										
										
										
											2009-03-04 01:02:54 +00:00
										 |  |  |                 self.assertEqual(module.__name__, 'a.c') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-18 00:24:28 +00:00
										 |  |  |     def test_absolute_import_with_package(self): | 
					
						
							|  |  |  |         # Test importing a module from a package with an absolute name with | 
					
						
							|  |  |  |         # the 'package' argument given. | 
					
						
							|  |  |  |         pkg_name = 'pkg' | 
					
						
							|  |  |  |         pkg_long_name = '{0}.__init__'.format(pkg_name) | 
					
						
							|  |  |  |         name = '{0}.mod'.format(pkg_name) | 
					
						
							| 
									
										
										
										
											2020-12-04 15:39:21 -08:00
										 |  |  |         with test_util.mock_spec(pkg_long_name, name) as mock: | 
					
						
							| 
									
										
										
										
											2014-05-16 11:40:40 -06:00
										 |  |  |             with test_util.import_state(meta_path=[mock]): | 
					
						
							| 
									
										
										
										
											2013-10-18 10:45:59 -04:00
										 |  |  |                 self.init.import_module(pkg_name) | 
					
						
							|  |  |  |                 module = self.init.import_module(name, pkg_name) | 
					
						
							| 
									
										
										
										
											2009-01-18 00:24:28 +00:00
										 |  |  |                 self.assertEqual(module.__name__, name) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_relative_import_wo_package(self): | 
					
						
							|  |  |  |         # Relative imports cannot happen without the 'package' argument being | 
					
						
							|  |  |  |         # set. | 
					
						
							| 
									
										
										
										
											2009-08-27 23:49:21 +00:00
										 |  |  |         with self.assertRaises(TypeError): | 
					
						
							| 
									
										
										
										
											2013-10-18 10:45:59 -04:00
										 |  |  |             self.init.import_module('.support') | 
					
						
							| 
									
										
										
										
											2009-01-18 00:24:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-14 22:23:46 -06:00
										 |  |  |     def test_loaded_once(self): | 
					
						
							|  |  |  |         # Issue #13591: Modules should only be loaded once when | 
					
						
							|  |  |  |         # initializing the parent package attempts to import the | 
					
						
							|  |  |  |         # module currently being imported. | 
					
						
							|  |  |  |         b_load_count = 0 | 
					
						
							|  |  |  |         def load_a(): | 
					
						
							| 
									
										
										
										
											2013-10-18 10:45:59 -04:00
										 |  |  |             self.init.import_module('a.b') | 
					
						
							| 
									
										
										
										
											2011-12-14 22:23:46 -06:00
										 |  |  |         def load_b(): | 
					
						
							|  |  |  |             nonlocal b_load_count | 
					
						
							|  |  |  |             b_load_count += 1 | 
					
						
							|  |  |  |         code = {'a': load_a, 'a.b': load_b} | 
					
						
							|  |  |  |         modules = ['a.__init__', 'a.b'] | 
					
						
							| 
									
										
										
										
											2020-12-04 15:39:21 -08:00
										 |  |  |         with test_util.mock_spec(*modules, module_code=code) as mock: | 
					
						
							| 
									
										
										
										
											2014-05-16 11:40:40 -06:00
										 |  |  |             with test_util.import_state(meta_path=[mock]): | 
					
						
							| 
									
										
										
										
											2013-10-18 10:45:59 -04:00
										 |  |  |                 self.init.import_module('a.b') | 
					
						
							| 
									
										
										
										
											2011-12-14 22:23:46 -06:00
										 |  |  |         self.assertEqual(b_load_count, 1) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-18 10:45:59 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-16 11:40:40 -06:00
										 |  |  | (Frozen_ImportModuleTests, | 
					
						
							|  |  |  |  Source_ImportModuleTests | 
					
						
							| 
									
										
										
										
											2023-05-03 04:55:22 -07:00
										 |  |  |  ) = test_util.test_both( | 
					
						
							|  |  |  |      ImportModuleTests, init=init, util=util, machinery=machinery) | 
					
						
							| 
									
										
										
										
											2013-10-18 10:45:59 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-27 18:15:42 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-18 10:45:59 -04:00
										 |  |  | class FindLoaderTests: | 
					
						
							| 
									
										
										
										
											2012-05-12 17:43:17 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-10 16:21:03 -06:00
										 |  |  |     FakeMetaFinder = None | 
					
						
							| 
									
										
										
										
											2012-05-12 17:43:17 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_sys_modules(self): | 
					
						
							| 
									
										
										
										
											2023-05-03 04:55:22 -07:00
										 |  |  |         # If a module with __spec__.loader is in sys.modules, then return it. | 
					
						
							| 
									
										
										
										
											2012-05-12 17:43:17 -04:00
										 |  |  |         name = 'some_mod' | 
					
						
							| 
									
										
										
										
											2014-05-16 11:40:40 -06:00
										 |  |  |         with test_util.uncache(name): | 
					
						
							| 
									
										
										
										
											2013-06-15 18:39:21 -04:00
										 |  |  |             module = types.ModuleType(name) | 
					
						
							| 
									
										
										
										
											2012-05-12 17:43:17 -04:00
										 |  |  |             loader = 'a loader!' | 
					
						
							| 
									
										
										
										
											2023-05-03 04:55:22 -07:00
										 |  |  |             module.__spec__ = self.machinery.ModuleSpec(name, loader) | 
					
						
							| 
									
										
										
										
											2012-05-12 17:43:17 -04:00
										 |  |  |             sys.modules[name] = module | 
					
						
							| 
									
										
										
										
											2023-05-03 04:55:22 -07:00
										 |  |  |             spec = self.util.find_spec(name) | 
					
						
							|  |  |  |             self.assertIsNotNone(spec) | 
					
						
							|  |  |  |             self.assertEqual(spec.loader, loader) | 
					
						
							| 
									
										
										
										
											2012-05-12 17:43:17 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_sys_modules_loader_is_None(self): | 
					
						
							| 
									
										
										
										
											2023-05-03 04:55:22 -07:00
										 |  |  |         # If sys.modules[name].__spec__.loader is None, raise ValueError. | 
					
						
							| 
									
										
										
										
											2012-05-12 17:43:17 -04:00
										 |  |  |         name = 'some_mod' | 
					
						
							| 
									
										
										
										
											2014-05-16 11:40:40 -06:00
										 |  |  |         with test_util.uncache(name): | 
					
						
							| 
									
										
										
										
											2013-06-15 18:39:21 -04:00
										 |  |  |             module = types.ModuleType(name) | 
					
						
							| 
									
										
										
										
											2012-05-12 17:43:17 -04:00
										 |  |  |             module.__loader__ = None | 
					
						
							|  |  |  |             sys.modules[name] = module | 
					
						
							|  |  |  |             with self.assertRaises(ValueError): | 
					
						
							| 
									
										
										
										
											2023-05-03 04:55:22 -07:00
										 |  |  |                 self.util.find_spec(name) | 
					
						
							| 
									
										
										
										
											2012-05-12 17:43:17 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-13 11:09:08 -07:00
										 |  |  |     def test_sys_modules_loader_is_not_set(self): | 
					
						
							|  |  |  |         # Should raise ValueError | 
					
						
							|  |  |  |         # Issue #17099 | 
					
						
							|  |  |  |         name = 'some_mod' | 
					
						
							| 
									
										
										
										
											2014-05-16 11:40:40 -06:00
										 |  |  |         with test_util.uncache(name): | 
					
						
							| 
									
										
										
										
											2013-06-15 18:39:21 -04:00
										 |  |  |             module = types.ModuleType(name) | 
					
						
							| 
									
										
										
										
											2013-03-13 11:09:08 -07:00
										 |  |  |             try: | 
					
						
							| 
									
										
										
										
											2023-05-03 04:55:22 -07:00
										 |  |  |                 del module.__spec__.loader | 
					
						
							| 
									
										
										
										
											2013-03-13 11:09:08 -07:00
										 |  |  |             except AttributeError: | 
					
						
							|  |  |  |                 pass | 
					
						
							|  |  |  |             sys.modules[name] = module | 
					
						
							|  |  |  |             with self.assertRaises(ValueError): | 
					
						
							| 
									
										
										
										
											2023-05-03 04:55:22 -07:00
										 |  |  |                 self.util.find_spec(name) | 
					
						
							| 
									
										
										
										
											2013-03-13 11:09:08 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-12 17:43:17 -04:00
										 |  |  |     def test_success(self): | 
					
						
							|  |  |  |         # Return the loader found on sys.meta_path. | 
					
						
							|  |  |  |         name = 'some_mod' | 
					
						
							| 
									
										
										
										
											2014-05-16 11:40:40 -06:00
										 |  |  |         with test_util.uncache(name): | 
					
						
							|  |  |  |             with test_util.import_state(meta_path=[self.FakeMetaFinder]): | 
					
						
							| 
									
										
										
										
											2023-05-03 04:55:22 -07:00
										 |  |  |                 spec = self.util.find_spec(name) | 
					
						
							|  |  |  |                 self.assertEqual((name, (name, None)), (spec.name, spec.loader)) | 
					
						
							| 
									
										
										
										
											2012-05-12 17:43:17 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_success_path(self): | 
					
						
							|  |  |  |         # Searching on a path should work. | 
					
						
							|  |  |  |         name = 'some_mod' | 
					
						
							|  |  |  |         path = 'path to some place' | 
					
						
							| 
									
										
										
										
											2014-05-16 11:40:40 -06:00
										 |  |  |         with test_util.uncache(name): | 
					
						
							|  |  |  |             with test_util.import_state(meta_path=[self.FakeMetaFinder]): | 
					
						
							| 
									
										
										
										
											2023-05-03 04:55:22 -07:00
										 |  |  |                 spec = self.util.find_spec(name, path) | 
					
						
							|  |  |  |                 self.assertEqual(name, spec.name) | 
					
						
							| 
									
										
										
										
											2012-05-12 17:43:17 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_nothing(self): | 
					
						
							|  |  |  |         # None is returned upon failure to find a loader. | 
					
						
							| 
									
										
										
										
											2023-05-03 04:55:22 -07:00
										 |  |  |         self.assertIsNone(self.util.find_spec('nevergoingtofindthismodule')) | 
					
						
							| 
									
										
										
										
											2012-05-12 17:43:17 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-10 16:21:03 -06:00
										 |  |  | class FindLoaderPEP451Tests(FindLoaderTests): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     class FakeMetaFinder: | 
					
						
							|  |  |  |         @staticmethod | 
					
						
							|  |  |  |         def find_spec(name, path=None, target=None): | 
					
						
							|  |  |  |             return machinery['Source'].ModuleSpec(name, (name, path)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | (Frozen_FindLoaderPEP451Tests, | 
					
						
							|  |  |  |  Source_FindLoaderPEP451Tests | 
					
						
							| 
									
										
										
										
											2023-05-03 04:55:22 -07:00
										 |  |  |  ) = test_util.test_both( | 
					
						
							|  |  |  |      FindLoaderPEP451Tests, init=init, util=util, machinery=machinery) | 
					
						
							| 
									
										
										
										
											2013-10-18 10:45:59 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class ReloadTests: | 
					
						
							| 
									
										
										
										
											2013-06-14 15:04:26 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_reload_modules(self): | 
					
						
							|  |  |  |         for mod in ('tokenize', 'time', 'marshal'): | 
					
						
							|  |  |  |             with self.subTest(module=mod): | 
					
						
							| 
									
										
										
										
											2020-08-04 23:53:12 +08:00
										 |  |  |                 with import_helper.CleanImport(mod): | 
					
						
							| 
									
										
										
										
											2013-10-18 10:45:59 -04:00
										 |  |  |                     module = self.init.import_module(mod) | 
					
						
							|  |  |  |                     self.init.reload(module) | 
					
						
							| 
									
										
										
										
											2013-06-14 15:04:26 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-14 18:11:09 -06:00
										 |  |  |     def test_module_replaced(self): | 
					
						
							|  |  |  |         def code(): | 
					
						
							|  |  |  |             import sys | 
					
						
							|  |  |  |             module = type(sys)('top_level') | 
					
						
							|  |  |  |             module.spam = 3 | 
					
						
							|  |  |  |             sys.modules['top_level'] = module | 
					
						
							| 
									
										
										
										
											2020-12-04 15:39:21 -08:00
										 |  |  |         mock = test_util.mock_spec('top_level', | 
					
						
							|  |  |  |                                    module_code={'top_level': code}) | 
					
						
							| 
									
										
										
										
											2013-08-14 18:11:09 -06:00
										 |  |  |         with mock: | 
					
						
							| 
									
										
										
										
											2014-05-16 11:40:40 -06:00
										 |  |  |             with test_util.import_state(meta_path=[mock]): | 
					
						
							| 
									
										
										
										
											2013-10-18 10:45:59 -04:00
										 |  |  |                 module = self.init.import_module('top_level') | 
					
						
							|  |  |  |                 reloaded = self.init.reload(module) | 
					
						
							| 
									
										
										
										
											2013-08-14 18:11:09 -06:00
										 |  |  |                 actual = sys.modules['top_level'] | 
					
						
							|  |  |  |                 self.assertEqual(actual.spam, 3) | 
					
						
							|  |  |  |                 self.assertEqual(reloaded.spam, 3) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-31 22:22:15 -06:00
										 |  |  |     def test_reload_missing_loader(self): | 
					
						
							| 
									
										
										
										
											2020-08-04 23:53:12 +08:00
										 |  |  |         with import_helper.CleanImport('types'): | 
					
						
							| 
									
										
										
										
											2013-10-31 22:22:15 -06:00
										 |  |  |             import types | 
					
						
							|  |  |  |             loader = types.__loader__ | 
					
						
							|  |  |  |             del types.__loader__ | 
					
						
							|  |  |  |             reloaded = self.init.reload(types) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             self.assertIs(reloaded, types) | 
					
						
							|  |  |  |             self.assertIs(sys.modules['types'], types) | 
					
						
							|  |  |  |             self.assertEqual(reloaded.__loader__.path, loader.path) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_reload_loader_replaced(self): | 
					
						
							| 
									
										
										
										
											2020-08-04 23:53:12 +08:00
										 |  |  |         with import_helper.CleanImport('types'): | 
					
						
							| 
									
										
										
										
											2013-10-31 22:22:15 -06:00
										 |  |  |             import types | 
					
						
							|  |  |  |             types.__loader__ = None | 
					
						
							|  |  |  |             self.init.invalidate_caches() | 
					
						
							|  |  |  |             reloaded = self.init.reload(types) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             self.assertIsNot(reloaded.__loader__, None) | 
					
						
							|  |  |  |             self.assertIs(reloaded, types) | 
					
						
							|  |  |  |             self.assertIs(sys.modules['types'], types) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_reload_location_changed(self): | 
					
						
							|  |  |  |         name = 'spam' | 
					
						
							| 
									
										
										
										
											2020-08-04 23:53:12 +08:00
										 |  |  |         with os_helper.temp_cwd(None) as cwd: | 
					
						
							| 
									
										
										
										
											2014-05-16 11:40:40 -06:00
										 |  |  |             with test_util.uncache('spam'): | 
					
						
							| 
									
										
										
										
											2020-08-04 23:53:12 +08:00
										 |  |  |                 with import_helper.DirsOnSysPath(cwd): | 
					
						
							| 
									
										
										
										
											2013-11-22 09:05:39 -07:00
										 |  |  |                     # Start as a plain module. | 
					
						
							| 
									
										
										
										
											2013-10-31 22:22:15 -06:00
										 |  |  |                     self.init.invalidate_caches() | 
					
						
							|  |  |  |                     path = os.path.join(cwd, name + '.py') | 
					
						
							|  |  |  |                     cached = self.util.cache_from_source(path) | 
					
						
							|  |  |  |                     expected = {'__name__': name, | 
					
						
							|  |  |  |                                 '__package__': '', | 
					
						
							|  |  |  |                                 '__file__': path, | 
					
						
							|  |  |  |                                 '__cached__': cached, | 
					
						
							|  |  |  |                                 '__doc__': None, | 
					
						
							|  |  |  |                                 } | 
					
						
							| 
									
										
										
										
											2020-08-04 23:53:12 +08:00
										 |  |  |                     os_helper.create_empty_file(path) | 
					
						
							| 
									
										
										
										
											2013-10-31 22:22:15 -06:00
										 |  |  |                     module = self.init.import_module(name) | 
					
						
							| 
									
										
										
										
											2014-05-13 12:15:42 -06:00
										 |  |  |                     ns = vars(module).copy() | 
					
						
							| 
									
										
										
										
											2013-10-31 22:22:15 -06:00
										 |  |  |                     loader = ns.pop('__loader__') | 
					
						
							| 
									
										
										
										
											2013-11-22 09:05:39 -07:00
										 |  |  |                     spec = ns.pop('__spec__') | 
					
						
							| 
									
										
										
										
											2014-05-13 12:15:42 -06:00
										 |  |  |                     ns.pop('__builtins__', None)  # An implementation detail. | 
					
						
							| 
									
										
										
										
											2013-11-22 09:05:39 -07:00
										 |  |  |                     self.assertEqual(spec.name, name) | 
					
						
							|  |  |  |                     self.assertEqual(spec.loader, loader) | 
					
						
							| 
									
										
										
										
											2013-10-31 22:22:15 -06:00
										 |  |  |                     self.assertEqual(loader.path, path) | 
					
						
							|  |  |  |                     self.assertEqual(ns, expected) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-22 09:05:39 -07:00
										 |  |  |                     # Change to a package. | 
					
						
							| 
									
										
										
										
											2013-10-31 22:22:15 -06:00
										 |  |  |                     self.init.invalidate_caches() | 
					
						
							|  |  |  |                     init_path = os.path.join(cwd, name, '__init__.py') | 
					
						
							|  |  |  |                     cached = self.util.cache_from_source(init_path) | 
					
						
							|  |  |  |                     expected = {'__name__': name, | 
					
						
							|  |  |  |                                 '__package__': name, | 
					
						
							|  |  |  |                                 '__file__': init_path, | 
					
						
							|  |  |  |                                 '__cached__': cached, | 
					
						
							|  |  |  |                                 '__path__': [os.path.dirname(init_path)], | 
					
						
							|  |  |  |                                 '__doc__': None, | 
					
						
							|  |  |  |                                 } | 
					
						
							|  |  |  |                     os.mkdir(name) | 
					
						
							|  |  |  |                     os.rename(path, init_path) | 
					
						
							|  |  |  |                     reloaded = self.init.reload(module) | 
					
						
							| 
									
										
										
										
											2014-05-13 12:15:42 -06:00
										 |  |  |                     ns = vars(reloaded).copy() | 
					
						
							| 
									
										
										
										
											2013-10-31 22:22:15 -06:00
										 |  |  |                     loader = ns.pop('__loader__') | 
					
						
							| 
									
										
										
										
											2013-11-22 09:05:39 -07:00
										 |  |  |                     spec = ns.pop('__spec__') | 
					
						
							| 
									
										
										
										
											2014-05-13 12:15:42 -06:00
										 |  |  |                     ns.pop('__builtins__', None)  # An implementation detail. | 
					
						
							| 
									
										
										
										
											2013-11-22 09:05:39 -07:00
										 |  |  |                     self.assertEqual(spec.name, name) | 
					
						
							|  |  |  |                     self.assertEqual(spec.loader, loader) | 
					
						
							| 
									
										
										
										
											2013-10-31 22:22:15 -06:00
										 |  |  |                     self.assertIs(reloaded, module) | 
					
						
							|  |  |  |                     self.assertEqual(loader.path, init_path) | 
					
						
							| 
									
										
										
										
											2013-11-22 09:05:39 -07:00
										 |  |  |                     self.maxDiff = None | 
					
						
							| 
									
										
										
										
											2013-10-31 22:22:15 -06:00
										 |  |  |                     self.assertEqual(ns, expected) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_reload_namespace_changed(self): | 
					
						
							|  |  |  |         name = 'spam' | 
					
						
							| 
									
										
										
										
											2020-08-04 23:53:12 +08:00
										 |  |  |         with os_helper.temp_cwd(None) as cwd: | 
					
						
							| 
									
										
										
										
											2014-05-16 11:40:40 -06:00
										 |  |  |             with test_util.uncache('spam'): | 
					
						
							| 
									
										
										
										
											2022-05-17 00:05:47 +01:00
										 |  |  |                 with test_util.import_state(path=[cwd]): | 
					
						
							|  |  |  |                     self.init._bootstrap_external._install(self.init._bootstrap) | 
					
						
							| 
									
										
										
										
											2013-11-22 09:05:39 -07:00
										 |  |  |                     # Start as a namespace package. | 
					
						
							| 
									
										
										
										
											2013-10-31 22:22:15 -06:00
										 |  |  |                     self.init.invalidate_caches() | 
					
						
							|  |  |  |                     bad_path = os.path.join(cwd, name, '__init.py') | 
					
						
							|  |  |  |                     cached = self.util.cache_from_source(bad_path) | 
					
						
							|  |  |  |                     expected = {'__name__': name, | 
					
						
							|  |  |  |                                 '__package__': name, | 
					
						
							|  |  |  |                                 '__doc__': None, | 
					
						
							| 
									
										
										
										
											2018-02-02 15:15:58 -05:00
										 |  |  |                                 '__file__': None, | 
					
						
							| 
									
										
										
										
											2013-10-31 22:22:15 -06:00
										 |  |  |                                 } | 
					
						
							|  |  |  |                     os.mkdir(name) | 
					
						
							| 
									
										
										
										
											2021-04-05 13:11:23 +09:00
										 |  |  |                     with open(bad_path, 'w', encoding='utf-8') as init_file: | 
					
						
							| 
									
										
										
										
											2013-10-31 22:22:15 -06:00
										 |  |  |                         init_file.write('eggs = None') | 
					
						
							|  |  |  |                     module = self.init.import_module(name) | 
					
						
							| 
									
										
										
										
											2014-05-13 12:15:42 -06:00
										 |  |  |                     ns = vars(module).copy() | 
					
						
							| 
									
										
										
										
											2013-10-31 22:22:15 -06:00
										 |  |  |                     loader = ns.pop('__loader__') | 
					
						
							|  |  |  |                     path = ns.pop('__path__') | 
					
						
							| 
									
										
										
										
											2013-11-22 09:05:39 -07:00
										 |  |  |                     spec = ns.pop('__spec__') | 
					
						
							| 
									
										
										
										
											2014-05-13 12:15:42 -06:00
										 |  |  |                     ns.pop('__builtins__', None)  # An implementation detail. | 
					
						
							| 
									
										
										
										
											2013-11-22 09:05:39 -07:00
										 |  |  |                     self.assertEqual(spec.name, name) | 
					
						
							| 
									
										
										
										
											2018-02-02 15:15:58 -05:00
										 |  |  |                     self.assertIsNotNone(spec.loader) | 
					
						
							|  |  |  |                     self.assertIsNotNone(loader) | 
					
						
							|  |  |  |                     self.assertEqual(spec.loader, loader) | 
					
						
							| 
									
										
										
										
											2013-10-31 23:44:31 -06:00
										 |  |  |                     self.assertEqual(set(path), | 
					
						
							|  |  |  |                                      set([os.path.dirname(bad_path)])) | 
					
						
							| 
									
										
										
										
											2013-10-31 22:22:15 -06:00
										 |  |  |                     with self.assertRaises(AttributeError): | 
					
						
							|  |  |  |                         # a NamespaceLoader | 
					
						
							|  |  |  |                         loader.path | 
					
						
							|  |  |  |                     self.assertEqual(ns, expected) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-22 09:05:39 -07:00
										 |  |  |                     # Change to a regular package. | 
					
						
							| 
									
										
										
										
											2013-10-31 22:22:15 -06:00
										 |  |  |                     self.init.invalidate_caches() | 
					
						
							|  |  |  |                     init_path = os.path.join(cwd, name, '__init__.py') | 
					
						
							|  |  |  |                     cached = self.util.cache_from_source(init_path) | 
					
						
							|  |  |  |                     expected = {'__name__': name, | 
					
						
							|  |  |  |                                 '__package__': name, | 
					
						
							|  |  |  |                                 '__file__': init_path, | 
					
						
							|  |  |  |                                 '__cached__': cached, | 
					
						
							|  |  |  |                                 '__path__': [os.path.dirname(init_path)], | 
					
						
							|  |  |  |                                 '__doc__': None, | 
					
						
							|  |  |  |                                 'eggs': None, | 
					
						
							|  |  |  |                                 } | 
					
						
							|  |  |  |                     os.rename(bad_path, init_path) | 
					
						
							|  |  |  |                     reloaded = self.init.reload(module) | 
					
						
							| 
									
										
										
										
											2014-05-13 12:15:42 -06:00
										 |  |  |                     ns = vars(reloaded).copy() | 
					
						
							| 
									
										
										
										
											2013-10-31 22:22:15 -06:00
										 |  |  |                     loader = ns.pop('__loader__') | 
					
						
							| 
									
										
										
										
											2013-11-22 09:05:39 -07:00
										 |  |  |                     spec = ns.pop('__spec__') | 
					
						
							| 
									
										
										
										
											2014-05-13 12:15:42 -06:00
										 |  |  |                     ns.pop('__builtins__', None)  # An implementation detail. | 
					
						
							| 
									
										
										
										
											2013-11-22 09:05:39 -07:00
										 |  |  |                     self.assertEqual(spec.name, name) | 
					
						
							|  |  |  |                     self.assertEqual(spec.loader, loader) | 
					
						
							| 
									
										
										
										
											2013-10-31 22:22:15 -06:00
										 |  |  |                     self.assertIs(reloaded, module) | 
					
						
							|  |  |  |                     self.assertEqual(loader.path, init_path) | 
					
						
							|  |  |  |                     self.assertEqual(ns, expected) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-09 19:59:10 -07:00
										 |  |  |     def test_reload_submodule(self): | 
					
						
							|  |  |  |         # See #19851. | 
					
						
							|  |  |  |         name = 'spam' | 
					
						
							|  |  |  |         subname = 'ham' | 
					
						
							| 
									
										
										
										
											2014-05-16 11:40:40 -06:00
										 |  |  |         with test_util.temp_module(name, pkg=True) as pkg_dir: | 
					
						
							|  |  |  |             fullname, _ = test_util.submodule(name, subname, pkg_dir) | 
					
						
							| 
									
										
										
										
											2013-12-09 19:59:10 -07:00
										 |  |  |             ham = self.init.import_module(fullname) | 
					
						
							|  |  |  |             reloaded = self.init.reload(ham) | 
					
						
							|  |  |  |             self.assertIs(reloaded, ham) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-25 03:49:50 +05:30
										 |  |  |     def test_module_missing_spec(self): | 
					
						
							|  |  |  |         #Test that reload() throws ModuleNotFounderror when reloading | 
					
						
							| 
									
										
										
										
											2019-09-13 18:27:59 +01:00
										 |  |  |         # a module whose missing a spec. (bpo-29851) | 
					
						
							| 
									
										
										
										
											2017-05-25 03:49:50 +05:30
										 |  |  |         name = 'spam' | 
					
						
							|  |  |  |         with test_util.uncache(name): | 
					
						
							|  |  |  |             module = sys.modules[name] = types.ModuleType(name) | 
					
						
							|  |  |  |             # Sanity check by attempting an import. | 
					
						
							|  |  |  |             module = self.init.import_module(name) | 
					
						
							|  |  |  |             self.assertIsNone(module.__spec__) | 
					
						
							|  |  |  |             with self.assertRaises(ModuleNotFoundError): | 
					
						
							|  |  |  |                 self.init.reload(module) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-31 22:22:15 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-16 11:40:40 -06:00
										 |  |  | (Frozen_ReloadTests, | 
					
						
							|  |  |  |  Source_ReloadTests | 
					
						
							| 
									
										
										
										
											2023-05-03 04:55:22 -07:00
										 |  |  |  ) = test_util.test_both( | 
					
						
							|  |  |  |      ReloadTests, init=init, util=util, machinery=machinery) | 
					
						
							| 
									
										
										
										
											2013-06-14 15:04:26 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-18 10:45:59 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | class InvalidateCacheTests: | 
					
						
							| 
									
										
										
										
											2012-02-27 18:15:42 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_method_called(self): | 
					
						
							|  |  |  |         # If defined the method should be called. | 
					
						
							|  |  |  |         class InvalidatingNullFinder: | 
					
						
							|  |  |  |             def __init__(self, *ignored): | 
					
						
							|  |  |  |                 self.called = False | 
					
						
							|  |  |  |             def invalidate_caches(self): | 
					
						
							|  |  |  |                 self.called = True | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-10 23:56:26 +02:00
										 |  |  |         key = os.path.abspath('gobledeegook') | 
					
						
							| 
									
										
										
										
											2012-08-10 12:21:12 -04:00
										 |  |  |         meta_ins = InvalidatingNullFinder() | 
					
						
							|  |  |  |         path_ins = InvalidatingNullFinder() | 
					
						
							|  |  |  |         sys.meta_path.insert(0, meta_ins) | 
					
						
							| 
									
										
										
										
											2012-02-27 18:15:42 -05:00
										 |  |  |         self.addCleanup(lambda: sys.path_importer_cache.__delitem__(key)) | 
					
						
							| 
									
										
										
										
											2012-08-10 12:21:12 -04:00
										 |  |  |         sys.path_importer_cache[key] = path_ins | 
					
						
							|  |  |  |         self.addCleanup(lambda: sys.meta_path.remove(meta_ins)) | 
					
						
							| 
									
										
										
										
											2013-10-18 10:45:59 -04:00
										 |  |  |         self.init.invalidate_caches() | 
					
						
							| 
									
										
										
										
											2012-08-10 12:21:12 -04:00
										 |  |  |         self.assertTrue(meta_ins.called) | 
					
						
							|  |  |  |         self.assertTrue(path_ins.called) | 
					
						
							| 
									
										
										
										
											2012-02-27 18:15:42 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_method_lacking(self): | 
					
						
							|  |  |  |         # There should be no issues if the method is not defined. | 
					
						
							|  |  |  |         key = 'gobbledeegook' | 
					
						
							| 
									
										
										
										
											2013-06-15 18:39:21 -04:00
										 |  |  |         sys.path_importer_cache[key] = None | 
					
						
							| 
									
										
										
										
											2018-04-06 16:10:18 -07:00
										 |  |  |         self.addCleanup(lambda: sys.path_importer_cache.pop(key, None)) | 
					
						
							| 
									
										
										
										
											2013-10-18 10:45:59 -04:00
										 |  |  |         self.init.invalidate_caches()  # Shouldn't trigger an exception. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-16 11:40:40 -06:00
										 |  |  | (Frozen_InvalidateCacheTests, | 
					
						
							|  |  |  |  Source_InvalidateCacheTests | 
					
						
							| 
									
										
										
										
											2023-05-03 04:55:22 -07:00
										 |  |  |  ) = test_util.test_both( | 
					
						
							|  |  |  |      InvalidateCacheTests, init=init, util=util, machinery=machinery) | 
					
						
							| 
									
										
										
										
											2012-02-27 18:15:42 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-02 14:53:10 -04:00
										 |  |  | class FrozenImportlibTests(unittest.TestCase): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_no_frozen_importlib(self): | 
					
						
							|  |  |  |         # Should be able to import w/o _frozen_importlib being defined. | 
					
						
							| 
									
										
										
										
											2013-10-18 10:45:59 -04:00
										 |  |  |         # Can't do an isinstance() check since separate copies of importlib | 
					
						
							|  |  |  |         # may have been used for import, so just check the name is not for the | 
					
						
							|  |  |  |         # frozen loader. | 
					
						
							| 
									
										
										
										
											2014-05-16 11:40:40 -06:00
										 |  |  |         source_init = init['Source'] | 
					
						
							| 
									
										
										
										
											2013-10-18 10:45:59 -04:00
										 |  |  |         self.assertNotEqual(source_init.__loader__.__class__.__name__, | 
					
						
							|  |  |  |                             'FrozenImporter') | 
					
						
							| 
									
										
										
										
											2012-07-02 14:53:10 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-18 10:45:59 -04:00
										 |  |  | class StartupTests: | 
					
						
							| 
									
										
										
										
											2013-02-01 14:43:59 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_everyone_has___loader__(self): | 
					
						
							|  |  |  |         # Issue #17098: all modules should have __loader__ defined. | 
					
						
							|  |  |  |         for name, module in sys.modules.items(): | 
					
						
							|  |  |  |             if isinstance(module, types.ModuleType): | 
					
						
							| 
									
										
										
										
											2013-11-22 09:05:39 -07:00
										 |  |  |                 with self.subTest(name=name): | 
					
						
							|  |  |  |                     self.assertTrue(hasattr(module, '__loader__'), | 
					
						
							|  |  |  |                                     '{!r} lacks a __loader__ attribute'.format(name)) | 
					
						
							| 
									
										
										
										
											2021-04-06 08:56:57 -07:00
										 |  |  |                     if self.machinery.BuiltinImporter.find_spec(name): | 
					
						
							| 
									
										
										
										
											2013-11-22 09:05:39 -07:00
										 |  |  |                         self.assertIsNot(module.__loader__, None) | 
					
						
							| 
									
										
										
										
											2021-04-06 08:56:57 -07:00
										 |  |  |                     elif self.machinery.FrozenImporter.find_spec(name): | 
					
						
							| 
									
										
										
										
											2013-11-22 09:05:39 -07:00
										 |  |  |                         self.assertIsNot(module.__loader__, None) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_everyone_has___spec__(self): | 
					
						
							|  |  |  |         for name, module in sys.modules.items(): | 
					
						
							|  |  |  |             if isinstance(module, types.ModuleType): | 
					
						
							|  |  |  |                 with self.subTest(name=name): | 
					
						
							|  |  |  |                     self.assertTrue(hasattr(module, '__spec__')) | 
					
						
							| 
									
										
										
										
											2021-04-06 08:56:57 -07:00
										 |  |  |                     if self.machinery.BuiltinImporter.find_spec(name): | 
					
						
							| 
									
										
										
										
											2013-11-22 09:05:39 -07:00
										 |  |  |                         self.assertIsNot(module.__spec__, None) | 
					
						
							| 
									
										
										
										
											2021-04-06 08:56:57 -07:00
										 |  |  |                     elif self.machinery.FrozenImporter.find_spec(name): | 
					
						
							| 
									
										
										
										
											2013-11-22 09:05:39 -07:00
										 |  |  |                         self.assertIsNot(module.__spec__, None) | 
					
						
							| 
									
										
										
										
											2009-01-18 00:24:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-18 10:45:59 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-16 11:40:40 -06:00
										 |  |  | (Frozen_StartupTests, | 
					
						
							|  |  |  |  Source_StartupTests | 
					
						
							|  |  |  |  ) = test_util.test_both(StartupTests, machinery=machinery) | 
					
						
							| 
									
										
										
										
											2013-10-18 10:45:59 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-18 00:24:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | if __name__ == '__main__': | 
					
						
							| 
									
										
										
										
											2013-02-01 14:51:43 -05:00
										 |  |  |     unittest.main() |