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.
........
This commit is contained in:
Florent Xicluna 2010-02-27 14:21:57 +00:00
parent e33721e1b5
commit 5925085653
3 changed files with 42 additions and 4 deletions

View File

@ -218,8 +218,8 @@ def _load_testfile(filename, package, module_relative, encoding):
def _indent(s, indent=4): def _indent(s, indent=4):
""" """
Add the given number of space characters to the beginning every Add the given number of space characters to the beginning of
non-blank line in `s`, and return the result. every non-blank line in `s`, and return the result.
""" """
# This regexp matches the start of non-blank lines: # This regexp matches the start of non-blank lines:
return re.sub('(?m)^(?!$)', indent*' ', s) return re.sub('(?m)^(?!$)', indent*' ', s)
@ -1354,7 +1354,14 @@ class DocTestRunner:
save_stdout = sys.stdout save_stdout = sys.stdout
if out is None: if out is None:
encoding = save_stdout.encoding
if encoding is None or encoding.lower() == 'utf-8':
out = save_stdout.write 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 sys.stdout = self._fakeout
# Patch pdb.set_trace to restore sys.stdout during interactive # Patch pdb.set_trace to restore sys.stdout during interactive

View File

@ -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 called with the name of a file, which is taken to be relative to the
calling module. The return value is (#failures, #tests). 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 >>> doctest.testfile('test_doctest.txt') # doctest: +ELLIPSIS
********************************************************************** **********************************************************************
File "...", line 6, in test_doctest.txt 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') >>> doctest.testfile('test_doctest4.txt', encoding='utf-8')
TestResults(failed=0, attempted=2) TestResults(failed=0, attempted=2)
>>> doctest.master = None # Reset master. >>> 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""" 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. out of the binary module.
>>> import unicodedata >>> import unicodedata
>>> doctest.testmod(unicodedata) >>> doctest.testmod(unicodedata, verbose=False)
TestResults(failed=0, attempted=0) TestResults(failed=0, attempted=0)
""" """

View File

@ -260,6 +260,8 @@ C-API
Library Library
------- -------
- Issue #1729305: Fix doctest to handle encode error with "backslashreplace".
- Issue #691291: codecs.open() should not convert end of lines on reading and - Issue #691291: codecs.open() should not convert end of lines on reading and
writing. writing.