From 55a7b66faeaef2686eaeebdebb02d433a0d49a6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bern=C3=A1t=20G=C3=A1bor?= Date: Mon, 19 Dec 2022 14:19:14 -0800 Subject: [PATCH] Fix provisioning (#2750) --- src/tox/provision.py | 11 ++++++----- src/tox/session/env_select.py | 8 +++----- tests/test_provision.py | 2 +- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/tox/provision.py b/src/tox/provision.py index 529276d59d..34b56d07e9 100644 --- a/src/tox/provision.py +++ b/src/tox/provision.py @@ -62,7 +62,7 @@ def provision(state: State) -> int | bool: keys=["min_version", "minversion"], of_type=Version, # do not include local version specifier (because it's not allowed in version spec per PEP-440) - default=Version("4.0"), + default=None, # type: ignore # Optional[Version] translates to object desc="Define the minimal tox version required to run", ) state.conf.core.add_config( @@ -72,10 +72,10 @@ def provision(state: State) -> int | bool: desc="Name of the virtual environment used to provision a tox.", ) - def add_tox_requires_min_version(requires: list[Requirement]) -> list[Requirement]: + def add_tox_requires_min_version(reqs: list[Requirement]) -> list[Requirement]: min_version: Version = state.conf.core["min_version"] - requires.append(Requirement(f"tox >= {min_version}")) - return requires + reqs.append(Requirement(f"tox{f'>={min_version}' if min_version else ''}")) + return reqs state.conf.core.add_config( keys="requires", @@ -113,8 +113,9 @@ def add_tox_requires_min_version(requires: list[Requirement]) -> list[Requiremen msg = f"provisioning explicitly disabled within {sys.executable}, but {miss_msg}" if isinstance(no_provision, str): msg += f" and wrote to {no_provision}" + min_version = str(next(i.specifier for i in requires if i.name == "tox")).split("=") requires_dict = { - "minversion": str(next(i.specifier for i in requires if i.name == "tox")).split("=")[1], + "minversion": min_version[1] if len(min_version) >= 2 else None, "requires": [str(i) for i in requires], } Path(no_provision).write_text(json.dumps(requires_dict, indent=4)) diff --git a/src/tox/session/env_select.py b/src/tox/session/env_select.py index fcf288939a..c746c25b52 100644 --- a/src/tox/session/env_select.py +++ b/src/tox/session/env_select.py @@ -232,11 +232,9 @@ def _finalize_config(self) -> None: def _build_run_env(self, name: str) -> RunToxEnv | None: if self._provision is not None and self._provision[0] is False and name == self._provision[1]: return None - env_conf = self._state.conf.get_env( - name, - package=False, - loaders=[self._provision[2]] if self._provision is not None and self._provision[1] == name else None, - ) + env_conf = self._state.conf.get_env(name, package=False) + if self._provision is not None and self._provision[1] == name: + env_conf.loaders.insert(0, self._provision[2]) desc = "the tox execute used to evaluate this environment" env_conf.add_config(keys="runner", desc=desc, of_type=str, default=self._state.conf.options.default_runner) runner = REGISTER.runner(cast(str, env_conf["runner"])) diff --git a/tests/test_provision.py b/tests/test_provision.py index cc95915310..c7a7fac2d0 100644 --- a/tests/test_provision.py +++ b/tests/test_provision.py @@ -186,4 +186,4 @@ def test_provision_no_recreate_json(tox_project: ToxProjectCreator) -> None: assert msg in result.out with (project.path / "out.json").open() as file_handler: requires = json.load(file_handler) - assert requires == {"minversion": "4.0", "requires": ["p", "tox>=4.0"]} + assert requires == {"minversion": None, "requires": ["p", "tox"]}