comparison piecrust/sources/base.py @ 363:dd25bd3ce1f9

serve: Refactoring and fixes to be able to serve taxonomy pages. * Page sources' `findPagePath` is renamed to `findPageFactory`, so that it also returns source metadata. * Page refs now store possible hits more properly, and use the previous point to also store metadata. As a result, they can also return a proper factory. * Implement `findPageFactory` correctly in all built-in sources. * When the Chef server matches a taxonomy page, get the source metadata from the page ref in order to make a more proper page. * Make the `getRoute(s)` functions explicitely say if they want taxonomy routes or not.
author Ludovic Chabant <ludovic@chabant.com>
date Sun, 26 Apr 2015 15:07:40 -0700
parents ac9b94c8fb37
children 4b1019bb2533
comparison
equal deleted inserted replaced
362:ff595828a364 363:dd25bd3ce1f9
43 def ref_spec(self): 43 def ref_spec(self):
44 return '%s:%s' % (self.source.name, self.rel_path) 44 return '%s:%s' % (self.source.name, self.rel_path)
45 45
46 @cached_property 46 @cached_property
47 def path(self): 47 def path(self):
48 return self.source.resolveRef(self.rel_path) 48 path, _ = self.source.resolveRef(self.rel_path)
49 return path
49 50
50 def buildPage(self): 51 def buildPage(self):
51 repo = self.source.app.env.page_repository 52 repo = self.source.app.env.page_repository
52 if repo is not None: 53 if repo is not None:
53 cache_key = '%s:%s' % (self.source.name, self.rel_path) 54 cache_key = '%s:%s' % (self.source.name, self.rel_path)
92 93
93 def getPages(self): 94 def getPages(self):
94 return build_pages(self.app, self.getPageFactories()) 95 return build_pages(self.app, self.getPageFactories())
95 96
96 def getPage(self, metadata): 97 def getPage(self, metadata):
97 rel_path, metadata = self.findPagePath(metadata, MODE_PARSING) 98 factory = self.findPageFactory(metadata, MODE_PARSING)
98 if rel_path is None: 99 if factory is None:
99 return None 100 return None
100 return Page(self, metadata, rel_path) 101 return factory.buildPage()
101 102
102 def getPageFactories(self): 103 def getPageFactories(self):
103 if self._factories is None: 104 if self._factories is None:
104 self._factories = list(self.buildPageFactories()) 105 self._factories = list(self.buildPageFactories())
105 return self._factories 106 return self._factories
106 107
107 def buildPageFactories(self): 108 def buildPageFactories(self):
108 raise NotImplementedError() 109 raise NotImplementedError()
109 110
110 def resolveRef(self, ref_path): 111 def resolveRef(self, ref_path):
112 """ Returns the full path and source metadata given a source
113 (relative) path, like a ref-spec.
114 """
111 raise NotImplementedError() 115 raise NotImplementedError()
112 116
113 def findPagePath(self, metadata, mode): 117 def findPageFactory(self, metadata, mode):
114 raise NotImplementedError() 118 raise NotImplementedError()
115 119
116 def buildDataProvider(self, page, user_data): 120 def buildDataProvider(self, page, user_data):
117 if self._provider_type is None: 121 if self._provider_type is None:
118 cls = next((pt for pt in self.app.plugin_loader.getDataProviders() 122 cls = next((pt for pt in self.app.plugin_loader.getDataProviders()