From eb84b5a27b75f84bf902ea2d6f5b67016ad1b2d8 Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Mon, 26 May 2025 12:45:52 +0200 Subject: [PATCH 1/5] Return bytes written from codecs.Stream(Reader)Writer.write() --- Doc/library/codecs.rst | 3 +++ Lib/codecs.py | 2 +- .../Library/2025-05-26-12-44-40.gh-issue-134706.bcTycR.rst | 3 +++ 3 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2025-05-26-12-44-40.gh-issue-134706.bcTycR.rst diff --git a/Doc/library/codecs.rst b/Doc/library/codecs.rst index 86511602fa5a60..7e7377ea085c36 100644 --- a/Doc/library/codecs.rst +++ b/Doc/library/codecs.rst @@ -747,6 +747,9 @@ compatible with the Python codec registry. Writes the object's contents encoded to the stream. + .. versionchanged:: next + Returns the number of characters or bytes written to the stream. + .. method:: writelines(list) diff --git a/Lib/codecs.py b/Lib/codecs.py index fc38e922257644..c80f55b5e78a15 100644 --- a/Lib/codecs.py +++ b/Lib/codecs.py @@ -378,7 +378,7 @@ def write(self, object): """ Writes the object's contents encoded to self.stream. """ data, consumed = self.encode(object, self.errors) - self.stream.write(data) + return self.stream.write(data) def writelines(self, list): diff --git a/Misc/NEWS.d/next/Library/2025-05-26-12-44-40.gh-issue-134706.bcTycR.rst b/Misc/NEWS.d/next/Library/2025-05-26-12-44-40.gh-issue-134706.bcTycR.rst new file mode 100644 index 00000000000000..f0d61b6300fbdc --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-05-26-12-44-40.gh-issue-134706.bcTycR.rst @@ -0,0 +1,3 @@ +:meth:`codecs.StreamWriter.write` and +:meth:`codecs.StreamReaderWriter.write` now return the number of characters +or bytes written. From a0ac78f52c6715f98b82904650fef8e3edf0f159 Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Mon, 26 May 2025 12:50:09 +0200 Subject: [PATCH 2/5] Fix a reference problem --- .../next/Library/2025-05-26-12-44-40.gh-issue-134706.bcTycR.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Misc/NEWS.d/next/Library/2025-05-26-12-44-40.gh-issue-134706.bcTycR.rst b/Misc/NEWS.d/next/Library/2025-05-26-12-44-40.gh-issue-134706.bcTycR.rst index f0d61b6300fbdc..da0ad8f4ebcc18 100644 --- a/Misc/NEWS.d/next/Library/2025-05-26-12-44-40.gh-issue-134706.bcTycR.rst +++ b/Misc/NEWS.d/next/Library/2025-05-26-12-44-40.gh-issue-134706.bcTycR.rst @@ -1,3 +1,3 @@ :meth:`codecs.StreamWriter.write` and -:meth:`codecs.StreamReaderWriter.write` now return the number of characters +``codecs.StreamReaderWriter.write`` now return the number of characters or bytes written. From 7881a6f07d0c4ee45931a677f52e1a0e08e00c79 Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Mon, 26 May 2025 14:02:12 +0200 Subject: [PATCH 3/5] Update NEWS file --- .../Library/2025-05-26-12-44-40.gh-issue-134706.bcTycR.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Misc/NEWS.d/next/Library/2025-05-26-12-44-40.gh-issue-134706.bcTycR.rst b/Misc/NEWS.d/next/Library/2025-05-26-12-44-40.gh-issue-134706.bcTycR.rst index da0ad8f4ebcc18..41cffaa959658c 100644 --- a/Misc/NEWS.d/next/Library/2025-05-26-12-44-40.gh-issue-134706.bcTycR.rst +++ b/Misc/NEWS.d/next/Library/2025-05-26-12-44-40.gh-issue-134706.bcTycR.rst @@ -1,3 +1,3 @@ -:meth:`codecs.StreamWriter.write` and -``codecs.StreamReaderWriter.write`` now return the number of characters -or bytes written. +:meth:`codecs.StreamWriter.write` and :meth:`!codecs.StreamReaderWriter.write` +now correctly return the number of characters or bytes written instead of +returning ``None``. From 1e620c97e5ab96def5511c187315b15d1eea5d52 Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Tue, 27 May 2025 11:19:25 +0200 Subject: [PATCH 4/5] Add tests --- Lib/test/test_codecs.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py index 8c9a0972492294..b60effa003f1ce 100644 --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -1985,6 +1985,11 @@ class StreamWriterTest(unittest.TestCase): def setUp(self): self.writer = codecs.getwriter('utf-8') + def test_write(self): + bio = io.BytesIO() + assert self.writer(bio).write("Hällo") == 6 + self.assertEqual(bio.getvalue(), b'H\xc3\xa4llo') + def test_copy(self): f = self.writer(Queue(b'')) with self.assertRaisesRegex(TypeError, 'StreamWriter'): @@ -2006,6 +2011,12 @@ def setUp(self): self.reader = codecs.getreader('latin1') self.writer = codecs.getwriter('utf-8') + def test_write(self): + bio = io.BytesIO() + f = codecs.StreamReaderWriter(bio, self.reader, self.writer) + assert f.write("Hällo") == 6 + self.assertEqual(bio.getvalue(), b'H\xc3\xa4llo') + def test_copy(self): f = codecs.StreamReaderWriter(Queue(b''), self.reader, self.writer) with self.assertRaisesRegex(TypeError, 'StreamReaderWriter'): From ba79df8d3ee758bb1e768efb07cb7e8f024872bb Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Tue, 27 May 2025 11:20:56 +0200 Subject: [PATCH 5/5] Use assertEqual --- Lib/test/test_codecs.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py index b60effa003f1ce..f23789acf4330b 100644 --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -1987,7 +1987,7 @@ def setUp(self): def test_write(self): bio = io.BytesIO() - assert self.writer(bio).write("Hällo") == 6 + self.assertEqual(self.writer(bio).write("Hällo"), 6) self.assertEqual(bio.getvalue(), b'H\xc3\xa4llo') def test_copy(self): @@ -2014,7 +2014,7 @@ def setUp(self): def test_write(self): bio = io.BytesIO() f = codecs.StreamReaderWriter(bio, self.reader, self.writer) - assert f.write("Hällo") == 6 + self.assertEqual(f.write("Hällo"), 6) self.assertEqual(bio.getvalue(), b'H\xc3\xa4llo') def test_copy(self):