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 cfg import CFG_ROOT
from cfg.factory import cfg_data_factory
from compose.factory import compose_factory, traefik_compose_factory
from rendered.entity import Rendered
from rendered.factory import rendered_factory
from rendered.util import write
from src_path.entity import src_paths_factory
from template.factory import template_factory
from compose.cfg import CFG_ROOT, TRAEFIK_PATH
from compose.cfg.factory import cfg_data_factory
from compose.compose.factory import compose_factory
from compose.rendered.entity import Rendered
from compose.rendered.factory import rendered_factory
from compose.rendered.util import write
from compose.src_path.entity import src_paths_factory
from compose.template.factory import template_factory
def load_all() -> Iterable[Rendered]:
@@ -27,7 +27,9 @@ def render_all() -> Iterator[Rendered]:
if __name__ == "__main__":
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):
rendered = rendered_factory(template)
write(rendered)

View File

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

View File

@@ -1,10 +1,10 @@
from typing import cast
from cfg.entity import CfgData, CfgDataYaml
from cfg.get import cfg_get_orgs
from src_path.entity import SrcPaths
from src_path.get import src_path_get_files
from util import read_yml
from compose.cfg.entity import CfgData, CfgDataYaml
from compose.cfg.get import cfg_get_orgs
from compose.src_path.entity import SrcPaths
from compose.src_path.get import src_path_get_files
from compose.util import read_yml
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 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
from compose.cfg.entity import CfgData
from compose.net.entities import Net, NetTraefik, NetYaml
from compose.service.entity import Service, ServiceYaml, TraefikService
from compose.service.get import services_get_networks
from compose.util import to_yaml
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 compose.entity import Compose, TraefikCompose
from util import get_replace_name
from compose.compose.entity import Compose, TraefikCompose
from compose.util import get_replace_name
def compose_get_volumes(compose: Compose | TraefikCompose) -> Iterator[str]:

View File

@@ -1,6 +1,6 @@
from cfg import DATA_ROOT
from dest_path.entity import DestPaths
from template.entity import Template
from compose.cfg import DATA_ROOT
from compose.dest_path.entity import DestPaths
from compose.template.entity import Template
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 util import get_replace_name
from compose.net.entities import Net, NetArgs
from compose.util import get_replace_name
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 typing import final
from dest_path.entity import DestPaths
from src_path.entity import SrcPaths
from template.entity import Template
from compose.dest_path.entity import DestPaths
from compose.src_path.entity import SrcPaths
from compose.template.entity import Template
@final

View File

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

View File

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

View File

@@ -1,7 +1,7 @@
from pathlib import Path
from shutil import copyfile
from rendered.entity import Rendered
from compose.rendered.entity import Rendered
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 typing import Literal, NotRequired, Self, TypedDict, TypeVar, overload, override
from cfg import T_Primitive
from util import get_replace_name
from compose.cfg import T_Primitive
from compose.util import get_replace_name
type T_NetAbc = str | Literal["proxy", "internal"]
TCo_NetABC = TypeVar("TCo_NetABC", bound=T_NetAbc, covariant=True)
@@ -43,7 +43,7 @@ type T_Compose = ServiceYaml | TraefikServiceYaml
@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
container_name: str
entrypoint: tuple[str, ...]
@@ -83,8 +83,8 @@ class ServiceAbc[T_net: T_NetAbc, T_Yaml: T_Compose](ABC):
return False
return True
@abstractmethod
@staticmethod
@abstractmethod
def get_nets(data: T_Yaml) -> frozenset[T_net] | None:
pass
# 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 typing import Literal
from net.entities import Net
from net.factory import net_factory_re
from service.entity import Service
from compose.net.entities import Net
from compose.net.factory import net_factory_re
from compose.service.entity import Service
def _networks_sub(

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -5,7 +5,7 @@ from typing import Any, cast, override
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):
@@ -40,7 +40,6 @@ def read_yml(path: Path) -> T_YamlDict:
with path.open("rt") as f:
return cast(T_YamlDict, yaml.safe_load(f))
def to_yaml(data: T_YamlDict) -> str:
_yaml = yaml.dump(data, Dumper=VerboseSafeDumper)
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))