Mercurial > piecrust2
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 |