Skip to content

Commit 9d9bcf1

Browse files
dimblebyradoering
andauthored
tolerate funky group names at 'poetry add' (#9277)
Co-authored-by: Randy Döring <[email protected]>
1 parent ea26f3d commit 9d9bcf1

File tree

2 files changed

+20
-16
lines changed

2 files changed

+20
-16
lines changed

src/poetry/console/commands/add.py

+9-10
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ class AddCommand(InstallerCommand, InitCommand):
112112
def handle(self) -> int:
113113
from poetry.core.constraints.version import parse_constraint
114114
from tomlkit import inline_table
115-
from tomlkit import parse as parse_toml
115+
from tomlkit import nl
116116
from tomlkit import table
117117

118118
from poetry.factory import Factory
@@ -150,17 +150,17 @@ def handle(self) -> int:
150150
poetry_content["group"] = table(is_super_table=True)
151151

152152
groups = poetry_content["group"]
153+
153154
if group not in groups:
154-
dependencies_toml: dict[str, Any] = parse_toml(
155-
f"[tool.poetry.group.{group}.dependencies]\n\n"
156-
)
157-
group_table = dependencies_toml["tool"]["poetry"]["group"][group]
158-
poetry_content["group"][group] = group_table
155+
groups[group] = table()
156+
groups.add(nl())
157+
158+
this_group = groups[group]
159159

160-
if "dependencies" not in poetry_content["group"][group]:
161-
poetry_content["group"][group]["dependencies"] = table()
160+
if "dependencies" not in this_group:
161+
this_group["dependencies"] = table()
162162

163-
section = poetry_content["group"][group]["dependencies"]
163+
section = this_group["dependencies"]
164164

165165
existing_packages = self.get_existing_packages_from_input(packages, section)
166166

@@ -266,7 +266,6 @@ def handle(self) -> int:
266266
)
267267

268268
# Refresh the locker
269-
content["tool"]["poetry"] = poetry_content
270269
self.poetry.locker.set_pyproject_data(content)
271270
self.installer.set_locker(self.poetry.locker)
272271

tests/console/commands/test_add.py

+11-6
Original file line numberDiff line numberDiff line change
@@ -992,13 +992,17 @@ def test_add_constraint_not_found_with_source(
992992
assert str(e.value) == "Could not find a matching version of package cachy"
993993

994994

995+
@pytest.mark.parametrize("group_name", ["dev", "foo.BAR"])
995996
def test_add_to_section_that_does_not_exist_yet(
996-
app: PoetryTestApplication, repo: TestRepository, tester: CommandTester
997+
app: PoetryTestApplication,
998+
repo: TestRepository,
999+
tester: CommandTester,
1000+
group_name: str,
9971001
) -> None:
9981002
repo.add_package(get_package("cachy", "0.1.0"))
9991003
repo.add_package(get_package("cachy", "0.2.0"))
10001004

1001-
tester.execute("cachy --group dev")
1005+
tester.execute(f"cachy --group {group_name}")
10021006

10031007
expected = """\
10041008
Using version ^0.2.0 for cachy
@@ -1020,12 +1024,13 @@ def test_add_to_section_that_does_not_exist_yet(
10201024
pyproject: dict[str, Any] = app.poetry.file.read()
10211025
content = pyproject["tool"]["poetry"]
10221026

1023-
assert "cachy" in content["group"]["dev"]["dependencies"]
1024-
assert content["group"]["dev"]["dependencies"]["cachy"] == "^0.2.0"
1027+
assert "cachy" in content["group"][group_name]["dependencies"]
1028+
assert content["group"][group_name]["dependencies"]["cachy"] == "^0.2.0"
10251029

1026-
expected = """\
1030+
escaped_group_name = f'"{group_name}"' if "." in group_name else group_name
1031+
expected = f"""\
10271032
1028-
[tool.poetry.group.dev.dependencies]
1033+
[tool.poetry.group.{escaped_group_name}.dependencies]
10291034
cachy = "^0.2.0"
10301035
10311036
"""

0 commit comments

Comments
 (0)