[Python-checkins] r73389 - in python/branches/py3k: Lib/doctest.py Lib/test/test_doctest.py Misc/NEWS

r.david.murray python-checkins at python.org
Fri Jun 12 17:33:19 CEST 2009


Author: r.david.murray
Date: Fri Jun 12 17:33:19 2009
New Revision: 73389

Log:
Issue #6195: fix doctest to no longer try to read 'source' data from
binary files.



Modified:
   python/branches/py3k/Lib/doctest.py
   python/branches/py3k/Lib/test/test_doctest.py
   python/branches/py3k/Misc/NEWS

Modified: python/branches/py3k/Lib/doctest.py
==============================================================================
--- python/branches/py3k/Lib/doctest.py	(original)
+++ python/branches/py3k/Lib/doctest.py	Fri Jun 12 17:33:19 2009
@@ -812,20 +812,28 @@
         # DocTestFinder._find_lineno to find the line number for a
         # given object's docstring.
         try:
-            file = inspect.getsourcefile(obj) or inspect.getfile(obj)
-            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
+            file = inspect.getsourcefile(obj)
         except TypeError:
             source_lines = None
+        else:
+            if not file:
+                # Check to see if it's one of our special internal "files"
+                # (see __patched_linecache_getlines).
+                file = inspect.getfile(obj)
+                if not file[0]+file[-2:] == '<]>': file = None
+            if file is None: source_lines = None
+            else:
+                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
 
         # Initialize globals, and merge in extraglobs.
         if globs is None:

Modified: python/branches/py3k/Lib/test/test_doctest.py
==============================================================================
--- python/branches/py3k/Lib/test/test_doctest.py	(original)
+++ python/branches/py3k/Lib/test/test_doctest.py	Fri Jun 12 17:33:19 2009
@@ -2288,6 +2288,17 @@
     >>> doctest.master = None  # Reset master.
 """
 
+def test_testmod(): r"""
+Tests for the testmod function.  More might be useful, but for now we're just
+testing the case raised by Issue 6195, where trying to doctest a C module would
+fail with a UnicodeDecodeError because doctest tried to read the "source" lines
+out of the binary module.
+
+    >>> import unicodedata
+    >>> doctest.testmod(unicodedata)
+    TestResults(failed=0, attempted=0)
+"""
+
 ######################################################################
 ## Main
 ######################################################################

Modified: python/branches/py3k/Misc/NEWS
==============================================================================
--- python/branches/py3k/Misc/NEWS	(original)
+++ python/branches/py3k/Misc/NEWS	Fri Jun 12 17:33:19 2009
@@ -24,6 +24,9 @@
 Library
 -------
 
+- Issue #6195: fixed doctest to no longer try to read 'source' data from
+  binary files.
+
 - Issue #5262: Fixed bug in next rollover time computation in
   TimedRotatingFileHandler.
 


More information about the Python-checkins mailing list