diff piecrust/pipelines/records.py @ 853:f070a4fc033c

core: Continue PieCrust3 refactor, simplify pages. The asset pipeline is still the only function pipeline at this point. * No more `QualifiedPage`, and several other pieces of code deleted. * Data providers are simpler and more focused. For instance, the page iterator doesn't try to support other types of items. * Route parameters are proper known source metadata to remove the confusion between the two. * Make the baker and pipeline more correctly manage records and record histories. * Add support for record collapsing and deleting stale outputs in the asset pipeline.
author Ludovic Chabant <ludovic@chabant.com>
date Sun, 21 May 2017 00:06:59 -0700
parents 4850f8c21b6e
children 08e02c2a2a1a
line wrap: on
line diff
--- a/piecrust/pipelines/records.py	Wed May 17 00:11:48 2017 -0700
+++ b/piecrust/pipelines/records.py	Sun May 21 00:06:59 2017 -0700
@@ -10,6 +10,8 @@
 
 
 class MultiRecord:
+    """ A container that includes multiple `Record` instances.
+    """
     RECORD_VERSION = 12
 
     def __init__(self):
@@ -28,7 +30,7 @@
                 return r
         if not auto_create:
             return None
-        record = Record()
+        record = Record(record_name)
         self.records.append(record)
         return record
 
@@ -48,23 +50,31 @@
 
 
 class Record:
-    def __init__(self):
-        self.name = None
+    """ A basic class that represents a 'record' of a bake operation on a
+        content source.
+    """
+    def __init__(self, name):
+        self.name = name
         self.entries = []
-        self.stats = {}
-        self.out_dir = None
+        self.deleted_out_paths = []
         self.success = True
 
 
 class RecordEntry:
+    """ An entry in a record, for a specific content item.
+    """
     def __init__(self):
         self.item_spec = None
+        self.out_paths = []
         self.errors = []
 
     @property
     def success(self):
         return len(self.errors) == 0
 
+    def describe(self):
+        return {}
+
 
 def _are_records_valid(multi_record):
     return (multi_record._app_version == APP_VERSION and
@@ -101,6 +111,9 @@
 
 
 class MultiRecordHistory:
+    """ Tracks the differences between an 'old' and a 'new' record
+        container.
+    """
     def __init__(self, previous, current):
         if previous is None or current is None:
             raise ValueError()
@@ -114,7 +127,13 @@
         for h in self.histories:
             if h.name == record_name:
                 return h
-        return None
+        rh = RecordHistory(
+            Record(record_name),
+            Record(record_name))
+        self.histories.append(rh)
+        self.previous.records.append(rh.previous)
+        self.current.records.append(rh.current)
+        return rh
 
     def _buildHistories(self, previous, current):
         pairs = {}
@@ -128,22 +147,30 @@
                     raise Exception("Got several records named: %s" % r.name)
                 pairs[r.name] = (p[0], r)
 
-        for p, c in pairs.values():
+        for name, pair in pairs.items():
+            p, c = pair
+            if p is None:
+                p = Record(name)
+                previous.records.append(p)
+            if c is None:
+                c = Record(name)
+                current.records.append(c)
             self.histories.append(RecordHistory(p, c))
 
 
 class RecordHistory:
     def __init__(self, previous, current):
-        self._diffs = {}
-        self._previous = previous
-        self._current = current
+        if previous is None or current is None:
+            raise ValueError()
 
-        if previous and current and previous.name != current.name:
+        if previous.name != current.name:
             raise Exception("The two records must have the same name! "
                             "Got '%s' and '%s'." %
                             (previous.name, current.name))
 
-        self._buildDiffs()
+        self._previous = previous
+        self._current = current
+        self._diffs = None
 
     @property
     def name(self):
@@ -159,9 +186,15 @@
 
     @property
     def diffs(self):
+        if self._diffs is None:
+            raise Exception("This record history hasn't been built yet.")
         return self._diffs.values()
 
-    def _buildDiffs(self):
+    def build(self):
+        if self._diffs is not None:
+            raise Exception("This record history has already been built.")
+
+        self._diffs = {}
         if self._previous is not None:
             for e in self._previous.entries:
                 key = _build_diff_key(e.item_spec)