nuvolaris/template.py (23 lines of code) (raw):

# Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. # import os, re from jinja2 import Environment, FileSystemLoader loader = FileSystemLoader(["./nuvolaris/templates", "./nuvolaris/files", "./nuvolaris/policies"]) env = Environment(loader=loader) # expand template def expand_template(template, data): """ >>> import json >>> json.loads(expand_template("test.json", {"item": "hello"})) {'_id': 'test', 'value': 'hello'} """ tpl = env.get_template(template) return tpl.render(data) #doc = json.loads(tpl.render(data)) # expond template and save in a file def spool_template(template, file, data): """ >>> import nuvolaris.testutil as tu >>> tu.grep(tu.fread(spool_template("test.json", "/tmp/test.json", {"item": "hi"})), r"value") "value": "hi" """ with open(file, "w") as f: f.write(expand_template(template, data)) return file # expand a line of a .tpl.yml interpreting '#' comments as follows: # if there is #!, the entire line will be removed # if there is a #:, the part from : and #: including the #: but not the initial : will be removed, exposing the value follwing #: # if there is a #-, the part from - and #- including the #- but not the initial - will be removed, exposing the value follwing - # if there is a ##, the ## (and an eventual space after) will be removed, exposing the template directive # note only one of those comments will be executed and matched in this order # you can escape the #x replacement rules writing #\~, #\#, #\-, #\: # those sequences will be replaced with #~ ## #- #: respectively after the replacement def process_tpl_line(line): r""" >>> line = "##{{ if some-condition }}" >>> print(process_tpl_line(line)) {{ if some-condition }} >>> line = " ##{{foreach item value}}" >>> print(process_tpl_line(line)) {{foreach item value}} >>> line = " key: value #: {{value}}" >>> print(process_tpl_line(line)) key: {{value}} >>> line = " - item #- {{item}}" >>> print(process_tpl_line(line)) - {{item}} >>> line = r"#\! with #\~, #\: and #\- but not #\@" >>> print(process_tpl_line(line)) #! with #~, #: and #- but not #\@ """ if re.search(r"#~", line): return "" elif re.search(r"##", line): line = re.sub(r"##(.*)$", r"\1", line, count=1) elif re.search(r"#:", line): line = re.sub(r":.*#:(.*)$", r":\1", line, count=1) elif re.search(r"#-", line): line = re.sub(r"-.*#-(.*)$", r"-\1", line, count=1) line = re.sub(r"#\\([!#-:~])", r"#\1", line) return line