Mercurial > piecrust2
changeset 814:aca04e175488
data: Allow page generators to have an associated data provider
author | Ben Artin <ben@artins.org> |
---|---|
date | Wed, 28 Dec 2016 01:27:02 -0500 |
parents | c3cb2f9df882 |
children | 69d16e1afb95 |
files | piecrust/app.py piecrust/data/providersdata.py piecrust/generation/base.py piecrust/sources/base.py |
diffstat | 4 files changed, 38 insertions(+), 19 deletions(-) [+] |
line wrap: on
line diff
--- a/piecrust/app.py Mon Jan 02 16:30:57 2017 -0500 +++ b/piecrust/app.py Wed Dec 28 01:27:02 2016 -0500 @@ -200,6 +200,11 @@ tgts.append(tgt) return tgts + @cached_property + def dataProviderClasses(self): + return self.plugin_loader.getDataProviders() + + def getSource(self, source_name): for source in self.sources: if source.name == source_name: @@ -235,6 +240,14 @@ if pub.target == target_name: return pub return None + + def getDataProviderClass(cls, provider_type): + for prov in cls.dataProviderClasses: + if prov.PROVIDER_NAME == provider_type: + return prov + raise ConfigurationError( + "Unknown data provider type: %s" % provider_type) + def _get_dir(self, default_rel_dir): abs_dir = os.path.join(self.root_dir, default_rel_dir)
--- a/piecrust/data/providersdata.py Mon Jan 02 16:30:57 2017 -0500 +++ b/piecrust/data/providersdata.py Wed Dec 28 01:27:02 2016 -0500 @@ -27,13 +27,14 @@ return self._dict = {} - for source in self._page.app.sources: - endpoint_bits = re_endpoint_sep.split(source.data_endpoint) - endpoint = self._dict - for e in endpoint_bits[:-1]: - if e not in endpoint: - endpoint[e] = {} - endpoint = endpoint[e] - override = endpoint.get(endpoint_bits[-1]) - provider = source.buildDataProvider(self._page, override) - endpoint[endpoint_bits[-1]] = provider + for source in self._page.app.sources + self._page.app.generators: + if source.data_endpoint: + endpoint_bits = re_endpoint_sep.split(source.data_endpoint) + endpoint = self._dict + for e in endpoint_bits[:-1]: + if e not in endpoint: + endpoint[e] = {} + endpoint = endpoint[e] + override = endpoint.get(endpoint_bits[-1]) + provider = source.buildDataProvider(self._page, override) + endpoint[endpoint_bits[-1]] = provider
--- a/piecrust/generation/base.py Mon Jan 02 16:30:57 2017 -0500 +++ b/piecrust/generation/base.py Wed Dec 28 01:27:02 2016 -0500 @@ -124,6 +124,14 @@ raise ConfigurationError( "Generator '%s' requires a listing page ref." % name) self.page_ref = PageRef(app, page_ref) + self.data_endpoint = config.get('data_endpoint') + self.data_type = config.get('data_type') + + if self.data_endpoint and not self.data_type: + raise ConfigurationError( + "Generator '%s' requires a data type because it has a data endpoint." % name) + + self._provider_type = None @cached_property def source(self): @@ -146,3 +154,7 @@ def onRouteFunctionUsed(self, route, route_metadata): pass + def buildDataProvider(self, page, override): + if not self._provider_type: + self._provider_type = self.app.getDataProviderClass(self.data_type) + return self._provider_type(self, page, override)
--- a/piecrust/sources/base.py Mon Jan 02 16:30:57 2017 -0500 +++ b/piecrust/sources/base.py Wed Dec 28 01:27:02 2016 -0500 @@ -125,14 +125,7 @@ raise NotImplementedError() def buildDataProvider(self, page, override): - if self._provider_type is None: - cls = next((pt for pt in self.app.plugin_loader.getDataProviders() - if pt.PROVIDER_NAME == self.data_type), - None) - if cls is None: - raise ConfigurationError( - "Unknown data provider type: %s" % self.data_type) - self._provider_type = cls - + if not self._provider_type: + self._provider_type = self.app.getDataProviderClass(self.data_type) return self._provider_type(self, page, override)