Commit ce3f7632 by finswimmer Committed by GitHub

Do not error when adding existing packages

Resolves: #98
parent 81b27746
# -*- coding: utf-8 -*-
from typing import Dict
from typing import List
from cleo import argument
from cleo import option
......@@ -86,18 +90,19 @@ class AddCommand(InstallerCommand, InitCommand):
if section not in poetry_content:
poetry_content[section] = {}
for name in packages:
for key in poetry_content[section]:
if key.lower() == name.lower():
pair = self._parse_requirements([name])[0]
if (
"git" in pair
or "url" in pair
or pair.get("version") == "latest"
):
continue
existing_packages = self.get_existing_packages_from_input(
packages, poetry_content, section
)
if existing_packages:
self.notify_about_existing_packages(existing_packages)
raise ValueError("Package {} is already present".format(name))
packages = [name for name in packages if name not in existing_packages]
if not packages:
self.poetry.file.write(content)
self.line("Nothing to add.")
return 0
requirements = self._determine_requirements(
packages,
......@@ -184,3 +189,28 @@ class AddCommand(InstallerCommand, InitCommand):
self.poetry.file.write(original_content)
return status
def get_existing_packages_from_input(
self, packages, poetry_content, target_section
): # type: (List[str], Dict, str) -> List[str]
existing_packages = []
for name in packages:
for key in poetry_content[target_section]:
if key.lower() == name.lower():
existing_packages.append(name)
return existing_packages
def notify_about_existing_packages(
self, existing_packages
): # type: (List[str]) -> None
self.line(
"The following packages are already present in the pyproject.toml and will be skipped:\n"
)
for name in existing_packages:
self.line(" • <c1>{name}</c1>".format(name=name))
self.line(
"\nIf you want to update it to the latest compatible version, you can use `poetry update package`.\n"
"If you prefer to upgrade it to the latest available version, you can use `poetry add package@latest`.\n"
)
......@@ -714,7 +714,7 @@ Package operations: 1 install, 0 updates, 0 removals
assert content["dependencies"]["pyyaml"] == "^3.13"
def test_add_should_display_an_error_when_adding_existing_package_with_no_constraint(
def test_add_should_skip_when_adding_existing_package_with_no_constraint(
app, repo, tester
):
content = app.poetry.file.read()
......@@ -722,11 +722,18 @@ def test_add_should_display_an_error_when_adding_existing_package_with_no_constr
app.poetry.file.write(content)
repo.add_package(get_package("foo", "1.1.2"))
with pytest.raises(ValueError) as e:
tester.execute("foo")
assert "Package foo is already present" == str(e.value)
expected = """\
The following packages are already present in the pyproject.toml and will be skipped:
• foo
If you want to update it to the latest compatible version, you can use `poetry update package`.
If you prefer to upgrade it to the latest available version, you can use `poetry add package@latest`.
"""
assert expected in tester.io.fetch_output()
def test_add_should_work_when_adding_existing_package_with_latest_constraint(
......@@ -1527,7 +1534,7 @@ Package operations: 1 install, 0 updates, 0 removals
assert content["dependencies"]["pyyaml"] == "^3.13"
def test_add_should_display_an_error_when_adding_existing_package_with_no_constraint_old_installer(
def test_add_should_skip_when_adding_existing_package_with_no_constraint_old_installer(
app, repo, installer, old_tester
):
content = app.poetry.file.read()
......@@ -1536,10 +1543,18 @@ def test_add_should_display_an_error_when_adding_existing_package_with_no_constr
repo.add_package(get_package("foo", "1.1.2"))
with pytest.raises(ValueError) as e:
old_tester.execute("foo")
assert "Package foo is already present" == str(e.value)
expected = """\
The following packages are already present in the pyproject.toml and will be skipped:
• foo
If you want to update it to the latest compatible version, you can use `poetry update package`.
If you prefer to upgrade it to the latest available version, you can use `poetry add package@latest`.
"""
assert expected in old_tester.io.fetch_output()
def test_add_should_work_when_adding_existing_package_with_latest_constraint_old_installer(
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment