summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNick Coghlan <ncoghlan@gmail.com>2008-12-15 11:41:05 (GMT)
committerNick Coghlan <ncoghlan@gmail.com>2008-12-15 11:41:05 (GMT)
commit68060013eaa13ddd26bf4eb804d3dce7b29813a9 (patch)
tree7d8ccb45af30f4201fffb3b5f2d15dcf37bebff5
parent60b2e38b68e484830e3e3857197b0d9201c3ac22 (diff)
downloadcpython-68060013eaa13ddd26bf4eb804d3dce7b29813a9.zip
cpython-68060013eaa13ddd26bf4eb804d3dce7b29813a9.tar.gz
cpython-68060013eaa13ddd26bf4eb804d3dce7b29813a9.tar.bz2
Issue #4197: Fix the remaining part of the doctest-in-zipfile problem by giving linecache access to the module globals when available
-rw-r--r--Lib/doctest.py16
-rw-r--r--Lib/test/test_zipimport_support.py29
2 files changed, 42 insertions, 3 deletions
diff --git a/Lib/doctest.py b/Lib/doctest.py
index 8a5a22c..3f2baa5 100644
--- a/Lib/doctest.py
+++ b/Lib/doctest.py
@@ -820,7 +820,15 @@ class DocTestFinder:
# given object's docstring.
try:
file = inspect.getsourcefile(obj) or inspect.getfile(obj)
- source_lines = linecache.getlines(file)
+ if module is not None:
+ # Supply the module globals in case the module was
+ # originally loaded via a PEP 302 loader and
+ # file is not a valid filesystem path
+ source_lines = linecache.getlines(file, module.__dict__)
+ else:
+ # No access to a loader, so assume it's a normal
+ # filesystem path
+ source_lines = linecache.getlines(file)
if not source_lines:
source_lines = None
except TypeError:
@@ -1433,8 +1441,10 @@ class DocTestRunner:
d = self._name2ft
for name, (f, t) in other._name2ft.items():
if name in d:
- print "*** DocTestRunner.merge: '" + name + "' in both" \
- " testers; summing outcomes."
+ # Don't print here by default, since doing
+ # so breaks some of the buildbots
+ #print "*** DocTestRunner.merge: '" + name + "' in both" \
+ # " testers; summing outcomes."
f2, t2 = d[name]
f = f + f2
t = t + t2
diff --git a/Lib/test/test_zipimport_support.py b/Lib/test/test_zipimport_support.py
index 3daf90f..b416b81 100644
--- a/Lib/test/test_zipimport_support.py
+++ b/Lib/test/test_zipimport_support.py
@@ -173,6 +173,35 @@ class ZipSupportTests(ImportHooksBaseTestCase):
for obj in known_good_tests:
_run_object_doctest(obj, test_zipped_doctest)
+ def test_doctest_main_issue4197(self):
+ test_src = textwrap.dedent("""\
+ class Test:
+ ">>> 'line 2'"
+ pass
+
+ import doctest
+ doctest.testmod()
+ """)
+ pattern = 'File "%s", line 2, in %s'
+ with temp_dir() as d:
+ script_name = _make_test_script(d, 'script', test_src)
+ exit_code, data = _run_python(script_name)
+ expected = pattern % (script_name, "__main__.Test")
+ if verbose:
+ print "Expected line", expected
+ print "Got stdout:"
+ print data
+ self.assert_(expected in data)
+ zip_name, run_name = _make_test_zip(d, "test_zip",
+ script_name, '__main__.py')
+ exit_code, data = _run_python(zip_name)
+ expected = pattern % (run_name, "__main__.Test")
+ if verbose:
+ print "Expected line", expected
+ print "Got stdout:"
+ print data
+ self.assert_(expected in data)
+
def test_pdb_issue4201(self):
test_src = textwrap.dedent("""\
def f():