summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlorent Xicluna <florent.xicluna@gmail.com>2010-02-27 14:21:57 (GMT)
committerFlorent Xicluna <florent.xicluna@gmail.com>2010-02-27 14:21:57 (GMT)
commit5925085653cc9ef28dbf36859b9f208ef80b57b4 (patch)
treead6c11492804ff3b4090122c4feb6cce3159c4ac
parente33721e1b54a2af5b4547e56d9349930260b7235 (diff)
downloadcpython-5925085653cc9ef28dbf36859b9f208ef80b57b4.zip
cpython-5925085653cc9ef28dbf36859b9f208ef80b57b4.tar.gz
cpython-5925085653cc9ef28dbf36859b9f208ef80b57b4.tar.bz2
For 3.x, the "backslashreplace" error handling is plugged on the "write" method.
Recorded merge of revisions 78488 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r78488 | florent.xicluna | 2010-02-27 14:31:23 +0100 (sam, 27 fév 2010) | 2 lines Issue #1729305: Fix doctest to handle encode error with "backslashreplace". It fixes #7667 too. ........
-rw-r--r--Lib/doctest.py13
-rw-r--r--Lib/test/test_doctest.py31
-rw-r--r--Misc/NEWS2
3 files changed, 42 insertions, 4 deletions
diff --git a/Lib/doctest.py b/Lib/doctest.py
index eac4378..3b32004 100644
--- a/Lib/doctest.py
+++ b/Lib/doctest.py
@@ -218,8 +218,8 @@ def _load_testfile(filename, package, module_relative, encoding):
def _indent(s, indent=4):
"""
- Add the given number of space characters to the beginning every
- non-blank line in `s`, and return the result.
+ Add the given number of space characters to the beginning of
+ every non-blank line in `s`, and return the result.
"""
# This regexp matches the start of non-blank lines:
return re.sub('(?m)^(?!$)', indent*' ', s)
@@ -1354,7 +1354,14 @@ class DocTestRunner:
save_stdout = sys.stdout
if out is None:
- out = save_stdout.write
+ encoding = save_stdout.encoding
+ if encoding is None or encoding.lower() == 'utf-8':
+ out = save_stdout.write
+ else:
+ # Use backslashreplace error handling on write
+ def out(s):
+ s = str(s.encode(encoding, 'backslashreplace'), encoding)
+ save_stdout.write(s)
sys.stdout = self._fakeout
# Patch pdb.set_trace to restore sys.stdout during interactive
diff --git a/Lib/test/test_doctest.py b/Lib/test/test_doctest.py
index e4ac830..17842c9 100644
--- a/Lib/test/test_doctest.py
+++ b/Lib/test/test_doctest.py
@@ -2149,6 +2149,13 @@ doctest examples in a given file. In its simple invokation, it is
called with the name of a file, which is taken to be relative to the
calling module. The return value is (#failures, #tests).
+We don't want `-v` in sys.argv for these tests.
+
+ >>> save_argv = sys.argv
+ >>> if '-v' in sys.argv:
+ ... sys.argv = [arg for arg in save_argv if arg != '-v']
+
+
>>> doctest.testfile('test_doctest.txt') # doctest: +ELLIPSIS
**********************************************************************
File "...", line 6, in test_doctest.txt
@@ -2288,6 +2295,28 @@ using the optional keyword argument `encoding`:
>>> doctest.testfile('test_doctest4.txt', encoding='utf-8')
TestResults(failed=0, attempted=2)
>>> doctest.master = None # Reset master.
+
+Test the verbose output:
+
+ >>> doctest.testfile('test_doctest4.txt', encoding='utf-8', verbose=True)
+ Trying:
+ 'föö'
+ Expecting:
+ 'f\xf6\xf6'
+ ok
+ Trying:
+ 'bąr'
+ Expecting:
+ 'b\u0105r'
+ ok
+ 1 items passed all tests:
+ 2 tests in test_doctest4.txt
+ 2 tests in 1 items.
+ 2 passed and 0 failed.
+ Test passed.
+ TestResults(failed=0, attempted=2)
+ >>> doctest.master = None # Reset master.
+ >>> sys.argv = save_argv
"""
def test_testmod(): r"""
@@ -2297,7 +2326,7 @@ fail with a UnicodeDecodeError because doctest tried to read the "source" lines
out of the binary module.
>>> import unicodedata
- >>> doctest.testmod(unicodedata)
+ >>> doctest.testmod(unicodedata, verbose=False)
TestResults(failed=0, attempted=0)
"""
diff --git a/Misc/NEWS b/Misc/NEWS
index a870564..ee43e63 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -260,6 +260,8 @@ C-API
Library
-------
+- Issue #1729305: Fix doctest to handle encode error with "backslashreplace".
+
- Issue #691291: codecs.open() should not convert end of lines on reading and
writing.