annotate piecrust/generation/base.py @ 815:69d16e1afb95

internal: Keep things out of the `PieCrust` class, and other clean-ups.
author Ludovic Chabant <ludovic@chabant.com>
date Wed, 11 Jan 2017 09:01:01 -0800
parents aca04e175488
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
785
661f7ba15762 bug: Fix possible crash with overlapping pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 723
diff changeset
1 import logging
711
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2 from werkzeug.utils import cached_property
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
3 from piecrust.baking.records import BakeRecordEntry
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
4 from piecrust.baking.worker import save_factory, JOB_BAKE
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
5 from piecrust.configuration import ConfigurationError
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
6 from piecrust.routing import create_route_metadata
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
7 from piecrust.sources.pageref import PageRef
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
8
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
9
785
661f7ba15762 bug: Fix possible crash with overlapping pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 723
diff changeset
10 logger = logging.getLogger(__name__)
661f7ba15762 bug: Fix possible crash with overlapping pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 723
diff changeset
11
661f7ba15762 bug: Fix possible crash with overlapping pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 723
diff changeset
12
711
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
13 class InvalidRecordExtraKey(Exception):
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
14 pass
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
15
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
16
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
17 class PageGeneratorBakeContext(object):
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
18 def __init__(self, app, record, pool, generator):
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
19 self._app = app
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
20 self._record = record
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
21 self._pool = pool
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
22 self._generator = generator
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
23 self._job_queue = []
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
24 self._is_running = False
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
25
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
26 def getRecordExtraKey(self, seed):
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
27 return '%s:%s' % (self._generator.name, seed)
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
28
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
29 def matchesRecordExtraKey(self, extra_key):
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
30 return (extra_key is not None and
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
31 extra_key.startswith(self._generator.name + ':'))
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
32
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
33 def getSeedFromRecordExtraKey(self, extra_key):
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
34 if not self.matchesRecordExtraKey(extra_key):
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
35 raise InvalidRecordExtraKey("Invalid extra key: %s" % extra_key)
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
36 return extra_key[len(self._generator.name) + 1:]
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
37
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
38 def getAllPageRecords(self):
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
39 return self._record.transitions.values()
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
40
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
41 def getBakedPageRecords(self):
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
42 for prev, cur in self.getAllPageRecords():
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
43 if cur and cur.was_any_sub_baked:
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
44 yield (prev, cur)
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
45
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
46 def collapseRecord(self, entry):
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
47 self._record.collapseEntry(entry)
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
48
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
49 def queueBakeJob(self, page_fac, route, extra_route_metadata, seed):
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
50 if self._is_running:
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
51 raise Exception("The job queue is running.")
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
52
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
53 extra_key = self.getRecordExtraKey(seed)
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
54 entry = BakeRecordEntry(
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
55 page_fac.source.name,
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
56 page_fac.path,
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
57 extra_key)
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
58 self._record.addEntry(entry)
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
59
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
60 page = page_fac.buildPage()
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
61 route_metadata = create_route_metadata(page)
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
62 route_metadata.update(extra_route_metadata)
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
63 uri = route.getUri(route_metadata)
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
64 override_entry = self._record.getOverrideEntry(page.path, uri)
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
65 if override_entry is not None:
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
66 override_source = self.app.getSource(
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
67 override_entry.source_name)
785
661f7ba15762 bug: Fix possible crash with overlapping pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 723
diff changeset
68 if override_source.realm == page_fac.source.realm:
661f7ba15762 bug: Fix possible crash with overlapping pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 723
diff changeset
69 entry.errors.append(
711
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
70 "Page '%s' maps to URL '%s' but is overriden "
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
71 "by page '%s'." %
785
661f7ba15762 bug: Fix possible crash with overlapping pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 723
diff changeset
72 (page_fac.ref_spec, uri, override_entry.path))
661f7ba15762 bug: Fix possible crash with overlapping pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 723
diff changeset
73 logger.error(entry.errors[-1])
661f7ba15762 bug: Fix possible crash with overlapping pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 723
diff changeset
74 entry.flags |= BakeRecordEntry.FLAG_OVERRIDEN
711
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
75 return
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
76
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
77 route_index = self._app.routes.index(route)
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
78 job = {
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
79 'type': JOB_BAKE,
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
80 'job': {
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
81 'factory_info': save_factory(page_fac),
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
82 'generator_name': self._generator.name,
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
83 'generator_record_key': extra_key,
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
84 'route_index': route_index,
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
85 'route_metadata': route_metadata,
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
86 'dirty_source_names': self._record.dirty_source_names,
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
87 'needs_config': True
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
88 }
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
89 }
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
90 self._job_queue.append(job)
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
91
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
92 def runJobQueue(self):
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
93 def _handler(res):
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
94 entry = self._record.getCurrentEntry(
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
95 res['path'], res['generator_record_key'])
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
96 entry.config = res['config']
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
97 entry.subs = res['sub_entries']
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
98 if res['errors']:
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
99 entry.errors += res['errors']
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
100 if entry.has_any_error:
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
101 self._record.current.success = False
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
102
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
103 self._is_running = True
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
104 try:
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
105 ar = self._pool.queueJobs(self._job_queue, handler=_handler)
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
106 ar.wait()
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
107 finally:
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
108 self._is_running = False
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
109
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
110
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
111 class PageGenerator(object):
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
112 def __init__(self, app, name, config):
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
113 self.app = app
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
114 self.name = name
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
115 self.config = config or {}
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
116
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
117 self.source_name = config.get('source')
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
118 if self.source_name is None:
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
119 raise ConfigurationError(
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
120 "Generator '%s' requires a source name" % name)
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
121
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
122 page_ref = config.get('page')
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
123 if page_ref is None:
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
124 raise ConfigurationError(
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
125 "Generator '%s' requires a listing page ref." % name)
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
126 self.page_ref = PageRef(app, page_ref)
815
69d16e1afb95 internal: Keep things out of the `PieCrust` class, and other clean-ups.
Ludovic Chabant <ludovic@chabant.com>
parents: 814
diff changeset
127
814
aca04e175488 data: Allow page generators to have an associated data provider
Ben Artin <ben@artins.org>
parents: 792
diff changeset
128 self.data_endpoint = config.get('data_endpoint')
aca04e175488 data: Allow page generators to have an associated data provider
Ben Artin <ben@artins.org>
parents: 792
diff changeset
129 self.data_type = config.get('data_type')
aca04e175488 data: Allow page generators to have an associated data provider
Ben Artin <ben@artins.org>
parents: 792
diff changeset
130 if self.data_endpoint and not self.data_type:
aca04e175488 data: Allow page generators to have an associated data provider
Ben Artin <ben@artins.org>
parents: 792
diff changeset
131 raise ConfigurationError(
815
69d16e1afb95 internal: Keep things out of the `PieCrust` class, and other clean-ups.
Ludovic Chabant <ludovic@chabant.com>
parents: 814
diff changeset
132 "Generator '%s' requires a data type because it has "
69d16e1afb95 internal: Keep things out of the `PieCrust` class, and other clean-ups.
Ludovic Chabant <ludovic@chabant.com>
parents: 814
diff changeset
133 "a data endpoint." % name)
69d16e1afb95 internal: Keep things out of the `PieCrust` class, and other clean-ups.
Ludovic Chabant <ludovic@chabant.com>
parents: 814
diff changeset
134
814
aca04e175488 data: Allow page generators to have an associated data provider
Ben Artin <ben@artins.org>
parents: 792
diff changeset
135 self._provider_type = None
711
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
136
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
137 @cached_property
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
138 def source(self):
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
139 for src in self.app.sources:
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
140 if src.name == self.source_name:
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
141 return src
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
142 raise Exception("Can't find source '%s' for generator '%s'." % (
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
143 self.source_name, self.name))
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
144
792
58ebf50235a5 routing: Simplify how routes are defined.
Ludovic Chabant <ludovic@chabant.com>
parents: 785
diff changeset
145 def getSupportedRouteParameters(self):
58ebf50235a5 routing: Simplify how routes are defined.
Ludovic Chabant <ludovic@chabant.com>
parents: 785
diff changeset
146 raise NotImplementedError()
58ebf50235a5 routing: Simplify how routes are defined.
Ludovic Chabant <ludovic@chabant.com>
parents: 785
diff changeset
147
723
606f6d57b5df routing: Cleanup URL routing and improve page matching.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
148 def getPageFactory(self, route_metadata):
606f6d57b5df routing: Cleanup URL routing and improve page matching.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
149 # This will raise `PageNotFoundError` naturally if not found.
606f6d57b5df routing: Cleanup URL routing and improve page matching.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
150 return self.page_ref.getFactory()
606f6d57b5df routing: Cleanup URL routing and improve page matching.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
151
711
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
152 def bake(self, ctx):
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
153 raise NotImplementedError()
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
154
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
155 def onRouteFunctionUsed(self, route, route_metadata):
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
156 pass
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
157
814
aca04e175488 data: Allow page generators to have an associated data provider
Ben Artin <ben@artins.org>
parents: 792
diff changeset
158 def buildDataProvider(self, page, override):
aca04e175488 data: Allow page generators to have an associated data provider
Ben Artin <ben@artins.org>
parents: 792
diff changeset
159 if not self._provider_type:
815
69d16e1afb95 internal: Keep things out of the `PieCrust` class, and other clean-ups.
Ludovic Chabant <ludovic@chabant.com>
parents: 814
diff changeset
160 from piecrust.data.provider import get_data_provider_class
69d16e1afb95 internal: Keep things out of the `PieCrust` class, and other clean-ups.
Ludovic Chabant <ludovic@chabant.com>
parents: 814
diff changeset
161 self._provider_type = get_data_provider_class(self.app,
69d16e1afb95 internal: Keep things out of the `PieCrust` class, and other clean-ups.
Ludovic Chabant <ludovic@chabant.com>
parents: 814
diff changeset
162 self.data_type)
814
aca04e175488 data: Allow page generators to have an associated data provider
Ben Artin <ben@artins.org>
parents: 792
diff changeset
163 return self._provider_type(self, page, override)