[Python-checkins] cpython (3.3): Issue #18351: Fix various issues with

brett.cannon python-checkins at python.org
Sun Jul 7 00:05:13 CEST 2013


http://hg.python.org/cpython/rev/b8028f74bac4
changeset:   84467:b8028f74bac4
branch:      3.3
parent:      84462:c8fd1351c840
user:        Brett Cannon <brett at python.org>
date:        Sat Jul 06 17:56:43 2013 -0400
summary:
  Issue #18351: Fix various issues with
importlib._bootstrap._get_sourcefile().

Thanks to its only use by the C API, it was never properly tested
until now.

Thanks to Neal Norwitz for discovering the bug and Madison May for the patch.

files:
  Lib/importlib/_bootstrap.py |    10 +-
  Lib/test/test_import.py     |    38 +-
  Misc/ACKS                   |     1 +
  Misc/NEWS                   |     6 +
  Python/importlib.h          |  6826 +++++++++++-----------
  5 files changed, 3460 insertions(+), 3421 deletions(-)


diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py
--- a/Lib/importlib/_bootstrap.py
+++ b/Lib/importlib/_bootstrap.py
@@ -471,16 +471,14 @@
     """
     if len(bytecode_path) == 0:
         return None
-    rest, _, extension = bytecode_path.rparition('.')
-    if not rest or extension.lower()[-3:-1] != '.py':
+    rest, _, extension = bytecode_path.rpartition('.')
+    if not rest or extension.lower()[-3:-1] != 'py':
         return bytecode_path
-
     try:
         source_path = source_from_cache(bytecode_path)
     except (NotImplementedError, ValueError):
-        source_path = bytcode_path[-1:]
-
-    return source_path if _path_isfile(source_stats) else bytecode_path
+        source_path = bytecode_path[:-1]
+    return source_path if _path_isfile(source_path) else bytecode_path
 
 
 def _verbose_message(message, *args, verbosity=1):
diff --git a/Lib/test/test_import.py b/Lib/test/test_import.py
--- a/Lib/test/test_import.py
+++ b/Lib/test/test_import.py
@@ -1,5 +1,6 @@
 # We import importlib *ASAP* in order to test #15386
 import importlib
+from importlib._bootstrap import _get_sourcefile
 import builtins
 import imp
 from test.test_importlib.import_ import util as importlib_util
@@ -11,6 +12,7 @@
 import stat
 import sys
 import unittest
+import unittest.mock as mock
 import textwrap
 import errno
 import shutil
@@ -864,6 +866,40 @@
         self.assertIs(imp.new_module, mod.new_module)
 
 
+ at cpython_only
+class GetSourcefileTests(unittest.TestCase):
+
+    """Test importlib._bootstrap._get_sourcefile() as used by the C API.
+
+    Because of the peculiarities of the need of this function, the tests are
+    knowingly whitebox tests.
+
+    """
+
+    def test_get_sourcefile(self):
+        # Given a valid bytecode path, return the path to the corresponding
+        # source file if it exists.
+        with mock.patch('importlib._bootstrap._path_isfile') as _path_isfile:
+            _path_isfile.return_value = True;
+            path = TESTFN + '.pyc'
+            expect = TESTFN + '.py'
+            self.assertEqual(_get_sourcefile(path), expect)
+
+    def test_get_sourcefile_no_source(self):
+        # Given a valid bytecode path without a corresponding source path,
+        # return the original bytecode path.
+        with mock.patch('importlib._bootstrap._path_isfile') as _path_isfile:
+            _path_isfile.return_value = False;
+            path = TESTFN + '.pyc'
+            self.assertEqual(_get_sourcefile(path), path)
+
+    def test_get_sourcefile_bad_ext(self):
+        # Given a path with an invalid bytecode extension, return the
+        # bytecode path passed as the argument.
+        path = TESTFN + '.bad_ext'
+        self.assertEqual(_get_sourcefile(path), path)
+
+
 class ImportTracebackTests(unittest.TestCase):
 
     def setUp(self):
@@ -1028,7 +1064,7 @@
     run_unittest(ImportTests, PycacheTests, FilePermissionTests,
                  PycRewritingTests, PathsTests, RelativeImportTests,
                  OverridingImportBuiltinTests,
-                 ImportlibBootstrapTests,
+                 ImportlibBootstrapTests, GetSourcefileTests,
                  TestSymbolicallyLinkedPackage,
                  ImportTracebackTests)
 
diff --git a/Misc/ACKS b/Misc/ACKS
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -788,6 +788,7 @@
 Graham Matthews
 Dieter Maurer
 Daniel May
+Madison May
 Arnaud Mazin
 Rebecca McCreary
 Kirk McDonald
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -130,6 +130,12 @@
 - Issue #18113: Fixed a refcount leak in the curses.panel module's
   set_userptr() method.  Reported by Atsuo Ishimoto.
 
+C API
+-----
+
+- Issue #18351: Fix various issues with a helper function in importlib used
+  by PyImport_ExecCodeModuleWithPathnames() (and thus by extension PyImport_ExecCodeModule() and PyImport_ExecCodeModuleEx()).
+
 IDLE
 ----
 
diff --git a/Python/importlib.h b/Python/importlib.h
--- a/Python/importlib.h
+++ b/Python/importlib.h
[stripped]

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


More information about the Python-checkins mailing list