1111
1212import os
1313import sys
14+ import ast
1415from optparse import Option , OptionParser
1516
1617sys .path .insert (0 , os .getcwd ())
@@ -246,7 +247,7 @@ def render(template_path, data, extensions, strict=False):
246247 from jinja2 import (
247248 __version__ as jinja_version ,
248249 Environment ,
249- FileSystemLoader ,
250+ BaseLoader ,
250251 StrictUndefined ,
251252 )
252253
@@ -262,7 +263,7 @@ def render(template_path, data, extensions, strict=False):
262263 extensions .append (ext )
263264
264265 env = Environment (
265- loader = FileSystemLoader ( os . path . dirname ( template_path ) ),
266+ loader = BaseLoader ( ),
266267 extensions = extensions ,
267268 keep_trailing_newline = True ,
268269 )
@@ -273,7 +274,23 @@ def render(template_path, data, extensions, strict=False):
273274 env .globals ["environ" ] = lambda key : force_text (os .environ .get (key ))
274275 env .globals ["get_context" ] = lambda : data
275276
276- return env .get_template (os .path .basename (template_path )).render (data )
277+ # parse ansible jinja2 overrides
278+ JINJA2_OVERRIDE = '#jinja2:'
279+ with open (template_path , 'r' ) as f :
280+ template = f .read ()
281+ if template .startswith (JINJA2_OVERRIDE ):
282+ eol = template .find ('\n ' )
283+ line = template [len (JINJA2_OVERRIDE ):eol ]
284+ template = template [eol + 1 :]
285+ for pair in line .split (',' ):
286+ if ':' not in pair :
287+ raise RuntimeError ("failed to parse jinja2 override '%s'."
288+ " Did you use something different from colon as key-value separator?" % pair .strip ())
289+ (key , val ) = pair .split (':' , 1 )
290+ key = key .strip ()
291+ setattr (env , key , ast .literal_eval (val .strip ()))
292+
293+ return env .from_string (template ).render (data )
277294
278295
279296def is_fd_alive (fd ):
0 commit comments