Skip to content

Commit dd13a4e

Browse files
Merge pull request #95 from ivan-borovets/f/ref-simplify-app-factory
Simplify app factory
2 parents c522004 + 2b1de9a commit dd13a4e

3 files changed

Lines changed: 30 additions & 60 deletions

File tree

Makefile

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,12 @@ MAKEFLAGS += --no-print-directory
77

88
# -----------------------------
99
# User-configurable variables (edit this)
10+
# INFRA_SERVICES: long-running infra (db, broker, cache, ...)
11+
# INFRA_INIT_SERVICES: one-shot services that prepare INFRA_SERVICES
1012
# -----------------------------
1113
PROJECT_NAME ?= $(notdir $(abspath .))
1214
INFRA_SERVICES ?= db_pg
15+
INFRA_INIT_SERVICES ?=
1316

1417
# -----------------------------
1518
# Internal vars / aliases
@@ -117,10 +120,10 @@ up: docker-env
117120
$(DOCKER_COMPOSE) up --build --force-recreate
118121

119122
upd-local: local-env
120-
$(DOCKER_COMPOSE) up -d --build --force-recreate $(INFRA_SERVICES)
123+
$(DOCKER_COMPOSE) up -d --build --force-recreate $(INFRA_SERVICES) $(INFRA_INIT_SERVICES)
121124

122125
up-local: local-env
123-
$(DOCKER_COMPOSE) up --build --force-recreate $(INFRA_SERVICES)
126+
$(DOCKER_COMPOSE) up --build --force-recreate $(INFRA_SERVICES) $(INFRA_INIT_SERVICES)
124127

125128
down:
126129
$(DOCKER_COMPOSE) down
@@ -135,6 +138,9 @@ test-docker: docker-env
135138
$(DC_TEST_DOCKER) down -v --remove-orphans >/dev/null 2>&1 || true; \
136139
if [ -n "$(strip $(INFRA_SERVICES))" ]; then \
137140
$(DC_TEST_DOCKER) up -d --build --wait --wait-timeout 180 $(INFRA_SERVICES); \
141+
if [ -n "$(strip $(INFRA_INIT_SERVICES))" ]; then \
142+
$(DC_TEST_DOCKER) up --build $(INFRA_INIT_SERVICES) >/dev/null; \
143+
fi; \
138144
else \
139145
echo "INFRA_SERVICES is empty, skipping infra startup"; \
140146
fi; \

scripts/dishka/plot_dependencies_data.py

Lines changed: 10 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,37 +3,23 @@
33
import dishka.plotter
44
from dishka import AsyncContainer
55

6-
from app.config.loader import (
7-
load_app_settings,
8-
load_cookie_settings,
9-
load_jwt_settings,
10-
load_password_hasher_settings,
11-
load_postgres_settings,
12-
load_session_settings,
13-
load_sqla_settings,
14-
)
15-
from app.main.run import make_ioc_container
16-
17-
18-
def generate_dependency_graph_d2(container: AsyncContainer) -> str:
6+
from app.main.run import make_app
7+
8+
9+
def generate_d2_dependency_graph(container: AsyncContainer) -> str:
1910
"""
20-
Generates a dependency graph for the container in `d2` format.
11+
Generates dependency graph for container in `d2` format.
2112
See https://d2lang.com for rendering instructions.
2213
"""
2314
return dishka.plotter.render_d2(container)
2415

2516

2617
async def main() -> None:
27-
async with make_ioc_container(
28-
app_settings=load_app_settings(),
29-
postgres_settings=load_postgres_settings(),
30-
sqla_settings=load_sqla_settings(),
31-
password_hasher_settings=load_password_hasher_settings(),
32-
jwt_settings=load_jwt_settings(),
33-
session_settings=load_session_settings(),
34-
cookie_settings=load_cookie_settings(),
35-
)() as container:
36-
print(generate_dependency_graph_d2(container))
18+
app = make_app()
19+
container = app.state.dishka_container
20+
try:
21+
print(generate_d2_dependency_graph(container))
22+
finally:
3723
await container.close()
3824

3925

src/app/main/run.py

Lines changed: 12 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from collections.abc import AsyncIterator, Callable
22
from contextlib import AbstractAsyncContextManager, asynccontextmanager
33

4-
from dishka import AsyncContainer, Provider, make_async_container
4+
from dishka import Provider, make_async_container
55
from dishka.integrations.fastapi import setup_dishka
66
from fastapi import FastAPI
77

@@ -44,31 +44,6 @@ async def lifespan(app: FastAPI) -> AsyncIterator[None]:
4444
return lifespan
4545

4646

47-
def make_ioc_container(
48-
*di_providers: Provider,
49-
app_settings: AppSettings,
50-
postgres_settings: PostgresSettings,
51-
sqla_settings: SqlaSettings,
52-
password_hasher_settings: PasswordHasherSettings,
53-
jwt_settings: JwtSettings,
54-
session_settings: SessionSettings,
55-
cookie_settings: CookieSettings,
56-
) -> AsyncContainer:
57-
return make_async_container(
58-
*get_providers(),
59-
*di_providers,
60-
context={
61-
AppSettings: app_settings,
62-
PostgresSettings: postgres_settings,
63-
SqlaSettings: sqla_settings,
64-
PasswordHasherSettings: password_hasher_settings,
65-
JwtSettings: jwt_settings,
66-
SessionSettings: session_settings,
67-
CookieSettings: cookie_settings,
68-
},
69-
)
70-
71-
7247
def make_app(
7348
*di_providers: Provider,
7449
app_settings: AppSettings | None = None,
@@ -106,15 +81,18 @@ def make_app(
10681
lifespan=make_lifespan(),
10782
root_path=app_settings.ROOT_PATH.rstrip("/"),
10883
)
109-
container = make_ioc_container(
84+
container = make_async_container(
85+
*get_providers(),
11086
*di_providers,
111-
app_settings=app_settings,
112-
postgres_settings=postgres_settings,
113-
sqla_settings=sqla_settings,
114-
password_hasher_settings=password_hasher_settings,
115-
jwt_settings=jwt_settings,
116-
session_settings=session_settings,
117-
cookie_settings=cookie_settings,
87+
context={
88+
AppSettings: app_settings,
89+
PostgresSettings: postgres_settings,
90+
SqlaSettings: sqla_settings,
91+
PasswordHasherSettings: password_hasher_settings,
92+
JwtSettings: jwt_settings,
93+
SessionSettings: session_settings,
94+
CookieSettings: cookie_settings,
95+
},
11896
)
11997
setup_dishka(container, app)
12098
setup_middlewares(app, cookie_settings)

0 commit comments

Comments
 (0)