Keep pre Python 3.10 literal_eval behavior (#76261)

pull/73955/head
Martin Krizek 3 years ago committed by GitHub
parent fe77bc9e3c
commit 95e120ed02
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -0,0 +1,2 @@
minor_changes:
- jinja2_native - keep same behavior on Python 3.10.

@ -184,12 +184,7 @@ class Conditional:
# NOTE The spaces around True and False are intentional to short-circuit literal_eval for
# jinja2_native=False and avoid its expensive calls.
presented = "{%% if %s %%} True {%% else %%} False {%% endif %%}" % conditional
# NOTE Convert the result to text to account for both native and non-native jinja.
# NOTE The templated result of `presented` is string on native jinja as well prior to Python 3.10.
# ast.literal_eval on Python 3.10 removes leading whitespaces so " True " becomes bool True
# as opposed to Python 3.9 and lower where the same would result in IndentationError and
# string " True " would be returned by Templar.
val = to_text(templar.template(presented, disable_lookups=disable_lookups)).strip()
val = templar.template(presented, disable_lookups=disable_lookups).strip()
if val == "True":
return True
elif val == "False":

@ -140,6 +140,11 @@ def ansible_native_concat(nodes):
out = ''.join([to_text(_fail_on_undefined(v)) for v in chain(head, nodes)])
try:
return ast.literal_eval(out)
return ast.literal_eval(
# In Python 3.10+ ast.literal_eval removes leading spaces/tabs
# from the given string. For backwards compatibility we need to
# parse the string ourselves without removing leading spaces/tabs.
ast.parse(out, mode='eval')
)
except (ValueError, SyntaxError, MemoryError):
return out

Loading…
Cancel
Save