fix: floor PyYAML per interpreter and gate every matrix entry - #135
Merged
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
floorsran on3.10and3.14only, against a six-entrypytestmatrix. The job commentjustifies dropping
3.14t(no PyYAML release ships acp314twheel, whichthe standard explicitly
permits and cites this repo for). It says nothing about
3.11,3.12and3.13, which weresimply absent. §7: "Every matrix entry: wheel coverage is per interpreter, so two interpreters
that resolve the same versions can still disagree on whether those versions install."
Adding the three entries showed the declared floor was wrong on two of them.
The floor was not reachable at
3.12or3.13PyYAML's
cp3*wheel coverage:cp310,cp311cp312cp313cp314So
PyYAML>=6claimed a floor that no wheel satisfies on3.12or3.13:3.13gives the same;3.11installs. §7 is explicit that this is not a floor: "a floor reachableonly by compiling an sdist is not a floor a user installing a wheel can reach."
Why the existing job did not catch it
Not because of the matrix alone. Wheel-only does not verify the declared floor, it verifies the
declared range. A version with no wheel becomes ineligible, and
--resolution lowest-directthenpicks the lowest version that does have one. So even with
3.12in the matrix the old job wouldhave gone green: it resolves
6.0.1, reports success, and never touches the6.0the packagedeclares.
Both spellings §7 offers behave identically here (uv 0.12.5, 3.12,
--resolution lowest-direct):--no-buildPyYAML>=66.0.1--only-binary PyYAMLPyYAML>=66.0.1--no-buildPyYAML==6.0--only-binary PyYAMLPyYAML==6.0PyYAML>=6The last row is the irony: without the wheel-only flag, uv picks
6.0and dies compiling it on3.12. The flag is what let the range slide up and pass.
So the fix has to be the declaration, not the job. Splitting the floor per interpreter makes the
resolved version equal the declared one on every leg, which is what turns a green leg into evidence
about the floor rather than about the range. §7 currently says
floors"is the only job that tests"the declared floor; strictly it tests the range unless the declaration is pinned this tightly. That
belongs in a standard PR, not this one.
Verified
Each leg from a clean
.venv,uv pip install --resolution lowest-direct --only-binary PyYAML ".[yaml]"then the import smoke, resolving exactly the declared floor for its interpreter:just lint-ciclean;just test-ci1471 passed, 100% coverage. Local runs are macOS arm64, so CIis the verdict on manylinux coverage.