]> granicus.if.org Git - python/commitdiff
Issue #20435: Fix _pyio.StringIO.getvalue() to take into account newline translation...
authorAntoine Pitrou <solipsis@pitrou.net>
Sun, 2 Feb 2014 22:37:29 +0000 (23:37 +0100)
committerAntoine Pitrou <solipsis@pitrou.net>
Sun, 2 Feb 2014 22:37:29 +0000 (23:37 +0100)
Lib/_pyio.py
Lib/test/test_memoryio.py
Misc/NEWS

index 0986ed23e1fd7d0f5547e5f0c9bd3288d831ff18..149599472aafb1bf6e80c7a37ab7a5c52b22af7b 100644 (file)
@@ -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,
index f6aef4e2bedc7de75c14f893cbe2cff6e7956c78..baf3433537e91242a5e7fa55e188b2a58acf8efe 100644 (file)
@@ -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,
index ec12fbef9ac32e5cc634f6cb6869776971d9e937..48a00858579bcf68b180cfedd9bc93b420aace55 100644 (file)
--- 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