Output a warning to stderr when an invalid key is read from an INI config file

This commit is contained in:
Gleb Nikonorov 2020-05-30 20:36:02 -04:00
parent 56bf819c2f
commit eef4f87e7b
2 changed files with 55 additions and 0 deletions

View File

@ -1020,6 +1020,7 @@ class Config:
) )
self._checkversion() self._checkversion()
self._validatekeys()
self._consider_importhook(args) self._consider_importhook(args)
self.pluginmanager.consider_preparse(args, exclude_only=False) self.pluginmanager.consider_preparse(args, exclude_only=False)
if not os.environ.get("PYTEST_DISABLE_PLUGIN_AUTOLOAD"): if not os.environ.get("PYTEST_DISABLE_PLUGIN_AUTOLOAD"):
@ -1072,6 +1073,14 @@ class Config:
) )
) )
def _validatekeys(self):
for key in self._get_unknown_ini_keys():
sys.stderr.write("WARNING: unknown config ini key: {}\n".format(key))
def _get_unknown_ini_keys(self) -> List[str]:
parser_inicfg = self._parser._inidict
return [name for name in self.inicfg if name not in parser_inicfg]
def parse(self, args: List[str], addopts: bool = True) -> None: def parse(self, args: List[str], addopts: bool = True) -> None:
# parse given cmdline arguments into this config object. # parse given cmdline arguments into this config object.
assert not hasattr( assert not hasattr(

View File

@ -147,6 +147,52 @@ class TestParseIni:
result = testdir.inline_run("--confcutdir=.") result = testdir.inline_run("--confcutdir=.")
assert result.ret == 0 assert result.ret == 0
@pytest.mark.parametrize(
"ini_file_text, invalid_keys, stderr_output",
[
(
"""
[pytest]
unknown_ini = value1
another_unknown_ini = value2
""",
["unknown_ini", "another_unknown_ini"],
[
"WARNING: unknown config ini key: unknown_ini",
"WARNING: unknown config ini key: another_unknown_ini",
],
),
(
"""
[pytest]
unknown_ini = value1
minversion = 5.0.0
""",
["unknown_ini"],
["WARNING: unknown config ini key: unknown_ini"],
),
(
"""
[pytest]
minversion = 5.0.0
""",
[],
[],
),
],
)
def test_invalid_ini_keys_generate_warings(
self, testdir, ini_file_text, invalid_keys, stderr_output
):
testdir.tmpdir.join("pytest.ini").write(textwrap.dedent(ini_file_text))
config = testdir.parseconfig()
assert config._get_unknown_ini_keys() == invalid_keys, str(
config._get_unknown_ini_keys()
)
result = testdir.runpytest()
result.stderr.fnmatch_lines(stderr_output)
class TestConfigCmdlineParsing: class TestConfigCmdlineParsing:
def test_parsing_again_fails(self, testdir): def test_parsing_again_fails(self, testdir):