mirror of
https://github.com/PyCQA/flake8.git
synced 2026-04-09 22:34:17 +00:00
improve coverage a bit
This commit is contained in:
parent
639dfe1671
commit
bb3c8d2607
3 changed files with 50 additions and 21 deletions
|
|
@ -3,6 +3,7 @@ import collections
|
||||||
import errno
|
import errno
|
||||||
import itertools
|
import itertools
|
||||||
import logging
|
import logging
|
||||||
|
import multiprocessing.pool
|
||||||
import signal
|
import signal
|
||||||
import tokenize
|
import tokenize
|
||||||
from typing import Dict
|
from typing import Dict
|
||||||
|
|
@ -15,11 +16,6 @@ from flake8 import exceptions
|
||||||
from flake8 import processor
|
from flake8 import processor
|
||||||
from flake8 import utils
|
from flake8 import utils
|
||||||
|
|
||||||
try:
|
|
||||||
import multiprocessing.pool
|
|
||||||
except ImportError:
|
|
||||||
multiprocessing = None # type: ignore
|
|
||||||
|
|
||||||
Results = List[Tuple[str, int, int, str, Optional[str]]]
|
Results = List[Tuple[str, int, int, str, Optional[str]]]
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
@ -40,13 +36,6 @@ SERIAL_RETRY_ERRNOS = {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def _multiprocessing_is_fork() -> bool:
|
|
||||||
"""Class state is only preserved when using the `fork` strategy."""
|
|
||||||
return bool(
|
|
||||||
multiprocessing and multiprocessing.get_start_method() == "fork"
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class Manager:
|
class Manager:
|
||||||
"""Manage the parallelism and checker instances for each plugin and file.
|
"""Manage the parallelism and checker instances for each plugin and file.
|
||||||
|
|
||||||
|
|
@ -113,7 +102,9 @@ class Manager:
|
||||||
# - we're processing a diff, which again does not work well with
|
# - we're processing a diff, which again does not work well with
|
||||||
# multiprocessing and which really shouldn't require multiprocessing
|
# multiprocessing and which really shouldn't require multiprocessing
|
||||||
# - the user provided some awful input
|
# - the user provided some awful input
|
||||||
if not _multiprocessing_is_fork():
|
|
||||||
|
# class state is only preserved when using the `fork` strategy.
|
||||||
|
if multiprocessing.get_start_method() != "fork":
|
||||||
LOG.warning(
|
LOG.warning(
|
||||||
"The multiprocessing module is not available. "
|
"The multiprocessing module is not available. "
|
||||||
"Ignoring --jobs arguments."
|
"Ignoring --jobs arguments."
|
||||||
|
|
|
||||||
|
|
@ -227,6 +227,29 @@ def test_bug_report_successful(capsys):
|
||||||
assert err == ""
|
assert err == ""
|
||||||
|
|
||||||
|
|
||||||
|
def test_benchmark_successful(tmp_path, capsys):
|
||||||
|
"""Test that --benchmark does not crash."""
|
||||||
|
fname = tmp_path.joinpath("t.py")
|
||||||
|
fname.write_text("print('hello world')\n")
|
||||||
|
|
||||||
|
_call_main(["--benchmark", str(fname)])
|
||||||
|
|
||||||
|
out, err = capsys.readouterr()
|
||||||
|
parts = [line.split(maxsplit=1) for line in out.splitlines()]
|
||||||
|
assert parts == [
|
||||||
|
[mock.ANY, "seconds elapsed"],
|
||||||
|
["1", "total logical lines processed"],
|
||||||
|
[mock.ANY, "logical lines processed per second"],
|
||||||
|
["1", "total physical lines processed"],
|
||||||
|
[mock.ANY, "physical lines processed per second"],
|
||||||
|
["5", "total tokens processed"],
|
||||||
|
[mock.ANY, "tokens processed per second"],
|
||||||
|
["1", "total files processed"],
|
||||||
|
[mock.ANY, "files processed per second"],
|
||||||
|
]
|
||||||
|
assert err == ""
|
||||||
|
|
||||||
|
|
||||||
def test_specific_noqa_does_not_clobber_pycodestyle_noqa(tmpdir, capsys):
|
def test_specific_noqa_does_not_clobber_pycodestyle_noqa(tmpdir, capsys):
|
||||||
"""See https://github.com/pycqa/flake8/issues/1104."""
|
"""See https://github.com/pycqa/flake8/issues/1104."""
|
||||||
with tmpdir.as_cwd():
|
with tmpdir.as_cwd():
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
"""Tests for the Manager object for FileCheckers."""
|
"""Tests for the Manager object for FileCheckers."""
|
||||||
import errno
|
import errno
|
||||||
|
import multiprocessing
|
||||||
from unittest import mock
|
from unittest import mock
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
@ -37,8 +38,8 @@ def test_oserrors_cause_serial_fall_back():
|
||||||
assert serial.call_count == 1
|
assert serial.call_count == 1
|
||||||
|
|
||||||
|
|
||||||
@mock.patch("flake8.checker._multiprocessing_is_fork", return_value=True)
|
@mock.patch.object(multiprocessing, "get_start_method", return_value="fork")
|
||||||
def test_oserrors_are_reraised(is_windows):
|
def test_oserrors_are_reraised(_):
|
||||||
"""Verify that unexpected OSErrors will cause the Manager to reraise."""
|
"""Verify that unexpected OSErrors will cause the Manager to reraise."""
|
||||||
err = OSError(errno.EAGAIN, "Ominous message")
|
err = OSError(errno.EAGAIN, "Ominous message")
|
||||||
with mock.patch("_multiprocessing.SemLock", side_effect=err):
|
with mock.patch("_multiprocessing.SemLock", side_effect=err):
|
||||||
|
|
@ -49,15 +50,30 @@ def test_oserrors_are_reraised(is_windows):
|
||||||
assert serial.call_count == 0
|
assert serial.call_count == 0
|
||||||
|
|
||||||
|
|
||||||
def test_multiprocessing_is_disabled():
|
@mock.patch.object(multiprocessing, "get_start_method", return_value="spawn")
|
||||||
|
def test_multiprocessing_is_disabled(_):
|
||||||
"""Verify not being able to import multiprocessing forces jobs to 0."""
|
"""Verify not being able to import multiprocessing forces jobs to 0."""
|
||||||
style_guide = style_guide_mock()
|
style_guide = style_guide_mock()
|
||||||
with mock.patch("flake8.checker.multiprocessing", None):
|
|
||||||
manager = checker.Manager(style_guide, [], [])
|
manager = checker.Manager(style_guide, [], [])
|
||||||
assert manager.jobs == 0
|
assert manager.jobs == 0
|
||||||
|
|
||||||
|
|
||||||
def test_make_checkers():
|
def test_multiprocessing_cpu_count_not_implemented():
|
||||||
|
"""Verify that jobs is 0 if cpu_count is unavailable."""
|
||||||
|
style_guide = style_guide_mock()
|
||||||
|
style_guide.options.jobs = JobsArgument("auto")
|
||||||
|
|
||||||
|
with mock.patch.object(
|
||||||
|
multiprocessing,
|
||||||
|
"cpu_count",
|
||||||
|
side_effect=NotImplementedError,
|
||||||
|
):
|
||||||
|
manager = checker.Manager(style_guide, [], [])
|
||||||
|
assert manager.jobs == 0
|
||||||
|
|
||||||
|
|
||||||
|
@mock.patch.object(multiprocessing, "get_start_method", return_value="spawn")
|
||||||
|
def test_make_checkers(_):
|
||||||
"""Verify that we create a list of FileChecker instances."""
|
"""Verify that we create a list of FileChecker instances."""
|
||||||
style_guide = style_guide_mock()
|
style_guide = style_guide_mock()
|
||||||
files = ["file1", "file2"]
|
files = ["file1", "file2"]
|
||||||
|
|
@ -67,7 +83,6 @@ def test_make_checkers():
|
||||||
"logical_line_plugins": [],
|
"logical_line_plugins": [],
|
||||||
"physical_line_plugins": [],
|
"physical_line_plugins": [],
|
||||||
}
|
}
|
||||||
with mock.patch("flake8.checker.multiprocessing", None):
|
|
||||||
manager = checker.Manager(style_guide, files, checkplugins)
|
manager = checker.Manager(style_guide, files, checkplugins)
|
||||||
|
|
||||||
with mock.patch("flake8.utils.filenames_from") as filenames_from:
|
with mock.patch("flake8.utils.filenames_from") as filenames_from:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue