Commit 57839a63 authored by Antoine Pitrou's avatar Antoine Pitrou

Issue #20435: Fix _pyio.StringIO.getvalue() to take into account newline translation settings.

parent 6bb21c48
...@@ -2060,7 +2060,13 @@ class StringIO(TextIOWrapper): ...@@ -2060,7 +2060,13 @@ class StringIO(TextIOWrapper):
def getvalue(self): def getvalue(self):
self.flush() 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): def __repr__(self):
# TextIOWrapper tells the encoding in its repr. In StringIO, # TextIOWrapper tells the encoding in its repr. In StringIO,
......
...@@ -551,6 +551,7 @@ class TextIOTestMixin: ...@@ -551,6 +551,7 @@ class TextIOTestMixin:
self.assertEqual(3, memio.write("c\rd")) self.assertEqual(3, memio.write("c\rd"))
memio.seek(0) memio.seek(0)
self.assertEqual(memio.read(), "a\nb\nc\nd") self.assertEqual(memio.read(), "a\nb\nc\nd")
self.assertEqual(memio.getvalue(), "a\nb\nc\nd")
memio = self.ioclass("a\r\nb", newline=None) memio = self.ioclass("a\r\nb", newline=None)
self.assertEqual(memio.read(3), "a\nb") self.assertEqual(memio.read(3), "a\nb")
...@@ -562,6 +563,7 @@ class TextIOTestMixin: ...@@ -562,6 +563,7 @@ class TextIOTestMixin:
self.assertEqual(memio.read(4), "a\nb\r") self.assertEqual(memio.read(4), "a\nb\r")
self.assertEqual(memio.read(2), "\nc") self.assertEqual(memio.read(2), "\nc")
self.assertEqual(memio.read(1), "\r") self.assertEqual(memio.read(1), "\r")
self.assertEqual(memio.getvalue(), "a\nb\r\nc\rd")
memio = self.ioclass(newline="") memio = self.ioclass(newline="")
self.assertEqual(2, memio.write("a\n")) self.assertEqual(2, memio.write("a\n"))
self.assertEqual(2, memio.write("b\r")) self.assertEqual(2, memio.write("b\r"))
...@@ -581,6 +583,9 @@ class TextIOTestMixin: ...@@ -581,6 +583,9 @@ class TextIOTestMixin:
self.assertEqual(memio.read(), "a\rb\r\rc\rd") self.assertEqual(memio.read(), "a\rb\r\rc\rd")
memio.seek(0) memio.seek(0)
self.assertEqual(list(memio), ["a\r", "b\r", "\r", "c\r", "d"]) 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): def test_newline_crlf(self):
# newline="\r\n" # newline="\r\n"
...@@ -588,11 +593,15 @@ class TextIOTestMixin: ...@@ -588,11 +593,15 @@ class TextIOTestMixin:
self.assertEqual(memio.read(), "a\r\nb\r\r\nc\rd") self.assertEqual(memio.read(), "a\r\nb\r\r\nc\rd")
memio.seek(0) memio.seek(0)
self.assertEqual(list(memio), ["a\r\n", "b\r\r\n", "c\rd"]) 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): def test_issue5265(self):
# StringIO can duplicate newlines in universal newlines mode # StringIO can duplicate newlines in universal newlines mode
memio = self.ioclass("a\r\nb\r\n", newline=None) memio = self.ioclass("a\r\nb\r\n", newline=None)
self.assertEqual(memio.read(5), "a\nb\n") self.assertEqual(memio.read(5), "a\nb\n")
self.assertEqual(memio.getvalue(), "a\nb\n")
def test_newline_argument(self): def test_newline_argument(self):
self.assertRaises(TypeError, self.ioclass, newline=b"\n") self.assertRaises(TypeError, self.ioclass, newline=b"\n")
......
...@@ -45,6 +45,9 @@ Core and Builtins ...@@ -45,6 +45,9 @@ Core and Builtins
Library 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 #20288: fix handling of invalid numeric charrefs in HTMLParser.
- Issue #20424: Python implementation of io.StringIO now supports lone surrogates. - Issue #20424: Python implementation of io.StringIO now supports lone surrogates.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment