Mercurial > piecrust2
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() |