Mercurial > piecrust2
annotate piecrust/data/iterators.py @ 828:bca06fc064c0
Use assetor provided by page source when paginating
author | Ben Artin <ben@artins.org> |
---|---|
date | Sun, 01 Jan 2017 19:32:19 -0500 |
parents | e35407c60e00 |
children | 4850f8c21b6e |
rev | line source |
---|---|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
1 import logging |
581
911a054f4fbd
bake: Add support for a "known" page setting that excludes it from the bake.
Ludovic Chabant <ludovic@chabant.com>
parents:
455
diff
changeset
|
2 from piecrust.data.filters import PaginationFilter, IsFilterClause, NotClause |
455
cb3446be44b7
bake: Abort "render first" jobs if we start using other pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
408
diff
changeset
|
3 from piecrust.environment import AbortedSourceUseError |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
4 from piecrust.events import Event |
455
cb3446be44b7
bake: Abort "render first" jobs if we start using other pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
408
diff
changeset
|
5 from piecrust.sources.base import PageSource |
242
f130365568ff
internal: Code reorganization to put less stuff in `sources.base`.
Ludovic Chabant <ludovic@chabant.com>
parents:
233
diff
changeset
|
6 from piecrust.sources.interfaces import IPaginationSource |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
7 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
8 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
9 logger = logging.getLogger(__name__) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
10 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
11 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
12 class SliceIterator(object): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
13 def __init__(self, it, offset=0, limit=-1): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
14 self.it = it |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
15 self.offset = offset |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
16 self.limit = limit |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
17 self.current_page = None |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
18 self.has_more = False |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
19 self.inner_count = -1 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
20 self.next_page = None |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
21 self.prev_page = None |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
22 self._cache = None |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
23 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
24 def __iter__(self): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
25 if self._cache is None: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
26 inner_list = list(self.it) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
27 self.inner_count = len(inner_list) |
10
cd35d356ccce
Fix some bugs with iterators, add some unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
6
diff
changeset
|
28 |
cd35d356ccce
Fix some bugs with iterators, add some unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
6
diff
changeset
|
29 if self.limit > 0: |
cd35d356ccce
Fix some bugs with iterators, add some unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
6
diff
changeset
|
30 self.has_more = self.inner_count > (self.offset + self.limit) |
cd35d356ccce
Fix some bugs with iterators, add some unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
6
diff
changeset
|
31 self._cache = inner_list[self.offset:self.offset + self.limit] |
cd35d356ccce
Fix some bugs with iterators, add some unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
6
diff
changeset
|
32 else: |
cd35d356ccce
Fix some bugs with iterators, add some unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
6
diff
changeset
|
33 self.has_more = False |
cd35d356ccce
Fix some bugs with iterators, add some unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
6
diff
changeset
|
34 self._cache = inner_list[self.offset:] |
cd35d356ccce
Fix some bugs with iterators, add some unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
6
diff
changeset
|
35 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
36 if self.current_page: |
21
53b9df2263dc
Fix for pages listing pages from other sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
37 try: |
53b9df2263dc
Fix for pages listing pages from other sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
38 idx = inner_list.index(self.current_page) |
53b9df2263dc
Fix for pages listing pages from other sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
39 except ValueError: |
53b9df2263dc
Fix for pages listing pages from other sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
40 idx = -1 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
41 if idx >= 0: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
42 if idx < self.inner_count - 1: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
43 self.next_page = inner_list[idx + 1] |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
44 if idx > 0: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
45 self.prev_page = inner_list[idx - 1] |
10
cd35d356ccce
Fix some bugs with iterators, add some unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
6
diff
changeset
|
46 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
47 return iter(self._cache) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
48 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
49 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
50 class SettingFilterIterator(object): |
233
4379d8f8f831
internal: Removing some dependency of filters and iterators on pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
228
diff
changeset
|
51 def __init__(self, it, fil_conf, setting_accessor=None): |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
52 self.it = it |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
53 self.fil_conf = fil_conf |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
54 self._fil = None |
233
4379d8f8f831
internal: Removing some dependency of filters and iterators on pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
228
diff
changeset
|
55 self.setting_accessor = setting_accessor |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
56 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
57 def __iter__(self): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
58 if self._fil is None: |
280
8c0c53a315ae
data: Correctly build pagination filters when we know items are pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
242
diff
changeset
|
59 self._fil = PaginationFilter(value_accessor=self.setting_accessor) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
60 self._fil.addClausesFromConfig(self.fil_conf) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
61 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
62 for i in self.it: |
233
4379d8f8f831
internal: Removing some dependency of filters and iterators on pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
228
diff
changeset
|
63 if self._fil.pageMatches(i): |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
64 yield i |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
65 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
66 |
10
cd35d356ccce
Fix some bugs with iterators, add some unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
6
diff
changeset
|
67 class NaturalSortIterator(object): |
cd35d356ccce
Fix some bugs with iterators, add some unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
6
diff
changeset
|
68 def __init__(self, it, reverse=False): |
cd35d356ccce
Fix some bugs with iterators, add some unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
6
diff
changeset
|
69 self.it = it |
cd35d356ccce
Fix some bugs with iterators, add some unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
6
diff
changeset
|
70 self.reverse = reverse |
cd35d356ccce
Fix some bugs with iterators, add some unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
6
diff
changeset
|
71 |
cd35d356ccce
Fix some bugs with iterators, add some unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
6
diff
changeset
|
72 def __iter__(self): |
cd35d356ccce
Fix some bugs with iterators, add some unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
6
diff
changeset
|
73 return iter(sorted(self.it, reverse=self.reverse)) |
cd35d356ccce
Fix some bugs with iterators, add some unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
6
diff
changeset
|
74 |
cd35d356ccce
Fix some bugs with iterators, add some unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
6
diff
changeset
|
75 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
76 class SettingSortIterator(object): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
77 def __init__(self, it, name, reverse=False, value_accessor=None): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
78 self.it = it |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
79 self.name = name |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
80 self.reverse = reverse |
226
e9dc18a275ff
data: Add ability for `IPaginationSource`s to specify how to get settings.
Ludovic Chabant <ludovic@chabant.com>
parents:
21
diff
changeset
|
81 self.value_accessor = value_accessor or self._default_value_accessor |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
82 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
83 def __iter__(self): |
10
cd35d356ccce
Fix some bugs with iterators, add some unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
6
diff
changeset
|
84 return iter(sorted(self.it, key=self._key_getter, |
cd35d356ccce
Fix some bugs with iterators, add some unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
6
diff
changeset
|
85 reverse=self.reverse)) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
86 |
10
cd35d356ccce
Fix some bugs with iterators, add some unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
6
diff
changeset
|
87 def _key_getter(self, item): |
226
e9dc18a275ff
data: Add ability for `IPaginationSource`s to specify how to get settings.
Ludovic Chabant <ludovic@chabant.com>
parents:
21
diff
changeset
|
88 key = self.value_accessor(item, self.name) |
e9dc18a275ff
data: Add ability for `IPaginationSource`s to specify how to get settings.
Ludovic Chabant <ludovic@chabant.com>
parents:
21
diff
changeset
|
89 if key is None: |
e9dc18a275ff
data: Add ability for `IPaginationSource`s to specify how to get settings.
Ludovic Chabant <ludovic@chabant.com>
parents:
21
diff
changeset
|
90 return 0 |
e9dc18a275ff
data: Add ability for `IPaginationSource`s to specify how to get settings.
Ludovic Chabant <ludovic@chabant.com>
parents:
21
diff
changeset
|
91 return key |
e9dc18a275ff
data: Add ability for `IPaginationSource`s to specify how to get settings.
Ludovic Chabant <ludovic@chabant.com>
parents:
21
diff
changeset
|
92 |
e9dc18a275ff
data: Add ability for `IPaginationSource`s to specify how to get settings.
Ludovic Chabant <ludovic@chabant.com>
parents:
21
diff
changeset
|
93 @staticmethod |
e9dc18a275ff
data: Add ability for `IPaginationSource`s to specify how to get settings.
Ludovic Chabant <ludovic@chabant.com>
parents:
21
diff
changeset
|
94 def _default_value_accessor(item, name): |
e9dc18a275ff
data: Add ability for `IPaginationSource`s to specify how to get settings.
Ludovic Chabant <ludovic@chabant.com>
parents:
21
diff
changeset
|
95 try: |
e9dc18a275ff
data: Add ability for `IPaginationSource`s to specify how to get settings.
Ludovic Chabant <ludovic@chabant.com>
parents:
21
diff
changeset
|
96 return getattr(item, name) |
e9dc18a275ff
data: Add ability for `IPaginationSource`s to specify how to get settings.
Ludovic Chabant <ludovic@chabant.com>
parents:
21
diff
changeset
|
97 except AttributeError: |
e9dc18a275ff
data: Add ability for `IPaginationSource`s to specify how to get settings.
Ludovic Chabant <ludovic@chabant.com>
parents:
21
diff
changeset
|
98 return None |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
99 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
100 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
101 class PaginationFilterIterator(object): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
102 def __init__(self, it, fil): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
103 self.it = it |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
104 self._fil = fil |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
105 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
106 def __iter__(self): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
107 for page in self.it: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
108 if self._fil.pageMatches(page): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
109 yield page |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
110 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
111 |
729
e35407c60e00
templating: Make blog archives generator expose more templating data.
Ludovic Chabant <ludovic@chabant.com>
parents:
581
diff
changeset
|
112 class GenericSortIterator(object): |
e35407c60e00
templating: Make blog archives generator expose more templating data.
Ludovic Chabant <ludovic@chabant.com>
parents:
581
diff
changeset
|
113 def __init__(self, it, sorter): |
e35407c60e00
templating: Make blog archives generator expose more templating data.
Ludovic Chabant <ludovic@chabant.com>
parents:
581
diff
changeset
|
114 self.it = it |
e35407c60e00
templating: Make blog archives generator expose more templating data.
Ludovic Chabant <ludovic@chabant.com>
parents:
581
diff
changeset
|
115 self.sorter = sorter |
e35407c60e00
templating: Make blog archives generator expose more templating data.
Ludovic Chabant <ludovic@chabant.com>
parents:
581
diff
changeset
|
116 self._sorted_it = None |
e35407c60e00
templating: Make blog archives generator expose more templating data.
Ludovic Chabant <ludovic@chabant.com>
parents:
581
diff
changeset
|
117 |
e35407c60e00
templating: Make blog archives generator expose more templating data.
Ludovic Chabant <ludovic@chabant.com>
parents:
581
diff
changeset
|
118 def __iter__(self): |
e35407c60e00
templating: Make blog archives generator expose more templating data.
Ludovic Chabant <ludovic@chabant.com>
parents:
581
diff
changeset
|
119 if self._sorted_it is None: |
e35407c60e00
templating: Make blog archives generator expose more templating data.
Ludovic Chabant <ludovic@chabant.com>
parents:
581
diff
changeset
|
120 self._sorted_it = self.sorter(self.it) |
e35407c60e00
templating: Make blog archives generator expose more templating data.
Ludovic Chabant <ludovic@chabant.com>
parents:
581
diff
changeset
|
121 return iter(self._sorted_it) |
e35407c60e00
templating: Make blog archives generator expose more templating data.
Ludovic Chabant <ludovic@chabant.com>
parents:
581
diff
changeset
|
122 |
e35407c60e00
templating: Make blog archives generator expose more templating data.
Ludovic Chabant <ludovic@chabant.com>
parents:
581
diff
changeset
|
123 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
124 class PageIterator(object): |
408
fd8e39254da0
debug: Better debug info output for iterators, providers, and linkers.
Ludovic Chabant <ludovic@chabant.com>
parents:
280
diff
changeset
|
125 debug_render = [] |
fd8e39254da0
debug: Better debug info output for iterators, providers, and linkers.
Ludovic Chabant <ludovic@chabant.com>
parents:
280
diff
changeset
|
126 debug_render_doc_dynamic = ['_debugRenderDoc'] |
fd8e39254da0
debug: Better debug info output for iterators, providers, and linkers.
Ludovic Chabant <ludovic@chabant.com>
parents:
280
diff
changeset
|
127 debug_render_not_empty = True |
fd8e39254da0
debug: Better debug info output for iterators, providers, and linkers.
Ludovic Chabant <ludovic@chabant.com>
parents:
280
diff
changeset
|
128 |
729
e35407c60e00
templating: Make blog archives generator expose more templating data.
Ludovic Chabant <ludovic@chabant.com>
parents:
581
diff
changeset
|
129 def __init__(self, source, *, |
e35407c60e00
templating: Make blog archives generator expose more templating data.
Ludovic Chabant <ludovic@chabant.com>
parents:
581
diff
changeset
|
130 current_page=None, |
e35407c60e00
templating: Make blog archives generator expose more templating data.
Ludovic Chabant <ludovic@chabant.com>
parents:
581
diff
changeset
|
131 pagination_filter=None, sorter=None, |
e35407c60e00
templating: Make blog archives generator expose more templating data.
Ludovic Chabant <ludovic@chabant.com>
parents:
581
diff
changeset
|
132 offset=0, limit=-1, locked=False): |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
133 self._source = source |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
134 self._current_page = current_page |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
135 self._locked = False |
6
f5ca5c5bed85
More Python 3 fixes, modularization, and new unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
136 self._pages = source |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
137 self._pagesData = None |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
138 self._pagination_slicer = None |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
139 self._has_sorter = False |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
140 self._next_page = None |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
141 self._prev_page = None |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
142 self._iter_event = Event() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
143 |
6
f5ca5c5bed85
More Python 3 fixes, modularization, and new unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
144 if isinstance(source, IPaginationSource): |
f5ca5c5bed85
More Python 3 fixes, modularization, and new unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
145 src_it = source.getSourceIterator() |
f5ca5c5bed85
More Python 3 fixes, modularization, and new unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
146 if src_it is not None: |
f5ca5c5bed85
More Python 3 fixes, modularization, and new unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
147 self._pages = src_it |
f5ca5c5bed85
More Python 3 fixes, modularization, and new unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
148 |
581
911a054f4fbd
bake: Add support for a "known" page setting that excludes it from the bake.
Ludovic Chabant <ludovic@chabant.com>
parents:
455
diff
changeset
|
149 # If we're currently baking, apply the default baker filter |
911a054f4fbd
bake: Add support for a "known" page setting that excludes it from the bake.
Ludovic Chabant <ludovic@chabant.com>
parents:
455
diff
changeset
|
150 # to exclude things like draft posts. |
911a054f4fbd
bake: Add support for a "known" page setting that excludes it from the bake.
Ludovic Chabant <ludovic@chabant.com>
parents:
455
diff
changeset
|
151 if (isinstance(source, PageSource) and |
911a054f4fbd
bake: Add support for a "known" page setting that excludes it from the bake.
Ludovic Chabant <ludovic@chabant.com>
parents:
455
diff
changeset
|
152 source.app.config.get('baker/is_baking')): |
911a054f4fbd
bake: Add support for a "known" page setting that excludes it from the bake.
Ludovic Chabant <ludovic@chabant.com>
parents:
455
diff
changeset
|
153 setting_name = source.app.config.get('baker/no_bake_setting', |
911a054f4fbd
bake: Add support for a "known" page setting that excludes it from the bake.
Ludovic Chabant <ludovic@chabant.com>
parents:
455
diff
changeset
|
154 'draft') |
911a054f4fbd
bake: Add support for a "known" page setting that excludes it from the bake.
Ludovic Chabant <ludovic@chabant.com>
parents:
455
diff
changeset
|
155 accessor = self._getSettingAccessor() |
911a054f4fbd
bake: Add support for a "known" page setting that excludes it from the bake.
Ludovic Chabant <ludovic@chabant.com>
parents:
455
diff
changeset
|
156 draft_filter = PaginationFilter(accessor) |
911a054f4fbd
bake: Add support for a "known" page setting that excludes it from the bake.
Ludovic Chabant <ludovic@chabant.com>
parents:
455
diff
changeset
|
157 draft_filter.root_clause = NotClause() |
911a054f4fbd
bake: Add support for a "known" page setting that excludes it from the bake.
Ludovic Chabant <ludovic@chabant.com>
parents:
455
diff
changeset
|
158 draft_filter.root_clause.addClause( |
911a054f4fbd
bake: Add support for a "known" page setting that excludes it from the bake.
Ludovic Chabant <ludovic@chabant.com>
parents:
455
diff
changeset
|
159 IsFilterClause(setting_name, True)) |
911a054f4fbd
bake: Add support for a "known" page setting that excludes it from the bake.
Ludovic Chabant <ludovic@chabant.com>
parents:
455
diff
changeset
|
160 self._simpleNonSortedWrap( |
911a054f4fbd
bake: Add support for a "known" page setting that excludes it from the bake.
Ludovic Chabant <ludovic@chabant.com>
parents:
455
diff
changeset
|
161 PaginationFilterIterator, draft_filter) |
911a054f4fbd
bake: Add support for a "known" page setting that excludes it from the bake.
Ludovic Chabant <ludovic@chabant.com>
parents:
455
diff
changeset
|
162 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
163 # Apply any filter first, before we start sorting or slicing. |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
164 if pagination_filter is not None: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
165 self._simpleNonSortedWrap(PaginationFilterIterator, |
226
e9dc18a275ff
data: Add ability for `IPaginationSource`s to specify how to get settings.
Ludovic Chabant <ludovic@chabant.com>
parents:
21
diff
changeset
|
166 pagination_filter) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
167 |
729
e35407c60e00
templating: Make blog archives generator expose more templating data.
Ludovic Chabant <ludovic@chabant.com>
parents:
581
diff
changeset
|
168 if sorter is not None: |
e35407c60e00
templating: Make blog archives generator expose more templating data.
Ludovic Chabant <ludovic@chabant.com>
parents:
581
diff
changeset
|
169 self._simpleNonSortedWrap(GenericSortIterator, sorter) |
e35407c60e00
templating: Make blog archives generator expose more templating data.
Ludovic Chabant <ludovic@chabant.com>
parents:
581
diff
changeset
|
170 self._has_sorter = True |
e35407c60e00
templating: Make blog archives generator expose more templating data.
Ludovic Chabant <ludovic@chabant.com>
parents:
581
diff
changeset
|
171 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
172 if offset > 0 or limit > 0: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
173 self.slice(offset, limit) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
174 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
175 self._locked = locked |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
176 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
177 @property |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
178 def total_count(self): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
179 self._load() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
180 if self._pagination_slicer is not None: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
181 return self._pagination_slicer.inner_count |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
182 return len(self._pagesData) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
183 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
184 @property |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
185 def next_page(self): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
186 self._load() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
187 return self._next_page |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
188 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
189 @property |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
190 def prev_page(self): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
191 self._load() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
192 return self._prev_page |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
193 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
194 def __len__(self): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
195 self._load() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
196 return len(self._pagesData) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
197 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
198 def __getitem__(self, key): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
199 self._load() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
200 return self._pagesData[key] |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
201 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
202 def __iter__(self): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
203 self._load() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
204 self._iter_event.fire() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
205 return iter(self._pagesData) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
206 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
207 def __getattr__(self, name): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
208 if name[:3] == 'is_' or name[:3] == 'in_': |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
209 def is_filter(value): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
210 conf = {'is_%s' % name[3:]: value} |
233
4379d8f8f831
internal: Removing some dependency of filters and iterators on pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
228
diff
changeset
|
211 accessor = self._getSettingAccessor() |
4379d8f8f831
internal: Removing some dependency of filters and iterators on pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
228
diff
changeset
|
212 return self._simpleNonSortedWrap(SettingFilterIterator, conf, |
4379d8f8f831
internal: Removing some dependency of filters and iterators on pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
228
diff
changeset
|
213 accessor) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
214 return is_filter |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
215 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
216 if name[:4] == 'has_': |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
217 def has_filter(value): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
218 conf = {name: value} |
233
4379d8f8f831
internal: Removing some dependency of filters and iterators on pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
228
diff
changeset
|
219 accessor = self._getSettingAccessor() |
4379d8f8f831
internal: Removing some dependency of filters and iterators on pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
228
diff
changeset
|
220 return self._simpleNonSortedWrap(SettingFilterIterator, conf, |
4379d8f8f831
internal: Removing some dependency of filters and iterators on pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
228
diff
changeset
|
221 accessor) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
222 return has_filter |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
223 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
224 if name[:5] == 'with_': |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
225 def has_filter(value): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
226 conf = {'has_%s' % name[5:]: value} |
233
4379d8f8f831
internal: Removing some dependency of filters and iterators on pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
228
diff
changeset
|
227 accessor = self._getSettingAccessor() |
4379d8f8f831
internal: Removing some dependency of filters and iterators on pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
228
diff
changeset
|
228 return self._simpleNonSortedWrap(SettingFilterIterator, conf, |
4379d8f8f831
internal: Removing some dependency of filters and iterators on pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
228
diff
changeset
|
229 accessor) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
230 return has_filter |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
231 |
6
f5ca5c5bed85
More Python 3 fixes, modularization, and new unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
232 return self.__getattribute__(name) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
233 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
234 def skip(self, count): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
235 return self._simpleWrap(SliceIterator, count) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
236 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
237 def limit(self, count): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
238 return self._simpleWrap(SliceIterator, 0, count) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
239 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
240 def slice(self, skip, limit): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
241 return self._simpleWrap(SliceIterator, skip, limit) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
242 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
243 def filter(self, filter_name): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
244 if self._current_page is None: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
245 raise Exception("Can't use `filter()` because no parent page was " |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
246 "set for this page iterator.") |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
247 filter_conf = self._current_page.config.get(filter_name) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
248 if filter_conf is None: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
249 raise Exception("Couldn't find filter '%s' in the configuration " |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
250 "header for page: %s" % |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
251 (filter_name, self._current_page.path)) |
233
4379d8f8f831
internal: Removing some dependency of filters and iterators on pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
228
diff
changeset
|
252 accessor = self._getSettingAccessor() |
4379d8f8f831
internal: Removing some dependency of filters and iterators on pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
228
diff
changeset
|
253 return self._simpleNonSortedWrap(SettingFilterIterator, filter_conf, |
4379d8f8f831
internal: Removing some dependency of filters and iterators on pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
228
diff
changeset
|
254 accessor) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
255 |
10
cd35d356ccce
Fix some bugs with iterators, add some unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
6
diff
changeset
|
256 def sort(self, setting_name=None, reverse=False): |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
257 self._ensureUnlocked() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
258 self._unload() |
10
cd35d356ccce
Fix some bugs with iterators, add some unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
6
diff
changeset
|
259 if setting_name is not None: |
233
4379d8f8f831
internal: Removing some dependency of filters and iterators on pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
228
diff
changeset
|
260 accessor = self._getSettingAccessor() |
10
cd35d356ccce
Fix some bugs with iterators, add some unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
6
diff
changeset
|
261 self._pages = SettingSortIterator(self._pages, setting_name, |
226
e9dc18a275ff
data: Add ability for `IPaginationSource`s to specify how to get settings.
Ludovic Chabant <ludovic@chabant.com>
parents:
21
diff
changeset
|
262 reverse, accessor) |
10
cd35d356ccce
Fix some bugs with iterators, add some unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
6
diff
changeset
|
263 else: |
cd35d356ccce
Fix some bugs with iterators, add some unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
6
diff
changeset
|
264 self._pages = NaturalSortIterator(self._pages, reverse) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
265 self._has_sorter = True |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
266 return self |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
267 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
268 def reset(self): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
269 self._ensureUnlocked() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
270 self._unload |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
271 return self |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
272 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
273 @property |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
274 def _has_more(self): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
275 self._load() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
276 if self._pagination_slicer: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
277 return self._pagination_slicer.has_more |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
278 return False |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
279 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
280 def _simpleWrap(self, it_class, *args, **kwargs): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
281 self._ensureUnlocked() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
282 self._unload() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
283 self._ensureSorter() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
284 self._pages = it_class(self._pages, *args, **kwargs) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
285 if self._pagination_slicer is None and it_class is SliceIterator: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
286 self._pagination_slicer = self._pages |
16
3a13b43e77c1
Correctly set the current page on a pagination slicer.
Ludovic Chabant <ludovic@chabant.com>
parents:
10
diff
changeset
|
287 self._pagination_slicer.current_page = self._current_page |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
288 return self |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
289 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
290 def _simpleNonSortedWrap(self, it_class, *args, **kwargs): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
291 self._ensureUnlocked() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
292 self._unload() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
293 self._pages = it_class(self._pages, *args, **kwargs) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
294 return self |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
295 |
233
4379d8f8f831
internal: Removing some dependency of filters and iterators on pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
228
diff
changeset
|
296 def _getSettingAccessor(self): |
4379d8f8f831
internal: Removing some dependency of filters and iterators on pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
228
diff
changeset
|
297 accessor = None |
4379d8f8f831
internal: Removing some dependency of filters and iterators on pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
228
diff
changeset
|
298 if isinstance(self._source, IPaginationSource): |
4379d8f8f831
internal: Removing some dependency of filters and iterators on pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
228
diff
changeset
|
299 accessor = self._source.getSettingAccessor() |
4379d8f8f831
internal: Removing some dependency of filters and iterators on pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
228
diff
changeset
|
300 return accessor |
4379d8f8f831
internal: Removing some dependency of filters and iterators on pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
228
diff
changeset
|
301 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
302 def _ensureUnlocked(self): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
303 if self._locked: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
304 raise Exception( |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
305 "This page iterator has been locked, probably because " |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
306 "you're trying to tamper with pagination data.") |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
307 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
308 def _ensureSorter(self): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
309 if self._has_sorter: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
310 return |
6
f5ca5c5bed85
More Python 3 fixes, modularization, and new unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
311 if isinstance(self._source, IPaginationSource): |
f5ca5c5bed85
More Python 3 fixes, modularization, and new unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
312 sort_it = self._source.getSorterIterator(self._pages) |
f5ca5c5bed85
More Python 3 fixes, modularization, and new unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
313 if sort_it is not None: |
f5ca5c5bed85
More Python 3 fixes, modularization, and new unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
314 self._pages = sort_it |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
315 self._has_sorter = True |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
316 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
317 def _unload(self): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
318 self._pagesData = None |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
319 self._next_page = None |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
320 self._prev_page = None |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
321 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
322 def _load(self): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
323 if self._pagesData is not None: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
324 return |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
325 |
455
cb3446be44b7
bake: Abort "render first" jobs if we start using other pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
408
diff
changeset
|
326 if (self._current_page is not None and |
cb3446be44b7
bake: Abort "render first" jobs if we start using other pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
408
diff
changeset
|
327 self._current_page.app.env.abort_source_use and |
cb3446be44b7
bake: Abort "render first" jobs if we start using other pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
408
diff
changeset
|
328 isinstance(self._source, PageSource)): |
cb3446be44b7
bake: Abort "render first" jobs if we start using other pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
408
diff
changeset
|
329 logger.debug("Aborting iteration from %s." % |
cb3446be44b7
bake: Abort "render first" jobs if we start using other pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
408
diff
changeset
|
330 self._current_page.ref_spec) |
cb3446be44b7
bake: Abort "render first" jobs if we start using other pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
408
diff
changeset
|
331 raise AbortedSourceUseError() |
cb3446be44b7
bake: Abort "render first" jobs if we start using other pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
408
diff
changeset
|
332 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
333 self._ensureSorter() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
334 |
6
f5ca5c5bed85
More Python 3 fixes, modularization, and new unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
335 it_chain = self._pages |
f5ca5c5bed85
More Python 3 fixes, modularization, and new unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
336 is_pgn_source = False |
f5ca5c5bed85
More Python 3 fixes, modularization, and new unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
337 if isinstance(self._source, IPaginationSource): |
f5ca5c5bed85
More Python 3 fixes, modularization, and new unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
338 is_pgn_source = True |
f5ca5c5bed85
More Python 3 fixes, modularization, and new unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
339 tail_it = self._source.getTailIterator(self._pages) |
f5ca5c5bed85
More Python 3 fixes, modularization, and new unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
340 if tail_it is not None: |
f5ca5c5bed85
More Python 3 fixes, modularization, and new unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
341 it_chain = tail_it |
f5ca5c5bed85
More Python 3 fixes, modularization, and new unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
342 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
343 self._pagesData = list(it_chain) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
344 |
6
f5ca5c5bed85
More Python 3 fixes, modularization, and new unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
345 if is_pgn_source and self._current_page and self._pagination_slicer: |
f5ca5c5bed85
More Python 3 fixes, modularization, and new unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
346 pn = [self._pagination_slicer.prev_page, |
f5ca5c5bed85
More Python 3 fixes, modularization, and new unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
347 self._pagination_slicer.next_page] |
f5ca5c5bed85
More Python 3 fixes, modularization, and new unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
348 pn_it = self._source.getTailIterator(iter(pn)) |
f5ca5c5bed85
More Python 3 fixes, modularization, and new unit tests.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
349 self._prev_page, self._next_page = (list(pn_it)) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
350 |
408
fd8e39254da0
debug: Better debug info output for iterators, providers, and linkers.
Ludovic Chabant <ludovic@chabant.com>
parents:
280
diff
changeset
|
351 def _debugRenderDoc(self): |
fd8e39254da0
debug: Better debug info output for iterators, providers, and linkers.
Ludovic Chabant <ludovic@chabant.com>
parents:
280
diff
changeset
|
352 return "Contains %d items" % len(self) |
fd8e39254da0
debug: Better debug info output for iterators, providers, and linkers.
Ludovic Chabant <ludovic@chabant.com>
parents:
280
diff
changeset
|
353 |