2.0.0
modern-di-celery 2.0.0 — first release
First release of the Celery integration for modern-di. It wires a
modern-di container into a
Celery 5.x app and resolves dependencies into task
handlers, scoped per task. The version starts at 2.0.0 to track the modern-di
2.x ecosystem alongside the other official integrations.
A Celery task is a plain callable with no Depends-style seam, so this
integration follows modern-di's decorator path (like modern-di-typer),
fully synchronous — a natural fit, since Celery workers are synchronous.
Feature
setup_di(app, container). Stores the root container onapp.conf(read
back withfetch_di_container(app)), and wires the container's lifecycle to
Celery's worker-process signals — reopening it onworker_process_init(each
forked worker process gets its own open container) and closing it on
worker_process_shutdown. Returns the container.- Per-task child containers.
injectopens oneScope.REQUESTchild
container per task, resolves the marked dependencies, and closes it
(close_sync) when the task finishes — including on the error path. FromDI+@inject. Mark a task parameter with
Annotated[T, FromDI(provider_or_type)]and decorate the task with@inject;
the decorator resolves each marked parameter and rewrites the task signature
so Celery binds only the caller's real arguments. Injection is
parameter-order-insensitive —FromDIparams may appear anywhere in the
signature.DITaskbase class. SetCelery(task_cls=DITask)or@app.task(base=DITask)
to inject every task without a per-task@inject;DITaskappliesinject
to the task'srunand resets the task header so Celery still binds only real
args.
Packaging
- Requires
celery>=5,<6andmodern-di>=2.25,<3; Python 3.10–3.14. - Ships
py.typed; zero runtime dependencies beyond Celery and modern-di. - Resolution and finalizers are synchronous; there is no connection object (a
Celery task carries no framework request object).
Downstream
No action needed — this is a new package.
Internals
- 100% line coverage;
ruff,ty, andeof-fixerclean across Python
3.10–3.14. Tests use Celery's eager execution (task_always_eager). - Uses the portable planning convention (
planning/) with anarchitecture/
truth home; releases are tag-driven.