from dataclasses import asdict, dataclass from typing import Literal, NotRequired, Self, TypedDict, final from cfg.entity import CfgData from net.entities import Net, NetTraefik, NetYaml from service.entity import Service, ServiceYaml, TraefikService from service.get import services_get_networks from util import to_yaml class ComposeYaml(TypedDict): name: str networks: NotRequired[NetYaml] services: dict[str, ServiceYaml] @final @dataclass(frozen=True, slots=True) class Compose: cfg: CfgData networks: Net | None services: dict[str, Service] @classmethod def from_dict(cls, cfg: CfgData, data: ComposeYaml) -> Self: # services = dict[str, ComposeService]() services = dict(get_services_dict(data)) return cls( cfg, services_get_networks(services.values()), services, ) def as_yaml(self) -> str: return to_yaml(asdict(self)) def get_services_dict(data: ComposeYaml): for k, v in data["services"].items(): yield k, Service.from_dict(v) @final @dataclass(frozen=True, slots=True) class TraefikCompose: cfg: CfgData networks: NetTraefik services: dict[Literal["traefik"], TraefikService] def as_yaml(self) -> str: return to_yaml(asdict(self))