This commit is contained in:
2025-12-14 20:56:52 -06:00
parent a0b6e00a31
commit 51eb7e80e7
29 changed files with 137 additions and 131 deletions

View File

@@ -1,20 +0,0 @@
from collections.abc import Iterator
from typing import cast
from cfg.entity import CfgData, CfgDataYaml, OrgData
from service.entity import Service, ServiceYaml
from util import read_yml
def cfg_get_orgs(data: CfgDataYaml) -> Iterator[OrgData]:
for org_data in data["orgs"]:
yield OrgData(
org_data.get("org"),
org_data.get("url"),
)
def cfg_get_services(cfg_data: CfgData) -> Iterator[tuple[str, Service]]:
for path in cfg_data.files:
_dict = cast(ServiceYaml, read_yml(path))
yield path.stem, Service.from_dict(_dict)

View File

@@ -1,13 +1,13 @@
from collections.abc import Iterable, Iterator from collections.abc import Iterable, Iterator
from cfg import CFG_ROOT from compose.cfg import CFG_ROOT, TRAEFIK_PATH
from cfg.factory import cfg_data_factory from compose.cfg.factory import cfg_data_factory
from compose.factory import compose_factory, traefik_compose_factory from compose.compose.factory import compose_factory
from rendered.entity import Rendered from compose.rendered.entity import Rendered
from rendered.factory import rendered_factory from compose.rendered.factory import rendered_factory
from rendered.util import write from compose.rendered.util import write
from src_path.entity import src_paths_factory from compose.src_path.entity import src_paths_factory
from template.factory import template_factory from compose.template.factory import template_factory
def load_all() -> Iterable[Rendered]: def load_all() -> Iterable[Rendered]:
@@ -27,7 +27,9 @@ def render_all() -> Iterator[Rendered]:
if __name__ == "__main__": if __name__ == "__main__":
renders = render_all() renders = render_all()
traefik = traefik_compose_factory(renders) src_paths = src_paths_factory(TRAEFIK_PATH)
cfg_data = cfg_data_factory(src_paths)
traefik = compose_factory(cfg_data)
for template in template_factory(traefik): for template in template_factory(traefik):
rendered = rendered_factory(template) rendered = rendered_factory(template)
write(rendered) write(rendered)

View File

@@ -2,11 +2,11 @@ from dataclasses import dataclass
from pathlib import Path from pathlib import Path
from typing import NotRequired, TypedDict, final from typing import NotRequired, TypedDict, final
from src_path.entity import SrcPaths from compose.src_path.entity import SrcPaths
class OrgDataYaml(TypedDict): class OrgDataYaml(TypedDict):
org: NotRequired[str] org: str
url: NotRequired[str] url: NotRequired[str]
@@ -19,7 +19,7 @@ class CfgDataYaml(TypedDict):
@final @final
@dataclass(frozen=True, slots=True) @dataclass(frozen=True, slots=True)
class OrgData: class OrgData:
org: str | None org: str
url: str | None url: str | None
@@ -29,4 +29,4 @@ class CfgData:
src_paths: SrcPaths src_paths: SrcPaths
name: str name: str
files: frozenset[Path] files: frozenset[Path]
orgs: frozenset[OrgData] | None orgs: frozenset[OrgData]

View File

@@ -1,10 +1,10 @@
from typing import cast from typing import cast
from cfg.entity import CfgData, CfgDataYaml from compose.cfg.entity import CfgData, CfgDataYaml
from cfg.get import cfg_get_orgs from compose.cfg.get import cfg_get_orgs
from src_path.entity import SrcPaths from compose.src_path.entity import SrcPaths
from src_path.get import src_path_get_files from compose.src_path.get import src_path_get_files
from util import read_yml from compose.util import read_yml
def cfg_data_factory(cfg_dir: SrcPaths) -> CfgData: def cfg_data_factory(cfg_dir: SrcPaths) -> CfgData:

26
src/compose/cfg/get.py Normal file
View File

@@ -0,0 +1,26 @@
from collections.abc import Iterator
from typing import cast
from compose.cfg.entity import CfgData, CfgDataYaml, OrgData
from compose.service.entity import Service, ServiceYaml
from compose.util import read_yml
def cfg_get_orgs(data: CfgDataYaml) -> Iterator[OrgData]:
# orgs = data.get("orgs")
# if orgs is None:
# yield OrgData(
# org_data.get("org"),
# org_data.get("url"),
# )
for org_data in data["orgs"]:
yield OrgData(
org_data["org"],
org_data.get("url"),
)
def cfg_get_services(cfg_data: CfgData) -> Iterator[tuple[str, Service]]:
for path in cfg_data.files:
_dict = cast(ServiceYaml, read_yml(path))
yield path.stem, Service.from_dict(_dict)

View File

@@ -1,11 +1,11 @@
from dataclasses import asdict, dataclass from dataclasses import asdict, dataclass
from typing import Literal, NotRequired, Self, TypedDict, final from typing import Literal, NotRequired, Self, TypedDict, final
from cfg.entity import CfgData from compose.cfg.entity import CfgData
from net.entities import Net, NetTraefik, NetYaml from compose.net.entities import Net, NetTraefik, NetYaml
from service.entity import Service, ServiceYaml, TraefikService from compose.service.entity import Service, ServiceYaml, TraefikService
from service.get import services_get_networks from compose.service.get import services_get_networks
from util import to_yaml from compose.util import to_yaml
class ComposeYaml(TypedDict): class ComposeYaml(TypedDict):

View File

@@ -0,0 +1,36 @@
from compose.cfg.entity import CfgData
from compose.cfg.get import cfg_get_services
from compose.compose.entity import Compose
# from compose.service.factory import get_traefik_service
from compose.service.get import services_get_networks
def compose_factory(cfg_data: CfgData) -> Compose:
services = dict(cfg_get_services(cfg_data))
return Compose(
cfg_data,
services_get_networks(services.values()),
services,
)
# def traefik_compose_factory(renders: Iterable[Rendered]) -> TraefikCompose:
# src_paths = src_paths_factory(TRAEFIK_PATH)
# cfg = cfg_data_factory(src_paths)
# # cfg = CfgData(
# # src_paths,
# # 'traefik',
# # frozenset((TRAEFIK_PATH.joinpath('traefik'),)),
# # None,
# # )
# service = get_traefik_service()
# nets: NetTraefik = dict(rendered_get_nets(renders))
# service["networks"] = list(nets.keys())
# return TraefikCompose(
# cfg,
# nets,
# {"traefik": TraefikService.from_dict(service)},
# )

View File

@@ -1,7 +1,7 @@
from collections.abc import Iterator from collections.abc import Iterator
from compose.entity import Compose, TraefikCompose from compose.compose.entity import Compose, TraefikCompose
from util import get_replace_name from compose.util import get_replace_name
def compose_get_volumes(compose: Compose | TraefikCompose) -> Iterator[str]: def compose_get_volumes(compose: Compose | TraefikCompose) -> Iterator[str]:

View File

@@ -1,6 +1,6 @@
from cfg import DATA_ROOT from compose.cfg import DATA_ROOT
from dest_path.entity import DestPaths from compose.dest_path.entity import DestPaths
from template.entity import Template from compose.template.entity import Template
def dest_paths_factory(template: Template) -> DestPaths: def dest_paths_factory(template: Template) -> DestPaths:

View File

@@ -1,37 +0,0 @@
from collections.abc import Iterable
from cfg import TRAEFIK_PATH
from cfg.entity import CfgData
from cfg.factory import cfg_data_factory
from cfg.get import cfg_get_services
from compose.entity import Compose, TraefikCompose
from net.entities import NetTraefik
from rendered.entity import Rendered
from rendered.get import rendered_get_nets
from service.entity import TraefikService
from service.factory import get_traefik_service
from service.get import services_get_networks
from src_path.entity import src_paths_factory
def compose_factory(cfg_data: CfgData) -> Compose:
services = dict(cfg_get_services(cfg_data))
return Compose(
cfg_data,
services_get_networks(services.values()),
services,
)
def traefik_compose_factory(renders: Iterable[Rendered]) -> TraefikCompose:
src_paths = src_paths_factory(TRAEFIK_PATH)
cfg = cfg_data_factory(src_paths)
service = get_traefik_service()
nets: NetTraefik = dict(rendered_get_nets(renders))
service["networks"] = list(nets.keys())
return TraefikCompose(
cfg,
nets,
{"traefik": TraefikService.from_dict(service)},
)

View File

@@ -1,5 +1,5 @@
from net.entities import Net, NetArgs from compose.net.entities import Net, NetArgs
from util import get_replace_name from compose.util import get_replace_name
def net_args_factory(name: str, external: bool | None = None) -> NetArgs: def net_args_factory(name: str, external: bool | None = None) -> NetArgs:

View File

@@ -2,9 +2,9 @@ from dataclasses import dataclass
from pathlib import Path from pathlib import Path
from typing import final from typing import final
from dest_path.entity import DestPaths from compose.dest_path.entity import DestPaths
from src_path.entity import SrcPaths from compose.src_path.entity import SrcPaths
from template.entity import Template from compose.template.entity import Template
@final @final

View File

@@ -1,9 +1,9 @@
from functools import reduce from functools import reduce
from dest_path.factory import dest_paths_factory from compose.dest_path.factory import dest_paths_factory
from rendered.entity import Rendered from compose.rendered.entity import Rendered
from template.entity import Template from compose.template.entity import Template
from template.get import template_get_proxy, template_get_vols from compose.template.get import template_get_proxy, template_get_vols
def rendered_factory(template: Template) -> Rendered: def rendered_factory(template: Template) -> Rendered:

View File

@@ -1,8 +1,8 @@
from collections.abc import Iterable, Iterator from collections.abc import Iterable, Iterator
from net.entities import NetArgs from compose.net.entities import NetArgs
from net.factory import net_args_factory from compose.net.factory import net_args_factory
from rendered.entity import Rendered from compose.rendered.entity import Rendered
def rendered_get_nets(renders: Iterable[Rendered]) -> Iterator[tuple[str, NetArgs]]: def rendered_get_nets(renders: Iterable[Rendered]) -> Iterator[tuple[str, NetArgs]]:

View File

@@ -1,7 +1,7 @@
from pathlib import Path from pathlib import Path
from shutil import copyfile from shutil import copyfile
from rendered.entity import Rendered from compose.rendered.entity import Rendered
def _mk_dir(path: Path) -> None: def _mk_dir(path: Path) -> None:

View File

@@ -1,9 +1,9 @@
from abc import ABC, abstractmethod from abc import ABCMeta, abstractmethod
from dataclasses import dataclass from dataclasses import dataclass
from typing import Literal, NotRequired, Self, TypedDict, TypeVar, overload, override from typing import Literal, NotRequired, Self, TypedDict, TypeVar, overload, override
from cfg import T_Primitive from compose.cfg import T_Primitive
from util import get_replace_name from compose.util import get_replace_name
type T_NetAbc = str | Literal["proxy", "internal"] type T_NetAbc = str | Literal["proxy", "internal"]
TCo_NetABC = TypeVar("TCo_NetABC", bound=T_NetAbc, covariant=True) TCo_NetABC = TypeVar("TCo_NetABC", bound=T_NetAbc, covariant=True)
@@ -43,7 +43,7 @@ type T_Compose = ServiceYaml | TraefikServiceYaml
@dataclass(frozen=True, slots=True) @dataclass(frozen=True, slots=True)
class ServiceAbc[T_net: T_NetAbc, T_Yaml: T_Compose](ABC): class ServiceAbc[T_net: T_NetAbc, T_Yaml: T_Compose](metaclass=ABCMeta):
command: tuple[str, ...] | None command: tuple[str, ...] | None
container_name: str container_name: str
entrypoint: tuple[str, ...] entrypoint: tuple[str, ...]
@@ -83,8 +83,8 @@ class ServiceAbc[T_net: T_NetAbc, T_Yaml: T_Compose](ABC):
return False return False
return True return True
@abstractmethod
@staticmethod @staticmethod
@abstractmethod
def get_nets(data: T_Yaml) -> frozenset[T_net] | None: def get_nets(data: T_Yaml) -> frozenset[T_net] | None:
pass pass
# return self._get_nets(data) # return self._get_nets(data)

View File

@@ -0,0 +1,10 @@
# from typing import cast
# from compose.cfg import TRAEFIK_PATH
# from compose.service.entity import TraefikServiceYaml
# from compose.util import read_yml
# def get_traefik_service():
# path = TRAEFIK_PATH.joinpath("service.yml")
# return cast(TraefikServiceYaml, read_yml(path))

View File

@@ -1,9 +1,9 @@
from collections.abc import Iterable, Iterator from collections.abc import Iterable, Iterator
from typing import Literal from typing import Literal
from net.entities import Net from compose.net.entities import Net
from net.factory import net_factory_re from compose.net.factory import net_factory_re
from service.entity import Service from compose.service.entity import Service
def _networks_sub( def _networks_sub(

View File

@@ -1,5 +1,5 @@
from cfg.entity import CfgDataYaml from compose.cfg.entity import CfgDataYaml
from src_path.entity import SrcPaths from compose.src_path.entity import SrcPaths
def src_path_get_files(src_paths: SrcPaths, data: CfgDataYaml): def src_path_get_files(src_paths: SrcPaths, data: CfgDataYaml):

View File

@@ -1,8 +1,8 @@
from dataclasses import dataclass from dataclasses import dataclass
from typing import final from typing import final
from compose.entity import Compose, TraefikCompose from compose.compose.entity import Compose, TraefikCompose
from template.val_obj import DataDir, NameVal, OrgVal, RecordCls, Url from compose.template.val_obj import DataDir, NameVal, OrgVal, RecordCls, Url
@final @final

View File

@@ -1,11 +1,11 @@
from collections.abc import Iterator from collections.abc import Iterator
from cfg import DATA_ROOT from compose.cfg import DATA_ROOT
from cfg.entity import CfgData, OrgData from compose.cfg.entity import CfgData, OrgData
from compose.entity import Compose, TraefikCompose from compose.compose.entity import Compose, TraefikCompose
from compose.get import compose_get_volumes from compose.compose.get import compose_get_volumes
from template.entity import ReplaceArgs, Template from compose.template.entity import ReplaceArgs, Template
from template.val_obj import DataDir, NameVal, OrgVal, Record, Url from compose.template.val_obj import DataDir, NameVal, OrgVal, Record, Url
def replace_args_factory(cfg_data: CfgData, org_data: OrgData) -> ReplaceArgs: def replace_args_factory(cfg_data: CfgData, org_data: OrgData) -> ReplaceArgs:

View File

@@ -1,8 +1,8 @@
from collections.abc import Iterable from collections.abc import Iterable
from pathlib import Path from pathlib import Path
from net.entities import Net from compose.net.entities import Net
from template.entity import Template from compose.template.entity import Template
def template_get_vols(template: Template) -> Iterable[Path]: def template_get_vols(template: Template) -> Iterable[Path]:

View File

@@ -3,7 +3,7 @@ from dataclasses import dataclass
from pathlib import Path from pathlib import Path
from typing import TypeVar, final, override from typing import TypeVar, final, override
from util import get_replace_name from compose.util import get_replace_name
class RecordVal(ABC): class RecordVal(ABC):

View File

@@ -5,7 +5,7 @@ from typing import Any, cast, override
import yaml import yaml
from cfg import T_PrimDict, T_Primitive, T_PrimVal, T_YamlDict from compose.cfg import T_PrimDict, T_Primitive, T_PrimVal, T_YamlDict
class VerboseSafeDumper(yaml.SafeDumper): class VerboseSafeDumper(yaml.SafeDumper):
@@ -40,7 +40,6 @@ def read_yml(path: Path) -> T_YamlDict:
with path.open("rt") as f: with path.open("rt") as f:
return cast(T_YamlDict, yaml.safe_load(f)) return cast(T_YamlDict, yaml.safe_load(f))
def to_yaml(data: T_YamlDict) -> str: def to_yaml(data: T_YamlDict) -> str:
_yaml = yaml.dump(data, Dumper=VerboseSafeDumper) _yaml = yaml.dump(data, Dumper=VerboseSafeDumper)
return re.sub(r"(^\s*-)", r" \g<1>", _yaml, flags=re.MULTILINE) return re.sub(r"(^\s*-)", r" \g<1>", _yaml, flags=re.MULTILINE)

View File

@@ -1,10 +0,0 @@
from typing import cast
from cfg import TRAEFIK_PATH
from service.entity import TraefikServiceYaml
from util import read_yml
def get_traefik_service():
path = TRAEFIK_PATH.joinpath("service.yml")
return cast(TraefikServiceYaml, read_yml(path))