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