Files
compose_gen/src/docker_compose/compose/service.py
2025-12-18 00:00:53 -06:00

81 lines
2.6 KiB
Python

from abc import ABCMeta
from dataclasses import dataclass
from pathlib import Path
from typing import Self, final
from docker_compose.compose.service_yaml_read import (
ServiceYamlRead,
)
from docker_compose.compose.service_yaml_write import (
ServiceYamlWrite,
ServiceYamlWriteData,
)
from docker_compose.compose.val_obj import Record
from docker_compose.Ts import T_Primitive
@final
@dataclass(frozen=True, slots=True)
class Service(metaclass=ABCMeta):
command: tuple[str, ...] | None
container_name: str
entrypoint: tuple[str, ...] | None
environment: dict[str, T_Primitive] | None
image: str
labels: frozenset[str] | None
logging: dict[str, str] | None
networks: frozenset[str] | None
restart: str
security_opt: frozenset[str]
user: str | None
volumes: frozenset[str] | None
@classmethod
def from_path(cls, path: Path) -> Self:
return cls.from_dict(ServiceYamlRead.from_path(path))
@classmethod
def from_dict(cls, data: ServiceYamlRead):
command = data.data.get("command")
entrypoint = data.data.get("entrypoint")
volumes = data.data.get("volumes")
nets = data.data.get("networks")
return cls(
None if not command else tuple(command),
Record.get_replace_name("org_name"),
tuple(entrypoint) if entrypoint else None,
data.data.get("environment"),
data.data["image"],
data.labels,
data.data.get("logging"),
frozenset(nets) if nets else None,
"unless-stopped",
data.sec_opts,
data.data.get("user"),
frozenset(volumes) if volumes else None,
)
@property
def as_dict(self) -> ServiceYamlWrite:
data = ServiceYamlWriteData(
container_name=self.container_name,
image=self.image,
restart=self.restart,
security_opt=sorted(self.security_opt),
)
if self.command is not None:
data["command"] = list(self.command)
if self.entrypoint is not None:
data["entrypoint"] = list(self.entrypoint)
if self.environment is not None:
data["environment"] = self.environment
if self.labels is not None:
data["labels"] = sorted(self.labels)
if self.logging is not None:
data["logging"] = self.logging
if self.user is not None:
data["user"] = self.user
if self.volumes is not None:
data["volumes"] = sorted(self.volumes)
return ServiceYamlWrite(data)