From 2e5809a68ee8ba664e6a454b3c2aac05e791735a Mon Sep 17 00:00:00 2001 From: Kegan Dougal Date: Wed, 20 May 2015 11:19:32 +0100 Subject: [PATCH] Make build.py accept generic files for template var substitutions. This allows us to incrementally convert sections of the spec to use this templating system. E.g. './build.py ../specification/20_events.rst' where that .rst file has {{room_events}} in it somewhere. Add ability to show a list of valid template vars to use (e.g. room_events) by running './build.py --show-template-vars'. --- templating/build.py | 72 +++++++++++++++++++++++++------ templating/templates/skeleton.rst | 6 --- 2 files changed, 58 insertions(+), 20 deletions(-) delete mode 100644 templating/templates/skeleton.rst diff --git a/templating/build.py b/templating/build.py index ebf4ac18..4de25791 100755 --- a/templating/build.py +++ b/templating/build.py @@ -40,10 +40,14 @@ Checks - Any sections made but not used in the skeleton will produce a warning. """ -from jinja2 import Environment, FileSystemLoader, StrictUndefined +from jinja2 import Environment, FileSystemLoader, StrictUndefined, Template +from argparse import ArgumentParser, FileType +import json +import os +import sys + import internal.units import internal.sections -import json def load_units(): print "Loading units..." @@ -53,10 +57,8 @@ def load_sections(env, units): print "\nLoading sections..." return internal.sections.load(env, units) -def create_from_skeleton(skeleton, sections): - print "\nCreating spec from skeleton..." - print "Section keys: %s" % (sections.keys()) - return skeleton.render(sections.data) +def create_from_template(template, sections): + return template.render(sections.data) def check_unaccessed(name, store): unaccessed_keys = store.get_unaccessed_set() @@ -64,7 +66,10 @@ def check_unaccessed(name, store): print "Found %s unused %s keys." % (len(unaccessed_keys), name) print unaccessed_keys -def main(): +def main(file_stream=None, out_dir=None): + if out_dir and not os.path.exists(out_dir): + os.makedirs(out_dir) + # add a template filter to produce pretty pretty JSON def jsonify(input, indent=None, pre_whitespace=0): code = json.dumps(input, indent=indent) @@ -88,15 +93,54 @@ def main(): # use the units to create RST sections sections = load_sections(env, units) - # combine all the RST sections into a coherent spec - skeleton = env.get_template("skeleton.rst") - spec = create_from_skeleton(skeleton, sections) + # print out valid section keys if no file supplied + if not file_stream: + print "\nValid template variables:" + for key in sections.keys(): + print " %s" % key + return + + # check the input files and substitute in sections where required + print "Parsing input template: %s" % file_stream.name + temp = Template(file_stream.read()) + print "Creating output for: %s" % file_stream.name + output = create_from_template(temp, sections) + with open(os.path.join(out_dir, file_stream.name), "w") as f: + f.write(output) + print "Output file for: %s" % file_stream.name check_unaccessed("units", units) - - with open("spec.rst", "w") as f: - f.write(spec) if __name__ == '__main__': - main() + parser = ArgumentParser( + "Process a file (typically .rst) and replace templated areas with spec"+ + " info. For a list of possible template variables, add"+ + " --show-template-vars." + ) + parser.add_argument( + "file", nargs="?", type=FileType('r'), + help="The input file to process." + ) + parser.add_argument( + "--out-directory", "-o", help="The directory to output the file to."+ + " Default: /out", + default="out" + ) + parser.add_argument( + "--show-template-vars", "-s", action="store_true", + help="Show a list of all possible variables you can use in the"+ + " input file." + ) + args = parser.parse_args() + + if (args.show_template_vars): + main() + sys.exit(0) + + if not args.file: + print "No file supplied." + parser.print_help() + sys.exit(1) + + main(file_stream=args.file, out_dir=args.out_directory) diff --git a/templating/templates/skeleton.rst b/templating/templates/skeleton.rst deleted file mode 100644 index 1fd2d965..00000000 --- a/templating/templates/skeleton.rst +++ /dev/null @@ -1,6 +0,0 @@ -This is the skeleton of the spec. - -{{room_events}} - - -Here a footer thingy. \ No newline at end of file