Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 60 additions & 0 deletions planning/releases/0.10.4.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
# faststream-outbox 0.10.4 — internal refactors + richer PyPI metadata, no behavior change

**Patch release.** Every change to the installed package is an **internal refactor** —
the runtime behaves identically to 0.10.3 (same producer, subscriber, lease/terminal-write,
timer, DLQ, and validation behavior). The one user-visible change is **richer PyPI package
metadata**. Drop-in upgrade.

## Internal refactors (no behavior change)

These deepen the codebase without changing any observable behavior; they exist to remove
duplication and concentrate logic, verified by the unchanged test suite (and a new
cross-adapter contract suite).

- **Outbox rules de-duplicated between the real and fake clients.** The genuinely-shared
pure bits are now single-sourced — `_scheduling.py` (activate-args resolution +
validation, shared by the real and fake publish paths) and `_DLQ_PROJECTION` in
`schema.py` (one declarative outbox→DLQ column map both the real DLQ CTE and the fake
build from). The rules that must run server-side in Postgres (eligibility, lease cutoff,
retry timing) stay as two implementations but are now **co-verified** by a single
parametrized contract suite run against both the real client and the in-memory fake.
([#109](https://github.com/modern-python/faststream-outbox/pull/109))
- **Lease-lost telemetry has one home.** The byte-identical detect→log→emit block that the
terminal and retry flush paths each carried is consolidated into a single
`_emit_lease_lost(row, *, phase)` helper. ([#110](https://github.com/modern-python/faststream-outbox/pull/110))
- **`OutboxSubscriberConfig` validates itself.** Subscriber-knob validation moved from the
factory into `OutboxSubscriberConfig.__post_init__`, so *every* construction path is
guarded, not just `@broker.subscriber`. Behavior is preserved exactly; warning
attribution (the warning points at your `@subscriber` call site) is now computed via a
manual stacklevel walk so it's robust across CPython 3.13/3.14 and the FastAPI-router
path. ([#111](https://github.com/modern-python/faststream-outbox/pull/111))

## Packaging

- **Richer PyPI metadata** — keywords, classifiers, and project URLs. Better
discoverability and project links on the PyPI page; no install-time or runtime effect.
([#108](https://github.com/modern-python/faststream-outbox/pull/108))

## Migration

None. Drop-in upgrade from 0.10.x — no public-API change, no schema change, no config
change. If you don't construct `OutboxSubscriberConfig` directly (the normal case), nothing
about your code changes; if you *do*, it now validates on construction (rejecting the same
impossible values the factory always rejected).

## Touched surface

- **Package code (internal only):** `faststream_outbox/_scheduling.py` (new),
`publisher/producer.py`, `broker.py`, `schema.py`, `client.py`, `testing.py`,
`subscriber/usecase.py`, `subscriber/config.py`, `subscriber/factory.py`.
- **Packaging:** `pyproject.toml` (metadata only).
- **Tests:** `tests/test_client_contract.py` (new, cross-adapter contract), plus updates
to `tests/test_unit.py`, `tests/test_fake.py`, `tests/test_integration.py`.
- **Living docs:** `CLAUDE.md`, `architecture/dlq.md`, `architecture/test-broker.md`.

## See also

- [#108](https://github.com/modern-python/faststream-outbox/pull/108) — PyPI metadata.
- [#109](https://github.com/modern-python/faststream-outbox/pull/109) — rules de-duplication + client contract suite.
- [#110](https://github.com/modern-python/faststream-outbox/pull/110) — lease-lost telemetry consolidation.
- [#111](https://github.com/modern-python/faststream-outbox/pull/111) — self-validating subscriber config.