Skip to content

Commit d3ea2fa

Browse files
Merge pull request #75 from ivan-borovets/refactoring
2 parents 21eb1e1 + 0696241 commit d3ea2fa

2 files changed

Lines changed: 28 additions & 37 deletions

File tree

src/app/run.py

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,31 +2,25 @@
22
from dishka.integrations.fastapi import setup_dishka
33
from fastapi import FastAPI
44

5-
from app.presentation.http.controllers.root_router import create_root_router
6-
from app.setup.app_factory import configure_app, create_app, create_async_ioc_container
5+
from app.setup.app_factory import create_ioc_container, create_web_app
76
from app.setup.config.logs import configure_logging
87
from app.setup.config.settings import AppSettings, load_settings
9-
from app.setup.ioc.provider_registry import get_providers
108

119

1210
def make_app(
1311
*di_providers: Provider,
1412
settings: AppSettings | None = None,
1513
) -> FastAPI:
14+
"""Pass providers to override existing ones for testing."""
1615
if settings is None:
1716
configure_logging()
1817
settings = load_settings()
1918

2019
configure_logging(level=settings.logs.level)
2120

22-
app: FastAPI = create_app()
23-
configure_app(app=app, root_router=create_root_router())
24-
25-
async_ioc_container = create_async_ioc_container(
26-
providers=(*get_providers(), *di_providers),
27-
settings=settings,
28-
)
29-
setup_dishka(container=async_ioc_container, app=app)
21+
app: FastAPI = create_web_app()
22+
container = create_ioc_container(settings, *di_providers)
23+
setup_dishka(container, app)
3024

3125
return app
3226

src/app/setup/app_factory.py

Lines changed: 23 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,45 @@
1-
from collections.abc import AsyncIterator, Iterable
1+
from collections.abc import AsyncIterator
22
from contextlib import asynccontextmanager
33

44
from dishka import AsyncContainer, Provider, make_async_container
5-
from fastapi import APIRouter, FastAPI
5+
from fastapi import FastAPI
66
from fastapi.responses import ORJSONResponse
77

88
from app.infrastructure.persistence_sqla.mappings.all import map_tables
99
from app.presentation.http.auth.asgi_middleware import (
1010
ASGIAuthMiddleware,
1111
)
12+
from app.presentation.http.controllers.root_router import create_root_router
1213
from app.setup.config.settings import AppSettings
14+
from app.setup.ioc.provider_registry import get_providers
1315

1416

15-
def create_app() -> FastAPI:
16-
return FastAPI(
17+
def create_ioc_container(
18+
settings: AppSettings,
19+
*di_providers: Provider,
20+
) -> AsyncContainer:
21+
return make_async_container(
22+
*get_providers(),
23+
*di_providers,
24+
context={AppSettings: settings},
25+
)
26+
27+
28+
def create_web_app() -> FastAPI:
29+
app = FastAPI(
1730
lifespan=lifespan,
1831
default_response_class=ORJSONResponse,
1932
)
33+
# https://github.com/encode/starlette/discussions/2451
34+
app.add_middleware(ASGIAuthMiddleware)
35+
# Good place to register global exception handlers
36+
app.include_router(create_root_router())
37+
return app
2038

2139

2240
@asynccontextmanager
2341
async def lifespan(app: FastAPI) -> AsyncIterator[None]:
2442
map_tables()
2543
yield None
26-
await app.state.dishka_container.close()
2744
# https://dishka.readthedocs.io/en/stable/integrations/fastapi.html
28-
29-
30-
def configure_app(
31-
app: FastAPI,
32-
root_router: APIRouter,
33-
) -> None:
34-
app.include_router(root_router)
35-
app.add_middleware(ASGIAuthMiddleware)
36-
# https://github.com/encode/starlette/discussions/2451
37-
38-
# Good place to register global exception handlers
39-
40-
41-
def create_async_ioc_container(
42-
providers: Iterable[Provider],
43-
settings: AppSettings,
44-
) -> AsyncContainer:
45-
return make_async_container(
46-
*providers,
47-
context={AppSettings: settings},
48-
)
45+
await app.state.dishka_container.close()

0 commit comments

Comments
 (0)