changeset 368:2408eb6f4da8

linker: Don't put linker stuff in the config. Now that we want to deep-copy configuration, we can't put objects in there. We create a wrapper for pages that will store linker-specific objects in a separate attribute.
author Ludovic Chabant <ludovic@chabant.com>
date Sun, 03 May 2015 18:43:28 -0700
parents 734f2abf361c
children 4b1019bb2533
files piecrust/data/linker.py
diffstat 1 files changed, 27 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/piecrust/data/linker.py	Sun May 03 18:42:29 2015 -0700
+++ b/piecrust/data/linker.py	Sun May 03 18:43:28 2015 -0700
@@ -25,7 +25,7 @@
         self._linker._load()
         if self._linker._self_item is None:
             return None
-        return self._linker._self_item.config.get('__linker_child')
+        return self._linker._self_item._linker_info.child_linker
 
     @property
     def root(self):
@@ -45,9 +45,9 @@
 
     def __init__(self, page):
         super(LinkedPageData, self).__init__(page)
-        self.name = page.config.get('__linker_name')
-        self.is_self = page.config.get('__linker_is_self')
-        self.children = page.config.get('__linker_child')
+        self.name = page._linker_info.name
+        self.is_self = page._linker_info.is_self
+        self.children = page._linker_info.child_linker
         self.is_dir = (self.children is not None)
         self.is_page = True
 
@@ -100,6 +100,22 @@
         return None
 
 
+class _LinkerInfo(object):
+    def __init__(self):
+        self.name = None
+        self.is_self = False
+        self.child_linker = None
+
+
+class _LinkedPage(object):
+    def __init__(self, page):
+        self._page = page
+        self._linker_info = _LinkerInfo()
+
+    def __getattr__(self, name):
+        return getattr(self._page, name)
+
+
 class Linker(object):
     debug_render_doc = """Provides access to sibling and children pages."""
 
@@ -200,10 +216,11 @@
                     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', is_self)
+                    page = data.buildPage()
+                    is_self = (page.rel_path == self._root_page_path)
+                    item = _LinkedPage(page)
+                    item._linker_info.name = name
+                    item._linker_info.is_self = is_self
                     if is_self:
                         self._self_item = item
 
@@ -213,11 +230,11 @@
                 elif is_dir:
                     # The current item is a directory. The existing item
                     # should be a page.
-                    existing.config.set('__linker_child', item)
+                    existing._linker_info.child_linker = item
                 else:
                     # The current item is a page. The existing item should
                     # be a directory.
-                    item.config.set('__linker_child', existing)
+                    item._linker_info.child_linker = existing
                     self._items[name] = item