Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 1328e9d

Browse files
committed
Issue #20435: Fix _pyio.StringIO.getvalue() to take into account newline translation settings.
2 parents 2f2ecaa + 57839a6 commit 1328e9d

3 files changed

Lines changed: 19 additions & 1 deletion

File tree

Lib/_pyio.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2067,7 +2067,13 @@ def __init__(self, initial_value="", newline="\n"):
20672067

20682068
def getvalue(self):
20692069
self.flush()
2070-
return self.buffer.getvalue().decode(self._encoding, self._errors)
2070+
decoder = self._decoder or self._get_decoder()
2071+
old_state = decoder.getstate()
2072+
decoder.reset()
2073+
try:
2074+
return decoder.decode(self.buffer.getvalue(), final=True)
2075+
finally:
2076+
decoder.setstate(old_state)
20712077

20722078
def __repr__(self):
20732079
# TextIOWrapper tells the encoding in its repr. In StringIO,

Lib/test/test_memoryio.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -551,6 +551,7 @@ def test_newline_none(self):
551551
self.assertEqual(3, memio.write("c\rd"))
552552
memio.seek(0)
553553
self.assertEqual(memio.read(), "a\nb\nc\nd")
554+
self.assertEqual(memio.getvalue(), "a\nb\nc\nd")
554555
memio = self.ioclass("a\r\nb", newline=None)
555556
self.assertEqual(memio.read(3), "a\nb")
556557

@@ -562,6 +563,7 @@ def test_newline_empty(self):
562563
self.assertEqual(memio.read(4), "a\nb\r")
563564
self.assertEqual(memio.read(2), "\nc")
564565
self.assertEqual(memio.read(1), "\r")
566+
self.assertEqual(memio.getvalue(), "a\nb\r\nc\rd")
565567
memio = self.ioclass(newline="")
566568
self.assertEqual(2, memio.write("a\n"))
567569
self.assertEqual(2, memio.write("b\r"))
@@ -581,18 +583,25 @@ def test_newline_cr(self):
581583
self.assertEqual(memio.read(), "a\rb\r\rc\rd")
582584
memio.seek(0)
583585
self.assertEqual(list(memio), ["a\r", "b\r", "\r", "c\r", "d"])
586+
memio.seek(0)
587+
self.assertEqual(memio.readlines(), ["a\r", "b\r", "\r", "c\r", "d"])
588+
self.assertEqual(memio.getvalue(), "a\rb\r\rc\rd")
584589

585590
def test_newline_crlf(self):
586591
# newline="\r\n"
587592
memio = self.ioclass("a\nb\r\nc\rd", newline="\r\n")
588593
self.assertEqual(memio.read(), "a\r\nb\r\r\nc\rd")
589594
memio.seek(0)
590595
self.assertEqual(list(memio), ["a\r\n", "b\r\r\n", "c\rd"])
596+
memio.seek(0)
597+
self.assertEqual(memio.readlines(), ["a\r\n", "b\r\r\n", "c\rd"])
598+
self.assertEqual(memio.getvalue(), "a\r\nb\r\r\nc\rd")
591599

592600
def test_issue5265(self):
593601
# StringIO can duplicate newlines in universal newlines mode
594602
memio = self.ioclass("a\r\nb\r\n", newline=None)
595603
self.assertEqual(memio.read(5), "a\nb\n")
604+
self.assertEqual(memio.getvalue(), "a\nb\n")
596605

597606
def test_newline_argument(self):
598607
self.assertRaises(TypeError, self.ioclass, newline=b"\n")

Misc/NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ Core and Builtins
1616
Library
1717
-------
1818

19+
- Issue #20435: Fix _pyio.StringIO.getvalue() to take into account newline
20+
translation settings.
21+
1922
- tracemalloc: Fix slicing traces and fix slicing a traceback.
2023

2124
- Issue #20354: Fix an alignment issue in the tracemalloc module on 64-bit

0 commit comments

Comments
 (0)