1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
|
From 5629c5fe8878e30af371bf7a23a73007d5397ac2 Mon Sep 17 00:00:00 2001
From: Damian Shaw <damian.peter.shaw@gmail.com>
Date: Wed, 11 Feb 2026 23:26:14 -0500
Subject: [PATCH] Correct `PythonInputProvider._iter_matches` to fix tests with
packaging 26.0
---
.../python/test_resolvers_python.py | 25 ++++++++++++++-----
1 file changed, 19 insertions(+), 6 deletions(-)
diff --git a/tests/functional/python/test_resolvers_python.py b/tests/functional/python/test_resolvers_python.py
index eafb1cb..c44b777 100644
--- a/tests/functional/python/test_resolvers_python.py
+++ b/tests/functional/python/test_resolvers_python.py
@@ -3,9 +3,11 @@
import operator
import os
from collections import defaultdict
+from functools import reduce
import packaging.markers
import packaging.requirements
+import packaging.specifiers
import packaging.utils
import packaging.version
import pytest
@@ -92,12 +94,23 @@ def _iter_matches(self, identifier, requirements, incompatibilities):
name, _, _ = identifier.partition("[")
bad_versions = {c.version for c in incompatibilities[identifier]}
extras = {e for r in requirements[identifier] for e in r.extras}
- for key in self.index[name]:
- v = packaging.version.parse(key)
- if any(v not in r.specifier for r in requirements[identifier]):
- continue
- if v in bad_versions:
- continue
+
+ # Get all versions from the index, excluding bad versions
+ available_versions = (
+ v
+ for key in self.index[name]
+ if (v := packaging.version.parse(key)) not in bad_versions
+ )
+
+ # Combine all requirement specifiers using & operator
+ combined_specifier = reduce(
+ operator.and_,
+ map(operator.attrgetter("specifier"), requirements[identifier]),
+ packaging.specifiers.SpecifierSet(),
+ )
+
+ # Filter versions using the combined specifier
+ for v in combined_specifier.filter(available_versions):
yield Candidate(name=name, version=v, extras=extras)
def find_matches(self, identifier, requirements, incompatibilities):
|