comparison piecrust/data/base.py @ 420:f1b759c188b0

internal: Optimize page data building. Instead of loading the page to get its configuration, use a lazy-loader.
author Ludovic Chabant <ludovic@chabant.com>
date Sat, 20 Jun 2015 23:27:04 -0700
parents 0e9a94b7fdfa
children 21e26ed867b6
comparison
equal deleted inserted replaced
419:6801ad5aa1d4 420:f1b759c188b0
99 if self._values is None: 99 if self._values is None:
100 raise Exception("Can't call _setValue before this data has been " 100 raise Exception("Can't call _setValue before this data has been "
101 "loaded") 101 "loaded")
102 self._values[name] = value 102 self._values[name] = value
103 103
104 def mapLoader(self, attr_name, loader): 104 def mapLoader(self, attr_name, loader, override_existing=False):
105 if loader is None: 105 if loader is None:
106 if self._loaders is None or attr_name not in self._loaders: 106 if self._loaders is None or attr_name not in self._loaders:
107 return 107 return
108 del self._loaders[attr_name] 108 del self._loaders[attr_name]
109 if len(self._loaders) == 0: 109 if len(self._loaders) == 0:
110 self._loaders = None 110 self._loaders = None
111 return 111 return
112 112
113 if self._loaders is None: 113 if self._loaders is None:
114 self._loaders = {} 114 self._loaders = {}
115 if attr_name in self._loaders: 115 if not override_existing and attr_name in self._loaders:
116 raise Exception( 116 raise Exception(
117 "A loader has already been mapped for: %s" % attr_name) 117 "A loader has already been mapped for: %s" % attr_name)
118 self._loaders[attr_name] = loader 118 self._loaders[attr_name] = loader
119
120 def mapValue(self, attr_name, value, override_existing=False):
121 loader = lambda _, __: value
122 self.mapLoader(attr_name, loader, override_existing=override_existing)
119 123
120 def _load(self): 124 def _load(self):
121 if self._values is not None: 125 if self._values is not None:
122 return 126 return
123 self._values = self._page.config.getDeepcopy(self._page.app.debug) 127 self._values = self._page.config.getDeepcopy(self._page.app.debug)