Skip to content

renderer

Template rendering for files with {parameter} substitution.

render_folder(source, params, output=None, glob_pattern='**/*')

Load all files in a folder and replace {param} placeholders.

Parameters:

Name Type Description Default
source Path | str

Path to source folder containing template files.

required
params dict[str, str]

Dict mapping parameter names to replacement values.

required
output Path | str | None

Optional path to write rendered files, preserving folder structure.

None
glob_pattern str

Glob pattern to match files. Defaults to all files recursively.

'**/*'

Returns:

Type Description
dict[Path, str]

Dict mapping relative file paths to their rendered content.

Raises:

Type Description
ValueError

If a parameter referenced in a template is missing from params.

Source code in src/cloe_delta_table_manager/file_utils/renderer.py
def render_folder(
    source: Path | str,
    params: dict[str, str],
    output: Path | str | None = None,
    glob_pattern: str = "**/*",
) -> dict[Path, str]:
    """Load all files in a folder and replace {param} placeholders.

    Args:
        source: Path to source folder containing template files.
        params: Dict mapping parameter names to replacement values.
        output: Optional path to write rendered files, preserving folder structure.
        glob_pattern: Glob pattern to match files. Defaults to all files recursively.

    Returns:
        Dict mapping relative file paths to their rendered content.

    Raises:
        ValueError: If a parameter referenced in a template is missing from params.

    """
    source = Path(source)
    rendered: dict[Path, str] = {}

    for file_path in sorted(source.glob(glob_pattern)):
        if not file_path.is_file():
            continue

        content = file_path.read_text(encoding="utf-8")
        relative = file_path.relative_to(source)

        try:
            rendered[relative] = content.format_map(params)
        except KeyError as e:
            raise ValueError(f"Missing parameter {e} in template file: {relative}") from e

    if output is not None:
        output = Path(output)
        output.mkdir(parents=True, exist_ok=True)
        for relative, content in rendered.items():
            out_file = output / relative
            out_file.parent.mkdir(parents=True, exist_ok=True)
            out_file.write_text(content, encoding="utf-8")

    return rendered