Skip to content

Commit 35ad9c3

Browse files
authored
Merge pull request #26 from pypa/fix-mishandling-of-normalized-names
Fix name normalization bug
2 parents 5bd7944 + cd2863d commit 35ad9c3

File tree

2 files changed

+23
-6
lines changed

2 files changed

+23
-6
lines changed

src/dependency_groups/_implementation.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ def _normalize_name(name: str) -> str:
1212

1313

1414
def _normalize_group_names(
15-
dependency_groups: Mapping[str, str | Mapping[str, str]]
15+
dependency_groups: Mapping[str, str | Mapping[str, str]],
1616
) -> Mapping[str, str | Mapping[str, str]]:
1717
original_names: dict[str, list[str]] = {}
1818
normalized_groups = {}
@@ -171,17 +171,16 @@ def _resolve(self, group: str, requested_group: str) -> tuple[Requirement, ...]:
171171
if isinstance(item, Requirement):
172172
resolved_group.append(item)
173173
elif isinstance(item, DependencyGroupInclude):
174-
if item.include_group in self._include_graph_ancestors.get(group, ()):
174+
include_group = _normalize_name(item.include_group)
175+
if include_group in self._include_graph_ancestors.get(group, ()):
175176
raise CyclicDependencyError(
176177
requested_group, group, item.include_group
177178
)
178-
self._include_graph_ancestors[item.include_group] = (
179+
self._include_graph_ancestors[include_group] = (
179180
*self._include_graph_ancestors.get(group, ()),
180181
group,
181182
)
182-
resolved_group.extend(
183-
self._resolve(item.include_group, requested_group)
184-
)
183+
resolved_group.extend(self._resolve(include_group, requested_group))
185184
else: # unreachable
186185
raise NotImplementedError(
187186
f"Invalid dependency group item after parse: {item}"

tests/test_resolver_class.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,3 +127,21 @@ def test_no_double_parse():
127127
assert len(deceived_parse) == 1
128128
assert isinstance(deceived_parse[0], DependencyGroupInclude)
129129
assert deceived_parse[0].include_group == "perfidy"
130+
131+
132+
@pytest.mark.parametrize("group_name_declared", ("foo-bar", "foo_bar", "foo..bar"))
133+
@pytest.mark.parametrize("group_name_used", ("foo-bar", "foo_bar", "foo..bar"))
134+
def test_normalized_name_is_used_for_include_group_lookups(
135+
group_name_declared, group_name_used
136+
):
137+
groups = {
138+
group_name_declared: ["spam"],
139+
"eggs": [{"include-group": group_name_used}],
140+
}
141+
resolver = DependencyGroupResolver(groups)
142+
143+
result = resolver.resolve("eggs")
144+
assert len(result) == 1
145+
assert isinstance(result[0], Requirement)
146+
req = result[0]
147+
assert req.name == "spam"

0 commit comments

Comments
 (0)