summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2014-02-02 22:38:48 (GMT)
committerAntoine Pitrou <solipsis@pitrou.net>2014-02-02 22:38:48 (GMT)
commit1328e9d0a0bacdd49d7026d3d883354bb01356dc (patch)
treefda069df0da9a9939ee610896485f9882e8d8e49
parent2f2ecaa48461fc4a8987f5b20f01fa61da90be51 (diff)
parent57839a6349d7443855bc04d7f5c32f9f38929111 (diff)
downloadcpython-1328e9d0a0bacdd49d7026d3d883354bb01356dc.zip
cpython-1328e9d0a0bacdd49d7026d3d883354bb01356dc.tar.gz
cpython-1328e9d0a0bacdd49d7026d3d883354bb01356dc.tar.bz2
Issue #20435: Fix _pyio.StringIO.getvalue() to take into account newline translation settings.
-rw-r--r--Lib/_pyio.py8
-rw-r--r--Lib/test/test_memoryio.py9
-rw-r--r--Misc/NEWS3
3 files changed, 19 insertions, 1 deletions
diff --git a/Lib/_pyio.py b/Lib/_pyio.py
index edfb9b9..3961969 100644
--- a/Lib/_pyio.py
+++ b/Lib/_pyio.py
@@ -2067,7 +2067,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 d4135d5..1436a19 100644
--- a/Lib/test/test_memoryio.py
+++ b/Lib/test/test_memoryio.py
@@ -551,6 +551,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")
@@ -562,6 +563,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"))
@@ -581,6 +583,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"
@@ -588,11 +593,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")
def test_newline_argument(self):
self.assertRaises(TypeError, self.ioclass, newline=b"\n")
diff --git a/Misc/NEWS b/Misc/NEWS
index 05bde29..f6d908d 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -16,6 +16,9 @@ Core and Builtins
Library
-------
+- Issue #20435: Fix _pyio.StringIO.getvalue() to take into account newline
+ translation settings.
+
- tracemalloc: Fix slicing traces and fix slicing a traceback.
- Issue #20354: Fix an alignment issue in the tracemalloc module on 64-bit