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

1import ast 

2 

3from jinja2 import Environment, StrictUndefined 

4 

5from .eval import sync_eval 

6 

7 

8# internal use only 

9 

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) 

18 

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 

27 

28def _extract_expression(value): 

29 return value.removeprefix('{{').removesuffix('}}').strip() 

30 

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