From: Georg Brandl Date: Sun, 1 Aug 2010 08:22:05 +0000 (+0000) Subject: #8471: reset _SpoofOut.buf to an empty string when truncating; if Unicode had been... X-Git-Tag: v2.7.1rc1~528 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1f05e2e9baa66b3c6241c2450481eee0756381ca;p=python #8471: reset _SpoofOut.buf to an empty string when truncating; if Unicode had been output previously, it had been coerced to a Unicode string, potentially making subsequent prints behave differently or raise UnicodeErrors. --- diff --git a/Lib/doctest.py b/Lib/doctest.py index 70d3359545..917684cfc7 100644 --- a/Lib/doctest.py +++ b/Lib/doctest.py @@ -263,6 +263,9 @@ class _SpoofOut(StringIO): StringIO.truncate(self, size) if hasattr(self, "softspace"): del self.softspace + if not self.buf: + # Reset it to an empty string, to make sure it's not unicode. + self.buf = '' # Worst-case linear-time ellipsis matching. def _ellipsis_match(want, got): diff --git a/Lib/test/test_doctest.py b/Lib/test/test_doctest.py index 105106809c..e51bacca92 100644 --- a/Lib/test/test_doctest.py +++ b/Lib/test/test_doctest.py @@ -1581,7 +1581,33 @@ source: >>> test = doctest.DocTestParser().get_doctest(s, {}, 's', 's.py', 0) Traceback (most recent call last): ValueError: line 0 of the doctest for s has an option directive on a line with no example: '# doctest: +ELLIPSIS' -""" + + """ + + def test_unicode_output(self): r""" + +Check that unicode output works: + + >>> u'\xe9' + u'\xe9' + +If we return unicode, SpoofOut's buf variable becomes automagically +converted to unicode. This means all subsequent output becomes converted +to unicode, and if the output contains non-ascii characters that failed. +It used to be that this state change carried on between tests, meaning +tests would fail if unicode has been output previously in the testrun. +This test tests that this is no longer so: + + >>> print u'abc' + abc + +And then return a string with non-ascii characters: + + >>> print u'\xe9'.encode('utf-8') + é + + """ + def test_testsource(): r""" Unit tests for `testsource()`. diff --git a/Misc/NEWS b/Misc/NEWS index a7928c0843..14f3fb042d 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -18,6 +18,9 @@ Core and Builtins Library ------- +- Issue #8471: In doctest, properly reset the output stream to an empty + string when Unicode was previously output. + - Issue #8620: when a Cmd is fed input that reaches EOF without a final newline, it no longer truncates the last character of the last command line.