warn user if addoption is used after configuration and parsing phase.
This commit is contained in:
parent
95e0e2ba8c
commit
98dd9e0787
|
@ -1,2 +1,8 @@
|
||||||
`Parser.addoption` now throws a value error if an attempt is made at adding an option
|
`Parser.addoption` now throws a value error if an attempt is made at adding an option
|
||||||
after the pre_parsing process without including a default.
|
after the pre_parsing process without including a default. If the user decides to
|
||||||
|
provides a default a warning will be given since the option will not be available
|
||||||
|
for use in the command line.
|
||||||
|
|
||||||
|
This occurs if conftest files aren't in the root directory or any sub directory
|
||||||
|
matching the `test*` regex. conftest files which match the previous statement
|
||||||
|
will have their options added after the configuration and parsing phase.
|
||||||
|
|
|
@ -22,6 +22,7 @@ from _pytest.deprecated import ARGUMENT_PERCENT_DEFAULT
|
||||||
from _pytest.deprecated import ARGUMENT_TYPE_STR
|
from _pytest.deprecated import ARGUMENT_TYPE_STR
|
||||||
from _pytest.deprecated import ARGUMENT_TYPE_STR_CHOICE
|
from _pytest.deprecated import ARGUMENT_TYPE_STR_CHOICE
|
||||||
from _pytest.deprecated import check_ispytest
|
from _pytest.deprecated import check_ispytest
|
||||||
|
from _pytest.warning_types import PytestConfigWarning
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from typing import NoReturn
|
from typing import NoReturn
|
||||||
|
@ -363,9 +364,12 @@ class OptionGroup:
|
||||||
accepted **and** the automatic destination is in ``args.twowords``.
|
accepted **and** the automatic destination is in ``args.twowords``.
|
||||||
"""
|
"""
|
||||||
if getattr(self.parser, "after_preparse", False) and "default" not in attrs:
|
if getattr(self.parser, "after_preparse", False) and "default" not in attrs:
|
||||||
raise ValueError(
|
raise UsageError("Cannot add options after initial conftest discovery")
|
||||||
"Cannot add options without default after initial conftest discovery"
|
elif getattr(self.parser, "after_preparse", False):
|
||||||
|
warn = ("Adding option {option} after configuration phase").format(
|
||||||
|
option=optnames
|
||||||
)
|
)
|
||||||
|
warnings.warn(PytestConfigWarning(warn), stacklevel=3)
|
||||||
|
|
||||||
conflict = set(optnames).intersection(
|
conflict = set(optnames).intersection(
|
||||||
name for opt in self.options for name in opt.names()
|
name for opt in self.options for name in opt.names()
|
||||||
|
|
|
@ -13,6 +13,7 @@ from _pytest.main import Session
|
||||||
from _pytest.monkeypatch import MonkeyPatch
|
from _pytest.monkeypatch import MonkeyPatch
|
||||||
from _pytest.pathlib import import_path
|
from _pytest.pathlib import import_path
|
||||||
from _pytest.pytester import Pytester
|
from _pytest.pytester import Pytester
|
||||||
|
from _pytest.warning_types import PytestConfigWarning
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
|
@ -73,9 +74,13 @@ class TestPytestPluginInteractions:
|
||||||
default=True)
|
default=True)
|
||||||
"""
|
"""
|
||||||
)
|
)
|
||||||
config.pluginmanager._importconftest(
|
with pytest.warns(PytestConfigWarning) as warn:
|
||||||
p, importmode="prepend", rootpath=pytester.path
|
config.pluginmanager._importconftest(
|
||||||
)
|
p, importmode="prepend", rootpath=pytester.path
|
||||||
|
)
|
||||||
|
|
||||||
|
assert len(warn) == 1
|
||||||
|
assert str(warn[0].message).endswith("after configuration phase")
|
||||||
assert config.option.test123
|
assert config.option.test123
|
||||||
|
|
||||||
def test_do_option_postinit_nodefault(self, pytester: Pytester) -> None:
|
def test_do_option_postinit_nodefault(self, pytester: Pytester) -> None:
|
||||||
|
@ -87,7 +92,9 @@ class TestPytestPluginInteractions:
|
||||||
parser.addoption('--deadbeef', action="store_true")
|
parser.addoption('--deadbeef', action="store_true")
|
||||||
"""
|
"""
|
||||||
)
|
)
|
||||||
with pytest.raises(ValueError):
|
with pytest.raises(
|
||||||
|
UsageError, match="^Cannot add options after initial conftest discovery$"
|
||||||
|
):
|
||||||
config.pluginmanager._importconftest(
|
config.pluginmanager._importconftest(
|
||||||
p, importmode="prepend", rootpath=pytester.path
|
p, importmode="prepend", rootpath=pytester.path
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in New Issue