Merge branch '7852-readline-cache-fix-wip'
authorBrett Smith <brett@curoverse.com>
Fri, 18 Mar 2016 15:31:00 +0000 (11:31 -0400)
committerBrett Smith <brett@curoverse.com>
Fri, 18 Mar 2016 15:31:00 +0000 (11:31 -0400)
Closes #7852, #8755.

sdk/python/arvados/arvfile.py
sdk/python/tests/test_stream.py

index 71af6445a5ec508f1953777871a345c2d3e03ca1..b78c63e301b81d5ddb2644983e2e83017e98bbdf 100644 (file)
@@ -108,6 +108,7 @@ class ArvadosFileReaderBase(_FileLikeObjectBase):
         cache_pos, cache_data = self._readline_cache
         if self.tell() == cache_pos:
             data = [cache_data]
+            self._filepos += len(cache_data)
         else:
             data = ['']
         data_size = len(data[-1])
@@ -123,6 +124,7 @@ class ArvadosFileReaderBase(_FileLikeObjectBase):
         except ValueError:
             nextline_index = len(data)
         nextline_index = min(nextline_index, size)
+        self._filepos -= len(data) - nextline_index
         self._readline_cache = (self.tell(), data[nextline_index:])
         return data[:nextline_index]
 
index 6c3bd61414173fb64fe9ef7b7b1b44dcc4af6d9d..624f1b8ca4391678215539f70c2a28b00fd37388 100644 (file)
@@ -184,6 +184,19 @@ class StreamFileReaderTestCase(unittest.TestCase):
     def test_bz2_decompression(self):
         self.check_decompression('bz2', bz2.compress)
 
+    def test_readline_then_readlines(self):
+        reader = self.make_newlines_reader()
+        data = reader.readline()
+        self.assertEqual('one\n', data)
+        data = reader.readlines()
+        self.assertEqual(['two\n', '\n', 'three\n', 'four\n', '\n'], data)
+
+    def test_readline_then_readall(self):
+        reader = self.make_newlines_reader()
+        data = reader.readline()
+        self.assertEqual('one\n', data)
+        self.assertEqual(''.join(['two\n', '\n', 'three\n', 'four\n', '\n']), ''.join(reader.readall()))
+
 
 class StreamRetryTestMixin(object):
     # Define reader_for(coll_name, **kwargs)