From: Christian Herdtweck Date: Wed, 12 Dec 2018 09:54:56 +0000 (+0100) Subject: log_read: return/yield all of input args from iteration X-Git-Tag: v1.6.7~2^2~1 X-Git-Url: http://developer.intra2net.com/git/?p=pyi2ncommon;a=commitdiff_plain;h=aef38def316543d6c631f2735019a2317eed5491 log_read: return/yield all of input args from iteration --- diff --git a/src/log_read.py b/src/log_read.py index 01366d5..7fb5571 100644 --- a/src/log_read.py +++ b/src/log_read.py @@ -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) diff --git a/test/test_log_read.py b/test/test_log_read.py index 0fd4ae1..f5ebe61 100644 --- a/test/test_log_read.py +++ b/test/test_log_read.py @@ -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: