modern-di-flask 2.1.0 — adopt the modern-di integration kit
Maintenance release. No public API change — FromDI, inject,
setup_di, fetch_di_container, and flask_request_provider keep their
signatures and behavior. Swaps this package's hand-rolled connection
dispatch and marker resolution for the shared primitives in
modern_di.integrations,
shipped in
modern-di 2.28.0.
Fifth of 13 planned adapter conversions across the modern-di ecosystem
(after
modern-di-starlette 2.2.0,
modern-di-fastapi 2.10.0,
modern-di-litestar 2.13.0,
and
modern-di-aiohttp 2.2.0).
The simplest conversion so far: Flask has exactly one connection type and is
fully synchronous.
Internal refactors
_enter_requestnow derives scope/context via
integrations.bind(flask_request_provider, connection)instead of
hand-writingscope=Scope.REQUEST, context={Request: connection}. Flask
has no WebSocket counterpart, so there's only ever one provider — no
classify_connectiondispatch is needed anywhere.- No
Containercontext-manager block is introduced. Flask's
before_request/teardown_appcontextstay two separate hook callbacks,
unchanged in shape — unlike the middleware-wrapping pattern used in the
starlette/fastapi/litestar/aiohttp conversions. _FromDI/_parse_inject_paramsare gone.FromDI = integrations.from_di;injectnow composes
integrations.parse_markers/integrations.resolve_markers.- The three hand-written
"__modern_di_injected__"string-attribute
touch points are nowintegrations.is_injected/integrations.mark_injected—
same underlying attribute name, so this is a behavioral no-op.
Packaging
- Bumps the
modern-difloor to>=2.28,<3.
Downstream
No action needed — the public API (FromDI, inject, setup_di,
fetch_di_container, flask_request_provider) is unchanged. Upgrading
only requires modern-di>=2.28.0.
Internals
- 100% line coverage;
ruff,tyclean across Python 3.10–3.14. - Built via
subagent-driven-development: 4 planned tasks, each with an
independent spec+quality review; a whole-branch review before merge.