Coverage for src\zapy\templating\templating.py: 90%
31 statements
« prev ^ index » next coverage.py v7.3.4, created at 2023-12-20 14:17 -0500
« prev ^ index » next coverage.py v7.3.4, created at 2023-12-20 14:17 -0500
1import ast
3from jinja2 import Environment, StrictUndefined
5from .eval import sync_eval
8# internal use only
10def evaluate(value, variables: dict | None = None):
11 if variables is None: 11 ↛ 12line 11 didn't jump to line 12, because the condition on line 11 was never true
12 variables = dict()
13 if _is_python(value):
14 expression = _extract_expression(value)
15 return sync_eval(expression, variables)
16 else:
17 return render(value, variables)
19def render(source, variables: dict):
20 def raise_helper(msg):
21 raise Exception(msg)
22 jinja = Environment(undefined=StrictUndefined)
23 jinja.globals['raise'] = raise_helper
24 template = jinja.from_string(source)
25 rendered_template = template.render(**variables)
26 return rendered_template
28def _extract_expression(value):
29 return value.removeprefix('{{').removesuffix('}}').strip()
31def _is_python(value: str):
32 if not (value.startswith('{{') and value.endswith('}}')):
33 return False
34 expression = _extract_expression(value)
35 if '{{' not in expression:
36 return True
37 try:
38 ast.parse(expression)
39 return True
40 except SyntaxError:
41 return False