diff --git a/planning/releases/0.15.2.md b/planning/releases/0.15.2.md new file mode 100644 index 0000000..88010ff --- /dev/null +++ b/planning/releases/0.15.2.md @@ -0,0 +1,59 @@ +# httpware 0.15.2 — docs accuracy + internal dedup, no behavior change + +No public API changes. Every commit since 0.15.1 is docs, internal refactoring, +CI, or planning tooling — safe to upgrade unconditionally. + +## Docs + +- **Site overhaul + audit fixes** (#90): the "Why httpware" pitch is now + benefit-first (`raise_for_status()` dropped from the lead); `index.md` + slimmed to a true quickstart; the OpenTelemetry wiring guide moved to a new + `docs/observability.md`; `resilience.md` trimmed. Fixed two + security-relevant doc bugs where `errors.md`/`middleware.md` said secrets in + URLs are *not* redacted when the code does redact them, plus several other + doc/code mismatches (Retry-After-over-`max_delay` behavior, + previously-undocumented `ResponseTooLargeError`/`max_response_body_bytes`). +- **Project lockup hero** added to the docs home page (#91). +- **Docs-and-comments audit**: fixed stale docstrings (`BulkheadFullError`, + `AsyncClient.stream()`'s version caveat), a cross-doc contradiction on where + `DecodeError` wrapping happens, a `httpx`/`httpx2` terminology slip (with a + follow-up correction to the underlying `respx`-compatibility claim, verified + against `respx`'s own docs), a `contributing.md` wording contradiction on + docstring requirements, and deduplicated `ResponseTooLargeError`'s + triple-repeated behavior description down to one canonical account + (#103, #104, #105). + +## Internal (no behavior change) + +Continuation of the sync/async deduplication pass flagged by the 2026-06-14 +deep audit — every remaining "duplicated, no divergence yet" item from that +audit is now closed: + +- Body-cap subsystem and httpx2-exception-mapper context managers extracted + out of `client.py` into dedicated `_internal/` modules. +- Client construction-validation and kwargs-assembly logic shared between + `Client`/`AsyncClient`. +- The 6 hand-duplicated exception reconstruct/`__reduce__` pairs in + `errors.py` collapsed into one `_KeywordReduceMixin`. +- `Bulkhead`/`AsyncBulkhead` constructor validation and rejection-event + construction shared. +- The decoders' memoizing get-or-build cache pattern (4 sites across + `pydantic.py`/`msgspec.py`) shared via one generic helper. +- `_read_capped`/`_read_capped_async`'s declared-length-reject and + `Response`-reconstruction blocks shared. +- `AsyncBulkhead`/`AsyncCircuitBreaker`'s identical single-event-loop guard + shared via a new `_event_loop_guard.py`. + +## CI & tooling + +- PRs now run `mkdocs --strict` as a check, catching broken internal + links/anchors and orphaned pages before merge (#92). +- Planning convention bumped to 2.0.0 (flat change files, no per-change + folders) (#93, #94). +- Dropped stale `ty: ignore` suppressions in circuit-breaker tests that a + newer `ty` no longer needs (#96). + +## Downstream + +No action required. Nothing about the installed package's public behavior +changes.