Source code for pyobs.interfaces.IStructuredConfig

from __future__ import annotations

from abc import ABCMeta, abstractmethod
from dataclasses import dataclass, field
from typing import Any

from ..utils.config_schema import ConfigFieldSchema, ConfigSchema  # re-export
from ..utils.time import Time
from .IConfig import ConfigScalar
from .interface import Interface

ConfigValue = ConfigScalar | list["ConfigValue"] | dict[str, "ConfigValue"]


@dataclass
class ConfigAppliedState:
    config: dict[str, ConfigValue]
    time: Time = field(default_factory=Time.now)


class IStructuredConfig(Interface, metaclass=ABCMeta):
    """The module accepts a whole structured (possibly nested) config
    object in one call, rather than per-field get/set (see IConfig for
    the per-field variant)."""

    __module__ = "pyobs.interfaces"

    capabilities = ConfigSchema
    state = ConfigAppliedState

[docs] @abstractmethod async def set_config(self, config: dict[str, ConfigValue], **kwargs: Any) -> None: """Apply a full structured config to this module. Args: config: Nested dict matching this module's ConfigSchema (fetch via get_capabilities). Values are validated and deserialized into the module's internal config dataclass. Raises: ValueError: If config doesn't match the module's schema, or values fail validation. """ ...
__all__ = ["IStructuredConfig", "ConfigAppliedState", "ConfigSchema", "ConfigFieldSchema"]