From c06634acfcea82004373c03bd5059b02f18934fc Mon Sep 17 00:00:00 2001 From: Antoine Pitrou Date: Sun, 2 Feb 2014 23:37:29 +0100 Subject: [PATCH] Issue #20435: Fix _pyio.StringIO.getvalue() to take into account newline translation settings. --- Lib/_pyio.py | 8 +++++++- Lib/test/test_memoryio.py | 9 +++++++++ Misc/NEWS | 3 +++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/Lib/_pyio.py b/Lib/_pyio.py index 0986ed23e1..149599472a 100644 --- a/Lib/_pyio.py +++ b/Lib/_pyio.py @@ -1997,7 +1997,13 @@ class StringIO(TextIOWrapper): def getvalue(self): self.flush() - return self.buffer.getvalue().decode(self._encoding, self._errors) + decoder = self._decoder or self._get_decoder() + old_state = decoder.getstate() + decoder.reset() + try: + return decoder.decode(self.buffer.getvalue(), final=True) + finally: + decoder.setstate(old_state) def __repr__(self): # TextIOWrapper tells the encoding in its repr. In StringIO, diff --git a/Lib/test/test_memoryio.py b/Lib/test/test_memoryio.py index f6aef4e2be..baf3433537 100644 --- a/Lib/test/test_memoryio.py +++ b/Lib/test/test_memoryio.py @@ -537,6 +537,7 @@ class TextIOTestMixin: self.assertEqual(3, memio.write("c\rd")) memio.seek(0) self.assertEqual(memio.read(), "a\nb\nc\nd") + self.assertEqual(memio.getvalue(), "a\nb\nc\nd") memio = self.ioclass("a\r\nb", newline=None) self.assertEqual(memio.read(3), "a\nb") @@ -548,6 +549,7 @@ class TextIOTestMixin: self.assertEqual(memio.read(4), "a\nb\r") self.assertEqual(memio.read(2), "\nc") self.assertEqual(memio.read(1), "\r") + self.assertEqual(memio.getvalue(), "a\nb\r\nc\rd") memio = self.ioclass(newline="") self.assertEqual(2, memio.write("a\n")) self.assertEqual(2, memio.write("b\r")) @@ -567,6 +569,9 @@ class TextIOTestMixin: self.assertEqual(memio.read(), "a\rb\r\rc\rd") memio.seek(0) self.assertEqual(list(memio), ["a\r", "b\r", "\r", "c\r", "d"]) + memio.seek(0) + self.assertEqual(memio.readlines(), ["a\r", "b\r", "\r", "c\r", "d"]) + self.assertEqual(memio.getvalue(), "a\rb\r\rc\rd") def test_newline_crlf(self): # newline="\r\n" @@ -574,11 +579,15 @@ class TextIOTestMixin: self.assertEqual(memio.read(), "a\r\nb\r\r\nc\rd") memio.seek(0) self.assertEqual(list(memio), ["a\r\n", "b\r\r\n", "c\rd"]) + memio.seek(0) + self.assertEqual(memio.readlines(), ["a\r\n", "b\r\r\n", "c\rd"]) + self.assertEqual(memio.getvalue(), "a\r\nb\r\r\nc\rd") def test_issue5265(self): # StringIO can duplicate newlines in universal newlines mode memio = self.ioclass("a\r\nb\r\n", newline=None) self.assertEqual(memio.read(5), "a\nb\n") + self.assertEqual(memio.getvalue(), "a\nb\n") class PyStringIOTest(MemoryTestMixin, MemorySeekTestMixin, diff --git a/Misc/NEWS b/Misc/NEWS index ec12fbef9a..48a0085857 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -38,6 +38,9 @@ Core and Builtins Library ------- +- Issue #20435: Fix _pyio.StringIO.getvalue() to take into account newline + translation settings. + - Issue #20288: fix handling of invalid numeric charrefs in HTMLParser. - Issue #19456: ntpath.join() now joins relative paths correctly when a drive -- 2.50.1