From 78b986d5066e229c490c764ce5511f73fe97cc01 Mon Sep 17 00:00:00 2001 From: Ian Cordasco Date: Tue, 5 Apr 2016 18:52:35 -0500 Subject: [PATCH] Refactor checker manager and add tests --- flake8/checker.py | 50 +++++++++++++----------------- tests/unit/test_checker_manager.py | 22 ++++++++++--- 2 files changed, 40 insertions(+), 32 deletions(-) diff --git a/flake8/checker.py b/flake8/checker.py index 17c01cb..58b2eff 100644 --- a/flake8/checker.py +++ b/flake8/checker.py @@ -76,13 +76,14 @@ class Manager(object): self.processes = [] self.checkers = [] - try: - self.process_queue = multiprocessing.Queue() - self.results_queue = multiprocessing.Queue() - except OSError as oserr: - if oserr.errno not in SERIAL_RETRY_ERRNOS: - raise - self.using_multiprocessing = False + if self.using_multiprocessing: + try: + self.process_queue = multiprocessing.Queue() + self.results_queue = multiprocessing.Queue() + except OSError as oserr: + if oserr.errno not in SERIAL_RETRY_ERRNOS: + raise + self.using_multiprocessing = False @staticmethod def _cleanup_queue(q): @@ -160,8 +161,19 @@ class Manager(object): yield result - def _report_after_parallel(self): + def _handle_results(self, filename, results): style_guide = self.style_guide + for (error_code, line_number, column, text, physical_line) in results: + style_guide.handle_error( + code=error_code, + filename=filename, + line_number=line_number, + column_number=column, + text=text, + physical_line=physical_line, + ) + + def _report_after_parallel(self): final_results = {} for (filename, results) in self._results(): final_results[filename] = results @@ -170,30 +182,12 @@ class Manager(object): filename = checker.filename results = sorted(final_results.get(filename, []), key=lambda tup: (tup[1], tup[2])) - for (error_code, line_number, column, text, line) in results: - style_guide.handle_error( - code=error_code, - filename=filename, - line_number=line_number, - column_number=column, - text=text, - physical_line=line, - ) + self._handle_results(filename, results) def _report_after_serial(self): - style_guide = self.style_guide for checker in self.checkers: results = sorted(checker.results, key=lambda tup: (tup[2], tup[3])) - filename = checker.filename - for (error_code, line_number, column, text, line) in results: - style_guide.handle_error( - code=error_code, - filename=filename, - line_number=line_number, - column_number=column, - text=text, - physical_line=line, - ) + self._handle_results(checker.filename, results) def _run_checks_from_queue(self): LOG.info('Running checks in parallel') diff --git a/tests/unit/test_checker_manager.py b/tests/unit/test_checker_manager.py index 2d3143e..7e622bc 100644 --- a/tests/unit/test_checker_manager.py +++ b/tests/unit/test_checker_manager.py @@ -7,11 +7,18 @@ import pytest from flake8 import checker +def style_guide_mock(**kwargs): + kwargs.setdefault('diff', False) + kwargs.setdefault('jobs', '4') + style_guide = mock.Mock() + style_guide.options = mock.Mock(**kwargs) + return style_guide + + def test_oserrors_cause_serial_fall_back(): """Verify that OSErrors will cause the Manager to fallback to serial.""" err = OSError(errno.ENOSPC, 'Ominous message about spaceeeeee') - style_guide = mock.Mock() - style_guide.options = mock.Mock(diff=False, jobs='4') + style_guide = style_guide_mock() with mock.patch('multiprocessing.Queue', side_effect=err): manager = checker.Manager(style_guide, [], []) assert manager.using_multiprocessing is False @@ -20,8 +27,15 @@ def test_oserrors_cause_serial_fall_back(): def test_oserrors_are_reraised(): """Verify that OSErrors will cause the Manager to fallback to serial.""" err = OSError(errno.EAGAIN, 'Ominous message') - style_guide = mock.Mock() - style_guide.options = mock.Mock(diff=False, jobs='4') + style_guide = style_guide_mock() with mock.patch('multiprocessing.Queue', side_effect=err): with pytest.raises(OSError): checker.Manager(style_guide, [], []) + + +def test_multiprocessing_is_disabled(): + """Verify not being able to import multiprocessing forces jobs to 0.""" + style_guide = style_guide_mock() + with mock.patch('flake8.checker.multiprocessing', None): + manager = checker.Manager(style_guide, [], []) + assert manager.jobs == 0