Source code for buildingmotif.api.app

import os
from typing import Optional

from flask import Flask, current_app
from flask_api import status
from sqlalchemy.exc import SQLAlchemyError

from buildingmotif.api.views.library import blueprint as library_blueprint
from buildingmotif.api.views.model import blueprint as model_blueprint
from buildingmotif.api.views.parser import blueprint as parsers_blueprint
from buildingmotif.api.views.template import blueprint as template_blueprint
from buildingmotif.building_motif.building_motif import BuildingMOTIF


def _after_request(response):
    """Commit or rollback the session.

    :param response: response
    :type response: Flask.response
    :return: response
    :rtype: Flask.response
    """
    try:
        current_app.building_motif.session.commit()
    except SQLAlchemyError:
        current_app.building_motif.session.rollback()

    current_app.building_motif.Session.remove()
    response.headers["Access-Control-Allow-Origin"] = "*"
    response.headers["Access-Control-Allow-Methods"] = "*"
    response.headers["Access-Control-Allow-Headers"] = "*"

    return response


def _after_error(error):
    """Returns request with a 500 and the error message.

    :param error: python error
    :type error: Error
    :return: flask error response
    :rtype: Flask.response
    """
    return str(error), status.HTTP_500_INTERNAL_SERVER_ERROR


[docs]def create_app(DB_URI, shacl_engine: Optional[str] = "pyshacl"): """Creates a Flask API. :param db_uri: database URI :type db_uri: str :param shacl_engine: the name of the engine to use for validation: "pyshacl" or "topquadrant". Using topquadrant requires Java to be installed on this machine, and the "topquadrant" feature on BuildingMOTIF, defaults to "pyshacl" :type shacl_engine: str, optional :return: flask app :rtype: Flask.app """ app = Flask(__name__, instance_relative_config=True) app.config.from_mapping( DB_URI=DB_URI, ) app.building_motif = BuildingMOTIF(app.config["DB_URI"], shacl_engine=shacl_engine) app.after_request(_after_request) app.register_error_handler(Exception, _after_error) app.register_blueprint(library_blueprint, url_prefix="/libraries") app.register_blueprint(template_blueprint, url_prefix="/templates") app.register_blueprint(model_blueprint, url_prefix="/models") app.register_blueprint(parsers_blueprint, url_prefix="/parsers") return app
if __name__ == "__main__": """Run API.""" db_uri = os.getenv("DB_URI") if db_uri is None: raise ValueError("Environment variable DB_URI not set.") app = create_app(db_uri) app.run(debug=True, host="0.0.0.0", threaded=False)