Passed
Push — develop ( 503712...bde8f9 )
by Shalom
02:13
created

inji.engine   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 90
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 7
eloc 60
dl 0
loc 90
ccs 47
cts 47
cp 1
rs 10
c 0
b 0
f 0

2 Methods

Rating   Name   Duplication   Size   Complexity  
A TemplateEngine.__init__() 0 37 4
A TemplateEngine.render() 0 28 2

1 Function

Rating   Name   Duplication   Size   Complexity  
A get_symbols() 0 4 1
1
#!/usr/bin/env python3
2
3
# -*- coding: utf-8 -*-
4
5 1
from jinja2 import DebugUndefined, StrictUndefined, Undefined, make_logging_undefined
6 1
from jinja2 import Environment, FileSystemLoader
7 1
from jinja2.exceptions import TemplateNotFound, UndefinedError
8 1
import sys
9 1
import logging
10 1
import inspect
11
12 1
from . import utils
13 1
from . import filters
14 1
from . import tests
15 1
from . import globals
16
17 1
def get_symbols(mod):
18 1
  return { k:v for k,v
19
            in inspect.getmembers(mod)
20
            if not (k.startswith('_')) }
21
22 1
class TemplateEngine(object):
23
24 1
  def __init__( self,
25
                undefined_variables_mode_behaviour='strict',
26
                j2_env_params={},
27
    ):
28
29 1
    m = undefined_variables_mode_behaviour
30 1
    if   m in ['strict', 'StrictUndefined']:
31 1
      Handler = StrictUndefined
32 1
    elif m in ['empty',  'Undefined']:
33 1
      Handler = Undefined
34 1
    elif m in ['keep',   'DebugUndefined']:
35 1
      Handler = DebugUndefined
36
37
    # Setup debug logging on STDERR to have the jinja2 engine emit
38
    # its activities
39 1
    root = logging.getLogger(__name__)
40 1
    root.setLevel(logging.DEBUG)
41 1
    handler = logging.StreamHandler(sys.stderr)
42 1
    handler.setFormatter(logging.Formatter('%(name)s %(levelname)s: %(message)s'))
43 1
    root.addHandler(handler)
44
45 1
    UndefinedHandler = make_logging_undefined( logger=root, base=Handler )
0 ignored issues
show
introduced by
The variable Handler does not seem to be defined for all execution paths.
Loading history...
46
47 1
    j2_env_params.setdefault('undefined', UndefinedHandler)
48 1
    j2_env_params.setdefault('trim_blocks', True)
49 1
    j2_env_params.setdefault('keep_trailing_newline', False)
50 1
    j2_env_params.setdefault('extensions', [
51
                            'jinja2.ext.i18n',
52
                            'jinja2.ext.do',
53
                            'jinja2.ext.loopcontrols',
54
                          ])
55
56 1
    self.j2_env_params = j2_env_params
57
58 1
    self.filters = get_symbols(filters)
59 1
    self.tests   = get_symbols(tests)
60 1
    self.globals = get_symbols(globals)
61
62 1
  def render(
63
      self,
64
      template,
65
      context
66
    ):
67
    """ Render the template """
68
69
    # We don't assume that includes and other sourceables reside relative
70
    # to the current directory but instead relative to the "master" template
71
    # we are processing. We deviate from jinja tradition this way.
72
    # This is because.
73
    # 1. We process template from stdin in temporary directories
74
    # 2. We should be free to change the process CWD and not break rendering
75 1
    rootdir = utils.dirname(template)
76
77 1
    self.j2_env_params.setdefault('loader', FileSystemLoader(rootdir))
78 1
    j2_env = Environment(**self.j2_env_params)
79
80 1
    j2_env.globals.update(self.globals)
81 1
    j2_env.filters.update(self.filters)
82 1
    j2_env.tests.update(self.tests)
83
84 1
    try:
85 1
      template = utils.basename(template)
86 1
      yield j2_env.get_template(template).render(context)
87 1
    except UndefinedError as e:
88 1
      raise UndefinedError( "variable {} in template '{}'".format(
89
              str(e), template) ) from e
90
91