feat: updated to newest flask-imp code.

This commit is contained in:
David Carmichael
2024-08-16 15:08:51 +01:00
parent 8258bc1cbd
commit caaf17af12
106 changed files with 2265 additions and 5066 deletions

View File

@@ -0,0 +1,9 @@
from .imp_blueprint_config import ImpBlueprintConfig
from .imp_config import ImpConfig
from .quart_config import QuartConfig
__all__ = [
"ImpConfig",
"ImpBlueprintConfig",
"QuartConfig",
]

View File

@@ -0,0 +1,55 @@
import typing as t
from dataclasses import dataclass
@dataclass
class ImpBlueprintConfig:
enabled: t.Optional[bool] = None
url_prefix: t.Optional[str] = None
subdomain: t.Optional[str] = None
url_default: t.Optional[t.Dict[str, t.Any]] = None
static_folder: t.Optional[str] = None
template_folder: t.Optional[str] = None
static_url_path: t.Optional[str] = None
root_path: t.Optional[str] = None
cli_group: t.Optional[str] = None
init_session: t.Optional[t.Dict[str, t.Any]] = None
_blueprint_attrs = {
"url_prefix",
"subdomain",
"url_defaults",
"static_folder",
"template_folder",
"static_url_path",
"root_path",
"cli_group",
}
def __init__(
self,
enabled: bool = False,
url_prefix: t.Optional[str] = None,
subdomain: t.Optional[str] = None,
url_defaults: t.Optional[t.Dict[str, t.Any]] = None,
static_folder: t.Optional[str] = None,
template_folder: t.Optional[str] = None,
static_url_path: t.Optional[str] = None,
root_path: t.Optional[str] = None,
cli_group: t.Optional[str] = None,
init_session: t.Optional[t.Dict[str, t.Any]] = None,
):
self.enabled = enabled
self.url_prefix = url_prefix
self.subdomain = subdomain
self.url_defaults = url_defaults
self.static_folder = static_folder
self.template_folder = template_folder
self.static_url_path = static_url_path
self.root_path = root_path
self.cli_group = cli_group
self.init_session = init_session
def quart_blueprint_args(self) -> t.Dict[str, t.Any]:
return {k: getattr(self, k) for k in self._blueprint_attrs if getattr(self, k)}

View File

@@ -0,0 +1,14 @@
import typing as t
class ImpConfig:
IMP_INIT_SESSION: t.Optional[t.Dict[str, t.Any]]
def __init__(
self,
init_session: t.Optional[t.Dict[str, t.Any]] = None,
):
if not init_session:
self.IMP_INIT_SESSION = {}
else:
self.IMP_INIT_SESSION = init_session

View File

@@ -0,0 +1,162 @@
import typing as t
from quart import Quart
class QuartConfig:
DEBUG: t.Optional[bool]
PROPAGATE_EXCEPTIONS: t.Optional[bool]
TRAP_HTTP_EXCEPTIONS: t.Optional[bool]
TRAP_BAD_REQUEST_ERRORS: t.Optional[bool]
SECRET_KEY: t.Optional[str]
SESSION_COOKIE_NAME: t.Optional[str]
SESSION_COOKIE_DOMAIN: t.Optional[str]
SESSION_COOKIE_PATH: t.Optional[str]
SESSION_COOKIE_HTTPONLY: t.Optional[bool]
SESSION_COOKIE_SECURE: t.Optional[bool]
SESSION_COOKIE_SAMESITE: t.Optional[t.Literal["Lax", "Strict"]]
PERMANENT_SESSION_LIFETIME: t.Optional[int]
SESSION_REFRESH_EACH_REQUEST: t.Optional[bool]
USE_X_SENDFILE: t.Optional[bool]
SEND_FILE_MAX_AGE_DEFAULT: t.Optional[int]
ERROR_404_HELP: t.Optional[bool]
SERVER_NAME: t.Optional[str]
APPLICATION_ROOT: t.Optional[str]
PREFERRED_URL_SCHEME: t.Optional[str]
MAX_CONTENT_LENGTH: t.Optional[int]
TEMPLATES_AUTO_RELOAD: t.Optional[bool]
EXPLAIN_TEMPLATE_LOADING: t.Optional[bool]
MAX_COOKIE_SIZE: t.Optional[int]
_additional: t.Dict[str, t.Any]
_quart_config_keys = {
"DEBUG",
"PROPAGATE_EXCEPTIONS",
"TRAP_HTTP_EXCEPTIONS",
"TRAP_BAD_REQUEST_ERRORS",
"SECRET_KEY",
"SESSION_COOKIE_NAME",
"SESSION_COOKIE_DOMAIN",
"SESSION_COOKIE_PATH",
"SESSION_COOKIE_HTTPONLY",
"SESSION_COOKIE_SECURE",
"SESSION_COOKIE_SAMESITE",
"PERMANENT_SESSION_LIFETIME",
"SESSION_REFRESH_EACH_REQUEST",
"USE_X_SENDFILE",
"SEND_FILE_MAX_AGE_DEFAULT",
"ERROR_404_HELP",
"SERVER_NAME",
"APPLICATION_ROOT",
"PREFERRED_URL_SCHEME",
"MAX_CONTENT_LENGTH",
"TEMPLATES_AUTO_RELOAD",
"EXPLAIN_TEMPLATE_LOADING",
"MAX_COOKIE_SIZE",
}
def __init__(
self,
debug: t.Optional[bool] = None,
propagate_exceptions: t.Optional[bool] = None,
trap_http_exceptions: t.Optional[bool] = None,
trap_bad_request_errors: t.Optional[bool] = None,
secret_key: t.Optional[str] = None,
session_cookie_name: t.Optional[str] = None,
session_cookie_domain: t.Optional[str] = None,
session_cookie_path: t.Optional[str] = None,
session_cookie_httponly: t.Optional[bool] = None,
session_cookie_secure: t.Optional[bool] = None,
session_cookie_samesite: t.Optional[t.Literal["Lax", "Strict"]] = None,
permanent_session_lifetime: t.Optional[int] = None,
session_refresh_each_request: t.Optional[bool] = None,
use_x_sendfile: t.Optional[bool] = None,
send_file_max_age_default: t.Optional[int] = None,
error_404_help: t.Optional[bool] = None,
server_name: t.Optional[str] = None,
application_root: t.Optional[str] = None,
preferred_url_scheme: t.Optional[str] = None,
max_content_length: t.Optional[int] = None,
templates_auto_reload: t.Optional[bool] = None,
explain_template_loading: t.Optional[bool] = None,
max_cookie_size: t.Optional[int] = None,
app_instance: t.Optional["Quart"] = None,
additional: t.Optional[t.Dict[str, t.Any]] = None,
) -> None:
"""
Quart configuration class modeled after the Quart documentation.
Additional config values can be set by passing them as a dict or using the set_additional method.
All key arguments are converted to uppercase and added to the Quart app.config dictionary.
e.g. session_cookie_name -> app.config["SESSION_COOKIE_NAME"]
"""
self.DEBUG = debug
self.PROPAGATE_EXCEPTIONS = propagate_exceptions
self.TRAP_HTTP_EXCEPTIONS = trap_http_exceptions
self.TRAP_BAD_REQUEST_ERRORS = trap_bad_request_errors
self.SECRET_KEY = secret_key
self.SESSION_COOKIE_NAME = session_cookie_name
self.SESSION_COOKIE_DOMAIN = session_cookie_domain
self.SESSION_COOKIE_PATH = session_cookie_path
self.SESSION_COOKIE_HTTPONLY = session_cookie_httponly
self.SESSION_COOKIE_SECURE = session_cookie_secure
self.SESSION_COOKIE_SAMESITE = session_cookie_samesite
self.PERMANENT_SESSION_LIFETIME = permanent_session_lifetime
self.SESSION_REFRESH_EACH_REQUEST = session_refresh_each_request
self.USE_X_SENDFILE = use_x_sendfile
self.SEND_FILE_MAX_AGE_DEFAULT = send_file_max_age_default
self.ERROR_404_HELP = error_404_help
self.SERVER_NAME = server_name
self.APPLICATION_ROOT = application_root
self.PREFERRED_URL_SCHEME = preferred_url_scheme
self.MAX_CONTENT_LENGTH = max_content_length
self.TEMPLATES_AUTO_RELOAD = templates_auto_reload
self.EXPLAIN_TEMPLATE_LOADING = explain_template_loading
self.MAX_COOKIE_SIZE = max_cookie_size
self._additional = additional or {}
if app_instance is not None:
self.init_app(app_instance)
def set_additional(self, _auto_uppercase: bool = True, **kwargs: t.Any) -> None:
"""
Set additional config values that are not part of the QuartConfig class.
Keys are converted to uppercase.
"""
if kwargs:
self._additional.update(
{
k.upper()
if isinstance(k, str)
else k
if _auto_uppercase
else k and k.upper() not in self._quart_config_keys: v
for k, v in kwargs.items()
}
)
def init_app(self, app: Quart) -> None:
if not isinstance(app, Quart):
raise TypeError("The app that was passed in is not an instance of Quart")
self.apply_config(app)
def apply_config(self, app: Quart) -> None:
if not isinstance(app, Quart):
raise TypeError("The app that was passed in is not an instance of Quart")
app.config.update(
{
**{k: v for k, v in self.as_dict().items() if v is not None},
**{k.upper(): v for k, v in self._additional.items()},
}
)
def as_dict(self) -> t.Dict[str, t.Any]:
return {
**{
k: getattr(self, k) for k in self._quart_config_keys if getattr(self, k)
},
**self._additional,
}