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):