You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
RedditVideoMakerBot/utils/docker_bootstrap.py

72 lines
2.0 KiB

"""Container bootstrap helpers for first-run runtime state."""
from __future__ import annotations
from pathlib import Path
from typing import Any, Dict
import tomlkit
ROOT = Path(__file__).resolve().parent.parent
def _default_from_template(node: Dict[str, Any]) -> Dict[str, Any]:
defaults: Dict[str, Any] = {}
for key, value in node.items():
if isinstance(value, dict) and "optional" in value:
if "default" in value:
defaults[key] = value["default"]
else:
value_type = value.get("type")
if value_type == "bool":
defaults[key] = False
elif value_type in {"int", "float"}:
defaults[key] = 0
else:
defaults[key] = ""
elif isinstance(value, dict):
defaults[key] = _default_from_template(value)
return defaults
def _ensure_json(path: Path, content: str) -> None:
path.parent.mkdir(parents=True, exist_ok=True)
if not path.exists():
path.write_text(content, encoding="utf-8")
def _ensure_config(path: Path) -> None:
if path.exists():
return
template_path = ROOT / "utils/.config.template.toml"
template = tomlkit.loads(template_path.read_text(encoding="utf-8"))
defaults = _default_from_template(template)
path.write_text(tomlkit.dumps(defaults), encoding="utf-8")
def ensure_runtime_state() -> None:
"""Create runtime files and directories expected by the app."""
for relative in (
"assets/temp",
"assets/backgrounds/audio",
"assets/backgrounds/video",
".cache",
"results",
"video_creation/data",
):
(ROOT / relative).mkdir(parents=True, exist_ok=True)
_ensure_config(ROOT / "config.toml")
_ensure_json(ROOT / "video_creation/data/videos.json", "[]\n")
_ensure_json(ROOT / "utils/backgrounds.json", "{}\n")
def main() -> None:
ensure_runtime_state()
if __name__ == "__main__":
main()