v0.26.0 — httpx2, a clean mypy tests/, and CI green again
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 declaredInt8Array | Nonebut raisesTypeError: expected listat 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 avgi/annotation, the test was wrong. The most instructive case:test_aggregate_function.pypassedfilter_mask=Nonewhere the worker in fact always builds an all-trueBooleanArray. 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.