changeset 408:fd8e39254da0

debug: Better debug info output for iterators, providers, and linkers.
author Ludovic Chabant <ludovic@chabant.com>
date Mon, 25 May 2015 18:37:34 -0700
parents bd56d9acd6ef
children 2bb5327c4c1f
files piecrust/data/base.py piecrust/data/iterators.py piecrust/data/linker.py piecrust/data/provider.py
diffstat 4 files changed, 41 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/piecrust/data/base.py	Mon May 25 18:36:44 2015 -0700
+++ b/piecrust/data/base.py	Mon May 25 18:37:34 2015 -0700
@@ -21,7 +21,9 @@
         to the templating system.
     """
     debug_render = []
+    debug_render_invoke = []
     debug_render_dynamic = ['_debugRenderKeys']
+    debug_render_invoke_dynamic = ['_debugRenderKeys']
 
     def __init__(self, page):
         self._page = page
--- a/piecrust/data/iterators.py	Mon May 25 18:36:44 2015 -0700
+++ b/piecrust/data/iterators.py	Mon May 25 18:37:34 2015 -0700
@@ -108,6 +108,10 @@
 
 
 class PageIterator(object):
+    debug_render = []
+    debug_render_doc_dynamic = ['_debugRenderDoc']
+    debug_render_not_empty = True
+
     def __init__(self, source, current_page=None, pagination_filter=None,
             offset=0, limit=-1, locked=False):
         self._source = source
@@ -303,3 +307,6 @@
             pn_it = self._source.getTailIterator(iter(pn))
             self._prev_page, self._next_page = (list(pn_it))
 
+    def _debugRenderDoc(self):
+        return "Contains %d items" % len(self)
+
--- a/piecrust/data/linker.py	Mon May 25 18:36:44 2015 -0700
+++ b/piecrust/data/linker.py	Mon May 25 18:37:34 2015 -0700
@@ -12,15 +12,22 @@
     """ Entry template data to get access to related pages from a given
         root page.
     """
+    debug_render = ['parent', 'ancestors', 'siblings', 'children', 'root',
+                    'forpath']
+    debug_render_invoke = ['parent', 'siblings', 'children']
+
     def __init__(self, source, page_path):
         self._source = source
         self._root_page_path = page_path
         self._linker = None
+        self._is_loaded = False
 
     @property
     def parent(self):
         self._load()
-        return self._linker.parent
+        if self._linker is not None:
+            return self._linker.parent
+        return None
 
     @property
     def ancestors(self):
@@ -32,11 +39,15 @@
     @property
     def siblings(self):
         self._load()
+        if self._linker is None:
+            return []
         return self._linker
 
     @property
     def children(self):
         self._load()
+        if self._linker is None:
+            return []
         self._linker._load()
         if self._linker._self_item is None:
             return []
@@ -48,14 +59,24 @@
     @property
     def root(self):
         self._load()
+        if self._linker is None:
+            return None
         return self._linker.root
 
     def forpath(self, rel_path):
         self._load()
+        if self._linker is None:
+            return None
         return self._linker.forpath(rel_path)
 
     def _load(self):
-        if self._linker is not None:
+        if self._is_loaded:
+            return
+
+        self._is_loaded = True
+
+        is_listable = isinstance(self._source, IListableSource)
+        if not is_listable:
             return
 
         dir_path = self._source.getDirpath(self._root_page_path)
@@ -69,7 +90,10 @@
         `Paginator` and other page iterators, but with a few additional data
         like hierarchical data.
     """
-    debug_render = ['is_dir', 'is_self'] + PaginationData.debug_render
+    debug_render = (['is_dir', 'is_self', 'parent', 'children'] +
+                    PaginationData.debug_render)
+    debug_render_invoke = (['is_dir', 'is_self', 'parent', 'children'] +
+                           PaginationData.debug_render_invoke)
 
     def __init__(self, page):
         super(LinkedPageData, self).__init__(page)
--- a/piecrust/data/provider.py	Mon May 25 18:36:44 2015 -0700
+++ b/piecrust/data/provider.py	Mon May 25 18:37:34 2015 -0700
@@ -37,7 +37,8 @@
 class IteratorDataProvider(DataProvider):
     PROVIDER_NAME = 'iterator'
 
-    debug_render_doc = """Provides a list of pages."""
+    debug_render_doc_dynamic = ['_debugRenderDoc']
+    debug_render_not_empty = True
 
     def __init__(self, source, page, user_data):
         self._innerIt = None
@@ -70,6 +71,9 @@
             eis.current_page_info.render_ctx.addUsedSource(self._source.name)
             self._ctx_set = True
 
+    def _debugRenderDoc(self):
+        return 'Provides a list of %d items' % len(self)
+
 
 class BlogDataProvider(DataProvider):
     PROVIDER_NAME = 'blog'