diff piecrust/pipelines/page.py @ 877:d6d35b2efd04

bake: Rename "pass" to "step" and make the page pipeline use different steps. That pipeline is now first loading all pages, and then rendering full pages unless they trigger a sub-render.
author Ludovic Chabant <ludovic@chabant.com>
date Thu, 15 Jun 2017 22:16:23 -0700
parents 504ddb370df8
children b4e10471e970
line wrap: on
line diff
--- a/piecrust/pipelines/page.py	Thu Jun 15 07:33:40 2017 -0700
+++ b/piecrust/pipelines/page.py	Thu Jun 15 22:16:23 2017 -0700
@@ -2,8 +2,6 @@
 from piecrust.pipelines.base import ContentPipeline
 from piecrust.pipelines._pagebaker import PageBaker
 from piecrust.pipelines._pagerecords import PagePipelineRecordEntry
-from piecrust.rendering import (
-    RenderingContext, render_page_segments)
 from piecrust.sources.base import AbortedSourceUseError
 
 
@@ -35,11 +33,13 @@
         existing.subs = record_entry.subs
 
     def run(self, job, ctx, result):
-        pass_name = job.data.get('pass', 0)
-        if pass_name == 0:
-            self._renderSegmentsOrPostpone(job.content_item, ctx, result)
-        elif pass_name == 1:
-            self._fullRender(job.content_item, ctx, result)
+        step_num = job.step_num
+        if step_num == 0:
+            self._loadPage(job.content_item, ctx, result)
+        elif step_num == 1:
+            self._renderOrPostpone(job.content_item, ctx, result)
+        elif step_num == 2:
+            self._renderAlways(job.content_item, ctx, result)
 
     def getDeletions(self, ctx):
         for prev, cur in ctx.record_history.diffs:
@@ -59,37 +59,35 @@
     def shutdown(self):
         self._pagebaker.stopWriterQueue()
 
-    def _renderSegmentsOrPostpone(self, content_item, ctx, result):
+    def _loadPage(self, content_item, ctx, result):
+        logger.debug("Loading page: %s" % content_item.spec)
+        page = self.app.getPage(self.source, content_item)
+        record_entry = result.record_entry
+        record_entry.config = page.config.getAll()
+        record_entry.timestamp = page.datetime.timestamp()
+        result.next_step_job = self.createJob(content_item)
+
+    def _renderOrPostpone(self, content_item, ctx, result):
         # Here our job is to render the page's segments so that they're
         # cached in memory and on disk... unless we detect that the page
         # is using some other sources, in which case we abort and we'll try
         # again on the second pass.
-        logger.debug("Rendering segments for: %s" % content_item.spec)
-        record_entry = result.record_entry
-        stats = self.app.env.stats
-
+        logger.debug("Conditional render for: %s" % content_item.spec)
         page = self.app.getPage(self.source, content_item)
-        record_entry.config = page.config.getAll()
-        record_entry.timestamp = page.datetime.timestamp()
-
-        rdrctx = RenderingContext(page)
+        prev_entry = ctx.previous_entry
+        cur_entry = result.record_entry
         self.app.env.abort_source_use = True
         try:
-            render_page_segments(rdrctx)
+            self._pagebaker.bake(page, prev_entry, cur_entry)
         except AbortedSourceUseError:
             logger.debug("Page was aborted for using source: %s" %
                          content_item.spec)
-            stats.stepCounter("SourceUseAbortions")
+            self.app.env.stats.stepCounter("SourceUseAbortions")
+            result.next_step_job = self.createJob(content_item)
         finally:
             self.app.env.abort_source_use = False
 
-        result.next_pass_job = self.createJob(content_item)
-        result.next_pass_job.data.update({
-            'pass': 1,
-            'record_entry': record_entry
-        })
-
-    def _fullRender(self, content_item, ctx, result):
+    def _renderAlways(self, content_item, ctx, result):
         logger.debug("Full render for: %s" % content_item.spec)
         page = self.app.getPage(self.source, content_item)
         prev_entry = ctx.previous_entry