Commit 07565b21 by Randy Döring Committed by Bjorn Neergaard

Merge any marker constraints into constraints with specific markers

parent 7aefbd69
......@@ -665,6 +665,14 @@ class Provider:
# - ipython (1.2.4) ; implementation_name == "pypy"
#
# the marker for `ipython` will become `implementation_name != "pypy"`.
#
# Further, we have to merge the constraints of the requirements
# without markers into the constraints of the requirements with markers.
# for instance, if we have the following dependencies:
# - foo (>= 1.2)
# - foo (!= 1.2.1) ; python == 3.10
#
# the constraint for the second entry will become (!= 1.2.1, >= 1.2)
any_markers_dependencies = [d for d in _deps if d.marker.is_any()]
other_markers_dependencies = [d for d in _deps if not d.marker.is_any()]
......@@ -673,9 +681,16 @@ class Provider:
for other_dep in other_markers_dependencies[1:]:
marker = marker.union(other_dep.marker)
for i, d in enumerate(_deps):
if d.marker.is_any():
_deps[i].marker = marker.invert()
inverted_marker = marker.invert()
for dep_any in any_markers_dependencies:
dep_any.marker = inverted_marker
for dep_other in other_markers_dependencies:
dep_other.set_constraint(
dep_other.constraint.intersect(dep_any.constraint)
)
# TODO: Setting _pretty_constraint can be removed once the following issue has been fixed
# https://github.com/python-poetry/poetry/issues/4589
dep_other._pretty_constraint = str(dep_other.constraint)
overrides = []
for _dep in _deps:
......
......@@ -1142,6 +1142,49 @@ So, because no versions of a match !=1.0
assert str(e.value) == expected
def test_solver_duplicate_dependencies_different_constraints_merge_no_markers(
solver, repo, package
):
package.add_dependency(Factory.create_dependency("A", "*"))
package.add_dependency(Factory.create_dependency("B", "1.0"))
package_a10 = get_package("A", "1.0")
package_a10.add_dependency(Factory.create_dependency("C", {"version": "^1.0"}))
package_a20 = get_package("A", "2.0")
package_a20.add_dependency(
Factory.create_dependency("C", {"version": "^2.0"}) # incompatible with B
)
package_a20.add_dependency(
Factory.create_dependency("C", {"version": "!=2.1", "python": "3.10"})
)
package_b = get_package("B", "1.0")
package_b.add_dependency(Factory.create_dependency("C", {"version": "<2.0"}))
package_c10 = get_package("C", "1.0")
package_c20 = get_package("C", "2.0")
package_c21 = get_package("C", "2.1")
repo.add_package(package_a10)
repo.add_package(package_a20)
repo.add_package(package_b)
repo.add_package(package_c10)
repo.add_package(package_c20)
repo.add_package(package_c21)
transaction = solver.solve()
check_solver_result(
transaction,
[
{"job": "install", "package": package_c10},
{"job": "install", "package": package_a10}, # only a10, not a20
{"job": "install", "package": package_b},
],
)
def test_solver_duplicate_dependencies_sub_dependencies(solver, repo, package):
package.add_dependency(Factory.create_dependency("A", "*"))
......
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