docker_etl/create_new_job.py (60 lines of code) (raw):

import os import shutil from pathlib import Path import click import jinja2 from docker_etl.ci_config import update_config from docker_etl.file_utils import ( CI_JOB_NAME, CI_JOB_TEMPLATE_NAME, CI_WORKFLOW_NAME, CI_WORKFLOW_TEMPLATE_NAME, JOBS_DIR, get_templates, ) def add_ci_config(job_name: str, template_dir: Path): """Create job CI configs in job directory.""" template_loader = jinja2.FileSystemLoader(template_dir) template_env = jinja2.Environment(loader=template_loader) try: ci_job_template = template_env.get_template(CI_JOB_TEMPLATE_NAME) ci_workflow_template = template_env.get_template(CI_WORKFLOW_TEMPLATE_NAME) except jinja2.exceptions.TemplateNotFound: raise FileNotFoundError( f"Both {CI_JOB_TEMPLATE_NAME} and " f"{CI_WORKFLOW_TEMPLATE_NAME} must be in {template_dir}" ) ci_job_text = ci_job_template.render(job_name=job_name) ci_workflow_text = ci_workflow_template.render(job_name=job_name) with open(JOBS_DIR / job_name / CI_JOB_NAME, "w") as f: f.write(ci_job_text) with open(JOBS_DIR / job_name / CI_WORKFLOW_NAME, "w") as f: f.write(ci_workflow_text) def copy_job_template(job_name: str, template_dir: Path): """Copy job template files to jobs directory.""" try: new_dir = shutil.copytree( src=template_dir / "job", dst=JOBS_DIR / job_name, ) except FileExistsError: raise ValueError(f"Job with name {job_name} already exists.") # rename module and change setup.py if template_dir.name == "python": shutil.move( src=os.path.join(new_dir, "python_template_job"), dst=os.path.join(new_dir, job_name.replace("-", "_")), ) @click.command() @click.option("--job-name", required=True) @click.option("--template", default="default") def create_job(job_name: str, template: str): valid_templates = get_templates() if template not in valid_templates: raise ValueError( f"Unrecognized template name {template}. Valid " f"template names: {', '.join(valid_templates.keys())}" ) template_dir = valid_templates[template] copy_job_template(job_name, template_dir) add_ci_config(job_name, template_dir) update_config() if __name__ == "__main__": create_job()