"""The Quality-Control Web Application entry point""" import os import sys import logging from pathlib import Path from logging import StreamHandler from flask import Flask from .entry import entrybp from .upload import upload from .parse import parsebp from .samples import samples from .dbinsert import dbinsertbp from .errors import register_error_handlers def override_settings_with_envvars( app: Flask, ignore: tuple[str, ...]=tuple()) -> None: """Override settings in `app` with those in ENVVARS""" for setting in (key for key in app.config if key not in ignore): app.config[setting] = os.environ.get(setting) or app.config[setting] def setup_logging(app: Flask): """Setup application logging""" handler_stderr = StreamHandler(stream=sys.stderr) app.logger.addHandler(handler_stderr) rootlogger = logging.getLogger() rootlogger.addHandler(handler_stderr) rootlogger.setLevel(app.config["LOG_LEVEL"]) def create_app(): """The application factory""" app = Flask(__name__) app.config.from_pyfile( Path(__file__).parent.joinpath("default_settings.py")) if "QCAPP_CONF" in os.environ: app.config.from_envvar("QCAPP_CONF") # Override defaults with instance path override_settings_with_envvars(app, ignore=tuple()) setup_logging(app) if "QCAPP_SECRETS" in os.environ: app.config.from_envvar("QCAPP_SECRETS") # setup blueprints app.register_blueprint(entrybp, url_prefix="/") app.register_blueprint(parsebp, url_prefix="/parse") app.register_blueprint(upload, url_prefix="/upload") app.register_blueprint(dbinsertbp, url_prefix="/dbinsert") app.register_blueprint(samples, url_prefix="/samples") register_error_handlers(app) return app