-
-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
config: Handle rich (non-string) types in TOML file
Fixes #3538 Before that, we had to use strings in a TOML configuration file, like this: enable = "use-symbolic-message-instead,useless-suppression" jobs = "10" suggestion-mode = "no" TOML supports rich types like list, integer and boolean. They make for a more readable and less error-prone file. We can now express the same configuration like this: enable = [ "use-symbolic-message-instead", "useless-suppression", ] jobs = 10 suggestion-mode = false
- Loading branch information
1 parent
c4c96ec
commit ffb6006
Showing
4 changed files
with
100 additions
and
24 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -381,3 +381,5 @@ contributors: | |
* Yang Yang: contributor | ||
|
||
* Andrew J. Simmons (anjsimmo): contributor | ||
|
||
* Damien Baty: contributor |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,37 +1,93 @@ | ||
# pylint: disable=missing-module-docstring, missing-function-docstring, protected-access | ||
import unittest.mock | ||
|
||
import pylint.lint | ||
|
||
|
||
def test_can_read_toml(tmp_path): | ||
config_file = tmp_path / "pyproject.toml" | ||
def check_configuration_file_reader(config_file): | ||
"""Initialize pylint with the given configuration file and check that | ||
what we initialized the linter with what was expected. | ||
""" | ||
args = ["--rcfile", str(config_file), __file__] | ||
# If we used `pytest.raises(SystemExit)`, the `runner` variable | ||
# would not be accessible outside the `with` block. | ||
with unittest.mock.patch("sys.exit") as mocked_exit: | ||
# Do not actually run checks, that could be slow. Do not mock | ||
# `Pylinter.check`: it calls `Pylinter.initialize` which is | ||
# needed to properly set up messages inclusion/exclusion | ||
# in `_msg_states`, used by `is_message_enabled`. | ||
with unittest.mock.patch("pylint.lint.pylinter.check_parallel"): | ||
runner = pylint.lint.Run(args) | ||
|
||
# "logging-not-lazy" and "logging-format-interpolation" | ||
expected_disabled = {"W1201", "W1202"} | ||
for msgid in expected_disabled: | ||
assert not runner.linter.is_message_enabled(msgid) | ||
assert runner.linter.config.jobs == 10 | ||
assert runner.linter.config.reports | ||
|
||
mocked_exit.assert_called_once_with(0) | ||
return runner | ||
|
||
|
||
def test_can_read_ini(tmp_path): | ||
# Check that we can read the "regular" INI .pylintrc file | ||
config_file = tmp_path / ".pylintrc" | ||
config_file.write_text( | ||
"[tool.pylint.'messages control']\n" | ||
"disable='all'\n" | ||
"enable='missing-module-docstring'\n" | ||
"jobs=10\n" | ||
""" | ||
[messages control] | ||
disable = logging-not-lazy,logging-format-interpolation | ||
jobs = 10 | ||
reports = yes | ||
""" | ||
) | ||
linter = pylint.lint.PyLinter() | ||
linter.global_set_option = unittest.mock.MagicMock() | ||
linter.read_config_file(str(config_file)) | ||
|
||
assert linter.global_set_option.called_with("disable", "all") | ||
assert linter.global_set_option.called_with("enable", "missing-module-docstring") | ||
assert linter.global_set_option.called_with("jobs", 10) | ||
check_configuration_file_reader(config_file) | ||
|
||
|
||
def test_can_read_setup_cfg(tmp_path): | ||
# Check that we can read a setup.cfg (which is an INI file where | ||
# section names are prefixed with "pylint." | ||
config_file = tmp_path / "setup.cfg" | ||
config_file.write_text( | ||
"[pylint.messages control]\n" | ||
"disable=all\n" | ||
"enable=missing-module-docstring\n" | ||
"jobs=10\n" | ||
""" | ||
[pylint.messages control] | ||
disable = logging-not-lazy,logging-format-interpolation | ||
jobs = 10 | ||
reports = yes | ||
""" | ||
) | ||
linter = pylint.lint.PyLinter() | ||
linter.global_set_option = unittest.mock.MagicMock() | ||
linter.read_config_file(str(config_file)) | ||
check_configuration_file_reader(config_file) | ||
|
||
assert linter.global_set_option.called_with("disable", "all") | ||
assert linter.global_set_option.called_with("enable", "missing-module-docstring") | ||
assert linter.global_set_option.called_with("jobs", 10) | ||
|
||
def test_can_read_toml(tmp_path): | ||
# Check that we can read a TOML file where lists and integers are | ||
# expressed as strings. | ||
config_file = tmp_path / "pyproject.toml" | ||
config_file.write_text( | ||
""" | ||
[tool.pylint."messages control"] | ||
disable = "logging-not-lazy,logging-format-interpolation" | ||
jobs = "10" | ||
reports = "yes" | ||
""" | ||
) | ||
check_configuration_file_reader(config_file) | ||
|
||
|
||
def test_can_read_toml_rich_types(tmp_path): | ||
# Check that we can read a TOML file where lists, integers and | ||
# booleans are expressed as such (and not as strings), using TOML | ||
# type system. | ||
config_file = tmp_path / "pyproject.toml" | ||
config_file.write_text( | ||
""" | ||
[tool.pylint."messages control"] | ||
disable = [ | ||
"logging-not-lazy", | ||
"logging-format-interpolation", | ||
] | ||
jobs = 10 | ||
reports = true | ||
""" | ||
) | ||
check_configuration_file_reader(config_file) |