Skip to content

ci: resolve the declared dependency floors on every PR - #81

Merged
lesnik512 merged 1 commit into
mainfrom
ci/resolve-floors
Sep 21, 2026
Merged

lesnik512 merged 1 commit into
mainfrom
ci/resolve-floors

Conversation

@lesnik512

Copy link
Copy Markdown
Member

Why

pytest and scheduled both resolve highest, so the declared lower bounds ship untested. That is how faststream-stomp kept faststream~=0.7 until 0.7.6 made address a required field of SubscriberSpec and broke AsyncAPI generation for anyone resolving fresh — community-of-python/stompman#209.

What

A lowest leg that resolves --resolution lowest-direct and runs the suite against it, on every supported interpreter. Wheel coverage is per-interpreter, so two interpreters resolving the same versions can still disagree on whether those versions install; --no-build makes a missing wheel a resolution error rather than a quiet sdist compile. It takes the same redpanda service the pytest leg does. 3.14t stays out: aiokafka ships no free-threaded wheel to resolve.

What it found

faststream[kafka]>=0.7.1 holds. The suite passes against faststream 0.7.1 and aiokafka 0.14.0 on 3.11 through 3.14, and nothing here touches the endpoint-specification API 0.7.6 changed. No floor bump needed.

The harness is what was unsound:

  • pytest, pytest-cov, pytest-xdist and pytest-randomly were unbounded, so the floors resolved pytest-xdist==0.0.0, pytest-cov==2.0.0 and pytest-randomly==1.0.0.
  • pytest-asyncio was floored at >=0.23.4, one minor below the release that added asyncio_default_fixture_loop_scope. This project sets that option, and pytest only warns when the installed version does not know it — so at the declared floor the setting silently did nothing.

Verification

Floors resolved and the suite run locally on 3.11, 3.12, 3.13 and 3.14 against a real redpanda — 190 passed on each. just lint-ci and just test-ci still pass at the resolved-highest end, coverage 100%.

`pytest` and `scheduled` both resolve highest, so the declared lower bounds
ship untested. That is how faststream-stomp kept `faststream~=0.7` until 0.7.6
made `address` a required field of `SubscriberSpec` and broke AsyncAPI
generation for anyone resolving fresh.

The new `lowest` leg resolves `--resolution lowest-direct` and runs the suite
against it on every supported interpreter — wheel coverage is per-interpreter,
so two of them resolving the same versions can still disagree on whether those
versions install. `--no-build` keeps it a resolution error rather than a quiet
sdist compile. It takes the same redpanda service the `pytest` leg does; 3.14t
stays out, since aiokafka ships no free-threaded wheel to resolve.

`faststream>=0.7.1` holds: the suite passes against 0.7.1 on all four
interpreters, and nothing here touches the endpoint-specification API 0.7.6
changed. The harness did not. `pytest`, `pytest-cov`, `pytest-xdist` and
`pytest-randomly` were unbounded, so the floors resolved pytest-xdist 0.0.0 and
pytest-cov 2.0.0. `pytest-asyncio` was floored at 0.23.4, one minor below the
release that added `asyncio_default_fixture_loop_scope` — a setting this
project's pytest config ships and that pytest merely warns about when the
installed version does not know it.
@lesnik512
lesnik512 merged commit ae14e5a into main Sep 21, 2026
11 checks passed
@lesnik512
lesnik512 deleted the ci/resolve-floors branch September 21, 2026 14:37
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