All notable changes to httpware will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Initial project scaffold:
src/httpware/package,py.typedmarker,pyproject.tomlwithuv_buildbackend. - Org conventions ported from
modern-python/modern-di:Justfile,.github/workflows/ci.yml,[tool.ruff]config,[tool.pytest.ini_options], dev and lint dep groups. - Declared dependencies:
httpx2>=2.0.0,<3.0,pydantic>=2.0,<3.0. - Declared install extras:
[msgspec],[otel],[niquests],[all]. SECURITY.mdwith 90-day private-disclosure window.CONTRIBUTING.mdwith development workflow.CLAUDE.mdwith AI-agent guidance.- Core data types:
Request,Response,Limits,Timeout,ClientConfig— frozen+slotted dataclasses withwith_*immutability helpers onRequestand computedtext/json()accessors onResponse(Story 1.2). - Status-keyed exception hierarchy with plain typed fields:
ClientError,TransportError,TimeoutError,StatusError,ClientStatusError/ServerStatusErrorbases, 9 leaf classes (BadRequestError…ServiceUnavailableError),STATUS_TO_EXCEPTIONlookup dict (Story 1.3).StatusErroris picklable and deep-copyable via custom__reduce__;__repr__and the summary message stripuser:pass@userinfo from the request URL;headersis stored as a read-onlyMappingProxyTypeso caller mutations afterraisedo not bleed into the exception.TimeoutErrormulti-inherits frombuiltins.TimeoutError(revisits architecture Decision 3) soexcept builtins.TimeoutError(the formasyncio.wait_forraises) also catches httpware-raised timeouts. Transportprotocol (@runtime_checkable) and defaultHttpx2Transportadapter;StreamResponseplaceholder for Story 4.1 protocol typing; the wiremethodis uppercased at the seam andhttpx2exceptions (TimeoutException,HTTPError,InvalidURL,CookieConflict, and the closed-clientRuntimeError) are mapped tohttpware.TimeoutError/httpware.TransportError(with the original exception's message preserved on the mapped instance) so nohttpx2exception escapes the library; lazyhttpx2.AsyncClientconstruction is guarded by anasyncio.Lockso concurrent first-calls share one client;httpx2is confined tosrc/httpware/transports/httpx2.py(Story 1.4).