mirror of
https://github.com/PyCQA/flake8.git
synced 2026-04-12 07:44:16 +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
|
pycodestyle >= 2.7.0, < 2.8.0
|
||||||
mccabe >= 0.6.0, < 0.7.0
|
mccabe >= 0.6.0, < 0.7.0
|
||||||
importlib-metadata; python_version<"3.8"
|
importlib-metadata; python_version<"3.8"
|
||||||
|
toml
|
||||||
|
|
||||||
python_requires = >=3.6
|
python_requires = >=3.6
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ from typing import List
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
from typing import Tuple
|
from typing import Tuple
|
||||||
|
|
||||||
|
import toml
|
||||||
from flake8 import utils
|
from flake8 import utils
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
@ -51,7 +52,9 @@ class ConfigFileFinder:
|
||||||
self.user_config_file = self._user_config_file(program_name)
|
self.user_config_file = self._user_config_file(program_name)
|
||||||
|
|
||||||
# List of filenames to find in the local/project directory
|
# 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)
|
self.local_directory = os.path.abspath(os.curdir)
|
||||||
|
|
||||||
|
|
@ -77,7 +80,17 @@ class ConfigFileFinder:
|
||||||
found_files = []
|
found_files = []
|
||||||
for filename in files:
|
for filename in files:
|
||||||
try:
|
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:
|
except UnicodeDecodeError:
|
||||||
LOG.exception(
|
LOG.exception(
|
||||||
"There was an error decoding a config file."
|
"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"
|
CLI_SPECIFIED_FILEPATH = "tests/fixtures/config_files/cli-specified.ini"
|
||||||
BROKEN_CONFIG_PATH = "tests/fixtures/config_files/broken.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."""
|
"""Verify opening and reading the file specified via the cli."""
|
||||||
cli_filepath = CLI_SPECIFIED_FILEPATH
|
|
||||||
finder = config.ConfigFileFinder("flake8")
|
finder = config.ConfigFileFinder("flake8")
|
||||||
|
|
||||||
parsed_config = finder.cli_config(cli_filepath)
|
parsed_config = finder.cli_config(cli_filepath)
|
||||||
|
|
@ -91,13 +100,19 @@ def test_local_configs():
|
||||||
"files",
|
"files",
|
||||||
[
|
[
|
||||||
[BROKEN_CONFIG_PATH],
|
[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):
|
def test_read_config_catches_broken_config_files(files):
|
||||||
"""Verify that we do not allow the exception to bubble up."""
|
"""Verify that we do not allow the exception to bubble up."""
|
||||||
_, parsed = config.ConfigFileFinder._read_config(*files)
|
_, parsed = config.ConfigFileFinder._read_config(*files)
|
||||||
assert BROKEN_CONFIG_PATH not in parsed
|
assert BROKEN_CONFIG_PATH not in parsed
|
||||||
|
assert BROKEN_PYPROJECT_CONFIG_PATH not in parsed
|
||||||
|
|
||||||
|
|
||||||
def test_read_config_catches_decoding_errors(tmpdir):
|
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/cli-specified.ini", True),
|
||||||
("tests/fixtures/config_files/no-flake8-section.ini", False),
|
("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(
|
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.ini",
|
||||||
"tests/fixtures/config_files/cli-specified-with-inline-comments.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-without-inline-comments.ini", # noqa: E501
|
||||||
|
"tests/fixtures/config_files/cli-specified-pyproject.toml",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
def test_parsed_configs_are_equivalent(
|
def test_parsed_configs_are_equivalent(
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue