Source code for ewoksserver.app.config
import os
import sys
import importlib.util
from pathlib import Path
from typing import Optional, Dict
from typing_extensions import Annotated
from pydantic import Field
from pydantic import BaseModel
from fastapi import Depends
try:
from ewoksweb.serverutils import get_test_config
except ImportError:
get_test_config = None
[docs]class EwoksSettings(BaseModel):
configured: bool = Field(
default=False, title="Config or resource directory have been defined"
)
resource_directory: Path = Field(
default=Path("."), title="Backend file resource directory"
)
ewoks: Optional[Dict] = Field(default=None, title="Ewoks configuration")
celery: Optional[Dict] = Field(default=None, title="Celery configuration")
without_events: bool = Field(default=False, title="Enable ewoks events")
discover_tasks: bool = Field(default=False, title="Discover ewoks tasks on startup")
[docs]class AppSettings(BaseModel):
no_older_versions: bool = (
Field(default=False, title="Do not create end points for older API versions"),
)
_APP_SETTINGS = None
_EWOKS_SETTINGS = None
[docs]def create_ewoks_settings(
config: Optional[str] = None,
directory: Optional[str] = None,
without_events: bool = False,
frontend_tests: bool = False,
rediscover_tasks: bool = False,
) -> EwoksSettings:
global _EWOKS_SETTINGS
# Get configuration file
filename = os.environ.get("EWOKSSERVER_SETTINGS")
if config:
filename = config
if frontend_tests:
if get_test_config is None:
raise RuntimeError("ewoksweb is not installed")
filename = get_test_config()
# Extract settings from configuration file
resource_directory = None
ewoks = None
celery = None
if filename:
spec = importlib.util.spec_from_file_location("ewoksserverconfig", filename)
mod = importlib.util.module_from_spec(spec)
sys.modules["ewoksserverconfig"] = mod
spec.loader.exec_module(mod)
resource_directory = getattr(mod, "RESOURCE_DIRECTORY", resource_directory)
ewoks = getattr(mod, "EWOKS", ewoks)
celery = getattr(mod, "CELERY", celery)
# Overwrite resource directory
if directory:
resource_directory = directory
if not resource_directory:
resource_directory = "."
configured = bool(filename) or bool(directory)
_EWOKS_SETTINGS = EwoksSettings(
configured=configured,
resource_directory=resource_directory,
ewoks=ewoks,
celery=celery,
without_events=without_events,
discover_tasks=rediscover_tasks,
)
return _EWOKS_SETTINGS
[docs]def create_app_settings(no_older_versions: bool = False) -> None:
global _APP_SETTINGS
_APP_SETTINGS = AppSettings(no_older_versions=no_older_versions)
return _APP_SETTINGS
[docs]def get_ewoks_settings():
global _EWOKS_SETTINGS
if _EWOKS_SETTINGS is not None:
return _EWOKS_SETTINGS
return create_ewoks_settings()
[docs]def get_app_settings():
global _APP_SETTINGS
if _APP_SETTINGS is not None:
return _APP_SETTINGS
return create_app_settings()
EwoksSettingsType = Annotated[EwoksSettings, Depends(get_ewoks_settings)]