#!/usr/bin/env python3 # Recursively read for all files template_directory = './templates/' # Written to when generation is done out_directory = './out/' # Applied in order, later files override earlier files env_files = ['./vars.env', './local.env'] import jinja2 import re import os def main(): key_value_store = create_key_value_store() template_files = find_all_templates() out_files = convert_templates_to_out_file(template_files) convert_all_templates(template_files, key_value_store, out_files) def create_key_value_store(): out = {} for env_file in env_files: with open(env_file) as file: data = file.read() for line in data.split('\n'): m = re.match(r'^([^={}]+)=([^={}\n]+)', line) if m is None: continue out[m.group(1)] = m.group(2) return out def find_all_templates(): files = [] dirlist = [template_directory] while len(dirlist) > 0: for (dirpath, dirnames, filenames) in os.walk(dirlist.pop()): dirlist.extend(dirnames) files.extend(map(lambda n: os.path.join(*n), zip([dirpath] * len(filenames), filenames))) return files def convert_templates_to_out_file(template_files): out_files = [] real_template_dir = os.path.realpath(template_directory) real_out_dir = os.path.realpath(out_directory) for template_file in template_files: real_template_file = os.path.realpath(template_file) out_files += [real_template_file.replace(real_template_dir, real_out_dir)] return out_files def convert_all_templates(template_files, key_value_store, out_files): env = jinja2.Environment() for (template, out) in zip(template_files, out_files): convert_template(env, template, key_value_store, out) def convert_template(env, template, key_value_store, out): with open(template, 'r') as file: source = file.read() template = env.from_string(source) rendered = template.render(**key_value_store) out_dir_name = os.path.dirname(out) if not os.path.isdir(out_dir_name): os.makedirs(out_dir_name) with open(out, 'w') as file: file.write(rendered) if __name__ == '__main__': main()