Modern-DI integration for Typer.
Full guide: Typer integration docs
Usage example: examples/
Installation
uv add modern-di-typer # or: pip install modern-di-typer
Usage
import typing
import typer
import modern_di
from modern_di import Scope, providers, Group
from modern_di_typer import FromDI, inject, setup_di
class Dependencies(Group):
settings = providers.Factory(creator=lambda: {"debug": True})
service = providers.Factory(scope=Scope.REQUEST, creator=MyService, bound_type=None)
app = typer.Typer()
container = modern_di.Container(groups=[Dependencies])
setup_di(app, container)
container.validate() # optional fail-fast; must come after setup_di registers its providers
@app.command()
@inject
def my_command(
name: typing.Annotated[str, typer.Argument()],
service: typing.Annotated[MyService, FromDI(Dependencies.service)],
) -> None:
service.run(name)
if __name__ == "__main__":
with container:
app()
Action scope
Scope.ACTION dependencies live below the per-command Scope.REQUEST container.
Open one with action_scope(ctx): each with block yields a fresh action-scoped
container (a child of the command container), so you can open as many as
you need within a single command — one per item in a batch, for example.
import typer
from modern_di import Scope, providers, Group
from modern_di_typer import FromDI, action_scope, inject
class Dependencies(Group):
job = providers.Factory(scope=Scope.ACTION, creator=MyJob, bound_type=None)
@app.command()
@inject
def my_command(ctx: typer.Context) -> None:
for job_name in job_names:
with action_scope(ctx) as action:
action.resolve_provider(Dependencies.job).run()
API
setup_di(app, container)— register the container with a Typer appinject— decorator that resolvesFromDI-annotated parameters before the command runs; also exposestyper.Contextwithctx.obj["di_container"]for manual use. RaisesRuntimeErrornamingsetup_diwhen a command reaches it withoutsetup_dicalledFromDI(provider)— marker used inAnnotated[T, FromDI(...)]; accepts a provider instance or a typeaction_scope(ctx)— context manager yielding a freshScope.ACTIONcontainer (a child of the command container); open one per action. RaisesRuntimeErrornaming@injectwhen called from a command without itfetch_di_container(ctx)— returns the app-scoped container fromctx.obj
Used by
- semvertag — a CLI
auto-tagger for GitLab/GitHub that wires its settings, API providers, and
version-bump strategies through a
modern_dicontainer withmodern-di-typer. Seesemvertag/ioc.pyfor a real-worldsetup_di+Groupsetup.
📦 PyPI
📝 License
Part of modern-python
Built on modern-di, a dependency-injection framework with IoC container and scopes.
Browse the full list of templates and libraries in
modern-python — see the org profile for the categorized index.
Release files for modern-di-typer 3.0.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| modern_di_typer-3.0.3.tar.gz | 4.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| modern_di_typer-3.0.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size:9.9 kB
Release files / modern_di_typer-3.0.3.tar.gz
| Download URL | modern_di_typer-3.0.3.tar.gz |
|---|---|
| Size | 4.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
106d2e068e20252318005be7cc292c261392b846e31817fde1f8471392840474
|
|
BLAKE2b-256 checksum How to use checksums |
7161c9d97e8f7a1acca4242a71b8ed85f95517fcfca2b0890fb3f0e2bdd30068
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.15 {"installer":{"name":"uv","version":"0.12.15","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / modern_di_typer-3.0.3-py3-none-any.whl
| Download URL | modern_di_typer-3.0.3-py3-none-any.whl |
|---|---|
| Size | 5.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
22769a1d305155f11717a3aa8332ae865ab78831352a3b5af4bb637221723dd3
|
|
BLAKE2b-256 checksum How to use checksums |
af8ba837d2b79e038a66205f791889da1499bdd00ff4cf3102076a87ffd7117e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.15 {"installer":{"name":"uv","version":"0.12.15","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|