From 7984739b27335c4d088a3d3f57827d86856cd444 Mon Sep 17 00:00:00 2001
From: areebbeigh <areebbeigh@gmail.com>
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)