:p
atchew
Login
This tag can be used to extract sections of the tester's log, for example the test script or the output. Fixes: https://github.com/patchew-project/patchew/issues/31 Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> --- patchew/tags.py | 23 +++++++++++++++++++++++ tests/test_custom_tags.py | 10 +++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/patchew/tags.py b/patchew/tags.py index XXXXXXX..XXXXXXX 100644 --- a/patchew/tags.py +++ b/patchew/tags.py @@ -XXX,XX +XXX,XX @@ def grep_iter(value, regex, n_before, n_after, sep): for i in range(max(lineno - n, 0), min(stop, lineno)): yield lines[i % n] +# Similar to sed "/abc/,/def/p" except that the last line can +# be excluded. +def lines_between_iter(value, start, stop, include_last=True): + inside = False + for line in lines_iter(value): + if inside and re.search(stop, line): + inside = False + if include_last: + yield line + continue + # If include_last is false, immediately look + # for the next range. + + if not inside and re.search(start, line): + inside = True + + if inside: + yield line + register = template.Library() @register.simple_tag @@ -XXX,XX +XXX,XX @@ def grep_B(value, regex, n=3, sep='---'): @register.filter def grep_C(value, regex, n=3, sep='---'): return '\n'.join(grep_iter(value, regex, n, n, sep)) + +@register.simple_tag +def lines_between(value, start, stop, include_last=True): + return '\n'.join(lines_between_iter(value, start, stop, include_last)) diff --git a/tests/test_custom_tags.py b/tests/test_custom_tags.py index XXXXXXX..XXXXXXX 100755 --- a/tests/test_custom_tags.py +++ b/tests/test_custom_tags.py @@ -XXX,XX +XXX,XX @@ # http://opensource.org/licenses/MIT. from django.template import Context, Template -from patchew.tags import tail_lines, grep_A, grep_B, grep_C, grep +from patchew.tags import tail_lines, grep_A, grep_B, grep_C, grep, lines_between import unittest class CustomTagsTest(unittest.TestCase): @@ -XXX,XX +XXX,XX @@ class CustomTagsTest(unittest.TestCase): self.assertTemplate('{% grep_B s regex="[bc]" n=1 %}', 'a\nb\nc', s='a\nb\nc\nd') self.assertTemplate('{% grep_C s "b" n=1 %}', 'a\nb\nc', s='a\nb\nc\nd') self.assertTemplate('{% tail_lines s n=3 %}', 'b\nc\nd', s='a\nb\nc\nd') + self.assertTemplate('{% lines_between s start="^b$" stop="c" %}', 'b\nc', s='a\nb\nc\nd') def test_grep(self): self.assertEqual(grep('0\na\n9', '[0-9]'), '0\n9') @@ -XXX,XX +XXX,XX @@ class CustomTagsTest(unittest.TestCase): self.assertEqual(tail_lines('\n\nbc', 3), '\n\nbc') self.assertEqual(tail_lines('\n\n\n\nbc', 3), '\n\nbc') + def test_lines_between(self): + self.assertEqual(lines_between('a\nb\nc\nd', 'b', 'c'), 'b\nc') + self.assertEqual(lines_between('a\nb\nc\nd', 'b', 'c', False), 'b') + self.assertEqual(lines_between('a\nb\ncb\nd', 'b', 'c'), 'b\ncb') + self.assertEqual(lines_between('a\nb\ncb\nd', 'b', 'c', False), 'b\ncb\nd') + self.assertEqual(lines_between('a\nb\n\n\na\nb', '.', '^$'), 'a\nb\n\na\nb') + if __name__ == '__main__': unittest.main() -- 2.16.2 _______________________________________________ Patchew-devel mailing list Patchew-devel@redhat.com https://www.redhat.com/mailman/listinfo/patchew-devel
This tag can be used to extract sections of the tester's log, for example the test script or the output. Fixes: https://github.com/patchew-project/patchew/issues/31 Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> --- patchew/tags.py | 23 +++++++++++++++++++++++ tests/test_custom_tags.py | 10 +++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/patchew/tags.py b/patchew/tags.py index XXXXXXX..XXXXXXX 100644 --- a/patchew/tags.py +++ b/patchew/tags.py @@ -XXX,XX +XXX,XX @@ def grep_iter(value, regex, n_before, n_after, sep): for i in range(max(lineno - n, 0), min(stop, lineno)): yield lines[i % n] +# Similar to sed "/abc/,/def/p" except that the last line can +# be excluded. +def lines_between_iter(value, start, stop, include_last=True): + inside = False + for line in lines_iter(value): + if inside and re.search(stop, line): + inside = False + if include_last: + yield line + continue + # If include_last is false, immediately look + # for the next range. + + if not inside and re.search(start, line): + inside = True + + if inside: + yield line + register = template.Library() @register.simple_tag @@ -XXX,XX +XXX,XX @@ def grep_B(value, regex, n=3, sep='---'): @register.filter def grep_C(value, regex, n=3, sep='---'): return '\n'.join(grep_iter(value, regex, n, n, sep)) + +@register.simple_tag +def lines_between(value, start, stop, include_last=True): + return '\n'.join(lines_between_iter(value, start, stop, include_last)) diff --git a/tests/test_custom_tags.py b/tests/test_custom_tags.py index XXXXXXX..XXXXXXX 100755 --- a/tests/test_custom_tags.py +++ b/tests/test_custom_tags.py @@ -XXX,XX +XXX,XX @@ # http://opensource.org/licenses/MIT. from django.template import Context, Template -from patchew.tags import tail_lines, grep_A, grep_B, grep_C, grep +from patchew.tags import tail_lines, grep_A, grep_B, grep_C, grep, lines_between import unittest class CustomTagsTest(unittest.TestCase): @@ -XXX,XX +XXX,XX @@ class CustomTagsTest(unittest.TestCase): self.assertTemplate('{% grep_B s regex="[bc]" n=1 %}', 'a\nb\nc', s='a\nb\nc\nd') self.assertTemplate('{% grep_C s "b" n=1 %}', 'a\nb\nc', s='a\nb\nc\nd') self.assertTemplate('{% tail_lines s n=3 %}', 'b\nc\nd', s='a\nb\nc\nd') + self.assertTemplate('{% lines_between s start="^b$" stop="c" %}', 'b\nc', s='a\nb\nc\nd') def test_grep(self): self.assertEqual(grep('0\na\n9', '[0-9]'), '0\n9') @@ -XXX,XX +XXX,XX @@ class CustomTagsTest(unittest.TestCase): self.assertEqual(tail_lines('\n\nbc', 3), '\n\nbc') self.assertEqual(tail_lines('\n\n\n\nbc', 3), '\n\nbc') + def test_lines_between(self): + self.assertEqual(lines_between('a\nb\nc\nd', 'b', 'c'), 'b\nc') + self.assertEqual(lines_between('a\nb\nc\nd', 'b', 'c', False), 'b') + self.assertEqual(lines_between('a\nb\ncb\nd', 'b', 'c'), 'b\ncb') + self.assertEqual(lines_between('a\nb\ncb\nd', 'b', 'c', False), 'b\ncb\nd') + self.assertEqual(lines_between('a\nb\n\n\na\nb', '.', '^$'), 'a\nb\n\na\nb') + if __name__ == '__main__': unittest.main() -- 2.16.2 _______________________________________________ Patchew-devel mailing list Patchew-devel@redhat.com https://www.redhat.com/mailman/listinfo/patchew-devel