Skip to content

Commit 335aee2

Browse files
lesnik512claude
andcommitted
docs(release): draft 0.8.5 notes — small-fixes mop-up
Four small unrelated fixes in one patch. chain.py get_type_hints resolves; pydantic.py NameError window eliminated; LoggingMiddleware docs example uses logging; public-API test catches bogus __all__ entries. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 902001d commit 335aee2

1 file changed

Lines changed: 23 additions & 0 deletions

File tree

planning/releases/0.8.5.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# httpware 0.8.5 — small fixes mop-up
2+
3+
**Patch release. Four small unrelated fixes. No API change, no user-visible behavior change on the happy path.** Closes 4 of the remaining audit findings — two Low (chain.py + pydantic.py), two Nit (LoggingMiddleware docs + public-API test).
4+
5+
## What changed
6+
7+
- **`typing.get_type_hints(compose_async)` and `typing.get_type_hints(compose)` now resolve cleanly.** The `AsyncMiddleware` / `Middleware` imports moved out of the `if typing.TYPE_CHECKING:` guard in `httpware/middleware/chain.py`; runtime introspection of the chain-composition signatures works. No behavior change for users not calling `get_type_hints`.
8+
9+
- **`PydanticDecoder` no longer has a NameError window on test-reload.** `httpware/decoders/pydantic.py` now imports `pydantic.TypeAdapter` unconditionally at module top. The optional-extras gate is enforced upstream by `client.py:_default_pydantic_decoder()`, so loading this module without pydantic was already not a real-world path. The previous conditional import left `TypeAdapter` undefined when the install flag was patched off, raising `NameError` instead of the documented `ImportError` if anyone reloaded the module under the flag patch.
10+
11+
- **`LoggingMiddleware` example in `docs/middleware.md` uses `logging`, not `print()`.** CLAUDE.md lists "No `print()`" as a non-negotiable invariant; copying the example into a user's project would have failed their own ruff check. The new snippet mirrors the `RequestIdMiddleware` style further down the same file.
12+
13+
- **Public-API test catches bogus `__all__` entries.** `test_expected_exports` previously checked only `expected - set(__all__)`; now it asserts set equality so a symbol added to `__all__` without a peer update to the expected set is also caught.
14+
15+
## Upgrade
16+
17+
```bash
18+
uv add httpware==0.8.5
19+
# or
20+
pip install -U 'httpware==0.8.5'
21+
```
22+
23+
No import changes. No API changes. The only behavior change is that `from httpware.decoders.pydantic import PydanticDecoder` now fails with a real `ImportError` at import time when pydantic isn't installed (instead of succeeding-then-failing-at-construct). The audit finding documented that the previous behavior was unreachable in practice — the upstream fail-fast at `_default_pydantic_decoder()` is the real safety net.

0 commit comments

Comments
 (0)