Skip to content

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

Merged
lesnik512 merged 1 commit into
mainfrom
ci/floors-gate
Sep 20, 2026
Merged

lesnik512 merged 1 commit into
mainfrom
ci/floors-gate

Conversation

@lesnik512

Copy link
Copy Markdown
Member

Adds the floors job the standard now requires
(.github#109). This is the pilot for the
sweep: the other 11 modern-di-* repos share this _checks.yml almost line for line, so whatever
shape survives review here gets copied.

What it does

Resolves fastapi>=0.100 and modern-di>=3 at their floors, wheel-only, on all six matrix
entries, then runs the suite. Nothing else in CI installs those versions: just install runs
uv lock --upgrade, so pytest and scheduled.yml both resolve newest on every run.

Result

The floors are honest. All 17 tests pass at the bottom of both ranges on 3.10 through 3.14 and
3.14t, against fastapi==0.100.0, modern-di==3.0.0, starlette==0.27.0. No floor needed
raising, and 3.14t stays in the matrix rather than being dropped the way compose2pod drops it.

I measured all six locally before writing the job.

Two things the job needs, and why

The dev group is floored. It was four unbounded names, which --resolution lowest-direct
resolves to each package's first-ever release: pytest==2.7.1, pytest-asyncio==0.1,
pytest-cov==2.0.0. That is not a harness. The floors are the real minimums: pytest-asyncio>=0.24
is where asyncio_default_fixture_loop_scope arrives, which this repo sets.

The job installs httpx<0.28. fastapi>=0.100 pulls starlette==0.27.0, whose TestClient
imports httpx; current starlette imports httpx2, which is what the dev group declares, so at
the floors nothing provides the module starlette wants. Pinning below 0.28 as well because httpx
0.28 removed the app= shortcut that starlette 0.27 passes it. Deliberately a job step rather than
a dev-group entry: it is an artifact of resolving low, not something the project depends on.

Choices worth a second opinion, since 11 repos inherit them

  • Raw uv, not just. Section 2 says CI calls only the fixed recipe names. I read that as
    governing which recipes exist, not as banning a job that uses none, which is what
    faststream-outbox already does. The alternative is a test-floors recipe in every justfile,
    which is a bigger commitment than the standard asks for.
  • --no-install-project is not optional. Without it --no-build refuses to build this project
    itself and the sync fails outright. The tests import the package from the checkout instead.
  • No coverage. addopts is empty here, so a bare pytest measures nothing; the 100% gate
    rides test-ci on the resolved-newest leg.

Verification

Six interpreters at the floors: 17 passed each. At newest, unchanged: just lint-ci clean,
just test-ci 17 passed at 100% coverage.

@lesnik512
lesnik512 merged commit 8c679f8 into main Sep 20, 2026
14 checks passed
@lesnik512
lesnik512 deleted the ci/floors-gate branch September 20, 2026 17:44
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