Mercurial > piecrust2
annotate piecrust/environment.py @ 69:cb1ed436642c
Always use version generated by `setup.py`. Better version generation.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Sat, 30 Aug 2014 08:35:26 -0700 |
parents | 563ce5dd02af |
children | 0445a2232de7 |
rev | line source |
---|---|
47
558e3602be40
Cache rendered segments to disk.
Ludovic Chabant <ludovic@chabant.com>
parents:
32
diff
changeset
|
1 import re |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
2 import time |
47
558e3602be40
Cache rendered segments to disk.
Ludovic Chabant <ludovic@chabant.com>
parents:
32
diff
changeset
|
3 import json |
0 | 4 import logging |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
5 import threading |
67
563ce5dd02af
I don't care what the YAML spec says, ordered maps are the only sane way.
Ludovic Chabant <ludovic@chabant.com>
parents:
52
diff
changeset
|
6 import collections |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
7 import repoze.lru |
0 | 8 |
9 | |
10 logger = logging.getLogger(__name__) | |
11 | |
12 | |
47
558e3602be40
Cache rendered segments to disk.
Ludovic Chabant <ludovic@chabant.com>
parents:
32
diff
changeset
|
13 re_fs_cache_key = re.compile(r'[^\d\w\-\._]+') |
558e3602be40
Cache rendered segments to disk.
Ludovic Chabant <ludovic@chabant.com>
parents:
32
diff
changeset
|
14 |
558e3602be40
Cache rendered segments to disk.
Ludovic Chabant <ludovic@chabant.com>
parents:
32
diff
changeset
|
15 |
558e3602be40
Cache rendered segments to disk.
Ludovic Chabant <ludovic@chabant.com>
parents:
32
diff
changeset
|
16 def _make_fs_cache_key(key): |
558e3602be40
Cache rendered segments to disk.
Ludovic Chabant <ludovic@chabant.com>
parents:
32
diff
changeset
|
17 return re_fs_cache_key.sub('_', key) |
558e3602be40
Cache rendered segments to disk.
Ludovic Chabant <ludovic@chabant.com>
parents:
32
diff
changeset
|
18 |
558e3602be40
Cache rendered segments to disk.
Ludovic Chabant <ludovic@chabant.com>
parents:
32
diff
changeset
|
19 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
20 class MemCache(object): |
47
558e3602be40
Cache rendered segments to disk.
Ludovic Chabant <ludovic@chabant.com>
parents:
32
diff
changeset
|
21 """ Simple memory cache. It can be backed by a simple file-system |
558e3602be40
Cache rendered segments to disk.
Ludovic Chabant <ludovic@chabant.com>
parents:
32
diff
changeset
|
22 cache, but items need to be JSON-serializable to do this. |
558e3602be40
Cache rendered segments to disk.
Ludovic Chabant <ludovic@chabant.com>
parents:
32
diff
changeset
|
23 """ |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
24 def __init__(self, size=2048): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
25 self.cache = repoze.lru.LRUCache(size) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
26 self.lock = threading.RLock() |
47
558e3602be40
Cache rendered segments to disk.
Ludovic Chabant <ludovic@chabant.com>
parents:
32
diff
changeset
|
27 self.fs_cache = None |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
28 |
49
fce061f8c2ed
Fix cache validation issue with rendered segments, limit disk access.
Ludovic Chabant <ludovic@chabant.com>
parents:
47
diff
changeset
|
29 def get(self, key, item_maker, fs_cache_time=None): |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
30 item = self.cache.get(key) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
31 if item is None: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
32 logger.debug("Acquiring lock for: %s" % key) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
33 with self.lock: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
34 item = self.cache.get(key) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
35 if item is None: |
49
fce061f8c2ed
Fix cache validation issue with rendered segments, limit disk access.
Ludovic Chabant <ludovic@chabant.com>
parents:
47
diff
changeset
|
36 if (self.fs_cache is not None and |
fce061f8c2ed
Fix cache validation issue with rendered segments, limit disk access.
Ludovic Chabant <ludovic@chabant.com>
parents:
47
diff
changeset
|
37 fs_cache_time is not None): |
47
558e3602be40
Cache rendered segments to disk.
Ludovic Chabant <ludovic@chabant.com>
parents:
32
diff
changeset
|
38 # Try first from the file-system cache. |
558e3602be40
Cache rendered segments to disk.
Ludovic Chabant <ludovic@chabant.com>
parents:
32
diff
changeset
|
39 fs_key = _make_fs_cache_key(key) |
49
fce061f8c2ed
Fix cache validation issue with rendered segments, limit disk access.
Ludovic Chabant <ludovic@chabant.com>
parents:
47
diff
changeset
|
40 if self.fs_cache.isValid(fs_key, fs_cache_time): |
fce061f8c2ed
Fix cache validation issue with rendered segments, limit disk access.
Ludovic Chabant <ludovic@chabant.com>
parents:
47
diff
changeset
|
41 logger.debug("'%s' found in file-system cache." % |
fce061f8c2ed
Fix cache validation issue with rendered segments, limit disk access.
Ludovic Chabant <ludovic@chabant.com>
parents:
47
diff
changeset
|
42 key) |
47
558e3602be40
Cache rendered segments to disk.
Ludovic Chabant <ludovic@chabant.com>
parents:
32
diff
changeset
|
43 item_raw = self.fs_cache.read(fs_key) |
67
563ce5dd02af
I don't care what the YAML spec says, ordered maps are the only sane way.
Ludovic Chabant <ludovic@chabant.com>
parents:
52
diff
changeset
|
44 item = json.loads(item_raw, |
563ce5dd02af
I don't care what the YAML spec says, ordered maps are the only sane way.
Ludovic Chabant <ludovic@chabant.com>
parents:
52
diff
changeset
|
45 object_pairs_hook=collections.OrderedDict) |
47
558e3602be40
Cache rendered segments to disk.
Ludovic Chabant <ludovic@chabant.com>
parents:
32
diff
changeset
|
46 self.cache.put(key, item) |
558e3602be40
Cache rendered segments to disk.
Ludovic Chabant <ludovic@chabant.com>
parents:
32
diff
changeset
|
47 return item |
558e3602be40
Cache rendered segments to disk.
Ludovic Chabant <ludovic@chabant.com>
parents:
32
diff
changeset
|
48 |
558e3602be40
Cache rendered segments to disk.
Ludovic Chabant <ludovic@chabant.com>
parents:
32
diff
changeset
|
49 # Look into the mem-cache. |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
50 logger.debug("'%s' not found in cache, must build." % key) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
51 item = item_maker() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
52 self.cache.put(key, item) |
47
558e3602be40
Cache rendered segments to disk.
Ludovic Chabant <ludovic@chabant.com>
parents:
32
diff
changeset
|
53 |
558e3602be40
Cache rendered segments to disk.
Ludovic Chabant <ludovic@chabant.com>
parents:
32
diff
changeset
|
54 # Save to the file-system if needed. |
50
2fec3ee1298f
Properly override pages between realms.
Ludovic Chabant <ludovic@chabant.com>
parents:
49
diff
changeset
|
55 if (self.fs_cache is not None and |
2fec3ee1298f
Properly override pages between realms.
Ludovic Chabant <ludovic@chabant.com>
parents:
49
diff
changeset
|
56 fs_cache_time is not None): |
47
558e3602be40
Cache rendered segments to disk.
Ludovic Chabant <ludovic@chabant.com>
parents:
32
diff
changeset
|
57 item_raw = json.dumps(item) |
558e3602be40
Cache rendered segments to disk.
Ludovic Chabant <ludovic@chabant.com>
parents:
32
diff
changeset
|
58 self.fs_cache.write(fs_key, item_raw) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
59 return item |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
60 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
61 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
62 PHASE_PAGE_PARSING = 0 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
63 PHASE_PAGE_FORMATTING = 1 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
64 PHASE_PAGE_RENDERING = 2 |
0 | 65 |
66 | |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
67 class ExecutionInfo(object): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
68 def __init__(self, page, phase, render_ctx): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
69 self.page = page |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
70 self.phase = phase |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
71 self.render_ctx = render_ctx |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
72 self.was_cache_valid = False |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
73 self.start_time = time.clock() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
74 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
75 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
76 class ExecutionInfoStack(threading.local): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
77 def __init__(self): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
78 self._page_stack = [] |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
79 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
80 @property |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
81 def current_page_info(self): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
82 if len(self._page_stack) == 0: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
83 return None |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
84 return self._page_stack[-1] |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
85 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
86 @property |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
87 def is_main_page(self): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
88 return len(self._page_stack) == 1 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
89 |
12
30a42341cfa8
Define page slugs properly, avoid recursions with debug data.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
90 def hasPage(self, page): |
30a42341cfa8
Define page slugs properly, avoid recursions with debug data.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
91 for ei in self._page_stack: |
30a42341cfa8
Define page slugs properly, avoid recursions with debug data.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
92 if ei.page == page: |
30a42341cfa8
Define page slugs properly, avoid recursions with debug data.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
93 return True |
30a42341cfa8
Define page slugs properly, avoid recursions with debug data.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
94 return False |
30a42341cfa8
Define page slugs properly, avoid recursions with debug data.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
95 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
96 def pushPage(self, page, phase, render_ctx): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
97 self._page_stack.append(ExecutionInfo(page, phase, render_ctx)) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
98 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
99 def popPage(self): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
100 del self._page_stack[-1] |
0 | 101 |
102 | |
103 class Environment(object): | |
104 def __init__(self): | |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
105 self.start_time = time.clock() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
106 self.exec_info_stack = ExecutionInfoStack() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
107 self.was_cache_cleaned = False |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
108 self.page_repository = MemCache() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
109 self.rendered_segments_repository = MemCache() |
32
43091c9837bf
Fix problems with asset URLs.
Ludovic Chabant <ludovic@chabant.com>
parents:
12
diff
changeset
|
110 self.base_asset_url_format = '%uri%' |
52
e52241394791
Don't use file-system caching for rendered segments yet.
Ludovic Chabant <ludovic@chabant.com>
parents:
50
diff
changeset
|
111 self._use_rendered_segments_fs_cache = False |
0 | 112 |
113 def initialize(self, app): | |
52
e52241394791
Don't use file-system caching for rendered segments yet.
Ludovic Chabant <ludovic@chabant.com>
parents:
50
diff
changeset
|
114 if self._use_rendered_segments_fs_cache: |
e52241394791
Don't use file-system caching for rendered segments yet.
Ludovic Chabant <ludovic@chabant.com>
parents:
50
diff
changeset
|
115 cache = app.cache.getCache('renders') |
e52241394791
Don't use file-system caching for rendered segments yet.
Ludovic Chabant <ludovic@chabant.com>
parents:
50
diff
changeset
|
116 self.rendered_segments_repository.fs_cache = cache |
0 | 117 |
118 | |
119 class StandardEnvironment(Environment): | |
1
aaa8fb7c8918
Re-arranged modules to reduce dependencies to builtin stuff.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
120 def __init__(self): |
aaa8fb7c8918
Re-arranged modules to reduce dependencies to builtin stuff.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
121 super(StandardEnvironment, self).__init__() |
0 | 122 |