mirror of
https://github.com/PyCQA/flake8.git
synced 2026-04-11 15:24:18 +00:00
Refactor checker manager and add tests
This commit is contained in:
parent
eb3d8f5791
commit
78b986d506
2 changed files with 40 additions and 32 deletions
|
|
@ -76,13 +76,14 @@ class Manager(object):
|
||||||
self.processes = []
|
self.processes = []
|
||||||
self.checkers = []
|
self.checkers = []
|
||||||
|
|
||||||
try:
|
if self.using_multiprocessing:
|
||||||
self.process_queue = multiprocessing.Queue()
|
try:
|
||||||
self.results_queue = multiprocessing.Queue()
|
self.process_queue = multiprocessing.Queue()
|
||||||
except OSError as oserr:
|
self.results_queue = multiprocessing.Queue()
|
||||||
if oserr.errno not in SERIAL_RETRY_ERRNOS:
|
except OSError as oserr:
|
||||||
raise
|
if oserr.errno not in SERIAL_RETRY_ERRNOS:
|
||||||
self.using_multiprocessing = False
|
raise
|
||||||
|
self.using_multiprocessing = False
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _cleanup_queue(q):
|
def _cleanup_queue(q):
|
||||||
|
|
@ -160,8 +161,19 @@ class Manager(object):
|
||||||
|
|
||||||
yield result
|
yield result
|
||||||
|
|
||||||
def _report_after_parallel(self):
|
def _handle_results(self, filename, results):
|
||||||
style_guide = self.style_guide
|
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 = {}
|
final_results = {}
|
||||||
for (filename, results) in self._results():
|
for (filename, results) in self._results():
|
||||||
final_results[filename] = results
|
final_results[filename] = results
|
||||||
|
|
@ -170,30 +182,12 @@ class Manager(object):
|
||||||
filename = checker.filename
|
filename = checker.filename
|
||||||
results = sorted(final_results.get(filename, []),
|
results = sorted(final_results.get(filename, []),
|
||||||
key=lambda tup: (tup[1], tup[2]))
|
key=lambda tup: (tup[1], tup[2]))
|
||||||
for (error_code, line_number, column, text, line) in results:
|
self._handle_results(filename, results)
|
||||||
style_guide.handle_error(
|
|
||||||
code=error_code,
|
|
||||||
filename=filename,
|
|
||||||
line_number=line_number,
|
|
||||||
column_number=column,
|
|
||||||
text=text,
|
|
||||||
physical_line=line,
|
|
||||||
)
|
|
||||||
|
|
||||||
def _report_after_serial(self):
|
def _report_after_serial(self):
|
||||||
style_guide = self.style_guide
|
|
||||||
for checker in self.checkers:
|
for checker in self.checkers:
|
||||||
results = sorted(checker.results, key=lambda tup: (tup[2], tup[3]))
|
results = sorted(checker.results, key=lambda tup: (tup[2], tup[3]))
|
||||||
filename = checker.filename
|
self._handle_results(checker.filename, results)
|
||||||
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,
|
|
||||||
)
|
|
||||||
|
|
||||||
def _run_checks_from_queue(self):
|
def _run_checks_from_queue(self):
|
||||||
LOG.info('Running checks in parallel')
|
LOG.info('Running checks in parallel')
|
||||||
|
|
|
||||||
|
|
@ -7,11 +7,18 @@ import pytest
|
||||||
from flake8 import checker
|
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():
|
def test_oserrors_cause_serial_fall_back():
|
||||||
"""Verify that OSErrors will cause the Manager to fallback to serial."""
|
"""Verify that OSErrors will cause the Manager to fallback to serial."""
|
||||||
err = OSError(errno.ENOSPC, 'Ominous message about spaceeeeee')
|
err = OSError(errno.ENOSPC, 'Ominous message about spaceeeeee')
|
||||||
style_guide = mock.Mock()
|
style_guide = style_guide_mock()
|
||||||
style_guide.options = mock.Mock(diff=False, jobs='4')
|
|
||||||
with mock.patch('multiprocessing.Queue', side_effect=err):
|
with mock.patch('multiprocessing.Queue', side_effect=err):
|
||||||
manager = checker.Manager(style_guide, [], [])
|
manager = checker.Manager(style_guide, [], [])
|
||||||
assert manager.using_multiprocessing is False
|
assert manager.using_multiprocessing is False
|
||||||
|
|
@ -20,8 +27,15 @@ def test_oserrors_cause_serial_fall_back():
|
||||||
def test_oserrors_are_reraised():
|
def test_oserrors_are_reraised():
|
||||||
"""Verify that OSErrors will cause the Manager to fallback to serial."""
|
"""Verify that OSErrors will cause the Manager to fallback to serial."""
|
||||||
err = OSError(errno.EAGAIN, 'Ominous message')
|
err = OSError(errno.EAGAIN, 'Ominous message')
|
||||||
style_guide = mock.Mock()
|
style_guide = style_guide_mock()
|
||||||
style_guide.options = mock.Mock(diff=False, jobs='4')
|
|
||||||
with mock.patch('multiprocessing.Queue', side_effect=err):
|
with mock.patch('multiprocessing.Queue', side_effect=err):
|
||||||
with pytest.raises(OSError):
|
with pytest.raises(OSError):
|
||||||
checker.Manager(style_guide, [], [])
|
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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue