Skip to content

Commit

Permalink
fix: ensure no duplicate package names are stored in pyproject.toml
Browse files Browse the repository at this point in the history
  • Loading branch information
finswimmer committed Oct 18, 2022
1 parent 16046d9 commit 1a5c2be
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 0 deletions.
5 changes: 5 additions & 0 deletions src/poetry/console/commands/add.py
Expand Up @@ -215,6 +215,11 @@ def handle(self) -> int:

constraint_name = _constraint["name"]
assert isinstance(constraint_name, str)

for key in list(section.keys()):
if canonicalize_name(key) == canonicalize_name(constraint_name):
del section[key]

section[constraint_name] = constraint

with contextlib.suppress(ValueError):
Expand Down
48 changes: 48 additions & 0 deletions tests/console/commands/test_add.py
Expand Up @@ -43,6 +43,18 @@ def poetry_with_up_to_date_lockfile(
)


@pytest.fixture
def poetry_sample_project(
project_factory: ProjectFactory, fixture_dir: FixtureDirGetter
) -> Poetry:
source = fixture_dir("sample_project")

return project_factory(
name="my-package",
pyproject_content=(source / "pyproject.toml").read_text(encoding="utf-8"),
)


@pytest.fixture()
def tester(command_tester_factory: CommandTesterFactory) -> CommandTester:
return command_tester_factory("add")
Expand Down Expand Up @@ -1055,6 +1067,42 @@ def test_add_should_skip_when_adding_canonicalized_existing_package_with_no_cons
assert expected in tester.io.fetch_output()


def test_add_should_replace_non_canonicalized_package(
project_factory: ProjectFactory,
repo: TestRepository,
command_tester_factory: CommandTesterFactory,
):
pyproject_content = """\
[tool.poetry]
name = "simple-project"
version = "1.2.3"
description = "Some description."
authors = [
"Python Poetry <tests@python-poetry.org>"
]
license = "MIT"
readme = "README.rst"
[tool.poetry.dependencies]
python = "^3.6"
Foo = "^0.6"
"""

poetry = project_factory(name="simple-project", pyproject_content=pyproject_content)
content = poetry.file.read()

assert "Foo" in content["tool"]["poetry"]["dependencies"]
assert "foo" not in content["tool"]["poetry"]["dependencies"]

tester = command_tester_factory("add", poetry=poetry)
repo.add_package(get_package("foo", "1.1.2"))
tester.execute("foo@latest")

updated_content = poetry.file.read()
assert "Foo" not in updated_content["tool"]["poetry"]["dependencies"]
assert "foo" in updated_content["tool"]["poetry"]["dependencies"]


def test_add_should_work_when_adding_existing_package_with_latest_constraint(
app: PoetryTestApplication, repo: TestRepository, tester: CommandTester
):
Expand Down

0 comments on commit 1a5c2be

Please sign in to comment.