# HG changeset patch # User Ludovic Chabant # Date 1434868024 25200 # Node ID f1b759c188b0ca07038e0370b8b6427d92a75009 # Parent 6801ad5aa1d497ac419a77ec160962c82f42f23d internal: Optimize page data building. Instead of loading the page to get its configuration, use a lazy-loader. diff -r 6801ad5aa1d4 -r f1b759c188b0 piecrust/data/base.py --- a/piecrust/data/base.py Sat Jun 20 23:25:38 2015 -0700 +++ b/piecrust/data/base.py Sat Jun 20 23:27:04 2015 -0700 @@ -101,7 +101,7 @@ "loaded") self._values[name] = value - def mapLoader(self, attr_name, loader): + def mapLoader(self, attr_name, loader, override_existing=False): if loader is None: if self._loaders is None or attr_name not in self._loaders: return @@ -112,11 +112,15 @@ if self._loaders is None: self._loaders = {} - if attr_name in self._loaders: + if not override_existing and attr_name in self._loaders: raise Exception( "A loader has already been mapped for: %s" % attr_name) self._loaders[attr_name] = loader + def mapValue(self, attr_name, value, override_existing=False): + loader = lambda _, __: value + self.mapLoader(attr_name, loader, override_existing=override_existing) + def _load(self): if self._values is not None: return diff -r 6801ad5aa1d4 -r f1b759c188b0 piecrust/data/builder.py --- a/piecrust/data/builder.py Sat Jun 20 23:25:38 2015 -0700 +++ b/piecrust/data/builder.py Sat Jun 20 23:27:04 2015 -0700 @@ -6,6 +6,7 @@ from piecrust import APP_VERSION from piecrust.configuration import merge_dicts from piecrust.data.assetor import Assetor +from piecrust.data.base import LazyPageConfigData from piecrust.data.debug import build_debug_info from piecrust.data.linker import PageLinkerData from piecrust.data.paginator import Paginator @@ -37,6 +38,7 @@ first_uri, _ = split_sub_uri(app, ctx.uri) pc_data = PieCrustData() + config_data = LazyPageConfigData(page) pgn_source = ctx.pagination_source or get_default_pagination_source(page) paginator = Paginator(page, pgn_source, page_num=ctx.page_num, @@ -45,19 +47,21 @@ linker = PageLinkerData(page.source, page.rel_path) data = { 'piecrust': pc_data, - 'page': {}, + 'page': config_data, 'assets': assetor, 'pagination': paginator, 'family': linker } - page_data = data['page'] - page_data.update(copy.deepcopy(page.source_metadata)) - page_data.update(page.config.getDeepcopy(app.debug)) - page_data['url'] = ctx.uri - page_data['timestamp'] = time.mktime(page.datetime.timetuple()) + + for k, v in page.source_metadata.items(): + config_data.mapValue(k, copy.deepcopy(v)) + config_data.mapValue('url', ctx.uri, override_existing=True) + config_data.mapValue('timestamp', time.mktime(page.datetime.timetuple()), + override_existing=True) date_format = app.config.get('site/date_format') if date_format: - page_data['date'] = page.datetime.strftime(date_format) + config_data.mapValue('date', page.datetime.strftime(date_format), + override_existing=True) #TODO: handle slugified taxonomy terms.