You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: CONTRIBUTING.md
+1-2Lines changed: 1 addition & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -18,8 +18,7 @@ just test # pytest with coverage
18
18
2.**Branch from `main`**, use a descriptive name (`feat/retry-budget-jitter`, `fix/transport-cancel-leak`).
19
19
3.**Run `just lint` and `just test`** locally before pushing. CI will reject changes that fail either.
20
20
4.**Add tests** for any code change. Property-based tests (via Hypothesis) are required for concurrency-sensitive code (retry budget, bulkhead, retry interleaving).
21
-
5.**Update `CHANGELOG.md`** in the `Unreleased` section.
22
-
6.**Open a pull request** against `main`. PR titles use conventional-commits style (`feat:`, `fix:`, `docs:`, `refactor:`, `test:`, `chore:`).
21
+
5.**Open a pull request** against `main`. PR titles use conventional-commits style (`feat:`, `fix:`, `docs:`, `refactor:`, `test:`, `chore:`).
**Resilience-first async HTTP client framework for Python.**
8
+
**Async HTTP client framework for Python.**
9
9
10
-
`httpware` is to Python what Polly is to .NET and resilience4j is to the JVM — a canonical resilience-first HTTP framework. The public API is transport-agnostic (the underlying client is `httpx2` by default, sitting behind a swappable `Transport` protocol). Retries, timeouts, bulkheads, and a Finagle-style **retry budget**ship as composable middleware. Tests use a `RecordedTransport`and never see the underlying client.
10
+
`httpware` is a typed, async HTTP client library built on `httpx2` with a protocol-based seam so the transportis swappable. Middleware composes via an onion model. Pydantic and msgspec response decoding ship out of the box. `RecordedTransport`replaces respx for transport-level tests.
11
11
12
-
> **Status:** Pre-1.0. Public API is subject to change between minor releases until v1.0. See [CHANGELOG.md](./CHANGELOG.md).
12
+
> **Status:** Pre-1.0 (0.1.0 alpha). Public API is subject to change between minor releases until v1.0. Resilience middleware (retry / timeout / bulkhead), streaming, and observability are not yet shipped — track progress on GitHub.
-**Retry budget by default** — token-bucket admission control (Finagle defaults). Caps retry storms before they happen.
52
-
-**Pluggable validation.** Default pydantic decoder with cached `TypeAdapter`; msgspec decoder via extras; bring your own.
53
-
-**`RecordedTransport` for tests.** A 3-line fixture replaces respx routes and transport-level mocking.
54
-
-**Status-keyed exceptions** with plain fields (`status: int`, `body: bytes`, `headers`, `json`). No transport exception types in user code.
55
-
-**First-class OpenTelemetry** instrumentation via `httpware[otel]`.
56
-
57
-
## Documentation
46
+
## What ships in 0.1.0
58
47
59
-
Full docs (in progress): https://httpware.readthedocs.io
48
+
-**`AsyncClient`** — eight HTTP method shortcuts (`get`, `post`, `put`, `patch`, `delete`, `head`, `options`, `request`) with typed `response_model` overloads; per-call overrides for `headers`, `params`, `cookies`, `timeout`, `json`, `content`; httpx-style `base_url` join; `with_options(...)` returns a view sharing the same transport.
49
+
-**Transport-agnostic seam.**`httpx2` is confined to `httpware.transports.httpx2.Httpx2Transport`. Implement the `Transport` protocol to swap backends.
50
+
-**Middleware foundation.**`Middleware` protocol, `Next` type alias, recursive-closure `compose()` chain composition, and phase decorators (`@before_request`, `@after_response`, `@on_error`).
51
+
-**Pluggable response decoding.**`PydanticDecoder` (default) with cached `TypeAdapter`; `MsgspecDecoder` via `httpware[msgspec]`.
52
+
-**`RecordedTransport`** — built-in test double with a route table, observed-request list, and `aclose_calls` counter.
-**No `httpx2` exception types** leak through `httpware`. The transport seam maps them to `httpware` exceptions.
60
55
61
56
## Part of `modern-python`
62
57
63
-
Browse the full list of templates and libraries in
64
-
[`modern-python`](https://github.com/modern-python) — see the org profile for the
65
-
categorized index.
58
+
Browse the full list of templates and libraries in [`modern-python`](https://github.com/modern-python) — see the org profile for the categorized index.
0 commit comments