diff piecrust/data/builder.py @ 852:4850f8c21b6e

core: Start of the big refactor for PieCrust 3.0. * Everything is a `ContentSource`, including assets directories. * Most content sources are subclasses of the base file-system source. * A source is processed by a "pipeline", and there are 2 built-in pipelines, one for assets and one for pages. The asset pipeline is vaguely functional, but the page pipeline is completely broken right now. * Rewrite the baking process as just running appropriate pipelines on each content item. This should allow for better parallelization.
author Ludovic Chabant <ludovic@chabant.com>
date Wed, 17 May 2017 00:11:48 -0700
parents 71c4f43d8fc1
children f070a4fc033c
line wrap: on
line diff
--- a/piecrust/data/builder.py	Sat Apr 29 21:42:22 2017 -0700
+++ b/piecrust/data/builder.py	Wed May 17 00:11:48 2017 -0700
@@ -1,53 +1,43 @@
 import logging
-from werkzeug.utils import cached_property
 from piecrust.data.base import MergedMapping
 from piecrust.data.linker import PageLinkerData
 from piecrust.data.pagedata import PageData
 from piecrust.data.paginator import Paginator
 from piecrust.data.piecrustdata import PieCrustData
 from piecrust.data.providersdata import DataProvidersData
-from piecrust.routing import CompositeRouteFunction
+from piecrust.routing import RouteFunction
 
 
 logger = logging.getLogger(__name__)
 
 
 class DataBuildingContext(object):
-    def __init__(self, qualified_page, page_num=1):
-        self.page = qualified_page
-        self.page_num = page_num
+    def __init__(self, qualified_page):
+        self.qualified_page = qualified_page
         self.pagination_source = None
         self.pagination_filter = None
 
-    @property
-    def app(self):
-        return self.page.app
-
-    @cached_property
-    def uri(self):
-        return self.page.getUri(self.page_num)
-
 
 def build_page_data(ctx):
-    app = ctx.app
-    page = ctx.page
+    qpage = ctx.qualified_page
+    page = qpage.page
+    app = page.app
     pgn_source = ctx.pagination_source or get_default_pagination_source(page)
     first_uri = ctx.page.getUri(1)
 
     pc_data = PieCrustData()
     config_data = PageData(page, ctx)
-    paginator = Paginator(page, pgn_source,
-                          page_num=ctx.page_num,
+    paginator = Paginator(qpage, pgn_source,
                           pgn_filter=ctx.pagination_filter)
     assetor = page.source.buildAssetor(page, first_uri)
     linker = PageLinkerData(page.source, page.rel_path)
     data = {
-            'piecrust': pc_data,
-            'page': config_data,
-            'assets': assetor,
-            'pagination': paginator,
-            'family': linker
-            }
+        'piecrust': pc_data,
+        'page': config_data,
+        'assets': assetor,
+        'pagination': paginator,
+        'family': linker
+    }
 
     for route in app.routes:
         name = route.func_name
@@ -56,17 +46,13 @@
 
         func = data.get(name)
         if func is None:
-            func = CompositeRouteFunction()
-            func.addFunc(route)
-            data[name] = func
-        elif isinstance(func, CompositeRouteFunction):
-            func.addFunc(route)
+            data[name] = RouteFunction(route)
         else:
             raise Exception("Route function '%s' collides with an "
                             "existing function or template data." %
                             name)
 
-    #TODO: handle slugified taxonomy terms.
+    # TODO: handle slugified taxonomy terms.
 
     site_data = app.config.getAll()
     providers_data = DataProvidersData(page)
@@ -81,7 +67,7 @@
     return data
 
 
-def build_layout_data(page, page_data, contents):
+def add_layout_data(page_data, contents):
     for name, txt in contents.items():
         if name in page_data:
             logger.warning("Content segment '%s' will hide existing data." %