Skip to content
Snippets Groups Projects
Verified Commit a4ed8e7f authored by David Beniamine's avatar David Beniamine
Browse files

WIP trying to setup dependency injection

parent b96e67e1
Branches test
No related tags found
No related merge requests found
......@@ -4,25 +4,34 @@ from flask_restful_swagger import swagger
from flask_apispec.extension import FlaskApiSpec
from Mirador_backend.routes import v1
from Mirador_backend.utils.config import ConfigFactory
from Mirador_backend.utils.containers import Container
from Mirador_backend.utils.database import db
from Mirador_backend.utils.app import setApp
from Mirador_backend.utils.config import Config
from dependency_injector import providers
from dependency_injector.wiring import Provide, inject
@inject
def shutdown_session(db: db = Provide[Container.db], exception=None):
db.close()
@inject
def do_create_app(config: Config = Provide[Container.config]) -> Flask:
app = Flask(__name__)
setApp(app)
app.container = Container()
app.config = config
app.teardown_appcontext(shutdown_session)
api = Api(app)
docs = FlaskApiSpec(app)
app.config.from_object(ConfigFactory())
app.db = db(app.config['DB'], app.config['DEBUG'])
v1.register_routes(api, docs)
return app
@app.teardown_appcontext
def shutdown_session(exception=None):
app.db.close()
# Just for flask resolver
def create_app():
return do_create_app()
if __name__ == '__main__':
app.run()
create_app().run()
......@@ -4,8 +4,10 @@ from sqlalchemy.orm import mapped_column
from sqlalchemy import Integer, JSON
from sqlalchemy import select
from sqlalchemy.exc import NoResultFound
from Mirador_backend.utils.containers import Container
from Mirador_backend.utils.database import db
from dependency_injector.wiring import Provide, inject
import json
from Mirador_backend.utils.app import getApp
class NotFound(NoResultFound):
......@@ -16,10 +18,10 @@ class BaseModel(DeclarativeBase):
"""A generic model class
"""
session = getApp().db.session
session = None
"""Access the db session"""
engine = getApp().db.engine
engine = None
"""Access the db session"""
fillable = ['id']
......@@ -33,13 +35,21 @@ class BaseModel(DeclarativeBase):
}
"""Actual data fields"""
def create_all():
@inject
def __init__(self, db: db = Provide[Container.db]):
super().__init__()
if db is None:
raise Exception('DB must be set')
self.session = db.session
self.engine = db.engine
def create_all(self):
"""Creates all tables for all models"""
BaseModel.metadata.create_all(getApp().db.engine)
BaseModel.metadata.create_all(self.engine)
def drop_all():
"""drop all tables for all models"""
BaseModel.metadata.drop_all(getApp().db.engine)
BaseModel.metadata.drop_all(self.engine)
@classmethod
def query(cls, stmt):
......
......@@ -10,9 +10,6 @@ from flask_apispec import doc
from flask_restful import marshal, fields
from Mirador_backend.models import BaseModel, NotFound
from Mirador_backend.utils.app import getApp
logger = getApp().logger
class ResourceGroup(MethodResource, Resource):
......
......@@ -3,14 +3,15 @@ import json
from os.path import dirname, abspath
from flask_fixtures import FixturesMixin
from Mirador_backend.app import app
from Mirador_backend.app import create_app
from Mirador_backend.models import BaseModel
class TestCase(unittest.TestCase, FixturesMixin):
fixtures = ['test.json']
app = app
db = BaseModel
app = create_app()
db = BaseModel()
def setUp(self):
self.base = 'v1/mirador_resource'
......
def getApp():
return getApp.app
getApp.app = None
def setApp(app):
getApp.app = app
......@@ -23,13 +23,9 @@ class Config(object):
'BASE': getenv('MYSQL_DATABASE', 'base'),
}
class TestingConfig(Config):
TESTING = True
DEBUG = True
DB = None
FIXTURES_DIRS = ['tests/fixtures']
def ConfigFactory():
return TestingConfig if getenv('ENV', 'dev') == 'test' else Config
def __init__():
if getenv('ENV', 'dev') == 'test':
self.TESTING = True
self.DEBUG = True
self.DB = None
self.FIXTURES_DIRS = ['tests/fixtures']
from dependency_injector import containers, providers
from Mirador_backend.utils.config import Config
from Mirador_backend.utils.database import db
class Container(containers.DeclarativeContainer):
wiring_config = containers.WiringConfiguration(modules=[
"Mirador_backend.app",
"Mirador_backend.models",
"Mirador_backend.resources.base",
"Mirador_backend.tests.tester"
])
config = providers.Factory(Config)
db = providers.Factory(db, config=config)
......@@ -9,9 +9,9 @@ class db():
return 'sqlite://'
return f'{params["TYPE"]}://{params["USER"]}:{params["PASSWORD"]}@{params["HOST"]}/{params["BASE"]}'
def __init__(self, config, debug):
self.config = config
self.engine = create_engine(self.__getDBUri(), echo=debug)
def __init__(self, config):
self.config = config['DB']
self.engine = create_engine(self.__getDBUri(), echo=config['DEBUG'])
self.session = scoped_session(sessionmaker(autocommit=False,
autoflush=False,
bind=self.engine))
......
......@@ -39,6 +39,7 @@ setup(
# 1.1.x is incompatible with mariadb connector already in python:3.10 docker image
"mariadb>=1.0.11,<1.1.0",
"python-dotenv",
"dependency-injector",
],
extras_require={
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment