diff piecrust/sources/blogarchives.py @ 989:8adc27285d93

bake: Big pass on bake performance. - Reduce the amount of data passed between processes. - Make inter-process data simple objects to make it easier to test with alternatives to pickle. - Make sources have the basic requirement to be able to find a content item from an item spec (path). - Make Hoedown the default Markdown formatter.
author Ludovic Chabant <ludovic@chabant.com>
date Sun, 19 Nov 2017 14:29:17 -0800
parents 1d0364614665
children ba809c221a27
line wrap: on
line diff
--- a/piecrust/sources/blogarchives.py	Fri Nov 03 23:14:56 2017 -0700
+++ b/piecrust/sources/blogarchives.py	Sun Nov 19 14:29:17 2017 -0800
@@ -7,9 +7,12 @@
     PageIterator, HardCodedFilterIterator, DateSortIterator)
 from piecrust.page import Page
 from piecrust.pipelines._pagebaker import PageBaker
-from piecrust.pipelines._pagerecords import PagePipelineRecordEntry
+from piecrust.pipelines._pagerecords import (
+    PagePipelineRecordEntry,
+    add_page_job_result, merge_job_result_into_record_entry)
 from piecrust.pipelines.base import (
-    ContentPipeline, get_record_name_for_source)
+    ContentPipeline,
+    create_job, get_record_name_for_source, content_item_from_job)
 from piecrust.routing import RouteParameter
 from piecrust.sources.base import ContentItem
 from piecrust.sources.generator import GeneratorSourceBase
@@ -38,14 +41,11 @@
     def getSupportedRouteParameters(self):
         return [RouteParameter('year', RouteParameter.TYPE_INT4)]
 
-    def findContent(self, route_params):
+    def findContentFromRoute(self, route_params):
         year = route_params['year']
-        spec = '_index'
-        metadata = {
-            'record_entry_spec': '_index[%04d]' % year,
-            'route_params': {'year': year}
-        }
-        return ContentItem(spec, metadata)
+        return ContentItem(
+            '_index',
+            {'route_params': {'year': year}})
 
     def prepareRenderContext(self, ctx):
         ctx.pagination_source = self.inner_source
@@ -178,24 +178,41 @@
                      (len(self._dirty_years), len(self._all_years)))
 
         jobs = []
+        rec_fac = self.createRecordEntry
+        current_record = ctx.current_record
+
         for y in self._dirty_years:
-            item = ContentItem(
-                '_index',
-                {
-                    'record_entry_spec': '_index[%04d]' % y,
-                    'route_params': {'year': y}
-                })
-            jobs.append(self.createJob(item))
+            record_entry_spec = '_index[%04d]' % y
+
+            jobs.append(create_job(self, '_index',
+                                   year=y,
+                                   record_entry_spec=record_entry_spec))
+
+            entry = rec_fac(record_entry_spec)
+            current_record.addEntry(entry)
+
         if len(jobs) > 0:
             return jobs
         return None
 
     def run(self, job, ctx, result):
-        page = Page(self.source, job.content_item)
+        year = job['year']
+        content_item = ContentItem('_index',
+                                   {'year': year,
+                                    'route_params': {'year': year}})
+        page = Page(self.source, content_item)
+
         prev_entry = ctx.previous_entry
-        cur_entry = result.record_entry
-        cur_entry.year = job.content_item.metadata['route_params']['year']
-        self._pagebaker.bake(page, prev_entry, cur_entry)
+        rdr_subs = self._pagebaker.bake(page, prev_entry)
+
+        add_page_job_result(result)
+        result['subs'] = rdr_subs
+        result['year'] = page.source_metadata['year']
+
+    def handleJobResult(self, result, ctx):
+        existing = ctx.record_entry
+        merge_job_result_into_record_entry(existing, result)
+        existing.year = result['year']
 
     def postJobRun(self, ctx):
         # Create bake entries for the years that were *not* dirty.