Source code for flask_ligand

"""flask-ligand microservice library package."""

# ======================================================================================================================
# Imports
# ======================================================================================================================
from __future__ import annotations
from flask import Flask
from flask_cors import CORS
from typing import TYPE_CHECKING
from flask_ligand.cli import genclient
from flask_ligand import extensions, views
from flask_ligand.default_settings import flask_environment_configurator


# ======================================================================================================================
# Type Checking
# ======================================================================================================================
if TYPE_CHECKING:  # pragma: no cover
    from typing import Any, Tuple
    from flask_ligand.extensions.api import Api


# ======================================================================================================================
# Globals
# ======================================================================================================================
__version__ = "0.8.1"


# ======================================================================================================================
# Functions: Public
# ======================================================================================================================
[docs]def create_app( flask_app_name: str, flask_env: str, api_title: str, api_version: str, openapi_client_name: str, **kwargs: Any, ) -> Tuple[Flask, Api]: """ Create Flask application. Args: flask_app_name: This name is used to find resources on the filesystem, can be used by extensions to improve debugging information and a lot more. So it's important what you provide one. If you are using a single module, ``__name__`` is always the correct value. If you however are using a package, it's usually recommended to hardcode the name of your package. flask_env: Specify the environment to use when launching the flask app. Available environments: ``prod``: Configured for use in a production environment. ``stage``: Configured for use in a development/staging environment. ``local``: Configured for use with a local Flask server. ``testing``: Configured for use in unit testing. ``cli``: Configured for use in a production environment without initializing extensions. (Use for CI/CD) api_title: The title (name) of the API to display in the OpenAPI documentation. api_version: The semantic version for the OpenAPI client. openapi_client_name: The package name to use for generated OpenAPI clients. kwargs: Additional settings to add to the configuration object or overrides for unprotected settings. Returns: A tuple with a fully configured Flask application and an Api ready to register additional Blueprints. Raises: RuntimeError: Attempted to override a protected setting, specified an additional setting that was not all uppercase or the specified environment is invalid. """ app = Flask(flask_app_name) CORS(app, expose_headers=["x-pagination", "etag"]) # TODO: this needs to be configurable! [271] flask_environment_configurator(app, flask_env, api_title, api_version, openapi_client_name, **kwargs) api = extensions.create_api(app, True if flask_env == "cli" else False) views.register_blueprints(api) app.cli.add_command(genclient) return app, api