besgen API documentation
Project documentation Docs

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)