Commit 0c609704 by Randy Döring Committed by GitHub

installer: use locked version of vcs dependency with extras instead of latest (#6185)

parent b1eff774
......@@ -418,11 +418,6 @@ class VersionSolver:
return complete_name
package = None
if dependency.name not in self._use_latest:
# prefer locked version of compatible (not exact same) dependency;
# required in order to not unnecessarily update dependencies with
# extras, e.g. "coverage" vs. "coverage[toml]"
locked = self._get_locked(dependency, allow_similar=True)
if locked is not None:
package = next(
(
......@@ -504,9 +499,7 @@ class VersionSolver:
incompatibility
)
def _get_locked(
self, dependency: Dependency, *, allow_similar: bool = False
) -> DependencyPackage | None:
def _get_locked(self, dependency: Dependency) -> DependencyPackage | None:
if dependency.name in self._use_latest:
return None
......@@ -514,8 +507,13 @@ class VersionSolver:
for dependency_package in locked:
package = dependency_package.package
if (
allow_similar or dependency.is_same_package_as(package)
) and dependency.constraint.allows(package.version):
# Locked dependencies are always without features.
# Thus, we can't use is_same_package_as() here because it compares
# the complete_name (including features).
dependency.name == package.name
and dependency.is_same_source_as(package)
and dependency.constraint.allows(package.version)
):
return DependencyPackage(dependency, package)
return None
......
[[package]]
name = "demo"
version = "0.1.2"
description = ""
category = "main"
optional = false
python-versions = "*"
develop = false
[package.dependencies]
cleo = {version = "*", optional = true, markers = "extra == \"foo\""}
pendulum = ">=1.4.4"
[package.extras]
foo = ["cleo"]
[package.source]
type = "git"
url = "https://github.com/demo/demo.git"
reference = "master"
resolved_reference = "123456"
[[package]]
name = "pendulum"
version = "1.4.4"
description = ""
category = "main"
optional = false
python-versions = "*"
[[package]]
name = "cleo"
version = "1.0.0"
description = ""
category = "main"
optional = false
python-versions = "*"
[metadata]
python-versions = "*"
lock-version = "1.1"
content-hash = "123456789"
[metadata.files]
demo = []
pendulum = []
cleo = []
......@@ -2473,3 +2473,45 @@ def test_installer_should_use_the_locked_version_of_git_dependencies(
source_reference="master",
source_resolved_reference="123456",
)
@pytest.mark.parametrize("is_locked", [False, True])
def test_installer_should_use_the_locked_version_of_git_dependencies_with_extras(
installer: Installer,
locker: Locker,
package: ProjectPackage,
repo: Repository,
is_locked: bool,
):
if is_locked:
locker.locked(True)
locker.mock_lock_data(fixture("with-vcs-dependency-with-extras"))
expected_reference = "123456"
else:
expected_reference = "9cf87a285a2d3fbb0b9fa621997b3acc3631ed24"
package.add_dependency(
Factory.create_dependency(
"demo",
{
"git": "https://github.com/demo/demo.git",
"branch": "master",
"extras": ["foo"],
},
)
)
repo.add_package(get_package("pendulum", "1.4.4"))
repo.add_package(get_package("cleo", "1.0.0"))
installer.run()
assert len(installer.executor.installations) == 3
assert installer.executor.installations[-1] == Package(
"demo",
"0.1.2",
source_type="git",
source_url="https://github.com/demo/demo.git",
source_reference="master",
source_resolved_reference=expected_reference,
)
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