Add support for reading config from pyproject.toml

This commit is contained in:
Joseph Egan 2021-05-12 00:30:04 +01:00
parent 1d30b79ce1
commit c609b69914
7 changed files with 72 additions and 5 deletions

View file

@ -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

View file

@ -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."

View file

@ -0,0 +1,12 @@
[tool.flake8]
ignore = [
"E123",
"W234",
E111,
]
exclude = [
"foo/",
"bar/",
"bogus/",
]
quiet = 1

View file

@ -0,0 +1,12 @@
[tool.flake8]
ignore = [
"E123",
"W234",
"E111",
]
exclude = [
"foo/",
"bar/",
"bogus/",
]
quiet = 1

View file

@ -0,0 +1,12 @@
[tool.flake9]
ignore = [
"E123",
"W234",
"E111",
]
exclude = [
"foo/",
"bar/",
"bogus/",
]
quiet = 1

View file

@ -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):

View file

@ -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(