feat: updated to newest flask-imp code.
This commit is contained in:
9
src/quart_imp/config/__init__.py
Normal file
9
src/quart_imp/config/__init__.py
Normal 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",
|
||||
]
|
||||
55
src/quart_imp/config/imp_blueprint_config.py
Normal file
55
src/quart_imp/config/imp_blueprint_config.py
Normal 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)}
|
||||
14
src/quart_imp/config/imp_config.py
Normal file
14
src/quart_imp/config/imp_config.py
Normal 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
|
||||
162
src/quart_imp/config/quart_config.py
Normal file
162
src/quart_imp/config/quart_config.py
Normal 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,
|
||||
}
|
||||
Reference in New Issue
Block a user