Skip to content

ci: resolve the declared dependency floors on every matrix entry - #36

Open
lesnik512 wants to merge 1 commit into
mainfrom
ci/floors-gate
Open

lesnik512 wants to merge 1 commit into
mainfrom
ci/floors-gate

Conversation

@lesnik512

Copy link
Copy Markdown
Member

Adds the floors job the org standard requires (standard.md §7), following modern-di-fastapi#56.

What the job found

starlette>=1.2 holds: starlette 1.2.0 passes the suite on all six interpreters.

What did not hold was the test client. test_finished_request_leaves_no_cyclic_garbage asserts collected == 0 — no cyclic garbage anywhere in the process across 20 requests — and httpx2 below 2.3 leaks cycles of its own, so the assertion failed at the floors on 3.10 through 3.14 while starlette itself was blameless.

Isolated by upgrading one package at a time from the floor set on 3.13: upgrading starlette to 1.6.0 still fails, upgrading modern-di or anyio still fails, upgrading httpx2 alone passes. Bisected to httpx2 2.3.0 — 2.0.0, 2.1.0 and 2.2.0 fail, 2.3.0 is the first that passes. So the bound belongs on the harness, not on the shipped floor:

"httpx2>=2.3",

3.14t passed the whole time only because the assertion is collected == 0 or not gil_enabled, and the free-threaded leg takes the second branch.

Why the job exists

pytest resolves every dependency at its newest, so the bottom of each declared range ships unexercised. This job resolves direct dependencies at their floors, wheel-only, on every entry of the same matrix pytest uses, and runs the suite against them.

--no-build: a floor reachable only by compiling an sdist is not a floor a user installing a wheel can reach. --no-install-project is mandatory alongside it — --no-build would otherwise refuse to build this project too, and the tests import it from the checkout.

The dev-group floors

uv sync --resolution lowest-direct treats an unbounded name in [dependency-groups] as "any version" and resolves it to that project's first-ever release. These are lower bounds on the test harness only; none of them constrains starlette, so the declared floor is still what the job installs. The resolved-newest path is unchanged.

Verification

Run locally on all six interpreters at the floors: starlette==1.2.0 on each, 22 passed. Resolved-newest path re-checked with just install && just lint-ci && just test-ci. Local runs are macOS/arm64; CI is the verdict on manylinux wheel coverage.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant