53 lines
1.3 KiB
Python
53 lines
1.3 KiB
Python
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))
|