[Python-checkins] cpython: Issue #19708: Update pkgutil to use the new importer APIs.

eric.snow python-checkins at python.org
Sat Jan 4 23:13:54 CET 2014


http://hg.python.org/cpython/rev/acebe574ab08
changeset:   88301:acebe574ab08
user:        Eric Snow <ericsnowcurrently at gmail.com>
date:        Sat Jan 04 15:09:53 2014 -0700
summary:
  Issue #19708: Update pkgutil to use the new importer APIs.

files:
  Lib/pkgutil.py           |  20 ++++++++++++++++++--
  Lib/test/test_pkgutil.py |  25 ++++++++++++-------------
  Misc/NEWS                |   2 ++
  3 files changed, 32 insertions(+), 15 deletions(-)


diff --git a/Lib/pkgutil.py b/Lib/pkgutil.py
--- a/Lib/pkgutil.py
+++ b/Lib/pkgutil.py
@@ -16,6 +16,21 @@
     '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):
     # This helper is needed in order for the PEP 302 emulation to
     # correctly handle compiled files
@@ -326,9 +341,10 @@
                 self.source = self._get_delegate().get_source()
         return self.source
 
-
     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):
         fullname = self._fix_name(fullname)
diff --git a/Lib/test/test_pkgutil.py b/Lib/test/test_pkgutil.py
--- a/Lib/test/test_pkgutil.py
+++ b/Lib/test/test_pkgutil.py
@@ -2,6 +2,7 @@
 import unittest
 import sys
 import importlib
+from importlib.util import spec_from_file_location
 import pkgutil
 import os
 import os.path
@@ -103,23 +104,20 @@
 class PkgutilPEP302Tests(unittest.TestCase):
 
     class MyTestLoader(object):
-        def load_module(self, fullname):
-            # 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__ = []
+        def exec_module(self, mod):
             # Count how many times the module is reloaded
-            mod.__dict__['loads'] = mod.__dict__.get('loads',0) + 1
-            return mod
+            mod.__dict__['loads'] = mod.__dict__.get('loads', 0) + 1
 
         def get_data(self, path):
             return "Hello, world!"
 
     class MyTestImporter(object):
-        def find_module(self, fullname, path=None):
-            return PkgutilPEP302Tests.MyTestLoader()
+        def find_spec(self, fullname, path=None, target=None):
+            loader = PkgutilPEP302Tests.MyTestLoader()
+            return spec_from_file_location(fullname,
+                                           '<%s>' % loader.__class__.__name__,
+                                           loader=loader,
+                                           submodule_search_locations=[])
 
     def setUp(self):
         sys.meta_path.insert(0, self.MyTestImporter())
@@ -210,7 +208,8 @@
             importers = list(iter_importers(fullname))
             expected_importer = get_importer(pathitem)
             for finder in importers:
-                loader = finder.find_module(fullname)
+                spec = pkgutil._get_spec(finder, fullname)
+                loader = spec.loader
                 try:
                     loader = loader.loader
                 except AttributeError:
@@ -221,7 +220,7 @@
                 self.assertEqual(finder, expected_importer)
                 self.assertIsInstance(loader,
                                       importlib.machinery.SourceFileLoader)
-                self.assertIsNone(finder.find_module(pkgname))
+                self.assertIsNone(pkgutil._get_spec(finder, pkgname))
 
             with self.assertRaises(ImportError):
                 list(iter_importers('invalid.module'))
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -257,6 +257,8 @@
 
 - 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.
 
 - ssl.create_default_context() sets OP_NO_COMPRESSION to prevent CRIME.

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list