From 8bd8fffb9ca04db26addcf198069cb5b86740739 Mon Sep 17 00:00:00 2001 From: areebbeigh Date: Tue, 9 Apr 2019 12:03:40 +0530 Subject: [PATCH] Process whole output This commit modifies process_output to process all the detected problems instead of just the first one. Fixes https://github.com/coala/coala-bears/issues/2882 --- bears/python/PycodestyleBear.py | 30 +++++++++++++++-------------- tests/python/PycodestyleBearTest.py | 11 +++++++++++ 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/bears/python/PycodestyleBear.py b/bears/python/PycodestyleBear.py index 405f369677..e5b4243718 100644 --- a/bears/python/PycodestyleBear.py +++ b/bears/python/PycodestyleBear.py @@ -74,20 +74,22 @@ def create_arguments( def process_output(self, output, filename, file): if not output: # backwards compatible no results return - result = re.match(OUTPUT_REGEX, output) + result = re.findall(OUTPUT_REGEX, output) if not result: # backwards compatible no results self.warn('{}: Unexpected output {}'.format(filename, output)) return - line, column, message, rule = result.groups() - if rule == 'E501': - aspect = LineLength('py') - else: - aspect = None - yield Result.from_values( - origin='{} ({})'.format(self.name, rule), - message=message, - file=filename, - line=int(line), - column=int(column), - aspect=aspect, - ) + + for line, column, message, rule in result: + if rule == 'E501': + aspect = LineLength('py') + else: + aspect = None + + yield Result.from_values( + origin='{} ({})'.format(self.name, rule), + message=message, + file=filename, + line=int(line), + column=int(column), + aspect=aspect, + ) diff --git a/tests/python/PycodestyleBearTest.py b/tests/python/PycodestyleBearTest.py index 1a134955f8..143847b071 100644 --- a/tests/python/PycodestyleBearTest.py +++ b/tests/python/PycodestyleBearTest.py @@ -27,6 +27,11 @@ def hello(): print("hello world") ''' +multiple_error_file = ''' +y = 10; +print( 'hello' ) +''' + file_with_very_long_line = ('def ' + 'h' * 1000 + '():\n' + ' print("hello")') @@ -114,3 +119,9 @@ def test_line_length(self): 'E501 line too long (106 > 30 characters)') self.assertEqual(result.origin, 'PycodestyleBear (E501)') self.assertEqual(result.aspect, LineLength('py')) + + def test_multiple_errors(self): + content = multiple_error_file.splitlines() + with prepare_file(content, None) as (file, fname): + with execute_bear(self.uut, fname, file) as results: + self.assertTrue(len(results) == 3)