From c69f42237aded4966b328810e7fb76918e086558 Mon Sep 17 00:00:00 2001 From: ivan-borovets <130386813+ivan-borovets@users.noreply.github.com> Date: Mon, 23 Mar 2026 10:29:16 +0300 Subject: [PATCH 1/2] [refactor] --- scripts/dishka/plot_dependencies_data.py | 34 ++++++------------ src/app/main/run.py | 46 +++++++----------------- 2 files changed, 22 insertions(+), 58 deletions(-) diff --git a/scripts/dishka/plot_dependencies_data.py b/scripts/dishka/plot_dependencies_data.py index b8f28c1..67cd9d5 100644 --- a/scripts/dishka/plot_dependencies_data.py +++ b/scripts/dishka/plot_dependencies_data.py @@ -3,37 +3,23 @@ import dishka.plotter from dishka import AsyncContainer -from app.config.loader import ( - load_app_settings, - load_cookie_settings, - load_jwt_settings, - load_password_hasher_settings, - load_postgres_settings, - load_session_settings, - load_sqla_settings, -) -from app.main.run import make_ioc_container - - -def generate_dependency_graph_d2(container: AsyncContainer) -> str: +from app.main.run import make_app + + +def generate_d2_dependency_graph(container: AsyncContainer) -> str: """ - Generates a dependency graph for the container in `d2` format. + Generates dependency graph for container in `d2` format. See https://d2lang.com for rendering instructions. """ return dishka.plotter.render_d2(container) async def main() -> None: - async with make_ioc_container( - app_settings=load_app_settings(), - postgres_settings=load_postgres_settings(), - sqla_settings=load_sqla_settings(), - password_hasher_settings=load_password_hasher_settings(), - jwt_settings=load_jwt_settings(), - session_settings=load_session_settings(), - cookie_settings=load_cookie_settings(), - )() as container: - print(generate_dependency_graph_d2(container)) + app = make_app() + container = app.state.dishka_container + try: + print(generate_d2_dependency_graph(container)) + finally: await container.close() diff --git a/src/app/main/run.py b/src/app/main/run.py index b1e9252..8784404 100644 --- a/src/app/main/run.py +++ b/src/app/main/run.py @@ -1,7 +1,7 @@ from collections.abc import AsyncIterator, Callable from contextlib import AbstractAsyncContextManager, asynccontextmanager -from dishka import AsyncContainer, Provider, make_async_container +from dishka import Provider, make_async_container from dishka.integrations.fastapi import setup_dishka from fastapi import FastAPI @@ -44,31 +44,6 @@ async def lifespan(app: FastAPI) -> AsyncIterator[None]: return lifespan -def make_ioc_container( - *di_providers: Provider, - app_settings: AppSettings, - postgres_settings: PostgresSettings, - sqla_settings: SqlaSettings, - password_hasher_settings: PasswordHasherSettings, - jwt_settings: JwtSettings, - session_settings: SessionSettings, - cookie_settings: CookieSettings, -) -> AsyncContainer: - return make_async_container( - *get_providers(), - *di_providers, - context={ - AppSettings: app_settings, - PostgresSettings: postgres_settings, - SqlaSettings: sqla_settings, - PasswordHasherSettings: password_hasher_settings, - JwtSettings: jwt_settings, - SessionSettings: session_settings, - CookieSettings: cookie_settings, - }, - ) - - def make_app( *di_providers: Provider, app_settings: AppSettings | None = None, @@ -106,15 +81,18 @@ def make_app( lifespan=make_lifespan(), root_path=app_settings.ROOT_PATH.rstrip("/"), ) - container = make_ioc_container( + container = make_async_container( + *get_providers(), *di_providers, - app_settings=app_settings, - postgres_settings=postgres_settings, - sqla_settings=sqla_settings, - password_hasher_settings=password_hasher_settings, - jwt_settings=jwt_settings, - session_settings=session_settings, - cookie_settings=cookie_settings, + context={ + AppSettings: app_settings, + PostgresSettings: postgres_settings, + SqlaSettings: sqla_settings, + PasswordHasherSettings: password_hasher_settings, + JwtSettings: jwt_settings, + SessionSettings: session_settings, + CookieSettings: cookie_settings, + }, ) setup_dishka(container, app) setup_middlewares(app, cookie_settings) From 2b1de9a98de70d77e0bfc6f9a132102cad0b4850 Mon Sep 17 00:00:00 2001 From: ivan-borovets <130386813+ivan-borovets@users.noreply.github.com> Date: Mon, 23 Mar 2026 10:37:35 +0300 Subject: [PATCH 2/2] [fix-makefile] --- Makefile | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 20fffcc..6075118 100644 --- a/Makefile +++ b/Makefile @@ -7,9 +7,12 @@ MAKEFLAGS += --no-print-directory # ----------------------------- # User-configurable variables (edit this) +# INFRA_SERVICES: long-running infra (db, broker, cache, ...) +# INFRA_INIT_SERVICES: one-shot services that prepare INFRA_SERVICES # ----------------------------- PROJECT_NAME ?= $(notdir $(abspath .)) INFRA_SERVICES ?= db_pg +INFRA_INIT_SERVICES ?= # ----------------------------- # Internal vars / aliases @@ -117,10 +120,10 @@ up: docker-env $(DOCKER_COMPOSE) up --build --force-recreate upd-local: local-env - $(DOCKER_COMPOSE) up -d --build --force-recreate $(INFRA_SERVICES) + $(DOCKER_COMPOSE) up -d --build --force-recreate $(INFRA_SERVICES) $(INFRA_INIT_SERVICES) up-local: local-env - $(DOCKER_COMPOSE) up --build --force-recreate $(INFRA_SERVICES) + $(DOCKER_COMPOSE) up --build --force-recreate $(INFRA_SERVICES) $(INFRA_INIT_SERVICES) down: $(DOCKER_COMPOSE) down @@ -135,6 +138,9 @@ test-docker: docker-env $(DC_TEST_DOCKER) down -v --remove-orphans >/dev/null 2>&1 || true; \ if [ -n "$(strip $(INFRA_SERVICES))" ]; then \ $(DC_TEST_DOCKER) up -d --build --wait --wait-timeout 180 $(INFRA_SERVICES); \ + if [ -n "$(strip $(INFRA_INIT_SERVICES))" ]; then \ + $(DC_TEST_DOCKER) up --build $(INFRA_INIT_SERVICES) >/dev/null; \ + fi; \ else \ echo "INFRA_SERVICES is empty, skipping infra startup"; \ fi; \