WARNING: THIS SITE IS A MIRROR OF GITHUB.COM / IT CANNOT LOGIN OR REGISTER ACCOUNTS / THE CONTENTS ARE PROVIDED AS-IS / THIS SITE ASSUMES NO RESPONSIBILITY FOR ANY DISPLAYED CONTENT OR LINKS / IF YOU FOUND SOMETHING MAY NOT GOOD FOR EVERYONE, CONTACT ADMIN AT ilovescratch@foxmail.com
Skip to content

Commit acb40b0

Browse files
authored
fix: dependency group with non-normalized name does not work in pdm 2.20.0 (#3250)
* fix: dependency group with non-normalized name does not work in pdm 2.20.0 Fixes #3247 Signed-off-by: Frost Ming <[email protected]> * fix tests Signed-off-by: Frost Ming <[email protected]>
1 parent 5d3779f commit acb40b0

File tree

5 files changed

+28
-7
lines changed

5 files changed

+28
-7
lines changed

news/3247.bugfix.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix group name normalization when comparing groups.

src/pdm/cli/commands/add.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ def do_add(
122122
if project.enable_write_lockfile:
123123
project.core.ui.info(f"Adding group [success]{group}[/] to lockfile")
124124
lock_groups.append(group)
125-
if group == "default" or not selection.dev and group not in project.pyproject.dev_dependencies:
125+
if group == "default" or not selection.dev and normalize_name(group) not in project.pyproject.dev_dependencies:
126126
if editables:
127127
raise PdmUsageError("Cannot add editables to the default or optional dependency group")
128128
for r in [parse_requirement(line, True) for line in editables] + [parse_requirement(line) for line in packages]:

src/pdm/cli/filters.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from typing import TYPE_CHECKING
66

77
from pdm.exceptions import PdmUsageError
8+
from pdm.utils import normalize_name
89

910
if TYPE_CHECKING:
1011
from typing import Iterator, Sequence
@@ -78,9 +79,9 @@ def _translated_groups(self) -> list[str]:
7879
if dev is None: # --prod is not set, include dev-dependencies
7980
dev = True
8081
project = self.project
81-
optional_groups = set(project.pyproject.metadata.get("optional-dependencies", {}))
82+
optional_groups = {normalize_name(g) for g in project.pyproject.metadata.get("optional-dependencies", {})}
8283
dev_groups = set(project.pyproject.dev_dependencies)
83-
groups_set = set(groups)
84+
groups_set = {normalize_name(g) if g != ":all" else g for g in groups}
8485
if groups_set & dev_groups:
8586
if not dev:
8687
raise PdmUsageError("--prod is not allowed with dev groups and should be left")
@@ -91,9 +92,9 @@ def _translated_groups(self) -> list[str]:
9192
groups_set.update(optional_groups)
9293
if default:
9394
groups_set.add("default")
94-
groups_set -= set(self.excluded_groups)
95+
groups_set -= {normalize_name(g) for g in self.excluded_groups}
9596

96-
invalid_groups = groups_set - set(project.iter_groups())
97+
invalid_groups = groups_set - {normalize_name(g) for g in project.iter_groups()}
9798
if invalid_groups:
9899
project.core.ui.echo(
99100
"[d]Ignoring non-existing groups: [success]" f"{', '.join(invalid_groups)}[/]",

src/pdm/project/core.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -442,7 +442,8 @@ def iter_groups(self) -> Iterable[str]:
442442
groups = {"default"}
443443
if self.pyproject.metadata.get("optional-dependencies"):
444444
groups.update(self.pyproject.metadata["optional-dependencies"].keys())
445-
groups.update(self.pyproject.dev_dependencies.keys())
445+
groups.update(self.pyproject._data.get("dependency-groups", {}).keys())
446+
groups.update(self.pyproject.settings.get("dev-dependencies", {}).keys())
446447
return groups
447448

448449
@property
@@ -662,18 +663,24 @@ def update_dev_dependencies(deps: list[str]) -> None:
662663
metadata, settings = self.pyproject.metadata, self.pyproject.settings
663664
if group == "default":
664665
return metadata.get("dependencies", tomlkit.array()), lambda x: metadata.__setitem__("dependencies", x)
666+
dev_dependencies = self.pyproject._data.get("dependency-groups", {})
667+
dev_dependencies.update(self.pyproject.settings.get("dev-dependencies", {}))
665668
deps_setter = [
666669
(
667670
metadata.get("optional-dependencies", {}),
668671
lambda x: metadata.setdefault("optional-dependencies", {}).__setitem__(group, x)
669672
if x
670673
else metadata.setdefault("optional-dependencies", {}).pop(group, None),
671674
),
672-
(self.pyproject.dev_dependencies, update_dev_dependencies),
675+
(dev_dependencies, update_dev_dependencies),
673676
]
677+
normalized_group = normalize_name(group)
674678
for deps, setter in deps_setter:
679+
normalized_groups = {normalize_name(g) for g in deps}
675680
if group in deps:
676681
return make_array(deps[group], True), setter
682+
if normalized_group in normalized_groups:
683+
raise PdmUsageError(f"Group {group} already exists in another non-normalized form")
677684
# If not found, return an empty list and a setter to add the group
678685
return tomlkit.array(), deps_setter[int(dev)][1]
679686

tests/cli/test_add.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,3 +327,15 @@ def test_add_dependency_with_direct_minimal_versions(project, pdm, repository):
327327
assert "django>=1.11.8" in project.pyproject.metadata["dependencies"]
328328
assert all_candidates["django"].version == "1.11.8"
329329
assert all_candidates["pytz"].version == "2019.6"
330+
331+
332+
def test_add_group_with_normalized_name(project, pdm, working_set):
333+
project.pyproject.dependency_groups.update({"foo_bar": ["requests"]})
334+
project.pyproject.write()
335+
pdm(["lock"], obj=project, strict=True)
336+
assert "foo-bar" in project.lockfile.groups
337+
pdm(["sync", "-G", "foo.bar"], obj=project, strict=True)
338+
assert "requests" in working_set
339+
result = pdm(["add", "-G", "foo-bar", "pytz"], obj=project)
340+
assert result.exit_code != 0
341+
assert "Group foo-bar already exists in another non-normalized form" in result.stderr

0 commit comments

Comments
 (0)