Created
June 20, 2018 08:03
-
-
Save afranzi/7847f9453d9cdeaa746e25577bea07e9 to your computer and use it in GitHub Desktop.
Jinja2 - Config Template
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import argparse | |
import errno | |
import os | |
import sys | |
from jinja2 import Environment, FileSystemLoader, StrictUndefined | |
UTF8 = 'utf8' | |
TEMPLATE = 'template' | |
def parse_option(sys_args): | |
parser = argparse.ArgumentParser( | |
description='Generate a configuration combining templates', | |
formatter_class=argparse.RawTextHelpFormatter | |
) | |
parser.add_argument('--input_folder', '-i', required=True, help='Input folder') | |
parser.add_argument('--output_folder', '-o', required=True, help='Output folder') | |
return parser, parser.parse_args(sys_args) | |
def create_directory(filename): | |
try: | |
os.makedirs(os.path.dirname(filename)) | |
except OSError as exc: # Guard against race condition | |
if exc.errno != errno.EEXIST: | |
raise | |
def chop(value, ending): | |
if value.endswith(ending): | |
return value[:-len(ending)] | |
return value | |
def generate_template(template, output_folder): | |
template_content = template.render(os.environ) | |
target_file = os.path.join(output_folder, template.name) | |
target_file = chop(target_file, '.template') | |
create_directory(target_file) | |
with open(target_file, 'w') as writer: | |
writer.write(template_content) | |
def main(args=None): | |
if args is None: | |
args = sys.argv[1:] | |
parser, args = parse_option(args) | |
file_system_loader = FileSystemLoader(args.input_folder) | |
env = Environment( | |
loader=file_system_loader, | |
undefined=StrictUndefined # Fails if it tries to render undefined values | |
) | |
templates = [env.get_template(template_path) for template_path in env.list_templates() | |
if template_path.endswith(TEMPLATE) or TEMPLATE not in template_path] | |
for template in templates: | |
generate_template(template, args.output_folder) | |
if __name__ == "__main__": | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment