Skip to content

Commit 0c60970

Browse files
authored
installer: use locked version of vcs dependency with extras instead of latest (#6185)
1 parent b1eff77 commit 0c60970

File tree

3 files changed

+97
-10
lines changed

3 files changed

+97
-10
lines changed

src/poetry/mixology/version_solver.py

+8-10
Original file line numberDiff line numberDiff line change
@@ -418,11 +418,6 @@ def _get_min(dependency: Dependency) -> tuple[bool, int]:
418418
return complete_name
419419

420420
package = None
421-
if dependency.name not in self._use_latest:
422-
# prefer locked version of compatible (not exact same) dependency;
423-
# required in order to not unnecessarily update dependencies with
424-
# extras, e.g. "coverage" vs. "coverage[toml]"
425-
locked = self._get_locked(dependency, allow_similar=True)
426421
if locked is not None:
427422
package = next(
428423
(
@@ -504,18 +499,21 @@ def _add_incompatibility(self, incompatibility: Incompatibility) -> None:
504499
incompatibility
505500
)
506501

507-
def _get_locked(
508-
self, dependency: Dependency, *, allow_similar: bool = False
509-
) -> DependencyPackage | None:
502+
def _get_locked(self, dependency: Dependency) -> DependencyPackage | None:
510503
if dependency.name in self._use_latest:
511504
return None
512505

513506
locked = self._locked.get(dependency.name, [])
514507
for dependency_package in locked:
515508
package = dependency_package.package
516509
if (
517-
allow_similar or dependency.is_same_package_as(package)
518-
) and dependency.constraint.allows(package.version):
510+
# Locked dependencies are always without features.
511+
# Thus, we can't use is_same_package_as() here because it compares
512+
# the complete_name (including features).
513+
dependency.name == package.name
514+
and dependency.is_same_source_as(package)
515+
and dependency.constraint.allows(package.version)
516+
):
519517
return DependencyPackage(dependency, package)
520518
return None
521519

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
[[package]]
2+
name = "demo"
3+
version = "0.1.2"
4+
description = ""
5+
category = "main"
6+
optional = false
7+
python-versions = "*"
8+
develop = false
9+
10+
[package.dependencies]
11+
cleo = {version = "*", optional = true, markers = "extra == \"foo\""}
12+
pendulum = ">=1.4.4"
13+
14+
[package.extras]
15+
foo = ["cleo"]
16+
17+
[package.source]
18+
type = "git"
19+
url = "https://github.com/demo/demo.git"
20+
reference = "master"
21+
resolved_reference = "123456"
22+
23+
[[package]]
24+
name = "pendulum"
25+
version = "1.4.4"
26+
description = ""
27+
category = "main"
28+
optional = false
29+
python-versions = "*"
30+
31+
[[package]]
32+
name = "cleo"
33+
version = "1.0.0"
34+
description = ""
35+
category = "main"
36+
optional = false
37+
python-versions = "*"
38+
39+
[metadata]
40+
python-versions = "*"
41+
lock-version = "1.1"
42+
content-hash = "123456789"
43+
44+
[metadata.files]
45+
demo = []
46+
pendulum = []
47+
cleo = []

tests/installation/test_installer.py

+42
Original file line numberDiff line numberDiff line change
@@ -2473,3 +2473,45 @@ def test_installer_should_use_the_locked_version_of_git_dependencies(
24732473
source_reference="master",
24742474
source_resolved_reference="123456",
24752475
)
2476+
2477+
2478+
@pytest.mark.parametrize("is_locked", [False, True])
2479+
def test_installer_should_use_the_locked_version_of_git_dependencies_with_extras(
2480+
installer: Installer,
2481+
locker: Locker,
2482+
package: ProjectPackage,
2483+
repo: Repository,
2484+
is_locked: bool,
2485+
):
2486+
if is_locked:
2487+
locker.locked(True)
2488+
locker.mock_lock_data(fixture("with-vcs-dependency-with-extras"))
2489+
expected_reference = "123456"
2490+
else:
2491+
expected_reference = "9cf87a285a2d3fbb0b9fa621997b3acc3631ed24"
2492+
2493+
package.add_dependency(
2494+
Factory.create_dependency(
2495+
"demo",
2496+
{
2497+
"git": "https://github.com/demo/demo.git",
2498+
"branch": "master",
2499+
"extras": ["foo"],
2500+
},
2501+
)
2502+
)
2503+
2504+
repo.add_package(get_package("pendulum", "1.4.4"))
2505+
repo.add_package(get_package("cleo", "1.0.0"))
2506+
2507+
installer.run()
2508+
2509+
assert len(installer.executor.installations) == 3
2510+
assert installer.executor.installations[-1] == Package(
2511+
"demo",
2512+
"0.1.2",
2513+
source_type="git",
2514+
source_url="https://github.com/demo/demo.git",
2515+
source_reference="master",
2516+
source_resolved_reference=expected_reference,
2517+
)

0 commit comments

Comments
 (0)