Files
compose_gen/src/docker_compose/compose/net.py
2026-01-11 12:35:27 -06:00

61 lines
1.6 KiB
Python

from collections.abc import Iterable, Iterator
from dataclasses import dataclass, field
from typing import Self, final
from docker_compose.cfg.org import OrgData
from docker_compose.compose.net_yaml import NetArgsYaml, NetYaml
from docker_compose.compose.services import Service
@final
@dataclass(frozen=True, slots=True)
class NetArgs:
name: str
full_name: str = field(init=False)
external: bool = field(init=False)
def __post_init__(self):
setter = super(NetArgs, self).__setattr__
setter("full_name", f"{OrgData.org_app.dest}_{self.name}")
setter("external", self.name == "proxy")
@property
def as_dict(self) -> NetArgsYaml:
yaml_dict = NetArgsYaml(
name=self.full_name,
)
if self.external:
yaml_dict["external"] = self.external
return yaml_dict
# @property
# def as_key_dict(self) -> tuple[str, NetArgsYaml]:
# return str(self), self.as_dict
@final
@dataclass
class Net:
data: frozenset[NetArgs]
@classmethod
def from_service_list(cls, args: Iterable[Service]) -> Self:
return cls.from_list(
frozenset(net for service in args for net in service.networks)
)
@classmethod
def from_list(cls, args: frozenset[str]) -> Self:
return cls(frozenset(NetArgs(arg) for arg in args))
@property
def as_dict(self) -> NetYaml:
return {net.name: net.as_dict for net in self.data}
@property
def proxys(self) -> Iterator[str]:
for net in self.data:
if not net.external:
continue
yield net.full_name[:-6]