Index: Lib/test/test_codecs.py =================================================================== --- Lib/test/test_codecs.py (revision 41660) +++ Lib/test/test_codecs.py (working copy) @@ -46,19 +46,23 @@ 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 = [] Index: Lib/codecs.py =================================================================== --- Lib/codecs.py (revision 41660) +++ Lib/codecs.py (working copy) @@ -337,10 +337,11 @@ return line readsize = size or 72 + readchars = size or -1 line = "" # If size is given, we call read() only once while True: - data = self.read(readsize, firstline=True) + data = self.read(readsize, chars=readchars, firstline=True) if data: # If we're at a "\r" read one extra character (which might # be a "\n") to get a proper line ending. If the stream is