comparison piecrust/baking/worker.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 c62d83e17abf
children 234d0c7c02cf
comparison
equal deleted inserted replaced
710:e85f29b28b84 711:ab5c6a8ae90a
51 if self.ctx.previous_record_path: 51 if self.ctx.previous_record_path:
52 self.ctx.previous_record = BakeRecord.load( 52 self.ctx.previous_record = BakeRecord.load(
53 self.ctx.previous_record_path) 53 self.ctx.previous_record_path)
54 self.ctx.previous_record_index = {} 54 self.ctx.previous_record_index = {}
55 for e in self.ctx.previous_record.entries: 55 for e in self.ctx.previous_record.entries:
56 key = _get_transition_key(e.path, e.taxonomy_info) 56 key = _get_transition_key(e.path, e.extra_key)
57 self.ctx.previous_record_index[key] = e 57 self.ctx.previous_record_index[key] = e
58 58
59 # Create the job handlers. 59 # Create the job handlers.
60 job_handlers = { 60 job_handlers = {
61 JOB_LOAD: LoadJobHandler(self.ctx), 61 JOB_LOAD: LoadJobHandler(self.ctx),
148 148
149 149
150 class RenderFirstSubJobHandler(JobHandler): 150 class RenderFirstSubJobHandler(JobHandler):
151 def handleJob(self, job): 151 def handleJob(self, job):
152 # Render the segments for the first sub-page of this page. 152 # Render the segments for the first sub-page of this page.
153 fac = load_factory(self.app, job) 153 fac = load_factory(self.app, job['factory_info'])
154 self.app.env.addManifestEntry('RenderJobs', fac.ref_spec) 154 self.app.env.addManifestEntry('RenderJobs', fac.ref_spec)
155 155
156 # These things should be OK as they're checked upstream by the baker. 156 route_index = job['route_index']
157 route = self.app.getRoute(fac.source.name, fac.metadata, 157 route = self.app.routes[route_index]
158 skip_taxonomies=True)
159 assert route is not None
160 158
161 page = fac.buildPage() 159 page = fac.buildPage()
162 route_metadata = create_route_metadata(page) 160 route_metadata = create_route_metadata(page)
163 qp = QualifiedPage(page, route, route_metadata) 161 qp = QualifiedPage(page, route, route_metadata)
164 ctx = PageRenderingContext(qp) 162 ctx = PageRenderingContext(qp)
196 def handleJob(self, job): 194 def handleJob(self, job):
197 # Actually bake the page and all its sub-pages to the output folder. 195 # Actually bake the page and all its sub-pages to the output folder.
198 fac = load_factory(self.app, job['factory_info']) 196 fac = load_factory(self.app, job['factory_info'])
199 self.app.env.addManifestEntry('BakeJobs', fac.ref_spec) 197 self.app.env.addManifestEntry('BakeJobs', fac.ref_spec)
200 198
199 route_index = job['route_index']
201 route_metadata = job['route_metadata'] 200 route_metadata = job['route_metadata']
202 tax_info = job['taxonomy_info'] 201 route = self.app.routes[route_index]
203 if tax_info is not None: 202
204 route = self.app.getTaxonomyRoute(tax_info.taxonomy_name, 203 gen_name = job['generator_name']
205 tax_info.source_name) 204 gen_key = job['generator_record_key']
206 else: 205 dirty_source_names = job['dirty_source_names']
207 route = self.app.getRoute(fac.source.name, route_metadata,
208 skip_taxonomies=True)
209 assert route is not None
210 206
211 page = fac.buildPage() 207 page = fac.buildPage()
212 qp = QualifiedPage(page, route, route_metadata) 208 qp = QualifiedPage(page, route, route_metadata)
213 209
214 result = { 210 result = {
215 'path': fac.path, 211 'path': fac.path,
216 'taxonomy_info': tax_info, 212 'generator_name': gen_name,
213 'generator_record_key': gen_key,
217 'sub_entries': None, 214 'sub_entries': None,
218 'errors': None} 215 'errors': None}
219 dirty_source_names = job['dirty_source_names'] 216
217 if job.get('needs_config', False):
218 result['config'] = page.config.getAll()
220 219
221 previous_entry = None 220 previous_entry = None
222 if self.ctx.previous_record_index is not None: 221 if self.ctx.previous_record_index is not None:
223 key = _get_transition_key(fac.path, tax_info) 222 key = _get_transition_key(fac.path, gen_key)
224 previous_entry = self.ctx.previous_record_index.get(key) 223 previous_entry = self.ctx.previous_record_index.get(key)
225 224
226 logger.debug("Baking page: %s" % fac.ref_spec) 225 logger.debug("Baking page: %s" % fac.ref_spec)
226 logger.debug("With route metadata: %s" % route_metadata)
227 try: 227 try:
228 sub_entries = self.page_baker.bake( 228 sub_entries = self.page_baker.bake(
229 qp, previous_entry, dirty_source_names, tax_info) 229 qp, previous_entry, dirty_source_names, gen_name)
230 result['sub_entries'] = sub_entries 230 result['sub_entries'] = sub_entries
231 231
232 except BakingError as ex: 232 except BakingError as ex:
233 logger.debug("Got baking error. Sending it to master.") 233 logger.debug("Got baking error. Sending it to master.")
234 result['errors'] = _get_errors(ex) 234 result['errors'] = _get_errors(ex)