Source code for openoptics.dashboard.config
# Copyright (c) Max-Planck-Gesellschaft zur Förderung der Wissenschaften e.V.
# Developed at the Max Planck Institute for Informatics, Network and Cloud Systems Group
#
# Author: Yiming Lei (ylei@mpi-inf.mpg.de)
#
# License: Creative Commons NC BY SA 4.0
# https://creativecommons.org/licenses/by-nc-sa/4.0/deed.en
"""Single source of truth for dashboard configuration."""
from __future__ import annotations
import os
from dataclasses import dataclass, field
from pathlib import Path
def _default_state_dir() -> Path:
return Path(os.environ.get("OPENOPTICS_STATE_DIR") or Path.home() / ".openoptics")
[docs]
@dataclass
class DashboardConfig:
enabled: bool = True
host: str = "localhost"
port: int = 8001
poll_interval_s: float = 1.0
state_dir: Path = field(default_factory=_default_state_dir)
# Live-feed queue size per WebSocket subscriber. When full, oldest is dropped
# (live view is not lossless by design; full history is always in the DB).
live_queue_size: int = 256
@property
def db_path(self) -> Path:
return self.state_dir / "dashboard.sqlite3"
@property
def media_dir(self) -> Path:
return self.state_dir / "media"
@property
def topos_dir(self) -> Path:
return self.media_dir / "topos"
[docs]
def ensure_dirs(self) -> None:
self.state_dir.mkdir(parents=True, exist_ok=True)
self.topos_dir.mkdir(parents=True, exist_ok=True)
[docs]
@classmethod
def from_env(cls) -> "DashboardConfig":
cfg = cls()
if v := os.environ.get("OPENOPTICS_DASHBOARD_HOST"):
cfg.host = v
if v := os.environ.get("OPENOPTICS_DASHBOARD_PORT"):
cfg.port = int(v)
if v := os.environ.get("OPENOPTICS_DASHBOARD_POLL_INTERVAL"):
cfg.poll_interval_s = float(v)
return cfg