From f18b5430b18619ade84bd283dadf7790278ffaf8 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Sat, 13 May 2023 13:51:28 -0400 Subject: fix legacy `tox --devenv venv` --- docs/changelog/2925.bugfix.rst | 1 + src/tox/session/cmd/legacy.py | 1 + src/tox/session/env_select.py | 5 ++++- tests/session/cmd/test_legacy.py | 13 +++++++++++-- tests/session/test_env_select.py | 11 +++++++++++ 5 files changed, 28 insertions(+), 3 deletions(-) create mode 100644 docs/changelog/2925.bugfix.rst diff --git a/docs/changelog/2925.bugfix.rst b/docs/changelog/2925.bugfix.rst new file mode 100644 index 00000000..f74003a9 --- /dev/null +++ b/docs/changelog/2925.bugfix.rst @@ -0,0 +1 @@ +Fix ``tox --devenv venv`` invocation without ``-e`` - by :user:`asottile`. diff --git a/src/tox/session/cmd/legacy.py b/src/tox/session/cmd/legacy.py index e92c3d27..b3327b08 100644 --- a/src/tox/session/cmd/legacy.py +++ b/src/tox/session/cmd/legacy.py @@ -105,6 +105,7 @@ def legacy(state: State) -> int: return list_env(state) if option.devenv_path: option.devenv_path = Path(option.devenv_path) + option.env = option.env or CliEnv("py") return devenv(state) if option.parallel != 0: # only 0 means sequential return run_parallel(state) diff --git a/src/tox/session/env_select.py b/src/tox/session/env_select.py index f091474d..5bb283b3 100644 --- a/src/tox/session/env_select.py +++ b/src/tox/session/env_select.py @@ -125,7 +125,6 @@ class EnvSelector: self.on_empty_fallback_py = True self._warned_about: set[str] = set() #: shared set of skipped environments that were already warned about self._state = state - self._cli_envs: CliEnv | None = getattr(self._state.conf.options, "env", None) self._defined_envs_: None | dict[str, _ToxEnvInfo] = None self._pkg_env_counter: Counter[str] = Counter() from tox.plugin.manager import MANAGER @@ -139,6 +138,10 @@ class EnvSelector: tox_env_filter_regex = getattr(state.conf.options, "skip_env", "").strip() self._filter_re = re.compile(tox_env_filter_regex) if tox_env_filter_regex else None + @property + def _cli_envs(self) -> CliEnv | None: + return getattr(self._state.conf.options, "env", None) + def _collect_names(self) -> Iterator[tuple[Iterable[str], bool]]: """:return: sources of tox environments defined with name and if is marked as target to run""" if self._provision is not None: # pragma: no branch diff --git a/tests/session/cmd/test_legacy.py b/tests/session/cmd/test_legacy.py index 957149b6..1aa7e473 100644 --- a/tests/session/cmd/test_legacy.py +++ b/tests/session/cmd/test_legacy.py @@ -78,13 +78,22 @@ def test_legacy_list_all(tox_project: ToxProjectCreator, mocker: MockerFixture, assert outcome.state.conf.options.show_core is False -def test_legacy_devenv(tox_project: ToxProjectCreator, mocker: MockerFixture, tmp_path: Path) -> None: +@pytest.mark.parametrize("args", [(), ("-e", "py")]) +def test_legacy_devenv( + tox_project: ToxProjectCreator, + mocker: MockerFixture, + tmp_path: Path, + args: tuple[str, ...], +) -> None: devenv = mocker.patch("tox.session.cmd.legacy.devenv") into = tmp_path / "b" - outcome = tox_project({"tox.ini": ""}).run("le", "--devenv", str(into), "-e", "py") + outcome = tox_project({"tox.ini": ""}).run("le", "--devenv", str(into), *args) + + outcome.state.envs.ensure_only_run_env_is_active() assert devenv.call_count == 1 + assert set(outcome.state.conf.options.env) == {"py"} assert outcome.state.conf.options.devenv_path == into diff --git a/tests/session/test_env_select.py b/tests/session/test_env_select.py index 496107a3..e8378fc7 100644 --- a/tests/session/test_env_select.py +++ b/tests/session/test_env_select.py @@ -2,7 +2,10 @@ from __future__ import annotations import pytest +from tox.config.cli.parse import get_options from tox.pytest import MonkeyPatch, ToxProjectCreator +from tox.session.env_select import CliEnv, EnvSelector +from tox.session.state import State def test_label_core_can_define(tox_project: ToxProjectCreator) -> None: @@ -117,3 +120,11 @@ def test_tox_skip_env_logs(tox_project: ToxProjectCreator, monkeypatch: MonkeyPa outcome = project.run("l", "--no-desc") outcome.assert_success() outcome.assert_out_err("ROOT: skip environment mypy, matches filter 'm[y]py'\npy310\npy39\n", "") + + +def test_env_select_lazily_looks_at_envs() -> None: + state = State(get_options(), []) + env_selector = EnvSelector(state) + # late-assigning env should be reflected in env_selector + state.conf.options.env = CliEnv("py") + assert set(env_selector.iter()) == {"py"} -- cgit v1.2.1