comparison piecrust/data/linker.py @ 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 27b10024f8d8
children e7b865f8f335
comparison
equal deleted inserted replaced
407:bd56d9acd6ef 408:fd8e39254da0
10 10
11 class PageLinkerData(object): 11 class PageLinkerData(object):
12 """ Entry template data to get access to related pages from a given 12 """ Entry template data to get access to related pages from a given
13 root page. 13 root page.
14 """ 14 """
15 debug_render = ['parent', 'ancestors', 'siblings', 'children', 'root',
16 'forpath']
17 debug_render_invoke = ['parent', 'siblings', 'children']
18
15 def __init__(self, source, page_path): 19 def __init__(self, source, page_path):
16 self._source = source 20 self._source = source
17 self._root_page_path = page_path 21 self._root_page_path = page_path
18 self._linker = None 22 self._linker = None
23 self._is_loaded = False
19 24
20 @property 25 @property
21 def parent(self): 26 def parent(self):
22 self._load() 27 self._load()
23 return self._linker.parent 28 if self._linker is not None:
29 return self._linker.parent
30 return None
24 31
25 @property 32 @property
26 def ancestors(self): 33 def ancestors(self):
27 cur = self.parent 34 cur = self.parent
28 while cur: 35 while cur:
30 cur = cur.parent 37 cur = cur.parent
31 38
32 @property 39 @property
33 def siblings(self): 40 def siblings(self):
34 self._load() 41 self._load()
42 if self._linker is None:
43 return []
35 return self._linker 44 return self._linker
36 45
37 @property 46 @property
38 def children(self): 47 def children(self):
39 self._load() 48 self._load()
49 if self._linker is None:
50 return []
40 self._linker._load() 51 self._linker._load()
41 if self._linker._self_item is None: 52 if self._linker._self_item is None:
42 return [] 53 return []
43 children = self._linker._self_item._linker_info.child_linker 54 children = self._linker._self_item._linker_info.child_linker
44 if children is None: 55 if children is None:
46 return children 57 return children
47 58
48 @property 59 @property
49 def root(self): 60 def root(self):
50 self._load() 61 self._load()
62 if self._linker is None:
63 return None
51 return self._linker.root 64 return self._linker.root
52 65
53 def forpath(self, rel_path): 66 def forpath(self, rel_path):
54 self._load() 67 self._load()
68 if self._linker is None:
69 return None
55 return self._linker.forpath(rel_path) 70 return self._linker.forpath(rel_path)
56 71
57 def _load(self): 72 def _load(self):
58 if self._linker is not None: 73 if self._is_loaded:
74 return
75
76 self._is_loaded = True
77
78 is_listable = isinstance(self._source, IListableSource)
79 if not is_listable:
59 return 80 return
60 81
61 dir_path = self._source.getDirpath(self._root_page_path) 82 dir_path = self._source.getDirpath(self._root_page_path)
62 self._linker = Linker(self._source, dir_path, 83 self._linker = Linker(self._source, dir_path,
63 root_page_path=self._root_page_path) 84 root_page_path=self._root_page_path)
67 """ Class whose instances get returned when iterating on a `Linker` 88 """ Class whose instances get returned when iterating on a `Linker`
68 or `RecursiveLinker`. It's just like what gets usually returned by 89 or `RecursiveLinker`. It's just like what gets usually returned by
69 `Paginator` and other page iterators, but with a few additional data 90 `Paginator` and other page iterators, but with a few additional data
70 like hierarchical data. 91 like hierarchical data.
71 """ 92 """
72 debug_render = ['is_dir', 'is_self'] + PaginationData.debug_render 93 debug_render = (['is_dir', 'is_self', 'parent', 'children'] +
94 PaginationData.debug_render)
95 debug_render_invoke = (['is_dir', 'is_self', 'parent', 'children'] +
96 PaginationData.debug_render_invoke)
73 97
74 def __init__(self, page): 98 def __init__(self, page):
75 super(LinkedPageData, self).__init__(page) 99 super(LinkedPageData, self).__init__(page)
76 self.name = page._linker_info.name 100 self.name = page._linker_info.name
77 self.is_self = page._linker_info.is_self 101 self.is_self = page._linker_info.is_self