Mercurial > piecrust2
comparison piecrust/baking/worker.py @ 853:f070a4fc033c
core: Continue PieCrust3 refactor, simplify pages.
The asset pipeline is still the only function pipeline at this point.
* No more `QualifiedPage`, and several other pieces of code deleted.
* Data providers are simpler and more focused. For instance, the page iterator
doesn't try to support other types of items.
* Route parameters are proper known source metadata to remove the confusion
between the two.
* Make the baker and pipeline more correctly manage records and record
histories.
* Add support for record collapsing and deleting stale outputs in the asset
pipeline.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Sun, 21 May 2017 00:06:59 -0700 |
parents | 4850f8c21b6e |
children | 08e02c2a2a1a |
comparison
equal
deleted
inserted
replaced
852:4850f8c21b6e | 853:f070a4fc033c |
---|---|
1 import time | 1 import time |
2 import logging | 2 import logging |
3 from piecrust.pipelines.base import PipelineContext, PipelineResult | 3 from piecrust.pipelines.base import PipelineContext, PipelineResult |
4 from piecrust.pipelines.records import ( | 4 from piecrust.pipelines.records import ( |
5 MultiRecordHistory, MultiRecord, Record, load_records) | 5 MultiRecordHistory, MultiRecord, RecordEntry, load_records) |
6 from piecrust.sources.base import ContentItem | 6 from piecrust.sources.base import ContentItem |
7 from piecrust.workerpool import IWorker | 7 from piecrust.workerpool import IWorker |
8 | 8 |
9 | 9 |
10 logger = logging.getLogger(__name__) | 10 logger = logging.getLogger(__name__) |
40 app.env.fs_cache_only_for_main_page = True | 40 app.env.fs_cache_only_for_main_page = True |
41 | 41 |
42 stats = app.env.stats | 42 stats = app.env.stats |
43 stats.registerTimer("BakeWorker_%d_Total" % self.wid) | 43 stats.registerTimer("BakeWorker_%d_Total" % self.wid) |
44 stats.registerTimer("BakeWorkerInit") | 44 stats.registerTimer("BakeWorkerInit") |
45 stats.registerTimer("JobReceive") | |
46 stats.registerTimer('LoadJob', raise_if_registered=False) | |
47 stats.registerTimer('RenderFirstSubJob', | |
48 raise_if_registered=False) | |
49 stats.registerTimer('BakeJob', raise_if_registered=False) | |
50 | |
51 stats.registerCounter("SourceUseAbortions") | |
52 | |
53 stats.registerManifest("LoadJobs") | |
54 stats.registerManifest("RenderJobs") | |
55 stats.registerManifest("BakeJobs") | |
56 | 45 |
57 self.app = app | 46 self.app = app |
58 | 47 |
59 # Load previous record | 48 # Load previous record |
60 if self.ctx.previous_records_path: | 49 if self.ctx.previous_records_path: |
88 def process(self, job): | 77 def process(self, job): |
89 logger.debug("Received job: %s@%s" % (job.source_name, job.item_spec)) | 78 logger.debug("Received job: %s@%s" % (job.source_name, job.item_spec)) |
90 src, pp = self._sources[job.source_name] | 79 src, pp = self._sources[job.source_name] |
91 item = ContentItem(job.item_spec, job.item_metadata) | 80 item = ContentItem(job.item_spec, job.item_metadata) |
92 | 81 |
93 record_class = pp.RECORD_CLASS or Record | 82 entry_class = pp.RECORD_ENTRY_CLASS or RecordEntry |
94 ppres = PipelineResult(record_class()) | 83 ppres = PipelineResult() |
95 ppres.record.item_spec = job.item_spec | 84 ppres.pipeline_name = pp.PIPELINE_NAME |
85 ppres.record_entry = entry_class() | |
86 ppres.record_entry.item_spec = job.item_spec | |
87 | |
96 pp.run(item, self._ppctx, ppres) | 88 pp.run(item, self._ppctx, ppres) |
97 return ppres | 89 return ppres |
98 | 90 |
99 def getStats(self): | 91 def getStats(self): |
100 stats = self.app.env.stats | 92 stats = self.app.env.stats |
111 def __init__(self, source_name, item_spec, item_metadata): | 103 def __init__(self, source_name, item_spec, item_metadata): |
112 self.source_name = source_name | 104 self.source_name = source_name |
113 self.item_spec = item_spec | 105 self.item_spec = item_spec |
114 self.item_metadata = item_metadata | 106 self.item_metadata = item_metadata |
115 | 107 |
116 | |
117 class JobHandler: | |
118 def __init__(self, ctx): | |
119 self.ctx = ctx | |
120 | |
121 @property | |
122 def app(self): | |
123 return self.ctx.app | |
124 | |
125 def handleJob(self, job): | |
126 raise NotImplementedError() | |
127 | |
128 def shutdown(self): | |
129 pass | |
130 | |
131 | |
132 def _get_errors(ex): | |
133 errors = [] | |
134 while ex is not None: | |
135 errors.append(str(ex)) | |
136 ex = ex.__cause__ | |
137 return errors | |
138 |