diff piecrust/environment.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 61d606fbc313
children 08e02c2a2a1a
line wrap: on
line diff
--- a/piecrust/environment.py	Sat Apr 29 21:42:22 2017 -0700
+++ b/piecrust/environment.py	Wed May 17 00:11:48 2017 -0700
@@ -1,68 +1,23 @@
 import time
 import logging
 import contextlib
-from piecrust.cache import MemCache
 
 
 logger = logging.getLogger(__name__)
 
 
-class AbortedSourceUseError(Exception):
-    pass
-
-
-class ExecutionInfo(object):
-    def __init__(self, page, render_ctx):
-        self.page = page
-        self.render_ctx = render_ctx
-        self.was_cache_valid = False
-        self.start_time = time.perf_counter()
-
-
-class ExecutionInfoStack(object):
-    def __init__(self):
-        self._page_stack = []
-
-    @property
-    def current_page_info(self):
-        if len(self._page_stack) == 0:
-            return None
-        return self._page_stack[-1]
-
-    @property
-    def is_main_page(self):
-        return len(self._page_stack) == 1
-
-    def hasPage(self, page):
-        for ei in self._page_stack:
-            if ei.page == page:
-                return True
-        return False
-
-    def pushPage(self, page, render_ctx):
-        if len(self._page_stack) > 0:
-            top = self._page_stack[-1]
-            assert top.page is not page
-        self._page_stack.append(ExecutionInfo(page, render_ctx))
-
-    def popPage(self):
-        del self._page_stack[-1]
-
-    def clear(self):
-        self._page_stack = []
-
-
-class ExecutionStats(object):
+class ExecutionStats:
     def __init__(self):
         self.timers = {}
         self.counters = {}
         self.manifests = {}
 
-    def registerTimer(self, category, *, raise_if_registered=True):
+    def registerTimer(self, category, *,
+                      raise_if_registered=True, time=0):
         if raise_if_registered and category in self.timers:
             raise Exception("Timer '%s' has already been registered." %
                             category)
-        self.timers[category] = 0
+        self.timers[category] = time
 
     @contextlib.contextmanager
     def timerScope(self, category):
@@ -106,83 +61,42 @@
             self.manifests[oc] = v + ov
 
 
-class Environment(object):
+class Environment:
     def __init__(self):
+        from piecrust.cache import MemCache
+        from piecrust.rendering import RenderingContextStack
+
         self.app = None
         self.start_time = None
-        self.exec_info_stack = ExecutionInfoStack()
         self.was_cache_cleaned = False
-        self.base_asset_url_format = '%uri%'
         self.page_repository = MemCache()
         self.rendered_segments_repository = MemCache()
-        self.fs_caches = {
-                'renders': self.rendered_segments_repository}
+        self.render_ctx_stack = RenderingContextStack()
         self.fs_cache_only_for_main_page = False
         self.abort_source_use = False
         self._default_layout_extensions = None
         self._stats = ExecutionStats()
 
     @property
-    def default_layout_extensions(self):
-        if self._default_layout_extensions is not None:
-            return self._default_layout_extensions
-
-        if self.app is None:
-            raise Exception("This environment has not been initialized yet.")
-
-        from piecrust.rendering import get_template_engine
-        dte = get_template_engine(self.app, None)
-        self._default_layout_extensions = ['.' + e.lstrip('.')
-                                           for e in dte.EXTENSIONS]
-        return self._default_layout_extensions
+    def stats(self):
+        return self._stats
 
     def initialize(self, app):
         self.app = app
         self.start_time = time.perf_counter()
-        self.exec_info_stack.clear()
-        self.was_cache_cleaned = False
-        self.base_asset_url_format = '%uri%'
 
-        for name, repo in self.fs_caches.items():
-            cache = app.cache.getCache(name)
-            repo.fs_cache = cache
-
-    def registerTimer(self, category, *, raise_if_registered=True):
-        self._stats.registerTimer(
-                category, raise_if_registered=raise_if_registered)
-
-    def timerScope(self, category):
-        return self._stats.timerScope(category)
-
-    def stepTimer(self, category, value):
-        self._stats.stepTimer(category, value)
+        self.rendered_segments_repository.fs_cache = \
+            app.cache.getCache('renders')
 
-    def stepTimerSince(self, category, since):
-        self._stats.stepTimerSince(category, since)
-
-    def registerCounter(self, category, *, raise_if_registered=True):
-        self._stats.registerCounter(
-                category, raise_if_registered=raise_if_registered)
-
-    def stepCounter(self, category, inc=1):
-        self._stats.stepCounter(category, inc)
-
-    def registerManifest(self, name, *, raise_if_registered=True):
-        self._stats.registerManifest(
-                name, raise_if_registered=raise_if_registered)
-
-    def addManifestEntry(self, name, entry):
-        self._stats.addManifestEntry(name, entry)
-
-    def getStats(self):
+    def _mergeCacheStats(self):
         repos = [
-                ('RenderedSegmentsRepo', self.rendered_segments_repository),
-                ('PagesRepo', self.page_repository)]
+            ('RenderedSegmentsRepo', self.rendered_segments_repository),
+            ('PagesRepo', self.page_repository)]
         for name, repo in repos:
             self._stats.counters['%s_hit' % name] = repo._hits
             self._stats.counters['%s_miss' % name] = repo._misses
-            self._stats.manifests['%s_missedKeys' % name] = list(repo._missed_keys)
-        return self._stats
+            self._stats.manifests['%s_missedKeys' % name] = \
+                list(repo._missed_keys)
 
 
 class StandardEnvironment(Environment):