changeset 1153:a9a592f655e3

config: Add setting for enabling baking or serving posts in the future.
author Ludovic Chabant <ludovic@chabant.com>
date Sat, 19 Jan 2019 17:41:30 -0800
parents 74c0c7483986
children aad9b5a0a809
files piecrust/__init__.py piecrust/appconfigdefaults.py piecrust/dataproviders/pageiterator.py piecrust/environment.py
diffstat 4 files changed, 27 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/piecrust/__init__.py	Sat Jan 19 17:40:13 2019 -0800
+++ b/piecrust/__init__.py	Sat Jan 19 17:41:30 2019 -0800
@@ -19,7 +19,7 @@
 
 PIECRUST_URL = 'https://bolt80.com/piecrust/'
 
-CACHE_VERSION = 33
+CACHE_VERSION = 34
 
 try:
     from piecrust.__version__ import APP_VERSION
--- a/piecrust/appconfigdefaults.py	Sat Jan 19 17:40:13 2019 -0800
+++ b/piecrust/appconfigdefaults.py	Sat Jan 19 17:41:30 2019 -0800
@@ -32,10 +32,12 @@
     }),
     'baker': collections.OrderedDict({
         'no_bake_setting': 'draft',
+        'bake_future': False,
         'workers': None,
         'batch_size': None
     }),
     'server': collections.OrderedDict({
+        'serve_future': True,
         'enable_gzip': True,
         'cache_time': 28800,
         'enable_debug_info': True,
--- a/piecrust/dataproviders/pageiterator.py	Sat Jan 19 17:40:13 2019 -0800
+++ b/piecrust/dataproviders/pageiterator.py	Sat Jan 19 17:41:30 2019 -0800
@@ -266,6 +266,16 @@
                 # the `draft` setting.
                 draft_setting = app.config['baker/no_bake_setting']
                 self._it = NoDraftsIterator(self._it, draft_setting)
+
+                if not app.config.get('baker/bake_future'):
+                    # Don't bake pages from the future.
+                    self._it = PruneFutureIterator(self._it,
+                                                   app.env.start_datetime)
+            elif app.config.get('server/is_serving'):
+                if not app.config.get('server/serve_future'):
+                    # Don't serve pages from the future.
+                    self._it = PruneFutureIterator(self._it,
+                                                   app.env.start_datetime)
         else:
             self._it = GenericSourceIterator(self._source)
 
@@ -425,6 +435,17 @@
         yield from filter(lambda i: not i.config.get(nds), self.it)
 
 
+class PruneFutureIterator:
+    def __init__(self, source, now_dt):
+        self.it = source
+        self.now_dt = now_dt
+
+    def __iter__(self):
+        now_dt = self.now_dt
+        for i in self.it:
+            if i.datetime <= now_dt:
+                yield i
+
 class PaginationDataBuilderIterator:
     def __init__(self, it):
         self.it = it
--- a/piecrust/environment.py	Sat Jan 19 17:40:13 2019 -0800
+++ b/piecrust/environment.py	Sat Jan 19 17:41:30 2019 -0800
@@ -1,5 +1,6 @@
 import time
 import logging
+import datetime
 import contextlib
 
 
@@ -79,6 +80,7 @@
 
         self.app = None
         self.start_time = None
+        self.start_datetime = None
         self.was_cache_cleaned = False
         self.page_repository = MemCache()
         self.rendered_segments_repository = MemCache()
@@ -94,6 +96,7 @@
     def initialize(self, app):
         self.app = app
         self.start_time = time.perf_counter()
+        self.start_datetime = datetime.datetime.now()
 
         self.rendered_segments_repository.fs_cache = \
             app.cache.getCache('renders')