Commit 3a789a7a by Sébastien Eustace Committed by Arun Babu Neelicattu

Fix incorrect package being selected with transitive markers.

parent 8b479d15
...@@ -4,6 +4,7 @@ from typing import TYPE_CHECKING ...@@ -4,6 +4,7 @@ from typing import TYPE_CHECKING
from typing import Dict from typing import Dict
from typing import List from typing import List
from typing import Optional from typing import Optional
from typing import Tuple
from typing import Union from typing import Union
from poetry.core.packages.dependency import Dependency from poetry.core.packages.dependency import Dependency
...@@ -327,11 +328,11 @@ class VersionSolver: ...@@ -327,11 +328,11 @@ class VersionSolver:
# Prefer packages with as few remaining versions as possible, # Prefer packages with as few remaining versions as possible,
# so that if a conflict is necessary it's forced quickly. # so that if a conflict is necessary it's forced quickly.
def _get_min(dependency: Dependency) -> int: def _get_min(dependency: Dependency) -> Tuple[bool, int]:
if dependency.name in self._use_latest: if dependency.name in self._use_latest:
# If we're forced to use the latest version of a package, it effectively # If we're forced to use the latest version of a package, it effectively
# only has one version to choose from. # only has one version to choose from.
return 1 return not dependency.marker.is_any(), 1
locked = self._get_locked(dependency) locked = self._get_locked(dependency)
if locked and ( if locked and (
...@@ -339,7 +340,7 @@ class VersionSolver: ...@@ -339,7 +340,7 @@ class VersionSolver:
or locked.is_prerelease() or locked.is_prerelease()
and dependency.constraint.allows(locked.version.next_patch()) and dependency.constraint.allows(locked.version.next_patch())
): ):
return 1 return not dependency.marker.is_any(), 1
# VCS, URL, File or Directory dependencies # VCS, URL, File or Directory dependencies
# represent a single version # represent a single version
...@@ -349,12 +350,15 @@ class VersionSolver: ...@@ -349,12 +350,15 @@ class VersionSolver:
or dependency.is_file() or dependency.is_file()
or dependency.is_directory() or dependency.is_directory()
): ):
return 1 return not dependency.marker.is_any(), 1
try: try:
return len(self._provider.search_for(dependency)) return (
not dependency.marker.is_any(),
len(self._provider.search_for(dependency)),
)
except ValueError: except ValueError:
return 0 return not dependency.marker.is_any(), 0
if len(unsatisfied) == 1: if len(unsatisfied) == 1:
dependency = unsatisfied[0] dependency = unsatisfied[0]
......
...@@ -2791,3 +2791,53 @@ def test_solver_can_resolve_python_restricted_package_dependencies( ...@@ -2791,3 +2791,53 @@ def test_solver_can_resolve_python_restricted_package_dependencies(
{"job": "install", "package": pre_commit}, {"job": "install", "package": pre_commit},
], ],
) )
def test_solver_should_not_raise_errors_for_irrelevant_transitive_python_constraints(
solver, repo, package
):
package.python_versions = "~2.7 || ^3.5"
solver.provider.set_package_python_versions("~2.7 || ^3.5")
package.add_dependency(Factory.create_dependency("virtualenv", "^20.4.3"))
package.add_dependency(
Factory.create_dependency("pre-commit", {"version": "^2.6", "python": "^3.6.1"})
)
virtualenv = get_package("virtualenv", "20.4.3")
virtualenv.python_versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7"
virtualenv.add_dependency(
Factory.create_dependency(
"importlib-resources", {"version": "*", "markers": 'python_version < "3.7"'}
)
)
pre_commit = Package("pre-commit", "2.7.1")
pre_commit.python_versions = ">=3.6.1"
pre_commit.add_dependency(
Factory.create_dependency(
"importlib-resources", {"version": "*", "markers": 'python_version < "3.7"'}
)
)
importlib_resources = get_package("importlib-resources", "5.1.2")
importlib_resources.python_versions = ">=3.6"
importlib_resources_3_2_1 = get_package("importlib-resources", "3.2.1")
importlib_resources_3_2_1.python_versions = (
"!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
)
repo.add_package(virtualenv)
repo.add_package(pre_commit)
repo.add_package(importlib_resources)
repo.add_package(importlib_resources_3_2_1)
ops = solver.solve()
check_solver_result(
ops,
[
{"job": "install", "package": importlib_resources_3_2_1},
{"job": "install", "package": pre_commit},
{"job": "install", "package": virtualenv},
],
)
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