Dotfiles_Generator/run.py

86 lines
2.2 KiB
Python
Executable File

#!/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()