Commit 37148b27 authored by Eric Snow's avatar Eric Snow

Issue #19708: Update pkgutil to use the new importer APIs.

parent 335e14dd
...@@ -16,6 +16,21 @@ __all__ = [ ...@@ -16,6 +16,21 @@ __all__ = [
'ImpImporter', 'ImpLoader', 'read_code', 'extend_path', 'ImpImporter', 'ImpLoader', 'read_code', 'extend_path',
] ]
def _get_spec(finder, name):
"""Return the finder-specific module spec."""
# Works with legacy finders.
try:
find_spec = finder.find_spec
except AttributeError:
loader = finder.find_module(name)
if loader is None:
return None
return importlib.util.spec_from_loader(name, loader)
else:
return find_spec(name)
def read_code(stream): def read_code(stream):
# This helper is needed in order for the PEP 302 emulation to # This helper is needed in order for the PEP 302 emulation to
# correctly handle compiled files # correctly handle compiled files
...@@ -326,9 +341,10 @@ class ImpLoader: ...@@ -326,9 +341,10 @@ class ImpLoader:
self.source = self._get_delegate().get_source() self.source = self._get_delegate().get_source()
return self.source return self.source
def _get_delegate(self): def _get_delegate(self):
return ImpImporter(self.filename).find_module('__init__') finder = ImpImporter(self.filename)
spec = _get_spec(finder, '__init__')
return spec.loader
def get_filename(self, fullname=None): def get_filename(self, fullname=None):
fullname = self._fix_name(fullname) fullname = self._fix_name(fullname)
......
...@@ -2,6 +2,7 @@ from test.support import run_unittest, unload, check_warnings ...@@ -2,6 +2,7 @@ from test.support import run_unittest, unload, check_warnings
import unittest import unittest
import sys import sys
import importlib import importlib
from importlib.util import spec_from_file_location
import pkgutil import pkgutil
import os import os
import os.path import os.path
...@@ -103,23 +104,20 @@ class PkgutilTests(unittest.TestCase): ...@@ -103,23 +104,20 @@ class PkgutilTests(unittest.TestCase):
class PkgutilPEP302Tests(unittest.TestCase): class PkgutilPEP302Tests(unittest.TestCase):
class MyTestLoader(object): class MyTestLoader(object):
def load_module(self, fullname): def exec_module(self, mod):
# Create an empty module
mod = sys.modules.setdefault(fullname, types.ModuleType(fullname))
mod.__file__ = "<%s>" % self.__class__.__name__
mod.__loader__ = self
# Make it a package
mod.__path__ = []
# Count how many times the module is reloaded # Count how many times the module is reloaded
mod.__dict__['loads'] = mod.__dict__.get('loads',0) + 1 mod.__dict__['loads'] = mod.__dict__.get('loads', 0) + 1
return mod
def get_data(self, path): def get_data(self, path):
return "Hello, world!" return "Hello, world!"
class MyTestImporter(object): class MyTestImporter(object):
def find_module(self, fullname, path=None): def find_spec(self, fullname, path=None, target=None):
return PkgutilPEP302Tests.MyTestLoader() loader = PkgutilPEP302Tests.MyTestLoader()
return spec_from_file_location(fullname,
'<%s>' % loader.__class__.__name__,
loader=loader,
submodule_search_locations=[])
def setUp(self): def setUp(self):
sys.meta_path.insert(0, self.MyTestImporter()) sys.meta_path.insert(0, self.MyTestImporter())
...@@ -210,7 +208,8 @@ class ExtendPathTests(unittest.TestCase): ...@@ -210,7 +208,8 @@ class ExtendPathTests(unittest.TestCase):
importers = list(iter_importers(fullname)) importers = list(iter_importers(fullname))
expected_importer = get_importer(pathitem) expected_importer = get_importer(pathitem)
for finder in importers: for finder in importers:
loader = finder.find_module(fullname) spec = pkgutil._get_spec(finder, fullname)
loader = spec.loader
try: try:
loader = loader.loader loader = loader.loader
except AttributeError: except AttributeError:
...@@ -221,7 +220,7 @@ class ExtendPathTests(unittest.TestCase): ...@@ -221,7 +220,7 @@ class ExtendPathTests(unittest.TestCase):
self.assertEqual(finder, expected_importer) self.assertEqual(finder, expected_importer)
self.assertIsInstance(loader, self.assertIsInstance(loader,
importlib.machinery.SourceFileLoader) importlib.machinery.SourceFileLoader)
self.assertIsNone(finder.find_module(pkgname)) self.assertIsNone(pkgutil._get_spec(finder, pkgname))
with self.assertRaises(ImportError): with self.assertRaises(ImportError):
list(iter_importers('invalid.module')) list(iter_importers('invalid.module'))
......
...@@ -257,6 +257,8 @@ Library ...@@ -257,6 +257,8 @@ Library
- Issue #19713: Move away from using find_module/load_module. - Issue #19713: Move away from using find_module/load_module.
- Issue #19708: Update pkgutil to use the new importer APIs.
- Issue #19851: Fixed a regression in reloading sub-modules. - Issue #19851: Fixed a regression in reloading sub-modules.
- ssl.create_default_context() sets OP_NO_COMPRESSION to prevent CRIME. - ssl.create_default_context() sets OP_NO_COMPRESSION to prevent CRIME.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment