Skip to content

Commit eeb4814

Browse files
committed
feat(cli): wip: support pep 735 on remove
1 parent 431209e commit eeb4814

File tree

1 file changed

+58
-13
lines changed

1 file changed

+58
-13
lines changed

src/poetry/console/commands/remove.py

+58-13
Original file line numberDiff line numberDiff line change
@@ -63,33 +63,58 @@ def handle(self) -> int:
6363

6464
content: dict[str, Any] = self.poetry.file.read()
6565
project_content = content.get("project", {})
66+
groups_content = content.get("dependency-groups", {})
6667
poetry_content = content.get("tool", {}).get("poetry", {})
6768

6869
if group is None:
6970
# remove from all groups
7071
removed = set()
7172
group_sections = []
7273
project_dependencies = project_content.get("dependencies", [])
74+
75+
group_dependencies = []
76+
for dependencies in groups_content.values():
77+
group_dependencies.extend(dependencies)
78+
7379
poetry_dependencies = poetry_content.get("dependencies", {})
74-
if project_dependencies or poetry_dependencies:
80+
if project_dependencies or poetry_dependencies or group_dependencies:
7581
group_sections.append(
76-
(MAIN_GROUP, project_dependencies, poetry_dependencies)
82+
(MAIN_GROUP, project_dependencies, poetry_dependencies, [])
7783
)
7884
group_sections.extend(
79-
(group_name, [], group_section.get("dependencies", {}))
85+
(group_name, [], {}, dependencies)
86+
for group_name, dependencies in groups_content.items()
87+
)
88+
group_sections.extend(
89+
(group_name, [], group_section.get("dependencies", {}), [])
8090
for group_name, group_section in poetry_content.get("group", {}).items()
8191
)
8292

83-
for group_name, project_section, poetry_section in group_sections:
93+
for (
94+
group_name,
95+
project_section,
96+
poetry_section,
97+
group_dep_section,
98+
) in group_sections:
8499
removed |= self._remove_packages(
85-
packages, project_section, poetry_section, group_name
100+
packages,
101+
project_section,
102+
poetry_section,
103+
group_dep_section,
104+
group_name,
86105
)
87-
if group_name != MAIN_GROUP and not poetry_section:
88-
del poetry_content["group"][group_name]
106+
if group_name != MAIN_GROUP:
107+
if not poetry_section and group_name in poetry_content.get(
108+
"group", {}
109+
):
110+
del poetry_content["group"][group_name]
111+
if not group_dep_section and group_name in groups_content:
112+
del groups_content[group_name]
113+
89114
elif group == "dev" and "dev-dependencies" in poetry_content:
90115
# We need to account for the old `dev-dependencies` section
91116
removed = self._remove_packages(
92-
packages, [], poetry_content["dev-dependencies"], "dev"
117+
packages, [], poetry_content["dev-dependencies"], [], "dev"
93118
)
94119

95120
if not poetry_content["dev-dependencies"]:
@@ -98,15 +123,30 @@ def handle(self) -> int:
98123
removed = set()
99124
if "group" in poetry_content:
100125
if group in poetry_content["group"]:
101-
removed = self._remove_packages(
102-
packages,
103-
[],
104-
poetry_content["group"][group].get("dependencies", {}),
105-
group,
126+
removed.update(
127+
self._remove_packages(
128+
packages,
129+
[],
130+
poetry_content["group"][group].get("dependencies", {}),
131+
[],
132+
group,
133+
)
106134
)
107135

108136
if not poetry_content["group"][group]:
109137
del poetry_content["group"][group]
138+
if group in groups_content:
139+
removed.update(
140+
self._remove_packages(
141+
packages,
142+
[],
143+
{},
144+
groups_content[group],
145+
group,
146+
)
147+
)
148+
if not groups_content[group]:
149+
del groups_content[group]
110150

111151
if "group" in poetry_content and not poetry_content["group"]:
112152
del poetry_content["group"]
@@ -140,6 +180,7 @@ def _remove_packages(
140180
packages: list[str],
141181
project_section: list[str],
142182
poetry_section: dict[str, Any],
183+
group_section: list[str],
143184
group_name: str,
144185
) -> set[str]:
145186
removed = set()
@@ -155,6 +196,10 @@ def _remove_packages(
155196
if canonicalize_name(existing_package) == normalized_name:
156197
del poetry_section[existing_package]
157198
removed.add(package)
199+
for requirement in group_section.copy():
200+
if Dependency.create_from_pep_508(requirement).name == normalized_name:
201+
group_section.remove(requirement)
202+
removed.add(package)
158203

159204
for package in removed:
160205
group.remove_dependency(package)

0 commit comments

Comments
 (0)