Mercurial > piecrust2
comparison piecrust/pipelines/page.py @ 991:1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
- Make the execution stats JSON-serializable.
- Re-add ability to differentiate between sources used during segment rendering
and during layout rendering. Fixes problems with cache invalidation of
pages that use other sources.
- Make taxonomy-related stuff JSON-serializable.
| author | Ludovic Chabant <ludovic@chabant.com> |
|---|---|
| date | Mon, 20 Nov 2017 23:06:47 -0800 |
| parents | 8adc27285d93 |
| children | fa489c5e829e |
comparison
equal
deleted
inserted
replaced
| 990:22cf13b86cc3 | 991:1857dbd4580f |
|---|---|
| 1 import copy | |
| 1 import time | 2 import time |
| 2 import logging | 3 import logging |
| 3 from piecrust.pipelines.base import ( | 4 from piecrust.pipelines.base import ( |
| 4 ContentPipeline, create_job, content_item_from_job) | 5 ContentPipeline, create_job, content_item_from_job) |
| 5 from piecrust.pipelines._pagebaker import PageBaker, get_output_path | 6 from piecrust.pipelines._pagebaker import PageBaker, get_output_path |
| 46 cur_entry = record_fac(item.spec) | 47 cur_entry = record_fac(item.spec) |
| 47 cur_entry.config = page.config.getAll() | 48 cur_entry.config = page.config.getAll() |
| 48 cur_entry.route_params = item.metadata['route_params'] | 49 cur_entry.route_params = item.metadata['route_params'] |
| 49 cur_entry.timestamp = page.datetime.timestamp() | 50 cur_entry.timestamp = page.datetime.timestamp() |
| 50 | 51 |
| 52 if page.was_modified: | |
| 53 cur_entry.flags |= PagePipelineRecordEntry.FLAG_SOURCE_MODIFIED | |
| 51 if page.config.get(self._draft_setting): | 54 if page.config.get(self._draft_setting): |
| 52 cur_entry.flags |= PagePipelineRecordEntry.FLAG_IS_DRAFT | 55 cur_entry.flags |= PagePipelineRecordEntry.FLAG_IS_DRAFT |
| 53 | 56 |
| 54 yield cur_entry | 57 yield cur_entry |
| 55 | 58 |
| 83 if cur.flags & PagePipelineRecordEntry.FLAG_IS_DRAFT: | 86 if cur.flags & PagePipelineRecordEntry.FLAG_IS_DRAFT: |
| 84 continue | 87 continue |
| 85 | 88 |
| 86 # Skip pages that are known to use other sources... we'll | 89 # Skip pages that are known to use other sources... we'll |
| 87 # schedule them in the second pass. | 90 # schedule them in the second pass. |
| 88 if prev and prev.getAllUsedSourceNames(): | 91 if prev: |
| 89 continue | 92 usn1, usn2 = prev.getAllUsedSourceNames() |
| 93 if usn1 or usn2: | |
| 94 continue | |
| 90 | 95 |
| 91 # Check if this item has been overriden by a previous pipeline | 96 # Check if this item has been overriden by a previous pipeline |
| 92 # run... for instance, we could be the pipeline for a "theme pages" | 97 # run... for instance, we could be the pipeline for a "theme pages" |
| 93 # source, and some of our pages have been overriden by a user | 98 # source, and some of our pages have been overriden by a user |
| 94 # page that writes out to the same URL. | 99 # page that writes out to the same URL. |
| 95 uri = uri_getter(cur.route_params) | 100 uri = uri_getter(cur.route_params) |
| 96 path = get_output_path(app, out_dir, uri, pretty_urls) | 101 path = get_output_path(app, out_dir, uri, pretty_urls) |
| 97 | |
| 98 override = used_paths.get(path) | 102 override = used_paths.get(path) |
| 99 if override is not None: | 103 if override is not None: |
| 100 override_source_name, override_entry = override | 104 override_source_name, override_entry = override |
| 101 override_source = app.getSource(override_source_name) | 105 override_source = app.getSource(override_source_name) |
| 102 if override_source.config['realm'] == \ | 106 if override_source.config['realm'] == \ |
| 141 jobs = [] | 145 jobs = [] |
| 142 pass_num = ctx.pass_num | 146 pass_num = ctx.pass_num |
| 143 history = ctx.record_histories.getHistory(ctx.record_name).copy() | 147 history = ctx.record_histories.getHistory(ctx.record_name).copy() |
| 144 history.build() | 148 history.build() |
| 145 for prev, cur in history.diffs: | 149 for prev, cur in history.diffs: |
| 146 if cur and cur.was_any_sub_baked: | 150 if not cur: |
| 147 continue | 151 continue |
| 148 if prev and any(map( | 152 if cur.was_any_sub_baked: |
| 149 lambda usn: usn in dirty_source_names, | 153 continue |
| 150 prev.getAllUsedSourceNames())): | 154 if prev: |
| 151 jobs.append(create_job(self, prev.item_spec, | 155 if any(map( |
| 152 pass_num=pass_num, | 156 lambda usn: usn in dirty_source_names, |
| 153 force_bake=True)) | 157 prev.getAllUsedSourceNames()[0])): |
| 158 jobs.append(create_job(self, prev.item_spec, | |
| 159 pass_num=pass_num, | |
| 160 force_bake=True)) | |
| 161 else: | |
| 162 # This page uses other sources, but no source was dirty | |
| 163 # this time around (it was a null build, maybe). We | |
| 164 # don't have any work to do, but we need to carry over | |
| 165 # any information we have, otherwise the post bake step | |
| 166 # will think we need to delete last bake's outputs. | |
| 167 cur.subs = copy.deepcopy(prev.subs) | |
| 168 | |
| 154 if len(jobs) > 0: | 169 if len(jobs) > 0: |
| 155 return jobs | 170 return jobs |
| 156 return None | 171 return None |
| 157 | 172 |
| 158 def handleJobResult(self, result, ctx): | 173 def handleJobResult(self, result, ctx): |
