Mercurial > piecrust2
annotate piecrust/templating/inukshukengine.py @ 1188:a7c43131d871
bake: Fix file write flushing problem with Python 3.8+
Writing the cache files fails in Python 3.8 because it looks like flushing
behaviour has changed. We need to explicitly flush. And even then, in very
rare occurrences, it looks like it can still run into racing conditions,
so we do a very hacky and ugly "retry" loop when fetching cached data :(
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Tue, 15 Jun 2021 22:36:23 -0700 |
parents | 6370ab74b2d5 |
children |
rev | line source |
---|---|
1012
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
1 import io |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
2 import os.path |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
3 import time |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
4 import logging |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
5 from inukshuk.parser import ParserError |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
6 from piecrust.templating.base import ( |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
7 TemplateEngine, TemplatingError, TemplateNotFoundError) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
8 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
9 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
10 logger = logging.getLogger(__name__) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
11 |
1013
6370ab74b2d5
internal: Don't profile the Inukshuk engine by default, duh.
Ludovic Chabant <ludovic@chabant.com>
parents:
1012
diff
changeset
|
12 _profile = False |
1012
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
13 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
14 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
15 class InukshukTemplateEngine(TemplateEngine): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
16 ENGINE_NAMES = ['inukshuk', 'inuk'] |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
17 EXTENSIONS = ['html', 'inuk'] |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
18 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
19 def __init__(self): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
20 self.engine = None |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
21 self.pc_cache = {} |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
22 self._seg_loader = None |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
23 self._buf = io.StringIO() |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
24 self._buf.truncate(2048) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
25 if _profile: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
26 self._renderTemplate = self._renderTemplateProf |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
27 else: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
28 self._renderTemplate = self._renderTemplateNoProf |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
29 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
30 def populateCache(self): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
31 self._ensureLoaded() |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
32 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
33 used_names = set() |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
34 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
35 def _filter_names(name): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
36 if name in used_names: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
37 return False |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
38 used_names.add(name) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
39 return True |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
40 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
41 self.engine.cacheAllTemplates(cache_condition=_filter_names) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
42 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
43 def renderSegment(self, path, segment, data): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
44 if not _string_needs_render(segment.content): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
45 return segment.content, False |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
46 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
47 self._ensureLoaded() |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
48 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
49 tpl_name = os.path.relpath(path, self.app.root_dir) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
50 try: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
51 self._seg_loader.templates[tpl_name] = segment.content |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
52 tpl = self.engine.getTemplate(tpl_name, memmodule=True) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
53 return self._renderTemplate(tpl, data), True |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
54 except ParserError as pe: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
55 raise TemplatingError(pe.message, path, pe.line_num) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
56 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
57 def renderFile(self, paths, data): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
58 self._ensureLoaded() |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
59 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
60 tpl = None |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
61 rendered_path = None |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
62 for p in paths: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
63 try: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
64 tpl = self.engine.getTemplate(p) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
65 rendered_path = p |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
66 break |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
67 except Exception: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
68 pass |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
69 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
70 if tpl is None: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
71 raise TemplateNotFoundError() |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
72 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
73 try: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
74 return self._renderTemplate(tpl, data) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
75 except ParserError as pe: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
76 raise TemplatingError(pe.message, rendered_path, pe.line_num) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
77 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
78 def _renderTemplateNoProf(self, tpl, data): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
79 return tpl.render(data) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
80 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
81 def _renderTemplateIntoNoProf(self, tpl, data): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
82 buf = self._buf |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
83 buf.seek(0) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
84 tpl.renderInto(data, buf) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
85 buf.flush() |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
86 size = buf.tell() |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
87 buf.seek(0) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
88 return buf.read(size) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
89 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
90 def _renderTemplateProf(self, tpl, data): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
91 stats = self.app.env.stats |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
92 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
93 # Code copied from Inukshuk, but with an `out_write` method that |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
94 # wraps a timer scope. |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
95 out = [] |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
96 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
97 def out_write(s): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
98 start = time.perf_counter() |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
99 out.append(s) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
100 stats.stepTimerSince('Inukshuk_outWrite', start) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
101 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
102 tpl._renderWithContext(None, data, out_write) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
103 return ''.join(out) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
104 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
105 def _ensureLoaded(self): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
106 if self.engine is not None: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
107 return |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
108 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
109 from inukshuk.engine import Engine |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
110 from inukshuk.loader import ( |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
111 StringsLoader, FileSystemLoader, CompositeLoader) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
112 from ._inukshukext import PieCrustExtension |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
113 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
114 self._seg_loader = StringsLoader() |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
115 loader = CompositeLoader([ |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
116 self._seg_loader, |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
117 FileSystemLoader(self.app.templates_dirs)]) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
118 self.engine = Engine(loader) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
119 self.engine.autoescape = True |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
120 self.engine.extensions.append(PieCrustExtension(self.app)) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
121 self.engine.compile_templates = True |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
122 self.engine.compile_cache_dir = os.path.join( |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
123 self.app.cache_dir, 'inuk') |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
124 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
125 if _profile: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
126 # If we're profiling, monkeypatch all the appropriate methods |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
127 # from the Inukshuk API. |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
128 stats = self.app.env.stats |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
129 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
130 import inukshuk.rendering |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
131 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
132 afe = inukshuk.rendering._attr_first_access |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
133 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
134 def wafe(ctx, data, prop_name): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
135 with stats.timerScope('Inukshuk_query'): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
136 return afe(ctx, data, prop_name) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
137 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
138 inukshuk.rendering._attr_first_access = wafe |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
139 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
140 afer = inukshuk.rendering._attr_first_access_root |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
141 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
142 def wafer(ctx, ctx_locals, data, ctx_globals, prop_name): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
143 with stats.timerScope('Inukshuk_query'): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
144 return afer(ctx, ctx_locals, data, ctx_globals, prop_name) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
145 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
146 inukshuk.rendering._attr_first_access_root = wafer |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
147 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
148 i = inukshuk.rendering.RenderContext.invoke |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
149 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
150 def wi(ctx, data, out, data_func, *args, **kwargs): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
151 with stats.timerScope('Inukshuk_invoke'): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
152 return i(ctx, data, out, data_func, *args, **kwargs) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
153 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
154 inukshuk.rendering.RenderContext.invoke = wi |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
155 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
156 import inukshuk.template |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
157 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
158 cc = inukshuk.template.Template._compileContent |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
159 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
160 def wcc(tpl, force_compiled=False): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
161 with stats.timerScope('Inukshuk_templateCompileContent'): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
162 return cc(tpl, force_compiled) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
163 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
164 inukshuk.template.Template._compileContent = wcc |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
165 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
166 dr = inukshuk.template.Template._doRender |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
167 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
168 def wdr(tpl, ctx, data, out): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
169 with stats.timerScope('Inukshuk_templateDoRender'): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
170 return dr(tpl, ctx, data, out) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
171 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
172 inukshuk.template.Template._doRender = wdr |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
173 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
174 stats.registerTimer('Inukshuk_query') |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
175 stats.registerTimer('Inukshuk_invoke') |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
176 stats.registerTimer('Inukshuk_templateDoRender') |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
177 stats.registerTimer('Inukshuk_templateCompileContent') |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
178 stats.registerTimer('Inukshuk_outWrite') |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
179 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
180 try: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
181 os.makedirs(self.engine.compile_cache_dir) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
182 except OSError: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
183 pass |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
184 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
185 |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
186 def _string_needs_render(txt): |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
187 index = txt.find('{') |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
188 while index >= 0: |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
189 ch = txt[index + 1] |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
190 if ch == '{' or ch == '%': |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
191 return True |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
192 index = txt.find('{', index + 1) |
576f7ebcd9c0
templating: Add Inukshuk template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
193 return False |