From db061c8a439cd760d285a44075bdaa55e15e2ea1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Randy=20D=C3=B6ring?= <30527984+radoering@users.noreply.github.com> Date: Sat, 30 Dec 2023 17:21:15 +0100 Subject: [PATCH] solver: improve verbose output for dependencies with extras --- src/poetry/mixology/incompatibility.py | 3 +- tests/mixology/test_incompatibility.py | 50 ++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 tests/mixology/test_incompatibility.py diff --git a/src/poetry/mixology/incompatibility.py b/src/poetry/mixology/incompatibility.py index 26bf72e79ba..ba3fb22ea09 100644 --- a/src/poetry/mixology/incompatibility.py +++ b/src/poetry/mixology/incompatibility.py @@ -432,7 +432,8 @@ def _terse(self, term: Term, allow_every: bool = False) -> str: if term.dependency.source_type: return str(term.dependency) - return f"{term.dependency.pretty_name} ({term.dependency.pretty_constraint})" + pretty_name = term.dependency.complete_pretty_name + return f"{pretty_name} ({term.dependency.pretty_constraint})" def _single_term_where(self, callable: Callable[[Term], bool]) -> Term | None: found = None diff --git a/tests/mixology/test_incompatibility.py b/tests/mixology/test_incompatibility.py new file mode 100644 index 00000000000..d3395f13796 --- /dev/null +++ b/tests/mixology/test_incompatibility.py @@ -0,0 +1,50 @@ +from __future__ import annotations + +import pytest + +from poetry.core.packages.dependency import Dependency +from poetry.core.packages.url_dependency import URLDependency + +from poetry.mixology.incompatibility import Incompatibility +from poetry.mixology.incompatibility_cause import DependencyCause +from poetry.mixology.term import Term + + +def get_url_dependency(name: str, url: str, version: str) -> URLDependency: + dependency = URLDependency(name, url) + dependency.constraint = version # type: ignore[assignment] + return dependency + + +@pytest.mark.parametrize( + ("dependency1", "dependency2", "expected"), + [ + ( + Dependency("foo", "1.0"), + Dependency("bar", "2.0"), + "foo (1.0) depends on bar (2.0)", + ), + ( + Dependency("foo", "1.0"), + Dependency("bar", "^1.0"), + "foo (1.0) depends on bar (^1.0)", + ), + ( + Dependency("foo", "1.0"), + get_url_dependency("bar", "https://example.com/bar.whl", "1.1"), + "foo (1.0) depends on bar (1.1) @ https://example.com/bar.whl", + ), + ( + Dependency("foo", "1.0", extras=["bar"]), + Dependency("foo", "1.0"), + "foo[bar] (1.0) depends on foo (1.0)", + ), + ], +) +def test_str_dependency_cause( + dependency1: Dependency, dependency2: Dependency, expected: str +) -> None: + incompatibility = Incompatibility( + [Term(dependency1, True), Term(dependency2, False)], DependencyCause() + ) + assert str(incompatibility) == expected