Skip to content

v0.26.0 — httpx2, a clean mypy tests/, and CI green again

Choose a tag to compare

@rustyconover rustyconover released this 05 Aug 13:48
· 116 commits to main since this release

httpx2 replaces httpx

httpx's last release was 0.28.1, in December 2024. Pydantic has picked up stewardship as httpx2 — same original author, same design, BSD-3, actively maintained. Every import httpx becomes import httpx2, and the pin moves to httpx2>=2.9.1.

This is an explicit source migration rather than httpx2's alias_httpx(), which resolves import httpx process-wide. That is an import hook, and a library others embed has no business installing one in its callers' interpreters.

Requires vgi-rpc 0.40.0, which makes the same move. That is a requirement, not just compatibility: vgi-rpc owns the HTTP transport client, so had this package migrated first, httpx would have stayed installed via vgi-rpc[http] and both clients would ship. httpx and httpcore are now absent from the lock entirely.

If you pass your own client into anything that reaches vgi-rpc's http_connect, switch it to httpx2.Client.

mypy tests/ is clean, and now gated

tests/ carried 174 errors across 37 files, because CI only ever checked vgi/. All fixed — properly, not suppressed:

  • 4 narrow type: ignores remain, each commented. Three cover a genuinely wrong pyarrow stub (UnionArray.from_sparse(type_codes=...) is declared Int8Array | None but raises TypeError: expected list at runtime); one covers a deliberate enum-literal comparison that is the point of its test.
  • 10 stale or incorrect ignores were removed, including one that was masking a real override violation.
  • Nothing under vgi/ changed. Where a test disagreed with a vgi/ annotation, the test was wrong. The most instructive case: test_aggregate_function.py passed filter_mask=None where the worker in fact always builds an all-true BooleanArray. The fixture now matches the payload production actually sends.

Two mypy config additions: jsonschema.* gets ignore_missing_imports (it ships no py.typed), and mypy_path = "examples" lets the example workers resolve — which surfaced four genuine type errors in test_examples_workers.py, also fixed.

A new CI step gates tests/ from here on. It went unchecked long enough to accumulate 174 errors; the point of the gate is that it cannot accumulate a second batch.

ty is removed

ty was already non-blocking, and at 0.0.66 it stopped terminating on this tree — ty check vgi/ ran past ten minutes locally and, on CI, hung until the step was cancelled. A cancelled step is not a failed one, so continue-on-error did not rescue it: the Lint job went red on 0.25.1 with every other check passing. A signal nothing gates on, that also fails the build, is worse than no signal.

Verification

2160 pytest passed, 0 DuckDB subprocess-integration failures, mypy vgi/ and mypy tests/ both clean, ruff clean.