# HG changeset patch # User Ludovic Chabant # Date 1432604254 25200 # Node ID fd8e39254da096f36eb1d67bcd28cc24a08ea38e # Parent bd56d9acd6ef6756956cdf1f75e729a3e8502442 debug: Better debug info output for iterators, providers, and linkers. diff -r bd56d9acd6ef -r fd8e39254da0 piecrust/data/base.py --- 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 diff -r bd56d9acd6ef -r fd8e39254da0 piecrust/data/iterators.py --- 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) + diff -r bd56d9acd6ef -r fd8e39254da0 piecrust/data/linker.py --- 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) diff -r bd56d9acd6ef -r fd8e39254da0 piecrust/data/provider.py --- 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'