|
14 | 14 |
|
15 | 15 | frozen_init, source_init = util.import_importlib('importlib') |
16 | 16 | frozen_abc, source_abc = util.import_importlib('importlib.abc') |
| 17 | +machinery = util.import_importlib('importlib.machinery') |
17 | 18 | frozen_util, source_util = util.import_importlib('importlib.util') |
18 | 19 |
|
19 | 20 | ##### Inheritance ############################################################## |
@@ -285,6 +286,137 @@ def test_get_filename(self): |
285 | 286 | tests = make_return_value_tests(ExecutionLoader, InspectLoaderDefaultsTests) |
286 | 287 | Frozen_ELDefaultTests, Source_ELDefaultsTests = tests |
287 | 288 |
|
| 289 | +##### MetaPathFinder concrete methods ########################################## |
| 290 | + |
| 291 | +class MetaPathFinderFindModuleTests: |
| 292 | + |
| 293 | + @classmethod |
| 294 | + def finder(cls, spec): |
| 295 | + class MetaPathSpecFinder(cls.abc.MetaPathFinder): |
| 296 | + |
| 297 | + def find_spec(self, fullname, path, target=None): |
| 298 | + self.called_for = fullname, path |
| 299 | + return spec |
| 300 | + |
| 301 | + return MetaPathSpecFinder() |
| 302 | + |
| 303 | + def test_no_spec(self): |
| 304 | + finder = self.finder(None) |
| 305 | + path = ['a', 'b', 'c'] |
| 306 | + name = 'blah' |
| 307 | + found = finder.find_module(name, path) |
| 308 | + self.assertIsNone(found) |
| 309 | + self.assertEqual(name, finder.called_for[0]) |
| 310 | + self.assertEqual(path, finder.called_for[1]) |
| 311 | + |
| 312 | + def test_spec(self): |
| 313 | + loader = object() |
| 314 | + spec = self.util.spec_from_loader('blah', loader) |
| 315 | + finder = self.finder(spec) |
| 316 | + found = finder.find_module('blah', None) |
| 317 | + self.assertIs(found, spec.loader) |
| 318 | + |
| 319 | + |
| 320 | +Frozen_MPFFindModuleTests, Source_MPFFindModuleTests = util.test_both( |
| 321 | + MetaPathFinderFindModuleTests, |
| 322 | + abc=(frozen_abc, source_abc), |
| 323 | + util=(frozen_util, source_util)) |
| 324 | + |
| 325 | +##### PathEntryFinder concrete methods ######################################### |
| 326 | + |
| 327 | +class PathEntryFinderFindLoaderTests: |
| 328 | + |
| 329 | + @classmethod |
| 330 | + def finder(cls, spec): |
| 331 | + class PathEntrySpecFinder(cls.abc.PathEntryFinder): |
| 332 | + |
| 333 | + def find_spec(self, fullname, target=None): |
| 334 | + self.called_for = fullname |
| 335 | + return spec |
| 336 | + |
| 337 | + return PathEntrySpecFinder() |
| 338 | + |
| 339 | + def test_no_spec(self): |
| 340 | + finder = self.finder(None) |
| 341 | + name = 'blah' |
| 342 | + found = finder.find_loader(name) |
| 343 | + self.assertIsNone(found[0]) |
| 344 | + self.assertEqual([], found[1]) |
| 345 | + self.assertEqual(name, finder.called_for) |
| 346 | + |
| 347 | + def test_spec_with_loader(self): |
| 348 | + loader = object() |
| 349 | + spec = self.util.spec_from_loader('blah', loader) |
| 350 | + finder = self.finder(spec) |
| 351 | + found = finder.find_loader('blah') |
| 352 | + self.assertIs(found[0], spec.loader) |
| 353 | + |
| 354 | + def test_spec_with_portions(self): |
| 355 | + spec = self.machinery.ModuleSpec('blah', None) |
| 356 | + paths = ['a', 'b', 'c'] |
| 357 | + spec.submodule_search_locations = paths |
| 358 | + finder = self.finder(spec) |
| 359 | + found = finder.find_loader('blah') |
| 360 | + self.assertIsNone(found[0]) |
| 361 | + self.assertEqual(paths, found[1]) |
| 362 | + |
| 363 | + |
| 364 | +Frozen_PEFFindLoaderTests, Source_PEFFindLoaderTests = util.test_both( |
| 365 | + PathEntryFinderFindLoaderTests, |
| 366 | + abc=(frozen_abc, source_abc), |
| 367 | + machinery=machinery, |
| 368 | + util=(frozen_util, source_util)) |
| 369 | + |
| 370 | + |
| 371 | +##### Loader concrete methods ################################################## |
| 372 | +class LoaderLoadModuleTests: |
| 373 | + |
| 374 | + def loader(self): |
| 375 | + class SpecLoader(self.abc.Loader): |
| 376 | + found = None |
| 377 | + def exec_module(self, module): |
| 378 | + self.found = module |
| 379 | + |
| 380 | + def is_package(self, fullname): |
| 381 | + """Force some non-default module state to be set.""" |
| 382 | + return True |
| 383 | + |
| 384 | + return SpecLoader() |
| 385 | + |
| 386 | + def test_fresh(self): |
| 387 | + loader = self.loader() |
| 388 | + name = 'blah' |
| 389 | + with util.uncache(name): |
| 390 | + loader.load_module(name) |
| 391 | + module = loader.found |
| 392 | + self.assertIs(sys.modules[name], module) |
| 393 | + self.assertEqual(loader, module.__loader__) |
| 394 | + self.assertEqual(loader, module.__spec__.loader) |
| 395 | + self.assertEqual(name, module.__name__) |
| 396 | + self.assertEqual(name, module.__spec__.name) |
| 397 | + self.assertIsNotNone(module.__path__) |
| 398 | + self.assertIsNotNone(module.__path__, |
| 399 | + module.__spec__.submodule_search_locations) |
| 400 | + |
| 401 | + def test_reload(self): |
| 402 | + name = 'blah' |
| 403 | + loader = self.loader() |
| 404 | + module = types.ModuleType(name) |
| 405 | + module.__spec__ = self.util.spec_from_loader(name, loader) |
| 406 | + module.__loader__ = loader |
| 407 | + with util.uncache(name): |
| 408 | + sys.modules[name] = module |
| 409 | + loader.load_module(name) |
| 410 | + found = loader.found |
| 411 | + self.assertIs(found, sys.modules[name]) |
| 412 | + self.assertIs(module, sys.modules[name]) |
| 413 | + |
| 414 | + |
| 415 | +Frozen_LoaderLoadModuleTests, Source_LoaderLoadModuleTests = util.test_both( |
| 416 | + LoaderLoadModuleTests, |
| 417 | + abc=(frozen_abc, source_abc), |
| 418 | + util=(frozen_util, source_util)) |
| 419 | + |
288 | 420 |
|
289 | 421 | ##### InspectLoader concrete methods ########################################### |
290 | 422 | class InspectLoaderSourceToCodeTests: |
|
0 commit comments