changeset 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 6801ad5aa1d4
children 4a43d7015b75
files piecrust/data/base.py piecrust/data/builder.py
diffstat 2 files changed, 17 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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.