0.8.6 — test mop-up
httpware 0.8.6 — test mop-up
Patch release. Test-only changes. No API change, no production code change, no behavior change for users. Closes 5 audit findings — all in the test suite.
What changed
test_no_slot_leak_after_drainis behavioral, not internals-peek. The Hypothesis property test forAsyncBulkheadno longer asserts againstbulkhead._sem._value; it submitsmax_concurrentfresh acquires after drain and confirms they all succeed under a tightacquire_timeout.test_threading_with_shared_budgetasserts the exact deposit count. The previouslen(budget._deposits) > 0was a smoke check that would have passed under deque corruption with even one survivor. The new assertion locks the count to(N_SYNC_THREADS * N_OPS_PER_THREAD) + N_ASYNC_TASKS= 220, made deterministic by the 0.8.3 deposit-hoist.test_optional_extras_pydantic_missing.pycovers the syncClientescape hatch. The async test pinnedAsyncClient(decoder=fake)bypassing the pydantic fail-fast; the syncClienthad no peer. Now it does._FakeDecoderhoisted to module top to keep the two tests DRY.- Sync
Bulkheadhas Hypothesis property tests. New filetests/test_bulkhead_sync_props.pymirrorstests/test_bulkhead_props.pyusingthreading.Thread+ThreadPoolExecutorinstead ofasyncio.gather. Three properties: in-flight never exceeds cap; fail-fast rejects at capacity; no slot leak after drain. - Sync
on_errorBaseExceptionpropagation is tested. Two new tests intest_middleware_sync.pypin the invariant that the syncon_errordecorator'sexcept Exceptionclause does NOT catchKeyboardInterruptorSystemExit— both must propagate throughcompose.
Audit status
35 audit findings, all addressed across 0.8.1 → 0.8.6 plus the in-place doc-staleness sweep on main. One chunk-3 hand-review item was excluded as INVALID (the audit looked for AsyncClient construction tests in tests/test_client_methods.py — they actually live in tests/test_client_construction.py + tests/test_client_lifecycle.py).
Upgrade
uv add httpware==0.8.6
# or
pip install -U 'httpware==0.8.6'No import changes. No API changes. Nothing observable from the consumer side.