mirror of
https://github.com/PyCQA/flake8.git
synced 2026-04-06 21:16:54 +00:00
Add support for reading config from pyproject.toml
This commit is contained in:
parent
1d30b79ce1
commit
c609b69914
7 changed files with 72 additions and 5 deletions
|
|
@ -42,6 +42,7 @@ install_requires=
|
|||
pycodestyle >= 2.7.0, < 2.8.0
|
||||
mccabe >= 0.6.0, < 0.7.0
|
||||
importlib-metadata; python_version<"3.8"
|
||||
toml
|
||||
|
||||
python_requires = >=3.6
|
||||
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ from typing import List
|
|||
from typing import Optional
|
||||
from typing import Tuple
|
||||
|
||||
import toml
|
||||
from flake8 import utils
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
|
@ -51,7 +52,9 @@ class ConfigFileFinder:
|
|||
self.user_config_file = self._user_config_file(program_name)
|
||||
|
||||
# List of filenames to find in the local/project directory
|
||||
self.project_filenames = ("setup.cfg", "tox.ini", f".{program_name}")
|
||||
self.project_filenames = (
|
||||
"pyproject.toml", "setup.cfg", "tox.ini", f".{program_name}",
|
||||
)
|
||||
|
||||
self.local_directory = os.path.abspath(os.curdir)
|
||||
|
||||
|
|
@ -77,7 +80,17 @@ class ConfigFileFinder:
|
|||
found_files = []
|
||||
for filename in files:
|
||||
try:
|
||||
found_files.extend(config.read(filename))
|
||||
if filename.endswith("pyproject.toml"):
|
||||
pyproject_config = toml.load(filename)
|
||||
config.read_dict(
|
||||
{
|
||||
"flake8": pyproject_config["tool"]["flake8"],
|
||||
},
|
||||
source=filename,
|
||||
)
|
||||
found_files.append(filename)
|
||||
else:
|
||||
found_files.extend(config.read(filename))
|
||||
except UnicodeDecodeError:
|
||||
LOG.exception(
|
||||
"There was an error decoding a config file."
|
||||
|
|
|
|||
12
tests/fixtures/config_files/broken-pyproject.toml
vendored
Normal file
12
tests/fixtures/config_files/broken-pyproject.toml
vendored
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
[tool.flake8]
|
||||
ignore = [
|
||||
"E123",
|
||||
"W234",
|
||||
E111,
|
||||
]
|
||||
exclude = [
|
||||
"foo/",
|
||||
"bar/",
|
||||
"bogus/",
|
||||
]
|
||||
quiet = 1
|
||||
12
tests/fixtures/config_files/cli-specified-pyproject.toml
vendored
Normal file
12
tests/fixtures/config_files/cli-specified-pyproject.toml
vendored
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
[tool.flake8]
|
||||
ignore = [
|
||||
"E123",
|
||||
"W234",
|
||||
"E111",
|
||||
]
|
||||
exclude = [
|
||||
"foo/",
|
||||
"bar/",
|
||||
"bogus/",
|
||||
]
|
||||
quiet = 1
|
||||
12
tests/fixtures/config_files/no-flake8-section-pyproject.toml
vendored
Normal file
12
tests/fixtures/config_files/no-flake8-section-pyproject.toml
vendored
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
[tool.flake9]
|
||||
ignore = [
|
||||
"E123",
|
||||
"W234",
|
||||
"E111",
|
||||
]
|
||||
exclude = [
|
||||
"foo/",
|
||||
"bar/",
|
||||
"bogus/",
|
||||
]
|
||||
quiet = 1
|
||||
|
|
@ -10,10 +10,19 @@ from flake8.options import config
|
|||
CLI_SPECIFIED_FILEPATH = "tests/fixtures/config_files/cli-specified.ini"
|
||||
BROKEN_CONFIG_PATH = "tests/fixtures/config_files/broken.ini"
|
||||
|
||||
CLI_SPECIFIED_PYPROJECT_CONFIG_PATH = "tests/fixtures/config_files/cli-specified-pyproject.toml" # noqa: E501
|
||||
BROKEN_PYPROJECT_CONFIG_PATH = "tests/fixtures/config_files/broken-pyproject.toml" # noqa: E501
|
||||
|
||||
def test_cli_config():
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"cli_filepath",
|
||||
[
|
||||
CLI_SPECIFIED_FILEPATH,
|
||||
CLI_SPECIFIED_PYPROJECT_CONFIG_PATH,
|
||||
],
|
||||
)
|
||||
def test_cli_config(cli_filepath):
|
||||
"""Verify opening and reading the file specified via the cli."""
|
||||
cli_filepath = CLI_SPECIFIED_FILEPATH
|
||||
finder = config.ConfigFileFinder("flake8")
|
||||
|
||||
parsed_config = finder.cli_config(cli_filepath)
|
||||
|
|
@ -91,13 +100,19 @@ def test_local_configs():
|
|||
"files",
|
||||
[
|
||||
[BROKEN_CONFIG_PATH],
|
||||
[CLI_SPECIFIED_FILEPATH, BROKEN_CONFIG_PATH],
|
||||
[BROKEN_PYPROJECT_CONFIG_PATH],
|
||||
[
|
||||
CLI_SPECIFIED_FILEPATH,
|
||||
BROKEN_CONFIG_PATH,
|
||||
BROKEN_PYPROJECT_CONFIG_PATH,
|
||||
],
|
||||
],
|
||||
)
|
||||
def test_read_config_catches_broken_config_files(files):
|
||||
"""Verify that we do not allow the exception to bubble up."""
|
||||
_, parsed = config.ConfigFileFinder._read_config(*files)
|
||||
assert BROKEN_CONFIG_PATH not in parsed
|
||||
assert BROKEN_PYPROJECT_CONFIG_PATH not in parsed
|
||||
|
||||
|
||||
def test_read_config_catches_decoding_errors(tmpdir):
|
||||
|
|
|
|||
|
|
@ -54,6 +54,7 @@ def test_parse_cli_config(optmanager, config_finder):
|
|||
[
|
||||
("tests/fixtures/config_files/cli-specified.ini", True),
|
||||
("tests/fixtures/config_files/no-flake8-section.ini", False),
|
||||
("tests/fixtures/config_files/no-flake8-section-pyproject.toml", False), # noqa: E501
|
||||
],
|
||||
)
|
||||
def test_is_configured_by(
|
||||
|
|
@ -188,6 +189,7 @@ def test_parse_uses_cli_config(optmanager):
|
|||
"tests/fixtures/config_files/cli-specified.ini",
|
||||
"tests/fixtures/config_files/cli-specified-with-inline-comments.ini",
|
||||
"tests/fixtures/config_files/cli-specified-without-inline-comments.ini", # noqa: E501
|
||||
"tests/fixtures/config_files/cli-specified-pyproject.toml",
|
||||
],
|
||||
)
|
||||
def test_parsed_configs_are_equivalent(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue