Skip to content

Commit 8dff357

Browse files
authored
Normalize extra names passed in (#2668)
Resolves #2655
1 parent 17950f4 commit 8dff357

File tree

3 files changed

+32
-0
lines changed

3 files changed

+32
-0
lines changed

docs/changelog/2655.bugfix.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Normalize extra names passed in (fixes extra groups not being picked up during installation) - by :user:`gaborbernat`.

src/tox/tox_env/python/runner.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
from functools import partial
77
from typing import Set
88

9+
from packaging.utils import canonicalize_name
10+
911
from tox.report import HandledError
1012
from tox.tox_env.errors import Skip
1113
from tox.tox_env.package import Package
@@ -65,11 +67,18 @@ def _register_package_conf(self) -> bool:
6567
pkg_type = self.pkg_type
6668
if pkg_type == "skip":
6769
return False
70+
71+
def _normalize_extras(values: set[str]) -> set[str]:
72+
# although _ and . is allowed this will be normalized during packaging to -
73+
# https://packaging.python.org/en/latest/specifications/dependency-specifiers/#grammar
74+
return {canonicalize_name(v) for v in values}
75+
6876
self.conf.add_config(
6977
keys=["extras"],
7078
of_type=Set[str],
7179
default=set(),
7280
desc="extras to install of the target package",
81+
post_process=_normalize_extras,
7382
)
7483
return True
7584

tests/tox_env/python/test_python_runner.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
from pathlib import Path
44

5+
import pytest
6+
57
from tox.journal import EnvJournal
68
from tox.pytest import ToxProjectCreator
79
from tox.tox_env.package import PathPackage
@@ -99,3 +101,23 @@ def test_package_temp_dir_view(tox_project: ToxProjectCreator, demo_pkg_inline:
99101
msg = f" D package {session_path} links to {Path('.pkg') / 'dist'/ wheel_name} ({project.path/ '.tox'}) "
100102
assert msg in result.out
101103
assert f" D delete package {project.path / '.tox' / session_path}" in result.out
104+
105+
106+
@pytest.mark.parametrize(
107+
("extra", "used_extra"),
108+
[
109+
("d_oc", "d-oc"),
110+
("d-oc", "d-oc"),
111+
("d.oc", "d-oc"),
112+
],
113+
)
114+
def test_extras_are_normalized(
115+
tox_project: ToxProjectCreator,
116+
demo_pkg_inline: Path,
117+
extra: str,
118+
used_extra: str,
119+
) -> None:
120+
project = tox_project({"tox.ini": f"[testenv]\nextras={extra}"})
121+
result = project.run("c", "-e", "py", "--root", str(demo_pkg_inline), "-k", "extras")
122+
result.assert_success()
123+
assert result.out == f"[testenv:py]\nextras = {used_extra}\n"

0 commit comments

Comments
 (0)