1f254a75176928e1d1228a5d20d49fbe2fe9f290aBrett Cannonfrom .. import abc 29ea8eda127b824f9cffb64deadbb420244a301c2Brett Cannonfrom .. import util 3fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon 49ea8eda127b824f9cffb64deadbb420244a301c2Brett Cannonmachinery = util.import_importlib('importlib.machinery') 59ea8eda127b824f9cffb64deadbb420244a301c2Brett Cannon 628a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsawimport errno 7fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannonimport os 823cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannonimport py_compile 9a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannonimport stat 10a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannonimport sys 11a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannonimport tempfile 12fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannonfrom test.support import make_legacy_pyc 1323cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannonimport unittest 1423cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannonimport warnings 1523cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon 1623cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon 179ea8eda127b824f9cffb64deadbb420244a301c2Brett Cannonclass FinderTests(abc.FinderTests): 1823cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon 1923cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon """For a top-level module, it should just be found directly in the 2023cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon directory being searched. This is true for a directory with source 2123cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon [top-level source], bytecode [top-level bc], or both [top-level both]. 2223cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon There is also the possibility that it is a package [top-level package], in 2323cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon which case there will be a directory with the module name and an 2423cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon __init__.py file. If there is a directory without an __init__.py an 2523cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon ImportWarning is returned [empty dir]. 2623cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon 2723cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon For sub-modules and sub-packages, the same happens as above but only use 2823cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon the tail end of the name [sub module] [sub package] [sub empty]. 2923cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon 3023cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon When there is a conflict between a package and module having the same name 3123cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon in the same directory, the package wins out [package over module]. This is 3223cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon so that imports of modules within the package can occur rather than trigger 3323cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon an import error. 3423cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon 3523cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon When there is a package and module with the same name, always pick the 3623cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon package over the module [package over module]. This is so that imports from 3723cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon the package have the possibility of succeeding. 3823cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon 3923cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon """ 4023cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon 4148fec0539157db38a993ededb32a8f312ec09fb9Nick Coghlan def get_finder(self, root): 429ea8eda127b824f9cffb64deadbb420244a301c2Brett Cannon loader_details = [(self.machinery.SourceFileLoader, 439ea8eda127b824f9cffb64deadbb420244a301c2Brett Cannon self.machinery.SOURCE_SUFFIXES), 449ea8eda127b824f9cffb64deadbb420244a301c2Brett Cannon (self.machinery.SourcelessFileLoader, 459ea8eda127b824f9cffb64deadbb420244a301c2Brett Cannon self.machinery.BYTECODE_SUFFIXES)] 469ea8eda127b824f9cffb64deadbb420244a301c2Brett Cannon return self.machinery.FileFinder(root, *loader_details) 4748fec0539157db38a993ededb32a8f312ec09fb9Nick Coghlan 481500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow def import_(self, root, module): 491500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow finder = self.get_finder(root) 501500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow return self._find(finder, module, loader_only=True) 511500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow 5223cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon def run_test(self, test, create=None, *, compile_=None, unlink=None): 5323cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon """Test the finding of 'test' with the creation of modules listed in 5423cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon 'create'. 5523cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon 5623cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon Any names listed in 'compile_' are byte-compiled. Modules 5723cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon listed in 'unlink' have their source files deleted. 5823cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon 5923cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon """ 6023cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon if create is None: 6123cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon create = {test} 62732ac654c8a3e5f9048a53efaee7380e1775a630Brett Cannon with util.create_modules(*create) as mapping: 6323cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon if compile_: 6423cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon for name in compile_: 6523cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon py_compile.compile(mapping[name]) 6623cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon if unlink: 6723cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon for name in unlink: 6823cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon os.unlink(mapping[name]) 6928a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw try: 7028a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw make_legacy_pyc(mapping[name]) 7128a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw except OSError as error: 7228a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw # Some tests do not set compile_=True so the source 7328a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw # module will not get compiled and there will be no 7428a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw # PEP 3147 pyc file to rename. 7528a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw if error.errno != errno.ENOENT: 7628a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw raise 7723cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon loader = self.import_(mapping['.root'], test) 78c9c0f201fed21efcf669dbbf5f923eaf0eeb1db9Benjamin Peterson self.assertTrue(hasattr(loader, 'load_module')) 7923cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon return loader 8023cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon 8123cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon def test_module(self): 8223cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon # [top-level source] 8323cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon self.run_test('top_level') 8423cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon # [top-level bc] 8528a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw self.run_test('top_level', compile_={'top_level'}, 8628a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw unlink={'top_level'}) 8723cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon # [top-level both] 8823cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon self.run_test('top_level', compile_={'top_level'}) 8923cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon 9023cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon # [top-level package] 9123cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon def test_package(self): 9223cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon # Source. 9323cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon self.run_test('pkg', {'pkg.__init__'}) 9423cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon # Bytecode. 9523cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon self.run_test('pkg', {'pkg.__init__'}, compile_={'pkg.__init__'}, 9623cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon unlink={'pkg.__init__'}) 9723cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon # Both. 9823cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon self.run_test('pkg', {'pkg.__init__'}, compile_={'pkg.__init__'}) 9923cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon 10023cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon # [sub module] 10123cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon def test_module_in_package(self): 102732ac654c8a3e5f9048a53efaee7380e1775a630Brett Cannon with util.create_modules('pkg.__init__', 'pkg.sub') as mapping: 10323cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon pkg_dir = os.path.dirname(mapping['pkg.__init__']) 10423cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon loader = self.import_(pkg_dir, 'pkg.sub') 105c9c0f201fed21efcf669dbbf5f923eaf0eeb1db9Benjamin Peterson self.assertTrue(hasattr(loader, 'load_module')) 10623cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon 10723cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon # [sub package] 10823cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon def test_package_in_package(self): 109732ac654c8a3e5f9048a53efaee7380e1775a630Brett Cannon context = util.create_modules('pkg.__init__', 'pkg.sub.__init__') 11023cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon with context as mapping: 11123cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon pkg_dir = os.path.dirname(mapping['pkg.__init__']) 11223cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon loader = self.import_(pkg_dir, 'pkg.sub') 113c9c0f201fed21efcf669dbbf5f923eaf0eeb1db9Benjamin Peterson self.assertTrue(hasattr(loader, 'load_module')) 11423cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon 11523cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon # [package over modules] 11623cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon def test_package_over_module(self): 11723cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon name = '_temp' 11823cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon loader = self.run_test(name, {'{0}.__init__'.format(name), name}) 119e51a36922ffcce8c5e45cc88dc95a9d33ead0f11Eric V. Smith self.assertIn('__init__', loader.get_filename(name)) 12023cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon 12123cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon def test_failure(self): 122732ac654c8a3e5f9048a53efaee7380e1775a630Brett Cannon with util.create_modules('blah') as mapping: 12323cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon nothing = self.import_(mapping['.root'], 'sdfsadsadf') 124b10951549b5f49849d44cdbac02c35146d5d05d3Eric V. Smith self.assertIsNone(nothing) 12523cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon 126d71bed3d76cc90dac24f88197bd37fdc2063330dBrett Cannon def test_empty_string_for_dir(self): 127d71bed3d76cc90dac24f88197bd37fdc2063330dBrett Cannon # The empty string from sys.path means to search in the cwd. 1289ea8eda127b824f9cffb64deadbb420244a301c2Brett Cannon finder = self.machinery.FileFinder('', (self.machinery.SourceFileLoader, 1299ea8eda127b824f9cffb64deadbb420244a301c2Brett Cannon self.machinery.SOURCE_SUFFIXES)) 130d71bed3d76cc90dac24f88197bd37fdc2063330dBrett Cannon with open('mod.py', 'w') as file: 131d71bed3d76cc90dac24f88197bd37fdc2063330dBrett Cannon file.write("# test file for importlib") 132d71bed3d76cc90dac24f88197bd37fdc2063330dBrett Cannon try: 1331500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow loader = self._find(finder, 'mod', loader_only=True) 134d71bed3d76cc90dac24f88197bd37fdc2063330dBrett Cannon self.assertTrue(hasattr(loader, 'load_module')) 135d71bed3d76cc90dac24f88197bd37fdc2063330dBrett Cannon finally: 136d71bed3d76cc90dac24f88197bd37fdc2063330dBrett Cannon os.unlink('mod.py') 137d71bed3d76cc90dac24f88197bd37fdc2063330dBrett Cannon 138b46a1793a787747d59e735e12471b3a309aa51daBrett Cannon def test_invalidate_caches(self): 139b46a1793a787747d59e735e12471b3a309aa51daBrett Cannon # invalidate_caches() should reset the mtime. 1409ea8eda127b824f9cffb64deadbb420244a301c2Brett Cannon finder = self.machinery.FileFinder('', (self.machinery.SourceFileLoader, 1419ea8eda127b824f9cffb64deadbb420244a301c2Brett Cannon self.machinery.SOURCE_SUFFIXES)) 142b46a1793a787747d59e735e12471b3a309aa51daBrett Cannon finder._path_mtime = 42 143b46a1793a787747d59e735e12471b3a309aa51daBrett Cannon finder.invalidate_caches() 144b46a1793a787747d59e735e12471b3a309aa51daBrett Cannon self.assertEqual(finder._path_mtime, -1) 145b46a1793a787747d59e735e12471b3a309aa51daBrett Cannon 14648fec0539157db38a993ededb32a8f312ec09fb9Nick Coghlan # Regression test for http://bugs.python.org/issue14846 14748fec0539157db38a993ededb32a8f312ec09fb9Nick Coghlan def test_dir_removal_handling(self): 14848fec0539157db38a993ededb32a8f312ec09fb9Nick Coghlan mod = 'mod' 149732ac654c8a3e5f9048a53efaee7380e1775a630Brett Cannon with util.create_modules(mod) as mapping: 15048fec0539157db38a993ededb32a8f312ec09fb9Nick Coghlan finder = self.get_finder(mapping['.root']) 1511500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow found = self._find(finder, 'mod', loader_only=True) 1521500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow self.assertIsNotNone(found) 1531500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow found = self._find(finder, 'mod', loader_only=True) 1541500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow self.assertIsNone(found) 15523cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon 156a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon @unittest.skipUnless(sys.platform != 'win32', 157a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon 'os.chmod() does not support the needed arguments under Windows') 158a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon def test_no_read_directory(self): 159a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon # Issue #16730 160a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon tempdir = tempfile.TemporaryDirectory() 161a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon original_mode = os.stat(tempdir.name).st_mode 162a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon def cleanup(tempdir): 163a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon """Cleanup function for the temporary directory. 164a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon 165a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon Since we muck with the permissions, we want to set them back to 166a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon their original values to make sure the directory can be properly 167a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon cleaned up. 168a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon 169a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon """ 170a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon os.chmod(tempdir.name, original_mode) 171a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon # If this is not explicitly called then the __del__ method is used, 172a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon # but since already mucking around might as well explicitly clean 173a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon # up. 174a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon tempdir.__exit__(None, None, None) 175a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon self.addCleanup(cleanup, tempdir) 176a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon os.chmod(tempdir.name, stat.S_IWUSR | stat.S_IXUSR) 177a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon finder = self.get_finder(tempdir.name) 1781500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow found = self._find(finder, 'doesnotexist') 1791500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow self.assertEqual(found, self.NOT_FOUND) 180a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon 181a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon def test_ignore_file(self): 182a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon # If a directory got changed to a file from underneath us, then don't 183a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon # worry about looking for submodules. 184a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon with tempfile.NamedTemporaryFile() as file_obj: 185a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon finder = self.get_finder(file_obj.name) 1861500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow found = self._find(finder, 'doesnotexist') 1871500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow self.assertEqual(found, self.NOT_FOUND) 1881500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow 189a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon 1902f8c83568ca5850601e92e315c4a1c840e94b1cbBrett Cannonclass FinderTestsPEP451(FinderTests): 1912f8c83568ca5850601e92e315c4a1c840e94b1cbBrett Cannon 1921500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow NOT_FOUND = None 1931500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow 1941500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow def _find(self, finder, name, loader_only=False): 1951500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow spec = finder.find_spec(name) 1961500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow return spec.loader if spec is not None else spec 1972f8c83568ca5850601e92e315c4a1c840e94b1cbBrett Cannon 1983497c0bf957be33c6794a4548cfa53dbb0f9b5dfEric Snow 1993497c0bf957be33c6794a4548cfa53dbb0f9b5dfEric Snow(Frozen_FinderTestsPEP451, 2003497c0bf957be33c6794a4548cfa53dbb0f9b5dfEric Snow Source_FinderTestsPEP451 2013497c0bf957be33c6794a4548cfa53dbb0f9b5dfEric Snow ) = util.test_both(FinderTestsPEP451, machinery=machinery) 2022f8c83568ca5850601e92e315c4a1c840e94b1cbBrett Cannon 2032f8c83568ca5850601e92e315c4a1c840e94b1cbBrett Cannon 2041500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snowclass FinderTestsPEP420(FinderTests): 2051500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow 2061500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow NOT_FOUND = (None, []) 2071500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow 2081500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow def _find(self, finder, name, loader_only=False): 2091500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow with warnings.catch_warnings(): 2101500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow warnings.simplefilter("ignore", DeprecationWarning) 2111500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow loader_portions = finder.find_loader(name) 2121500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow return loader_portions[0] if loader_only else loader_portions 2131500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow 2143497c0bf957be33c6794a4548cfa53dbb0f9b5dfEric Snow 2153497c0bf957be33c6794a4548cfa53dbb0f9b5dfEric Snow(Frozen_FinderTestsPEP420, 2163497c0bf957be33c6794a4548cfa53dbb0f9b5dfEric Snow Source_FinderTestsPEP420 2173497c0bf957be33c6794a4548cfa53dbb0f9b5dfEric Snow ) = util.test_both(FinderTestsPEP420, machinery=machinery) 2181500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow 2191500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow 2202f8c83568ca5850601e92e315c4a1c840e94b1cbBrett Cannonclass FinderTestsPEP302(FinderTests): 2212f8c83568ca5850601e92e315c4a1c840e94b1cbBrett Cannon 2221500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow NOT_FOUND = None 2231500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow 2241500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow def _find(self, finder, name, loader_only=False): 2251500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow with warnings.catch_warnings(): 2261500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow warnings.simplefilter("ignore", DeprecationWarning) 2271500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow return finder.find_module(name) 2282f8c83568ca5850601e92e315c4a1c840e94b1cbBrett Cannon 229a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon 2303497c0bf957be33c6794a4548cfa53dbb0f9b5dfEric Snow(Frozen_FinderTestsPEP302, 2313497c0bf957be33c6794a4548cfa53dbb0f9b5dfEric Snow Source_FinderTestsPEP302 2323497c0bf957be33c6794a4548cfa53dbb0f9b5dfEric Snow ) = util.test_both(FinderTestsPEP302, machinery=machinery) 23323cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon 23423cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon 23523cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannonif __name__ == '__main__': 2369ea8eda127b824f9cffb64deadbb420244a301c2Brett Cannon unittest.main() 237