>>> from jinja2 import Template
>>> template = Template("'{{ foo }}', '{{ bar }}', '{{ baz }}'")
>>> template.render(foo='foobar', bar='barbaz', baz='bazfoo')
('foobar', 'barbaz', 'bazfoo')
>>> from jinja2.nativetypes import NativeEnvironment
>>> e = NativeEnvironment()
>>> t = e.from_string("'{{ foo }}', '{{ bar }}', '{{ baz }}'")
>>> t.render(foo='foobar', bar='barbaz', baz='bazfoo')
'foobar, barbaz, bazfoo'
Trying to find an explanation of the on the above. Tested this in an interpreter to narrow it down to just Jinja2, and nothing else that may be calling it, such as Ansible with jinja2_native set to True.
When not using jinja2_native, we get the expected behavior above that the three substitutions occur with single quotes around each value. When jinja2_native is set to true (in the NativeEnvironment as shown above), the inner single quotes in the string are disregarded, and a single string is returned with the three substitutions.
This also occurs even with additional characters between the single quotes:
>>> e = NativeEnvironment()
>>> t = e.from_string("--foo='{{ foo }}' --bar='{{ bar }}'")
>>> t.render(foo='foobar', bar='barbaz')
u"--foo='foobar --bar=barbaz'"
Any help would be appreciated.
To add a little note on why this (more or less) happens: the template "--foo='{{ foo }}' --bar='{{ bar }}'"
is broken down to the following nodes:
--foo='
{{ foo }}
' --bar='
{{ bar }}
'"
The problem happens when native_concat
processes 3. ' --bar='
, literal_eval
there sees a string, strips the quotes and returns just --bar=
which is correct, just not in this context :)
@davidism any thoughts?
Most helpful comment
To add a little note on why this (more or less) happens: the template
"--foo='{{ foo }}' --bar='{{ bar }}'"
is broken down to the following nodes:--foo='
{{ foo }}
' --bar='
{{ bar }}
'"
The problem happens when
native_concat
processes 3.' --bar='
,literal_eval
there sees a string, strips the quotes and returns just--bar=
which is correct, just not in this context :)@davidism any thoughts?