# -*- encoding: utf-8 -*- import os.path import typing as T import click import jinja2 import yaml def read_config(path: T.Text) -> T.Dict[T.Text, T.Any]: """ Read the config from the specified path """ if not os.path.exists(path): raise ValueError(f"File does not exist {path}") with open(path) as f: data = yaml.safe_load(f) if not isinstance(data, dict): raise ValueError(f"Malformed configuration") return data def render_template(data: T.Dict[T.Text, T.Any], path: T.Text, dry_run: bool) -> None: """ Given the configuration values, renders the template into the desired path. """ loader = jinja2.PackageLoader("piker", "template") env = jinja2.Environment( loader=loader, autoescape=jinja2.select_autoescape(["yaml"]) ) template = env.get_template("drone.yml.j2") value = template.render(**data) if dry_run: print(value) return with open(path, "w") as out: out.write(value) @click.command() @click.option( "--dry-run/--no-dry-run", default=False, help="Display result without actually writing it", ) @click.argument("config", type=click.Path(exists=True), default="./piker.yml") @click.argument("target", type=click.Path(), default="./.drone.yml") def cli(dry_run: bool, config: T.Text, target: T.Text) -> None: """ CLI entrypoint """ conf_data = read_config(config) render_template(conf_data, target, dry_run)