Mercurial > piecrust2
comparison piecrust/app.py @ 711:ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
* Taxonomies are now implemented one or more `TaxonomyGenerator`s.
* A `BlogArchivesGenerator` stub is there but non-functional.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Thu, 26 May 2016 19:52:47 -0700 |
parents | 4285b2c9b872 |
children | 6abb436fea5b |
comparison
equal
deleted
inserted
replaced
710:e85f29b28b84 | 711:ab5c6a8ae90a |
---|---|
13 from piecrust.plugins.base import PluginLoader | 13 from piecrust.plugins.base import PluginLoader |
14 from piecrust.environment import StandardEnvironment | 14 from piecrust.environment import StandardEnvironment |
15 from piecrust.configuration import ConfigurationError, merge_dicts | 15 from piecrust.configuration import ConfigurationError, merge_dicts |
16 from piecrust.routing import Route | 16 from piecrust.routing import Route |
17 from piecrust.sources.base import REALM_THEME | 17 from piecrust.sources.base import REALM_THEME |
18 from piecrust.taxonomies import Taxonomy | |
19 | 18 |
20 | 19 |
21 logger = logging.getLogger(__name__) | 20 logger = logging.getLogger(__name__) |
22 | 21 |
23 | 22 |
149 rte = Route(self, r) | 148 rte = Route(self, r) |
150 routes.append(rte) | 149 routes.append(rte) |
151 return routes | 150 return routes |
152 | 151 |
153 @cached_property | 152 @cached_property |
154 def taxonomies(self): | 153 def generators(self): |
155 taxonomies = [] | 154 defs = {} |
156 for tn, tc in self.config.get('site/taxonomies').items(): | 155 for cls in self.plugin_loader.getPageGenerators(): |
157 tax = Taxonomy(self, tn, tc) | 156 defs[cls.GENERATOR_NAME] = cls |
158 taxonomies.append(tax) | 157 |
159 return taxonomies | 158 gens = [] |
159 for n, g in self.config.get('site/generators').items(): | |
160 cls = defs.get(g['type']) | |
161 if cls is None: | |
162 raise ConfigurationError("No such page generator type: %s" % | |
163 g['type']) | |
164 gen = cls(self, n, g) | |
165 gens.append(gen) | |
166 return gens | |
160 | 167 |
161 def getSource(self, source_name): | 168 def getSource(self, source_name): |
162 for source in self.sources: | 169 for source in self.sources: |
163 if source.name == source_name: | 170 if source.name == source_name: |
164 return source | 171 return source |
165 return None | 172 return None |
166 | 173 |
167 def getRoutes(self, source_name, *, skip_taxonomies=False): | 174 def getGenerator(self, generator_name): |
175 for gen in self.generators: | |
176 if gen.name == generator_name: | |
177 return gen | |
178 return None | |
179 | |
180 def getSourceRoutes(self, source_name): | |
168 for route in self.routes: | 181 for route in self.routes: |
169 if route.source_name == source_name: | 182 if route.source_name == source_name: |
170 if not skip_taxonomies or route.taxonomy_name is None: | 183 yield route |
171 yield route | 184 |
172 | 185 def getSourceRoute(self, source_name, route_metadata): |
173 def getRoute(self, source_name, route_metadata, *, skip_taxonomies=False): | 186 for route in self.getSourceRoutes(source_name): |
174 for route in self.getRoutes(source_name, | |
175 skip_taxonomies=skip_taxonomies): | |
176 if (route_metadata is None or | 187 if (route_metadata is None or |
177 route.matchesMetadata(route_metadata)): | 188 route.matchesMetadata(route_metadata)): |
178 return route | 189 return route |
179 return None | 190 return None |
180 | 191 |
181 def getTaxonomyRoute(self, tax_name, source_name): | 192 def getGeneratorRoute(self, generator_name): |
182 for route in self.routes: | 193 for route in self.routes: |
183 if (route.taxonomy_name == tax_name and | 194 if route.generator_name == generator_name: |
184 route.source_name == source_name): | |
185 return route | 195 return route |
186 return None | |
187 | |
188 def getTaxonomy(self, tax_name): | |
189 for tax in self.taxonomies: | |
190 if tax.name == tax_name: | |
191 return tax | |
192 return None | 196 return None |
193 | 197 |
194 def _get_dir(self, default_rel_dir): | 198 def _get_dir(self, default_rel_dir): |
195 abs_dir = os.path.join(self.root_dir, default_rel_dir) | 199 abs_dir = os.path.join(self.root_dir, default_rel_dir) |
196 if os.path.isdir(abs_dir): | 200 if os.path.isdir(abs_dir): |