diff piecrust/data/base.py @ 6:f5ca5c5bed85

More Python 3 fixes, modularization, and new unit tests.
author Ludovic Chabant <ludovic@chabant.com>
date Sat, 16 Aug 2014 08:15:30 -0700
parents 474c9882decf
children 30a42341cfa8
line wrap: on
line diff
--- a/piecrust/data/base.py	Mon Aug 11 22:36:47 2014 -0700
+++ b/piecrust/data/base.py	Sat Aug 16 08:15:30 2014 -0700
@@ -6,6 +6,23 @@
 logger = logging.getLogger(__name__)
 
 
+class IPaginationSource(object):
+    def getItemsPerPage(self):
+        raise NotImplementedError()
+
+    def getSourceIterator(self):
+        raise NotImplementedError()
+
+    def getSorterIterator(self, it):
+        raise NotImplementedError()
+
+    def getTailIterator(self, it):
+        raise NotImplementedError()
+
+    def getPaginationFilter(self, page):
+        raise NotImplementedError()
+
+
 class LazyPageConfigData(object):
     """ An object that represents the configuration header of a page,
         but also allows for additional data. It's meant to be exposed
@@ -78,43 +95,19 @@
         pass
 
 
-def build_uri(page):
-    route = page.app.getRoute(page.source.name, page.source_metadata)
-    if route is None:
-        raise Exception("Can't get route for page: %s" % page.path)
-    return route.getUri(page.source_metadata)
-
-
-def load_rendered_segment(data, name):
-    from piecrust.rendering import PageRenderingContext, render_page_segments
-
-    uri = build_uri(data.page)
-    try:
-        ctx = PageRenderingContext(data.page, uri)
-        segs = render_page_segments(ctx)
-    except Exception as e:
-        logger.exception("Error rendering segments for '%s': %s" % (uri, e))
-        raise
-
-    for k, v in segs.items():
-        data.mapLoader(k, None)
-        data.setValue(k, v)
-
-    if 'content.abstract' in segs:
-        data.setValue('content', segs['content.abstract'])
-        data.setValue('has_more', True)
-        if name == 'content':
-            return segs['content.abstract']
-
-    return segs[name]
-
-
 class PaginationData(LazyPageConfigData):
     def __init__(self, page):
         super(PaginationData, self).__init__(page)
 
+    def _get_uri(self):
+        page = self._page
+        route = page.app.getRoute(page.source.name, page.source_metadata)
+        if route is None:
+            raise Exception("Can't get route for page: %s" % page.path)
+        return route.getUri(page.source_metadata)
+
     def _loadCustom(self):
-        page_url = build_uri(self.page)
+        page_url = self._get_uri()
         self.setValue('url', page_url)
         self.setValue('slug', page_url)
         self.setValue('timestamp',
@@ -128,5 +121,29 @@
 
         segment_names = self.page.config.get('segments')
         for name in segment_names:
-            self.mapLoader(name, load_rendered_segment)
+            self.mapLoader(name, self._load_rendered_segment)
+
+    def _load_rendered_segment(self, data, name):
+        from piecrust.rendering import PageRenderingContext, render_page_segments
 
+        assert self is data
+        uri = self._get_uri()
+        try:
+            ctx = PageRenderingContext(self._page, uri)
+            segs = render_page_segments(ctx)
+        except Exception as e:
+            logger.exception("Error rendering segments for '%s': %s" % (uri, e))
+            raise
+
+        for k, v in segs.items():
+            self.mapLoader(k, None)
+            self.setValue(k, v)
+
+        if 'content.abstract' in segs:
+            self.setValue('content', segs['content.abstract'])
+            self.setValue('has_more', True)
+            if name == 'content':
+                return segs['content.abstract']
+
+        return segs[name]
+