Skip to content

Commit 4642fc2

Browse files
committed
feat(cli): support PEP 735 on self remove
1 parent 2431979 commit 4642fc2

File tree

7 files changed

+36
-17
lines changed

7 files changed

+36
-17
lines changed

src/poetry/console/commands/self/self_command.py

+17-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
from __future__ import annotations
22

3+
import typing
4+
35
from pathlib import Path
46
from typing import TYPE_CHECKING
7+
from typing import Any
58

69
from poetry.core.packages.dependency import Dependency
710
from poetry.core.packages.project_package import ProjectPackage
@@ -59,25 +62,35 @@ def activated_groups(self) -> set[str]:
5962

6063
def generate_system_pyproject(self) -> None:
6164
preserved = {}
65+
preserved_groups: dict[str, Any] = {}
6266

6367
if self.system_pyproject.exists():
64-
content = PyProjectTOML(self.system_pyproject).poetry_config
68+
toml_file = PyProjectTOML(self.system_pyproject)
69+
content = toml_file.data
6570

6671
for key in {"group", "source"}:
67-
if key in content:
68-
preserved[key] = content[key]
72+
if key in toml_file.poetry_config:
73+
preserved[key] = toml_file.poetry_config[key]
74+
75+
if "dependency-groups" in content:
76+
preserved_groups = typing.cast(
77+
"dict[str, Any]", content["dependency-groups"]
78+
)
6979

7080
package = ProjectPackage(name="poetry-instance", version=__version__)
7181
package.add_dependency(Dependency(name="poetry", constraint=f"{__version__}"))
7282

7383
package.python_versions = ".".join(str(v) for v in self.env.version_info[:3])
7484

75-
content = Factory.create_pyproject_from_package(package=package)
85+
content = Factory.create_legacy_pyproject_from_package(package=package)
7686
content["tool"]["poetry"]["package-mode"] = False # type: ignore[index]
7787

7888
for key in preserved:
7989
content["tool"]["poetry"][key] = preserved[key] # type: ignore[index]
8090

91+
if preserved_groups:
92+
content["dependency-groups"] = preserved_groups
93+
8194
pyproject = PyProjectTOML(self.system_pyproject)
8295
pyproject.file.write(content)
8396

src/poetry/factory.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ def create_package_source(
220220
)
221221

222222
@classmethod
223-
def create_pyproject_from_package(cls, package: Package) -> TOMLDocument:
223+
def create_legacy_pyproject_from_package(cls, package: Package) -> TOMLDocument:
224224
import tomlkit
225225

226226
from poetry.utils.dependency_specification import dependency_to_specification

tests/console/commands/self/test_add_plugins.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,9 @@ def assert_plugin_add_result(
3030
constraint: str,
3131
) -> None:
3232
assert tester.io.fetch_output() == expected
33-
dependencies: list[str] = get_self_command_dependencies()
33+
dependencies: list[str] | None = get_self_command_dependencies()
3434

35+
assert dependencies
3536
assert "poetry-plugin" in dependencies[0]
3637
assert constraint in dependencies[0]
3738

tests/console/commands/self/test_remove_plugins.py

+11-7
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,15 @@ def install_plugin(installed: Repository) -> None:
3232
package = ProjectPackage("poetry-instance", __version__)
3333
plugin = Package("poetry-plugin", "1.2.3")
3434

35-
package.add_dependency(
36-
Dependency(plugin.name, "^1.2.3", groups=[SelfCommand.ADDITIONAL_PACKAGE_GROUP])
35+
content = Factory.create_legacy_pyproject_from_package(package)
36+
content["dependency-groups"] = tomlkit.table()
37+
content["dependency-groups"][SelfCommand.ADDITIONAL_PACKAGE_GROUP] = tomlkit.array( # type: ignore[index]
38+
"[\n]"
3739
)
38-
content = Factory.create_pyproject_from_package(package)
40+
content["dependency-groups"][SelfCommand.ADDITIONAL_PACKAGE_GROUP].append( # type: ignore[index, union-attr, call-arg]
41+
Dependency(plugin.name, "^1.2.3").to_pep_508()
42+
)
43+
3944
system_pyproject_file = SelfCommand.get_default_system_pyproject_file()
4045
with open(system_pyproject_file, "w", encoding="utf-8", newline="") as f:
4146
f.write(content.as_string())
@@ -64,7 +69,6 @@ def install_plugin(installed: Repository) -> None:
6469
installed.add_package(plugin)
6570

6671

67-
@pytest.mark.xfail(reason="remove command does not support dependency-groups yet")
6872
def test_remove_installed_package(tester: CommandTester) -> None:
6973
tester.execute("poetry-plugin")
7074

@@ -82,11 +86,9 @@ def test_remove_installed_package(tester: CommandTester) -> None:
8286

8387
dependencies = get_self_command_dependencies()
8488

85-
assert "poetry-plugin" not in dependencies
8689
assert not dependencies
8790

8891

89-
@pytest.mark.xfail(reason="remove command does not support dependency-groups yet")
9092
def test_remove_installed_package_dry_run(tester: CommandTester) -> None:
9193
tester.execute("poetry-plugin --dry-run")
9294

@@ -105,4 +107,6 @@ def test_remove_installed_package_dry_run(tester: CommandTester) -> None:
105107

106108
dependencies = get_self_command_dependencies()
107109

108-
assert "poetry-plugin" in dependencies
110+
assert dependencies
111+
assert len(dependencies) == 1
112+
assert "poetry-plugin" in dependencies[0]

tests/console/commands/self/test_self_command.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ def example_system_pyproject() -> str:
1919
package.add_dependency(
2020
Dependency(plugin.name, "^1.2.3", groups=[SelfCommand.ADDITIONAL_PACKAGE_GROUP])
2121
)
22-
content = Factory.create_pyproject_from_package(package)
22+
content = Factory.create_legacy_pyproject_from_package(package)
2323
return content.as_string().rstrip("\n")
2424

2525

tests/console/commands/self/utils.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from poetry.factory import Factory
99

1010

11-
def get_self_command_dependencies(locked: bool = True) -> Array:
11+
def get_self_command_dependencies(locked: bool = True) -> Array | None:
1212
from poetry.console.commands.self.self_command import SelfCommand
1313
from poetry.locations import CONFIG_DIR
1414

@@ -25,7 +25,8 @@ def get_self_command_dependencies(locked: bool = True) -> Array:
2525
pyproject: dict[str, Any] = poetry.file.read()
2626
content = pyproject["dependency-groups"]
2727

28-
assert SelfCommand.ADDITIONAL_PACKAGE_GROUP in content
28+
if SelfCommand.ADDITIONAL_PACKAGE_GROUP not in content:
29+
return None
2930

3031
dependencies = content[SelfCommand.ADDITIONAL_PACKAGE_GROUP]
3132
assert isinstance(dependencies, Array)

tests/test_factory.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ def test_create_pyproject_from_package(
164164
poetry = Factory().create_poetry(fixture_dir(project))
165165
package = poetry.package
166166

167-
pyproject: dict[str, Any] = Factory.create_pyproject_from_package(package)
167+
pyproject: dict[str, Any] = Factory.create_legacy_pyproject_from_package(package)
168168

169169
result = pyproject["tool"]["poetry"]
170170
expected = poetry.pyproject.poetry_config

0 commit comments

Comments
 (0)