109 lines
3.2 KiB
Python
109 lines
3.2 KiB
Python
#!/usr/bin/python
|
|
|
|
import io
|
|
import sys
|
|
|
|
try:
|
|
from .renderer import render
|
|
from .metadata import version
|
|
except (ValueError, SystemError): # python 2
|
|
from renderer import render
|
|
from metadata import version
|
|
|
|
|
|
def main(template, data=None, **kwargs):
|
|
with io.open(template, 'r', encoding='utf-8') as template_file:
|
|
yaml_loader = kwargs.pop('yaml_loader', None) or 'SafeLoader'
|
|
|
|
if data is not None:
|
|
with io.open(data, 'r', encoding='utf-8') as data_file:
|
|
data = _load_data(data_file, yaml_loader)
|
|
else:
|
|
data = {}
|
|
|
|
args = {
|
|
'template': template_file,
|
|
'data': data
|
|
}
|
|
|
|
args.update(kwargs)
|
|
return render(**args)
|
|
|
|
|
|
def _load_data(file, yaml_loader):
|
|
try:
|
|
import yaml
|
|
loader = getattr(yaml, yaml_loader) # not tested
|
|
return yaml.load(file, Loader=loader) # not tested
|
|
except ImportError:
|
|
import json
|
|
return json.load(file)
|
|
|
|
|
|
def cli_main():
|
|
"""Render mustache templates using json files"""
|
|
import argparse
|
|
import os
|
|
|
|
def is_file_or_pipe(arg):
|
|
if not os.path.exists(arg) or os.path.isdir(arg):
|
|
parser.error('The file {0} does not exist!'.format(arg))
|
|
else:
|
|
return arg
|
|
|
|
def is_dir(arg):
|
|
if not os.path.isdir(arg):
|
|
parser.error('The directory {0} does not exist!'.format(arg))
|
|
else:
|
|
return arg
|
|
|
|
parser = argparse.ArgumentParser(description=__doc__)
|
|
|
|
parser.add_argument('-v', '--version', action='version',
|
|
version=version)
|
|
|
|
parser.add_argument('template', help='The mustache file',
|
|
type=is_file_or_pipe)
|
|
|
|
parser.add_argument('-d', '--data', dest='data',
|
|
help='The json data file',
|
|
type=is_file_or_pipe, default={})
|
|
|
|
parser.add_argument('-y', '--yaml-loader', dest='yaml_loader',
|
|
help=argparse.SUPPRESS)
|
|
|
|
parser.add_argument('-p', '--path', dest='partials_path',
|
|
help='The directory where your partials reside',
|
|
type=is_dir, default='.')
|
|
|
|
parser.add_argument('-e', '--ext', dest='partials_ext',
|
|
help='The extension for your mustache\
|
|
partials, \'mustache\' by default',
|
|
default='mustache')
|
|
|
|
parser.add_argument('-l', '--left-delimiter', dest='def_ldel',
|
|
help='The default left delimiter, "{{" by default.',
|
|
default='{{')
|
|
|
|
parser.add_argument('-r', '--right-delimiter', dest='def_rdel',
|
|
help='The default right delimiter, "}}" by default.',
|
|
default='}}')
|
|
|
|
parser.add_argument('-w', '--warn', dest='warn',
|
|
help='Print a warning to stderr for each undefined template key encountered',
|
|
action='store_true')
|
|
|
|
|
|
args = vars(parser.parse_args())
|
|
|
|
try:
|
|
sys.stdout.write(main(**args))
|
|
sys.stdout.flush()
|
|
except SyntaxError as e:
|
|
print('Chevron: syntax error')
|
|
sys.exit(' ' + '\n '.join(e.args[0].split('\n')))
|
|
|
|
|
|
if __name__ == '__main__':
|
|
cli_main()
|