All notable changes to babelqueue (Python) are documented here.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
The envelope wire format is versioned separately by meta.schema_version
(currently 1) — see the contract at babelqueue.com.
1.0.0 - 2026-06-07
1.0.0 — the public API is now SemVer-stable: breaking changes require a MAJOR,
following the deprecation policy. The wire envelope is unchanged
(schema_version: 1); the core + Celery/Django adapters ship together. Full
reference at babelqueue.com.
- CI adds ruff + mypy static analysis and a >=90% coverage gate
(
pytest --cov --cov-fail-under=90, run in the broker-backed job so the Redis / RabbitMQ transports count). Type-safety fix inredis_transport(str-narrow the BLMOVE reply) surfaced by mypy — no behaviour change. - GR-8 latency benchmark (
tests/test_overhead.py) — asserts the envelope encode/decode path adds ≤2% over plain-JSON serialization vs a conservative 2ms broker round-trip (the pure-Python codec is slower than the compiled SDKs — ~16µs marginal on CPython 3.9/CI — so the reference is higher to stay robust).
0.5.0 - 2026-06-06
- Celery adapter (
babelqueue.celery,[celery]extra) —from_celery(app)builds aBabelQueueruntime on a Celery app's broker, andinstall_worker(app)registers a Celery worker bootstep that drains URN-routed polyglot messages in a background thread alongside Celery's own consumer. - Django adapter (
babelqueue.django,[django]extra) — settings-drivenBABELQUEUEconfig,get_app()/publish()shortcuts, and amanage.py babelqueue_workermanagement command. Add"babelqueue.django"toINSTALLED_APPS. - Both adapters lazy-import their framework, so the core stays dependency-free.
0.4.0 - 2026-06-06
EnvelopeCodec.urn()— resolve the URN (job, acceptingurnas an alias).EnvelopeCodec.accepts()— consumer-side envelope validation (rejects empty URN, unsupportedmeta.schema_version, blanktrace_id, non-objectdata).- Shared cross-SDK conformance suite under
tests/conformance/(vendored from the canonicalconformance/set) plus atest_conformance.pyrunner.
0.3.0 - 2026-06-06
- RabbitMQ transport (
PikaTransport,amqp://): durable queue, persistent delivery,basic_get+ manual ack, and the contract AMQP properties (type=URN,correlation_id=trace_id,x-schema-version/x-source-lang/x-attempts). Optional[amqp]extra (lazypikaimport) — the core stays zero-dep.
0.2.0 - 2026-06-06
- Runtime —
BabelQueue(broker_url=...)app with a@app.handler("urn:...")decorator,publish(), and aconsume()/run()loop. Routes by URN over the canonical envelope;attempts-based retry → opt-in dead-letter queue;on_unknown_urnstrategies (fail/delete/release/dead_letter). - Transports — a pluggable
Transportabstraction withInMemoryTransport(memory://, for tests/local) andRedisTransport(redis://, reliable-queue pattern viaBLMOVE+ a processing list). Redis client is an optional[redis]extra, imported lazily — the core stays zero-dep.
0.1.0 - 2026-06-06
EnvelopeCodec— builds (make,from_message), encodes and decodes the canonical{job, trace_id, data, meta, attempts}envelope (schema_version1). The single Python implementation of the wire format.- Contracts
PolyglotMessage/HasTraceId(typedProtocols). dead_letter.annotate()— additivedead_letterblock builder.UnknownUrnStrategy—fail/delete/release/dead_letter.BabelQueueError/UnknownUrnError.- Golden conformance fixtures under
tests/fixtures/(shared cross-SDK set). py.typed— ships inline type hints (PEP 561).
- Pre-1.0: the public API may change before the
1.0.0tag. - The core has zero runtime dependencies (standard library only); Python
>=3.9.