]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Backport revision 42872:
authorWalter Dörwald <walter@livinglogic.de>
Mon, 6 Mar 2006 22:44:03 +0000 (22:44 +0000)
committerWalter Dörwald <walter@livinglogic.de>
Mon, 6 Mar 2006 22:44:03 +0000 (22:44 +0000)
If size is specified, try to read at least size characters.
This is a alternative version of patch #1379332.

Lib/codecs.py
Lib/test/test_codecs.py

index 103a6f62431e4b6219aedf6c2891375bb90051a0..9a217b3a19288b71d6d29452c553d624533c6a21 100644 (file)
@@ -274,7 +274,10 @@ class StreamReader(Codec):
         while True:
             # can the request can be satisfied from the character buffer?
             if chars < 0:
-                if self.charbuffer:
+                if size < 0:
+                    if self.charbuffer:
+                        break
+                elif len(self.charbuffer) >= size:
                     break
             else:
                 if len(self.charbuffer) >= chars:
index 44d7896948bb67a690ff9fbaabae9b4b64b500df..a1a8073c3965cec0a067ee101069e76a524d7a38 100644 (file)
@@ -57,19 +57,23 @@ class ReadTest(unittest.TestCase):
             stream = StringIO.StringIO(input.encode(self.encoding))
             return codecs.getreader(self.encoding)(stream)
 
-        def readalllines(input, keepends=True):
+        def readalllines(input, keepends=True, size=None):
             reader = getreader(input)
             lines = []
             while True:
-                line = reader.readline(keepends=keepends)
+                line = reader.readline(size=size, keepends=keepends)
                 if not line:
                     break
                 lines.append(line)
-            return "".join(lines)
+            return "|".join(lines)
 
         s = u"foo\nbar\r\nbaz\rspam\u2028eggs"
-        self.assertEqual(readalllines(s, True), s)
-        self.assertEqual(readalllines(s, False), u"foobarbazspameggs")
+        sexpected = u"foo\n|bar\r\n|baz\r|spam\u2028|eggs"
+        sexpectednoends = u"foo|bar|baz|spam|eggs"
+        self.assertEqual(readalllines(s, True), sexpected)
+        self.assertEqual(readalllines(s, False), sexpectednoends)
+        self.assertEqual(readalllines(s, True, 10), sexpected)
+        self.assertEqual(readalllines(s, False, 10), sexpectednoends)
 
         # Test long lines (multiple calls to read() in readline())
         vw = []