Skip to content

Commit 20823a2

Browse files
committed
Group common initialisation logic, DI container and config in a python module
1 parent 266521f commit 20823a2

File tree

18 files changed

+66
-54
lines changed

18 files changed

+66
-54
lines changed

.coveragerc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[run]
22
branch = True
3-
source = http_app, grpc_app, domains, gateways, celery_worker
4-
omit = grpc_app/generated/*
3+
source = http_app, grpc_app, domains, gateways, celery_worker, common
4+
omit = grpc_app/generated/*, common/config.py
55
concurrency = multiprocessing
66
parallel = true
77

Dockerfile

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,7 @@ COPY --chown=nonroot:nonroot poetry.lock .
7070
COPY --chown=nonroot:nonroot alembic ./alembic
7171
COPY --chown=nonroot:nonroot domains ./domains
7272
COPY --chown=nonroot:nonroot gateways ./gateways
73-
COPY --chown=nonroot:nonroot config.py .
74-
COPY --chown=nonroot:nonroot di_container.py .
73+
COPY --chown=nonroot:nonroot common ./common
7574
COPY --chown=nonroot:nonroot alembic.ini .
7675
COPY --chown=nonroot:nonroot Makefile .
7776

alembic/env.py

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,12 @@
44
from sqlalchemy.ext.asyncio import AsyncEngine
55

66
from alembic import context
7-
from config import AppConfig, init_logger
8-
from gateways.storage.SQLAlchemy import init_tables
7+
from common.bootstrap import application_init
8+
from common.config import AppConfig
99

1010
USE_TWOPHASE = False
1111

1212

13-
def init_container(app_config: AppConfig):
14-
# Workaround to avoid circular import
15-
from di_container import Container
16-
17-
return Container(config=app_config)
18-
19-
2013
# this is the Alembic Config object, which provides
2114
# access to the values within the .ini file in use.
2215
config = context.config
@@ -31,13 +24,9 @@ def init_container(app_config: AppConfig):
3124
# in the sample .ini file.
3225
# db_names = config.get_main_option("databases")
3326

34-
# TODO: Something better organised than this
35-
app_config = AppConfig()
36-
init_logger(app_config)
27+
di_container = application_init(AppConfig()).di_container
3728
logger = logging.getLogger("alembic.env")
38-
di_container = init_container(app_config)
3929
sa_manager = di_container.SQLAlchemyBindManager()
40-
init_tables()
4130

4231
target_metadata = sa_manager.get_bind_mappers_metadata()
4332
db_names = target_metadata.keys()

architecture.puml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ package domains #DDDDDD {
1717

1818
package entities {
1919
class BookModel
20+
class BookEvent
21+
}
22+
23+
package tasks {
24+
class BookTask
2025
}
2126

2227
package data_access_interface {
@@ -41,6 +46,7 @@ servicers --> Book
4146
'links internal to books domain
4247
BookService -l-> Book
4348
BookService --> entities
49+
BookService --> tasks
4450
BookService -r-> data_access_interface
4551
data_access_interface --> entities
4652

celery_worker/__init__.py

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,7 @@
33
application layers (storage, logs) when running standalone workers
44
without having to initialise the HTTP framework (or other ones)
55
"""
6-
from config import AppConfig, init_logger
7-
from domains import init_celery, init_domains
8-
from gateways.storage import init_storage
6+
from common.bootstrap import application_init
7+
from common.config import AppConfig
98

10-
app_config = AppConfig()
11-
init_logger(app_config)
12-
init_domains(app_config)
13-
init_storage()
14-
app = init_celery(app_config)
9+
app = application_init(AppConfig()).celery_app

common/__init__.py

Whitespace-only changes.

common/bootstrap.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
from celery import Celery
2+
from dependency_injector.containers import DynamicContainer
3+
from dependency_injector.providers import Object
4+
from pydantic import BaseModel, ConfigDict
5+
6+
from domains import init_celery, init_domains
7+
from gateways.storage import init_storage
8+
9+
from .config import AppConfig, init_logger
10+
from .di_container import Container
11+
12+
13+
class InitReference(BaseModel):
14+
celery_app: Celery
15+
di_container: DynamicContainer
16+
17+
model_config = ConfigDict(arbitrary_types_allowed=True)
18+
19+
20+
def application_init(app_config: AppConfig) -> InitReference:
21+
container = Container(
22+
config=Object(app_config),
23+
)
24+
init_logger(app_config)
25+
init_domains(app_config)
26+
init_storage()
27+
celery = init_celery(app_config)
28+
29+
return InitReference(
30+
celery_app=celery,
31+
di_container=container,
32+
)
File renamed without changes.

di_container.py renamed to common/di_container.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from sqlalchemy_bind_manager import SQLAlchemyBindManager
44
from sqlalchemy_bind_manager._repository import SQLAlchemyAsyncRepository
55

6-
from config import AppConfig
6+
from common.config import AppConfig
77
from domains.books._data_access_interfaces import (
88
BookEventGatewayInterface,
99
BookRepositoryInterface,

domains/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
from celery import Celery
22
from dependency_injector.providers import Object
33

4-
from config import AppConfig
5-
from di_container import Container
4+
from common.config import AppConfig
5+
from common.di_container import Container
66

77

88
def init_domains(config: AppConfig):

0 commit comments

Comments
 (0)