log_read: return/yield all of input args from iteration
authorChristian Herdtweck <christian.herdtweck@intra2net.com>
Wed, 12 Dec 2018 09:54:56 +0000 (10:54 +0100)
committerChristian Herdtweck <christian.herdtweck@intra2net.com>
Mon, 8 Nov 2021 15:12:32 +0000 (16:12 +0100)
src/log_read.py
test/test_log_read.py

index 01366d5..7fb5571 100644 (file)
@@ -304,10 +304,10 @@ class IterativeReader(object):
                                 :py:data:`self.descriptions`
         :param str new_data: Text data read from source
         :param idx: Index of data source
-        :returns: [(description, data)], same as input
-        :rtype [(str, str)]
+        :returns: [(description, data, idx], same as input
+        :rtype [(str, str, int)]
         """
-        return [(description, data), ]
+        return [(description, data, idx), ]
 
 
 #: characters to `rstrip()` from end of complete lines
@@ -333,10 +333,10 @@ class LineReader(IterativeReader):
         If line is not complete, then buffer it.
 
         Args: see super class method :py:meth:`IterativeReader.prepare_result`
-        :returns: list of 2-tuples `(description, line)` where
-                  `description` is same as arg, and `line` is
+        :returns: list of 3-tuples `(description, line, idx)` where
+                  `description` and `idx` are same as args, and `line` is
                   without trailing newline characters
-        :rtype: [(str, str)]
+        :rtype: [(str, str, int)]
         """
         all_data = self.line_buffers[idx] + new_data
         self.line_buffers[idx] = ''
@@ -344,7 +344,7 @@ class LineReader(IterativeReader):
         should_be_no_new_lines = False
         for line in all_data.splitlines(True):
             if line[-1] in LINE_SPLITTERS:
-                result.append((description, line.rstrip(LINE_SPLITTERS)))
+                result.append((description, line.rstrip(LINE_SPLITTERS), idx))
             elif should_be_no_new_lines:
                 raise ValueError('line splitters are not compatible with'
                                  'str.splitlines!')
@@ -383,14 +383,17 @@ class LogParser(LineReader):
         Try parsing lines.
 
         Args: see super class method :py:meth:`IterativeReader.prepare_result`
-        :returns: either a :py:class:`re.Match` if line matched
-                  :py:data:`self.pattern` or just str if line did not match.
-        :rtype: :py:class:`re.Match` OR str
+        :returns: 3-tuples `(description, line, idx)` where `description` and
+                  `idx` are same as input args and `line` is either a
+                  :py:class:`re.Match` if line matched :py:data:`self.pattern`
+                  or just str if line did not match.
+        :rtype: [(str, :py:class:`re.Match` OR str, int)]
         """
         # let super class split data into lines
-        for _, raw_line in super(LogParser, self).prepare_result(*args):
+        for description, raw_line, idx in \
+                super(LogParser, self).prepare_result(*args):
             result = re.match(self.pattern, raw_line)
             if result:
-                return result
+                return (description, result, idx)
             else:
-                return raw_line
+                return (description, raw_line, idx)
index 0fd4ae1..f5ebe61 100644 (file)
@@ -200,9 +200,10 @@ class LogReadTester(unittest.TestCase):
                 reader = IterativeReader(file_handle)
                 self.helper_test_len(reader, 1)
                 counter = -1        # we may have to adapt this manually
-                for desc, text in reader:
+                for desc, text, source_idx in reader:
                     receive_time = perf_counter()
                     self.assertEqual(desc, self.temp_file)
+                    self.assertEqual(source_idx, 0)
                     counter += 1
                     text = text.strip()
                     if DEBUG:
@@ -255,7 +256,7 @@ class LogReadTester(unittest.TestCase):
             reader = LineReader(file_handle)
             self.helper_test_len(reader, 1)
 
-            for line_expected, (_, line_read) in zip(lines_expected, reader):
+            for line_expected, (_, line_read, _) in zip(lines_expected, reader):
                 if 'end' in line_read:
                     break
                 else: