merge for issue #18351.

This commit is contained in:
Brett Cannon 2013-07-06 18:04:41 -04:00
commit 7e5d55705c
5 changed files with 843 additions and 807 deletions

View file

@ -443,16 +443,14 @@ def _get_sourcefile(bytecode_path):
""" """
if len(bytecode_path) == 0: if len(bytecode_path) == 0:
return None return None
rest, _, extension = bytecode_path.rparition('.') rest, _, extension = bytecode_path.rpartition('.')
if not rest or extension.lower()[-3:-1] != '.py': if not rest or extension.lower()[-3:-1] != 'py':
return bytecode_path return bytecode_path
try: try:
source_path = source_from_cache(bytecode_path) source_path = source_from_cache(bytecode_path)
except (NotImplementedError, ValueError): except (NotImplementedError, ValueError):
source_path = bytcode_path[-1:] source_path = bytecode_path[:-1]
return source_path if _path_isfile(source_path) else bytecode_path
return source_path if _path_isfile(source_stats) else bytecode_path
def _calc_mode(path): def _calc_mode(path):

View file

@ -1,6 +1,7 @@
# We import importlib *ASAP* in order to test #15386 # We import importlib *ASAP* in order to test #15386
import importlib import importlib
import importlib.util import importlib.util
from importlib._bootstrap import _get_sourcefile
import builtins import builtins
from test.test_importlib.import_ import util as importlib_util from test.test_importlib.import_ import util as importlib_util
import marshal import marshal
@ -11,6 +12,7 @@ import random
import stat import stat
import sys import sys
import unittest import unittest
import unittest.mock as mock
import textwrap import textwrap
import errno import errno
import shutil import shutil
@ -851,6 +853,40 @@ class ImportlibBootstrapTests(unittest.TestCase):
self.assertIs(machinery.FileFinder, mod.FileFinder) self.assertIs(machinery.FileFinder, mod.FileFinder)
@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): class ImportTracebackTests(unittest.TestCase):
def setUp(self): def setUp(self):

View file

@ -808,6 +808,7 @@ Laura Matson
Graham Matthews Graham Matthews
Dieter Maurer Dieter Maurer
Daniel May Daniel May
Madison May
Lucas Maystre Lucas Maystre
Arnaud Mazin Arnaud Mazin
Rebecca McCreary Rebecca McCreary

View file

@ -542,6 +542,9 @@ Documentation
C-API C-API
----- -----
- Issue #18351: Fix various issues in a function in importlib provided to help
PyImport_ExecCodeModuleWithPathnames() (and thus by extension PyImport_ExecCodeModule() and PyImport_ExecCodeModuleEx()).
- Issue #9369: The types of `char*` arguments of PyObject_CallFunction() and - Issue #9369: The types of `char*` arguments of PyObject_CallFunction() and
PyObject_CallMethod() now changed to `const char*`. Based on patches by PyObject_CallMethod() now changed to `const char*`. Based on patches by
Jörg Müller and Lars Buitinck. Jörg Müller and Lars Buitinck.

File diff suppressed because it is too large Load diff