mirror of
https://github.com/python/cpython.git
synced 2025-09-27 10:50:04 +00:00
Issue #19708: Update pkgutil to use the new importer APIs.
This commit is contained in:
parent
335e14dd1a
commit
37148b27ac
3 changed files with 32 additions and 15 deletions
|
@ -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:
|
||||||
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
|
||||||
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):
|
||||||
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):
|
||||||
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):
|
||||||
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
|
||||||
|
|
||||||
- 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.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue