Skip to content
Snippets Groups Projects
__init__.py 1.32 KiB
"""
automatically invoked app factory
"""
import logging
import os

from flask import Flask
from flask_cors import CORS  # for debugging

from compendium_v2 import config, environment

from compendium_v2.migrations import migration_utils


def migrate_database(config: dict) -> None:
    dsn = config['SQLALCHEMY_DATABASE_URI']
    migration_utils.upgrade(dsn)


def _create_app(app_config) -> Flask:
    # used by sphinx to create documentation without config and db migrations
    app = Flask(__name__)
    CORS(app)

    app.config['CONFIG_PARAMS'] = app_config

    from compendium_v2.routes import default
    app.register_blueprint(default.routes, url_prefix='/')

    from compendium_v2.routes import api
    app.register_blueprint(api.routes, url_prefix='/api')

    return app


def create_app() -> Flask:
    """
    overrides default settings with those found
    in the file read from env var SETTINGS_FILENAME

    :return: a new flask app instance
    """

    assert 'SETTINGS_FILENAME' in os.environ, "environment variable 'SETTINGS_FILENAME' is required"

    with open(os.environ['SETTINGS_FILENAME']) as f:
        app_config = config.load(f)

    app = _create_app(app_config)

    logging.info('Flask app initialized')

    environment.setup_logging()

    # run migrations on startup
    migrate_database(app_config)

    return app