changeset 247:d9d5c5de02a8

data: Add a top level wrapper for `Linker`. The `family` object is special in that it's "attached" to the current page, so make an object dedicated to that. It removes special code in `Linker`, and makes it possible to go `family.children` directly to get a page's children (i.e. pages in a directory of the same name).
author Ludovic Chabant <ludovic@chabant.com>
date Thu, 19 Feb 2015 23:33:54 -0800
parents f130365568ff
children 3f740928043a
files piecrust/data/builder.py piecrust/data/linker.py
diffstat 2 files changed, 44 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/piecrust/data/builder.py	Wed Feb 18 18:35:03 2015 -0800
+++ b/piecrust/data/builder.py	Thu Feb 19 23:33:54 2015 -0800
@@ -5,7 +5,7 @@
 from piecrust.configuration import merge_dicts
 from piecrust.data.assetor import Assetor
 from piecrust.data.debug import build_debug_info
-from piecrust.data.linker import Linker
+from piecrust.data.linker import PageLinkerData
 from piecrust.data.paginator import Paginator
 from piecrust.uriutil import get_slug, get_first_sub_uri
 
@@ -36,13 +36,13 @@
     paginator = Paginator(page, pgn_source, first_uri, ctx.page_num,
                           ctx.pagination_filter)
     assetor = Assetor(page, first_uri)
-    recursive_linker = Linker(page.source, page_path=page.rel_path)
+    linker = PageLinkerData(page.source, page.rel_path)
     data = {
             'piecrust': pc_data,
             'page': dict(page.config.get()),
             'assets': assetor,
             'pagination': paginator,
-            'family': recursive_linker
+            'family': linker
             }
     page_data = data['page']
     page_data['url'] = ctx.uri
--- a/piecrust/data/linker.py	Wed Feb 18 18:35:03 2015 -0800
+++ b/piecrust/data/linker.py	Thu Feb 19 23:33:54 2015 -0800
@@ -9,6 +9,33 @@
 logger = logging.getLogger(__name__)
 
 
+class PageLinkerData(object):
+    """ Entry template data to get access to related pages from a given
+        root page.
+    """
+    def __init__(self, source, page_path):
+        self._linker = Linker(source, page_path)
+
+    @property
+    def siblings(self):
+        return self._linker
+
+    @property
+    def children(self):
+        self._linker._load()
+        print("GOT ", self._linker._items.keys())
+        if self._linker._self_item is None:
+            return None
+        return self._linker._self_item.config.get('__linker_child')
+
+    @property
+    def root(self):
+        return self._linker.root
+
+    def forpath(self, rel_path):
+        return self._linker.forpath(rel_path)
+
+
 class LinkedPageData(PaginationData):
     """ Class whose instances get returned when iterating on a `Linker`
         or `RecursiveLinker`. It's just like what gets usually returned by
@@ -77,12 +104,13 @@
 class Linker(object):
     debug_render_doc = """Provides access to sibling and children pages."""
 
-    def __init__(self, source, *, name=None, dir_path=None, page_path=None):
+    def __init__(self, source, root_page_path, *, name=None, dir_path=None):
         self._source = source
+        self._root_page_path = root_page_path
         self._name = name
         self._dir_path = dir_path
-        self._root_page_path = page_path
         self._items = None
+        self._self_item = None
 
         self.is_dir = True
         self.is_page = False
@@ -138,9 +166,8 @@
         return self.forpath('/')
 
     def forpath(self, rel_path):
-        return Linker(self._source,
-                      name='.', dir_path=rel_path,
-                      page_path=self._root_page_path)
+        return Linker(self._source, self._root_page_path,
+                      name='.', dir_path=rel_path)
 
     def _iterItems(self, max_depth=-1, filter_func=None):
         items = walk_linkers(self, max_depth=max_depth,
@@ -156,11 +183,10 @@
         if not is_listable:
             raise Exception("Source '%s' can't be listed." % self._source.name)
 
-        if self._root_page_path is not None:
-            if self._name is None:
-                self._name = self._source.getBasename(self._root_page_path)
-            if self._dir_path is None:
-                self._dir_path = self._source.getDirpath(self._root_page_path)
+        if self._name is None:
+            self._name = self._source.getBasename(self._root_page_path)
+        if self._dir_path is None:
+            self._dir_path = self._source.getDirpath(self._root_page_path)
 
         if self._dir_path is None:
             raise Exception("This linker has no directory to start from.")
@@ -172,13 +198,15 @@
                 # If `is_dir` is true, `data` will be the directory's source
                 # path. If not, it will be a page factory.
                 if is_dir:
-                    item = Linker(self._source,
+                    item = Linker(self._source, self._root_page_path,
                                   name=name, dir_path=data)
                 else:
                     item = data.buildPage()
+                    is_self = (item.rel_path == self._root_page_path)
                     item.config.set('__linker_name', name)
-                    item.config.set('__linker_is_self',
-                                    item.rel_path == self._root_page_path)
+                    item.config.set('__linker_is_self', is_self)
+                    if is_self:
+                        self._self_item = item
 
                 existing = self._items.get(name)
                 if existing is None: