Skip to content

Commit bee2c3f

Browse files
fix(tox_env): canonicalize names when resolving dependency-group extras
1 parent 6485a01 commit bee2c3f

2 files changed

Lines changed: 36 additions & 2 deletions

File tree

src/tox/tox_env/python/dependency_groups.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,10 @@ def unwrap_nested_extras(
5353
if not project_name:
5454
return dependencies
5555

56+
normed_project_name = canonicalize_name(project_name)
5657
extras_to_unwrap: set[Requirement] = set()
5758
for dependency in dependencies:
58-
if dependency.name == project_name:
59+
if canonicalize_name(dependency.name) == normed_project_name:
5960
extras_to_unwrap.add(dependency)
6061
if not extras_to_unwrap:
6162
return dependencies
@@ -86,7 +87,10 @@ def resolve(root: Path, groups: set[str]) -> set[Requirement]:
8687
result = result.union(_resolve_dependency_group(dependency_groups, group, original_names_lookup))
8788

8889
project_name = pyproject.get("project", {}).get("name")
89-
optional_dependencies = pyproject.get("project", {}).get("optional-dependencies", {})
90+
optional_dependencies: dict[str, list[str]] = {
91+
canonicalize_name(name): deps
92+
for name, deps in pyproject.get("project", {}).get("optional-dependencies", {}).items()
93+
}
9094

9195
return unwrap_nested_extras(optional_dependencies, project_name, result, set())
9296

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
from __future__ import annotations
2+
3+
from typing import TYPE_CHECKING
4+
5+
from tox.tox_env.python.dependency_groups import resolve
6+
7+
if TYPE_CHECKING:
8+
from pathlib import Path
9+
10+
11+
def test_extra_key_not_canonical(tmp_path: Path) -> None:
12+
(tmp_path / "pyproject.toml").write_text(
13+
'[project]\nname = "demo-pkg"\n'
14+
'[project.optional-dependencies]\nextra_1 = ["extra-pkg>=1.0"]\n'
15+
'[dependency-groups]\ntest = ["demo-pkg[extra_1]"]\n',
16+
encoding="utf-8",
17+
)
18+
19+
assert sorted(str(i) for i in resolve(tmp_path, {"test"})) == ["extra-pkg>=1.0"]
20+
21+
22+
def test_project_name_not_canonical(tmp_path: Path) -> None:
23+
(tmp_path / "pyproject.toml").write_text(
24+
'[project]\nname = "demo-pkg"\n'
25+
'[project.optional-dependencies]\nextra1 = ["extra-pkg>=1.0"]\n'
26+
'[dependency-groups]\ntest = ["demo_pkg[extra1]"]\n',
27+
encoding="utf-8",
28+
)
29+
30+
assert sorted(str(i) for i in resolve(tmp_path, {"test"})) == ["extra-pkg>=1.0"]

0 commit comments

Comments
 (0)