Mercurial > piecrust2
comparison piecrust/configuration.py @ 666:81d9c3a3a0b5
internal: Get rid of the whole "sub cache" business.
* Compute cache keys up front, so the cache directory is only chosen once.
* Buffer up config variants to apply before loading the config. Makes it
possible to cache variant-resulting configs, too.
* Make a factory class to reuse the logic that creates the `PieCrust` object
correctly for multi-process workers and such.
* Add a test.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Thu, 03 Mar 2016 08:22:41 -0800 |
parents | 9ccc933ac2c7 |
children | ec384174b8b2 |
comparison
equal
deleted
inserted
replaced
665:5dc13c816045 | 666:81d9c3a3a0b5 |
---|---|
26 else: | 26 else: |
27 self._values = None | 27 self._values = None |
28 | 28 |
29 def __getitem__(self, key): | 29 def __getitem__(self, key): |
30 self._ensureLoaded() | 30 self._ensureLoaded() |
31 bits = key.split('/') | 31 try: |
32 cur = self._values | 32 return get_dict_value(self._values, key) |
33 for b in bits: | 33 except KeyError: |
34 try: | 34 raise KeyError("No such item: %s" % key) |
35 cur = cur[b] | |
36 except KeyError: | |
37 raise KeyError("No such item: %s" % key) | |
38 return cur | |
39 | 35 |
40 def __setitem__(self, key, value): | 36 def __setitem__(self, key, value): |
41 self._ensureLoaded() | 37 self._ensureLoaded() |
42 value = self._validateValue(key, value) | 38 value = self._validateValue(key, value) |
43 bits = key.split('/') | 39 set_dict_value(self._values, key, value) |
44 bitslen = len(bits) | |
45 cur = self._values | |
46 for i, b in enumerate(bits): | |
47 if i == bitslen - 1: | |
48 cur[b] = value | |
49 else: | |
50 if b not in cur: | |
51 cur[b] = {} | |
52 cur = cur[b] | |
53 | 40 |
54 def __delitem__(self, key): | 41 def __delitem__(self, key): |
55 raise NotImplementedError() | 42 raise NotImplementedError() |
56 | 43 |
57 def __iter__(self): | 44 def __iter__(self): |
125 def _validateAll(self, values): | 112 def _validateAll(self, values): |
126 return values | 113 return values |
127 | 114 |
128 def _validateValue(self, key_path, value): | 115 def _validateValue(self, key_path, value): |
129 return value | 116 return value |
117 | |
118 | |
119 def get_dict_value(d, key): | |
120 bits = key.split('/') | |
121 cur = d | |
122 for b in bits: | |
123 cur = cur[b] | |
124 return cur | |
125 | |
126 | |
127 def set_dict_value(d, key, value): | |
128 bits = key.split('/') | |
129 bitslen = len(bits) | |
130 cur = d | |
131 for i, b in enumerate(bits): | |
132 if i == bitslen - 1: | |
133 cur[b] = value | |
134 else: | |
135 if b not in cur: | |
136 cur[b] = {} | |
137 cur = cur[b] | |
130 | 138 |
131 | 139 |
132 def merge_dicts(source, merging, validator=None, *args): | 140 def merge_dicts(source, merging, validator=None, *args): |
133 _recurse_merge_dicts(source, merging, None, validator) | 141 _recurse_merge_dicts(source, merging, None, validator) |
134 for other in args: | 142 for other in args: |