From 5e4ba757f5df0de81b46390f829a1385978d8c92 Mon Sep 17 00:00:00 2001 From: Jelle Zijlstra Date: Sun, 13 May 2018 10:36:43 -0400 Subject: [PATCH 1/2] bpo-33482: fix codecs.StreamRecoder.writelines --- Lib/codecs.py | 2 +- .../next/Documentation/2018-05-13-10-36-37.bpo-33482.jalAaQ.rst | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Documentation/2018-05-13-10-36-37.bpo-33482.jalAaQ.rst diff --git a/Lib/codecs.py b/Lib/codecs.py index a70ed20f2bc794..3cd78fc9f1970e 100644 --- a/Lib/codecs.py +++ b/Lib/codecs.py @@ -838,7 +838,7 @@ def write(self, data): def writelines(self, list): - data = ''.join(list) + data = b''.join(list) data, bytesdecoded = self.decode(data, self.errors) return self.writer.write(data) diff --git a/Misc/NEWS.d/next/Documentation/2018-05-13-10-36-37.bpo-33482.jalAaQ.rst b/Misc/NEWS.d/next/Documentation/2018-05-13-10-36-37.bpo-33482.jalAaQ.rst new file mode 100644 index 00000000000000..bda5be87723d45 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2018-05-13-10-36-37.bpo-33482.jalAaQ.rst @@ -0,0 +1 @@ +Make `codecs.StreamRecoder.writelines` take a list of bytes. From 63d1494e3493873535a17c7f67662d8c0e5c308b Mon Sep 17 00:00:00 2001 From: Jelle Zijlstra Date: Mon, 11 Jun 2018 20:41:33 -0700 Subject: [PATCH 2/2] add basic tests for StreamRecoder --- Lib/test/test_codecs.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py index a59a5e21358e7b..e272033d2d5c55 100644 --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -3262,5 +3262,26 @@ def test_decode(self): self.assertEqual(data.decode('latin1'), expected) +class StreamRecoderTest(unittest.TestCase): + def test_writelines(self): + bio = io.BytesIO() + codec = codecs.lookup('ascii') + sr = codecs.StreamRecoder(bio, codec.encode, codec.decode, + encodings.ascii.StreamReader, encodings.ascii.StreamWriter) + sr.writelines([b'a', b'b']) + self.assertEqual(bio.getvalue(), b'ab') + + def test_write(self): + bio = io.BytesIO() + codec = codecs.lookup('latin1') + # Recode from Latin-1 to utf-8. + sr = codecs.StreamRecoder(bio, codec.encode, codec.decode, + encodings.utf_8.StreamReader, encodings.utf_8.StreamWriter) + + text = 'àñé' + sr.write(text.encode('latin1')) + self.assertEqual(bio.getvalue(), text.encode('utf-8')) + + if __name__ == "__main__": unittest.main()