Skip to content

2.0.0

Choose a tag to compare

@github-actions github-actions released this 10 Jul 11:58
fcc2eb1

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 on app.conf (read
    back with fetch_di_container(app)), and wires the container's lifecycle to
    Celery's worker-process signals — reopening it on worker_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. inject opens one Scope.REQUEST child
    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 — FromDI params may appear anywhere in the
    signature.
  • DITask base class. Set Celery(task_cls=DITask) or @app.task(base=DITask)
    to inject every task without a per-task @inject; DITask applies inject
    to the task's run and resets the task header so Celery still binds only real
    args.

Packaging

  • Requires celery>=5,<6 and modern-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, and eof-fixer clean across Python
    3.10–3.14. Tests use Celery's eager execution (task_always_eager).
  • Uses the portable planning convention (planning/) with an architecture/
    truth home; releases are tag-driven.