Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix tox_root propagation to work_dir #2962

Merged
merged 14 commits into from
Apr 5, 2023
1 change: 1 addition & 0 deletions docs/changelog/2933.bugfix.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix issue where ``work_dir`` was not correctly including ``tox_root`` for test runs
Tbruno25 marked this conversation as resolved.
Show resolved Hide resolved
12 changes: 3 additions & 9 deletions src/tox/config/sets.py
Original file line number Diff line number Diff line change
Expand Up @@ -188,23 +188,17 @@ def register_config(self) -> None:
desc="the root directory (where the configuration file is found)",
)

def work_dir_builder(conf: Config, env_name: str | None) -> Path: # noqa: U100
return (conf.work_dir if conf.work_dir is not None else cast(Path, self["tox_root"])) / ".tox"

def work_dir_post_process(value: Path) -> Path:
return self._conf.work_dir if self._conf.options.work_dir else value

self.add_config(
keys=["work_dir", "toxworkdir"],
of_type=Path,
default=work_dir_builder,
post_process=work_dir_post_process,
default=lambda *_: self["tox_root"] / ".tox", # noqa: U101
Tbruno25 marked this conversation as resolved.
Show resolved Hide resolved
post_process=lambda dir: self._conf.work_dir if self._conf.options.work_dir else dir,
desc="working directory",
)
self.add_config(
keys=["temp_dir"],
of_type=Path,
default=lambda conf, _: cast(Path, self["work_dir"]) / ".tmp", # noqa: U100, U101
default=lambda *_: self["work_dir"] / ".tmp", # noqa: U101
Tbruno25 marked this conversation as resolved.
Show resolved Hide resolved
desc="a folder for temporary files (is not cleaned at start)",
)
self.add_constant("host_python", "the host python executable path", sys.executable)
Expand Down
4 changes: 2 additions & 2 deletions tests/session/cmd/test_sequential.py
Original file line number Diff line number Diff line change
Expand Up @@ -280,7 +280,7 @@ def test_skip_pkg_install(tox_project: ToxProjectCreator, demo_pkg_inline: Path)
def test_skip_develop_mode(tox_project: ToxProjectCreator, demo_pkg_setuptools: Path) -> None:
proj = tox_project({"tox.ini": "[testenv]\npackage=wheel\n"})
execute_calls = proj.patch_execute(lambda r: 0 if "install" in r.run_id else None)
result = proj.run("--root", str(demo_pkg_setuptools), "--develop")
result = proj.run("--root", str(demo_pkg_setuptools), "--develop", "--workdir", str(proj.path / ".tox"))
result.assert_success()
calls = [(i[0][0].conf.name, i[0][3].run_id) for i in execute_calls.call_args_list]
expected = [
Expand Down Expand Up @@ -430,7 +430,7 @@ def test_sequential_inserted_env_vars(tox_project: ToxProjectCreator, demo_pkg_i
k.startswith("TOX_") or k == "VIRTUAL_ENV"]'
"""
project = tox_project({"tox.ini": ini})
result = project.run("r", "--root", str(demo_pkg_inline))
result = project.run("r", "--root", str(demo_pkg_inline), "--workdir", str(project.path / ".tox"))
result.assert_success()

assert re.search(f"TOX_PACKAGE={re.escape(str(project.path))}.*.tar.gz{os.linesep}", result.out)
Expand Down
78 changes: 75 additions & 3 deletions tests/test_run.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
from __future__ import annotations

from pathlib import Path

import pytest
from pytest_mock import MockerFixture

Expand All @@ -22,7 +24,77 @@ def test_re_raises_on_unexpected_exit(mocker: MockerFixture) -> None:
run()


def test_custom_work_dir(tox_project: ToxProjectCreator) -> None:
def test_custom_work_dir(tox_project: ToxProjectCreator, tmp_path: Path) -> None:
project = tox_project({})

expected_tox_root = project.path
expected_work_dir = tmp_path

outcome = project.run("c", "--workdir", str(expected_work_dir))
outcome.assert_success()

assert outcome.state.conf.options.work_dir == expected_work_dir, "should parse the --workdir argument"

assert outcome.state.conf.core["work_dir"], f"should set work_dir to {expected_work_dir}"

assert outcome.state.conf.core["tox_root"] == expected_tox_root, "should not update the value of tox_root"
assert outcome.state.conf.core["work_dir"] != (
expected_tox_root / ".tox"
), "should explicitly demonstrate that tox_root and work_dir are decoupled"

# should update config values that depend on work_dir
assert outcome.state.conf.core["temp_dir"] == expected_work_dir / ".tmp"

env_conf = outcome.state.conf.get_env("py")

assert env_conf["env_dir"] == expected_work_dir / "py"
assert env_conf["env_log_dir"] == expected_work_dir / "py" / "log"
assert env_conf["env_tmp_dir"] == expected_work_dir / "py" / "tmp"


def test_custom_root_dir(tox_project: ToxProjectCreator, tmp_path: Path) -> None:
project = tox_project({})

expected_tox_root = tmp_path
expected_work_dir = expected_tox_root / ".tox"

outcome = project.run("c", "--root", str(expected_tox_root))
outcome.assert_success()

assert outcome.state.conf.options.root_dir == expected_tox_root, "should parse the --root argument"

assert outcome.state.conf.core["tox_root"] == expected_tox_root, f"should set tox_root to {expected_tox_root}"

# values that depend on tox_root should also be updated

assert outcome.state.conf.core["work_dir"] == expected_work_dir
assert outcome.state.conf.core["temp_dir"] == expected_work_dir / ".tmp"

env_conf = outcome.state.conf.get_env("py")

assert env_conf["env_dir"] == expected_work_dir / "py"
assert env_conf["env_log_dir"] == expected_work_dir / "py" / "log"
assert env_conf["env_tmp_dir"] == expected_work_dir / "py" / "tmp"


def test_custom_root_dir_and_work_dir(tox_project: ToxProjectCreator, tmp_path: Path) -> None:
project = tox_project({})
outcome = project.run("c", "--workdir", str(project.path.parent))
assert outcome.state.conf.options.work_dir == project.path.parent

expected_tox_root = tmp_path / "tox_root"
expected_work_dir = tmp_path / "work_dir"

outcome = project.run("c", "--root", str(expected_tox_root), "--workdir", str(expected_work_dir))
outcome.assert_success()

assert outcome.state.conf.core["tox_root"] == expected_tox_root, f"should set tox_root to {expected_tox_root}"
assert outcome.state.conf.core["work_dir"] == expected_work_dir, f"should set work_dir to {expected_work_dir}"

# values that depend on work_dir should also be updated

assert outcome.state.conf.core["temp_dir"] == expected_work_dir / ".tmp"

env_conf = outcome.state.conf.get_env("py")

assert env_conf["env_dir"] == expected_work_dir / "py"
assert env_conf["env_log_dir"] == expected_work_dir / "py" / "log"
assert env_conf["env_tmp_dir"] == expected_work_dir / "py" / "tmp"
11 changes: 10 additions & 1 deletion tests/tox_env/python/test_python_runner.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,16 @@ def test_journal_package_dir(tmp_path: Path) -> None:

def test_package_temp_dir_view(tox_project: ToxProjectCreator, demo_pkg_inline: Path) -> None:
project = tox_project({"tox.ini": "[testenv]\npackage=wheel"})
result = project.run("r", "-vv", "-e", "py", "--root", str(demo_pkg_inline))
result = project.run(
gaborbernat marked this conversation as resolved.
Show resolved Hide resolved
"r",
"-vv",
"-e",
"py",
"--root",
str(demo_pkg_inline),
"--workdir",
str(project.path / ".tox"),
)
result.assert_success()
wheel_name = "demo_pkg_inline-1.0.0-py3-none-any.whl"
session_path = Path(".tmp") / "package" / "1" / wheel_name
Expand Down