Merge pull request #488 from dhozac/jinja2-env

Create a Jinja2 environment allowing includes
pull/603/head
Michael DeHaan 13 years ago
commit bd653c8f3c

@ -588,8 +588,7 @@ class Runner(object):
# template the source data locally
try:
resultant = utils.template_from_file(utils.path_dwim(self.basedir, source),
inject, self.setup_cache, no_engine=False)
resultant = utils.template_from_file(self.basedir, source, inject, self.setup_cache)
except Exception, e:
result = dict(failed=True, msg=str(e))
return ReturnData(host=conn.host, comm_ok=False, result=result)

@ -265,35 +265,33 @@ def varReplace(raw, vars):
return ''.join(done)
def _template(text, vars, setup_cache=None, no_engine=True):
def _template(text, vars, setup_cache=None):
''' run a text buffer through the templating engine '''
vars = vars.copy()
vars['hostvars'] = setup_cache
text = varReplace(unicode(text), vars)
if no_engine:
# used when processing include: directives so that Jinja is evaluated
# in a later context when more variables are available
return text
else:
template = jinja2.Template(text)
res = template.render(vars)
if text.endswith('\n') and not res.endswith('\n'):
res = res + '\n'
return res
return text
def template(text, vars, setup_cache=None, no_engine=True):
def template(text, vars, setup_cache=None):
''' run a text buffer through the templating engine
until it no longer changes '''
prev_text = ''
while prev_text != text:
prev_text = text
text = _template(text, vars, setup_cache, no_engine)
text = _template(text, vars, setup_cache)
return text
def template_from_file(path, vars, setup_cache, no_engine=True):
def template_from_file(basedir, path, vars, setup_cache):
''' run a file through the templating engine '''
data = codecs.open(path, encoding="utf8").read()
return template(data, vars, setup_cache, no_engine=no_engine)
environment = jinja2.Environment(loader=jinja2.FileSystemLoader(basedir), trim_blocks=False)
data = codecs.open(path_dwim(basedir, path), encoding="utf8").read()
template = environment.from_string(data)
vars = vars.copy()
vars['hostvars'] = setup_cache
res = template.render(vars)
if data.endswith('\n') and not res.endswith('\n'):
res = res + '\n'
return res
def parse_yaml(data):
return yaml.load(data)

@ -203,50 +203,47 @@ class TestUtils(unittest.TestCase):
assert res == 'hello world'
def test_template_varReplace_iterated(self):
template = 'hello $who'
vars = {
'who': 'oh great $person',
'person': 'one',
}
res = ansible.utils.template(template, vars)
assert res == u'hello oh great one'
#####################################
### Template function tests
def test_template_basic(self):
template = 'hello {{ who }}'
vars = {
'who': 'world',
}
res = ansible.utils.template(template, vars, {}, no_engine=False)
res = ansible.utils.template_from_file("test", "template-basic", vars, {})
assert res == 'hello world'
def test_template_whitespace(self):
template = 'hello {{ who }}\n'
vars = {
'who': 'world',
}
res = ansible.utils.template(template, vars, {}, no_engine=False)
res = ansible.utils.template_from_file("test", "template-whitespace", vars, {})
assert res == 'hello world\n'
def test_template_unicode(self):
template = 'hello {{ who }}'
vars = {
'who': u'wórld',
}
res = ansible.utils.template(template, vars, {}, no_engine=False)
res = ansible.utils.template_from_file("test", "template-basic", vars, {})
assert res == u'hello wórld'
def test_template_varReplace_iterated(self):
template = 'hello $who'
vars = {
'who': 'oh great $person',
'person': 'one',
}
res = ansible.utils.template(template, vars)
assert res == u'hello oh great one'
#####################################
### key-value parsing

@ -0,0 +1 @@
hello {{ who }}

@ -0,0 +1 @@
hello {{ who }}
Loading…
Cancel
Save