/
sectileloader.py
70 lines (59 loc) · 2.13 KB
/
sectileloader.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
from collections import OrderedDict
import hashlib
import json
from jinja2 import BaseLoader, TemplateNotFound
from sectile import Sectile
class SectileLoader(BaseLoader):
CACHE_SIZE=100
def __init__(self, fragments_dir):
self.sectile = Sectile(fragments=fragments_dir)
self.prepared_path = None
self.prepared_base = None
self.prepared_dimensions = None
# FIXME LRU cache, not everything ever
self.cache = OrderedDict()
def dimensions(self):
return self.sectile.get_dimensions_list()
def generate_template(self, path, base_template, **dimensions):
fingerprint = '%s-%s-%s' % (
path,
base_template,
json.dumps(dimensions)
)
# print('==', fingerprint)
if fingerprint in self.cache:
print('** cache hit')
self.cache.move_to_end(fingerprint, last=True)
else:
# print('++ cache miss')
content, fragments = self.sectile.generate(
path,
base_template,
**dimensions
)
self.cache[fingerprint] = {
'path': path,
'fingerprint': fingerprint,
'base_template': base_template,
'dimensions': dimensions,
'content': content,
'fragments': fragments,
}
if len(self.cache) > self.CACHE_SIZE:
# print('-- evict cache key')
self.cache.popitem(last=False)
return self.cache[fingerprint]
def prepare_template(self, path, base_template, **dimensions):
generated = self.generate_template(path, base_template, **dimensions)
return generated['fingerprint']
def get_source(self, environment, fingerprint):
if self.cache[fingerprint] is None:
raise TemplateNotFound(
"%s, %s {%s}" % (
self.prepared_path,
self.prepared_base,
self.prepared_dimensions
)
)
else:
return self.cache[fingerprint]['content'], None, None