File: besgen/generator.py
1from __future__ import annotations2 3from importlib.resources import files4from pathlib import Path5import re6 7 8def _module(name: str) -> str:9 return re.sub(r"[^A-Za-z0-9_]+", "_", name).strip("_").lower()10 11 12def _write(path: Path, text: str) -> None:13 path.parent.mkdir(parents=True, exist_ok=True)14 path.write_text(text.rstrip() + "\n", encoding="utf-8")15 16 17def _copy_tree(source, destination: Path, replacements: dict[str, str]) -> None:18 destination.mkdir(parents=True, exist_ok=True)19 for entry in source.iterdir():20 name = entry.name21 for old, new in replacements.items():22 name = name.replace(old, new)23 target = destination / name24 if entry.is_dir():25 _copy_tree(entry, target, replacements)26 else:27 text = entry.read_text(encoding="utf-8")28 for old, new in replacements.items():29 text = text.replace(old, new)30 _write(target, text)31 32 33def generate(directory: Path, name: str, template_name: str) -> None:34 if directory.exists() and any(directory.iterdir()):35 raise FileExistsError(f"{directory} exists and is not empty")36 directory.mkdir(parents=True, exist_ok=True)37 38 module = _module(name)39 replacements = {40 "__PROJECT__": name,41 "__MODULE__": module,42 "__DEV_MODULE__": f"{module}_dev",43 "__TEMPLATE__": template_name,44 }45 46 share = files("besgen").joinpath("../../share/besgen").resolve()47 _copy_tree(share / "common", directory, replacements)48 _copy_tree(share / template_name, directory, replacements)49 _copy_tree(share / "dev", directory / "dev", replacements)