Skip to content

Commit 4eed8d5

Browse files
authored
Fix devenv when package for env is wheel/editable (#2820)
Resolves #2815
1 parent 497c17c commit 4eed8d5

File tree

4 files changed

+19
-11
lines changed

4 files changed

+19
-11
lines changed

docs/changelog/2815.bugfix.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
``devenv`` does not respect the specified path when the package is a wheel file - by :user:`gaborbernat`.

src/tox/config/main.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
from tox.config.loader.api import Loader, OverrideMap
99

10+
from .loader.memory import MemoryLoader
1011
from .loader.section import Section
1112
from .sets import ConfigSet, CoreConfigSet, EnvConfigSet
1213
from .source import Source
@@ -41,6 +42,7 @@ def __init__(
4142
self._src = config_source
4243
self._key_to_conf_set: dict[tuple[str, str], ConfigSet] = OrderedDict()
4344
self._core_set: CoreConfigSet | None = None
45+
self.memory_seed_loaders: defaultdict[str, list[MemoryLoader]] = defaultdict(list)
4446

4547
def pos_args(self, to_path: Path | None) -> tuple[str, ...] | None:
4648
"""
@@ -132,6 +134,8 @@ def get_section_config(
132134
except KeyError:
133135
conf_set = of_type(self, section, for_env)
134136
self._key_to_conf_set[key] = conf_set
137+
if for_env is not None:
138+
conf_set.loaders.extend(self.memory_seed_loaders.get(for_env, []))
135139
for loader in self._src.get_loaders(section, base, self._overrides, conf_set):
136140
conf_set.loaders.append(loader)
137141
if loaders is not None:

src/tox/session/cmd/devenv.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,31 +17,31 @@
1717
def tox_add_option(parser: ToxParser) -> None:
1818
help_msg = "sets up a development environment at ENVDIR based on the tox configuration specified "
1919
our = parser.add_command("devenv", ["d"], help_msg, devenv)
20-
our.add_argument("devenv_path", metavar="path", default=Path("venv").absolute(), nargs="?")
20+
our.add_argument("devenv_path", metavar="path", default=Path("venv"), nargs="?", type=Path)
2121
register_env_select_flags(our, default=CliEnv("py"), multiple=False)
2222
env_run_create_flags(our, mode="devenv")
2323

2424

2525
def devenv(state: State) -> int:
2626
opt = state.conf.options
27+
opt.devenv_path = opt.devenv_path.absolute()
2728
opt.skip_missing_interpreters = False # the target python must exist
2829
opt.no_test = False # do not run the test suite
2930
opt.package_only = False
3031
opt.install_pkg = None # no explicit packages to install
3132
opt.skip_pkg_install = False # always install a package in this case
3233
opt.no_test = True # do not run the test phase
34+
loader = MemoryLoader( # these configuration values are loaded from in-memory always (no file conf)
35+
usedevelop=True, # dev environments must be of type dev
36+
env_dir=opt.devenv_path, # move it in source
37+
)
38+
state.conf.memory_seed_loaders[list(opt.env)[0]].append(loader)
3339

3440
state.envs.ensure_only_run_env_is_active()
3541
envs = list(state.envs.iter())
3642
if len(envs) != 1:
3743
raise HandledError(f"exactly one target environment allowed in devenv mode but found {', '.join(envs)}")
38-
loader = MemoryLoader( # these configuration values are loaded from in-memory always (no file conf)
39-
usedevelop=True, # dev environments must be of type dev
40-
env_dir=Path(opt.devenv_path), # move it in source
41-
)
42-
tox_env = state.envs[envs[0]]
43-
tox_env.conf.loaders.insert(0, loader)
4444
result = run_sequential(state)
4545
if result == 0:
46-
logging.warning(f"created development environment under {tox_env.conf['env_dir']}")
46+
logging.warning(f"created development environment under {opt.devenv_path}")
4747
return result

tests/session/cmd/test_devenv.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,18 @@
66

77

88
def test_devenv_fail_multiple_target(tox_project: ToxProjectCreator) -> None:
9-
outcome = tox_project({"tox.ini": ""}).run("d", "-e", "py39,py38")
9+
outcome = tox_project({"tox.ini": ""}).run("d", "-e", "a,b")
1010
outcome.assert_failed()
11-
msg = "ROOT: HandledError| exactly one target environment allowed in devenv mode but found py39, py38\n"
11+
msg = "ROOT: HandledError| exactly one target environment allowed in devenv mode but found a, b\n"
1212
outcome.assert_out_err(msg, "")
1313

1414

1515
@pytest.mark.integration()
1616
def test_devenv_ok(tox_project: ToxProjectCreator, enable_pip_pypi_access: str | None) -> None: # noqa: U100
17-
content = {"setup.py": "from setuptools import setup\nsetup(name='demo', version='1.0')"}
17+
content = {
18+
"setup.py": "from setuptools import setup\nsetup(name='demo', version='1.0')",
19+
"tox.ini": "[tox]\nenv_list = py\n[testenv]\nusedevelop = True",
20+
}
1821
project = tox_project(content)
1922
outcome = project.run("d", "-e", "py")
2023

0 commit comments

Comments
 (0)