diff piecrust/sources/autoconfig.py @ 148:432cd534ce08

Add `autoconfig` page source.
author Ludovic Chabant <ludovic@chabant.com>
date Sat, 29 Nov 2014 21:00:54 -0800
parents
children 683baa977d97
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/piecrust/sources/autoconfig.py	Sat Nov 29 21:00:54 2014 -0800
@@ -0,0 +1,71 @@
+import os
+import os.path
+import logging
+from piecrust.sources.base import (
+        PageSource, IPreparingSource, SimplePaginationSourceMixin,
+        PageNotFoundError, InvalidFileSystemEndpointError,
+        PageFactory, MODE_CREATING, MODE_PARSING)
+
+
+logger = logging.getLogger(__name__)
+
+
+class AutoConfigSource(PageSource,
+                       SimplePaginationSourceMixin):
+    SOURCE_NAME = 'autoconfig'
+    PATH_FORMAT = '%(values)s/%(slug)s.%(ext)s'
+
+    def __init__(self, app, name, config):
+        super(AutoConfigSource, self).__init__(app, name, config)
+        self.fs_endpoint = config.get('fs_endpoint', name)
+        self.fs_endpoint_path = os.path.join(self.root_dir, self.fs_endpoint)
+        self.supported_extensions = list(app.config.get('site/auto_formats').keys())
+        self.default_auto_format = app.config.get('site/default_auto_format')
+        self.setting_name = config.get('setting_name', name)
+        self.collapse_single_values = config.get('collapse_single_values', False)
+        self.only_single_values = config.get('only_single_values', False)
+
+    def buildPageFactories(self):
+        if not os.path.isdir(self.fs_endpoint_path):
+            raise InvalidFileSystemEndpointError(self.name, self.fs_endpoint_path)
+
+        for dirpath, dirnames, filenames in os.walk(self.fs_endpoint_path):
+            if not filenames:
+                continue
+            config = self._extractConfigFragment(dirpath)
+            for f in filenames:
+                slug, ext = os.path.splitext(f)
+                path = os.path.join(dirpath, f)
+                metadata = {
+                        'slug': slug,
+                        'config': config}
+                yield PageFactory(self, path, metadata)
+
+    def _extractConfigFragment(self, path):
+        rel_path = os.path.relpath(path, self.fs_endpoint_path)
+        if rel_path == '.':
+            values = []
+        else:
+            values = rel_path.split(os.sep)
+        if self.only_single_values and len(values) > 1:
+            raise Exception("Only one folder level is allowed for pages "
+                            "in source '%s'." % self.name)
+        if self.collapse_single_values and len(values) == 1:
+            values = values[0]
+        return {self.setting_name: values}
+
+    def resolveRef(self, ref_path):
+        return os.path.normpath(
+                os.path.join(self.fs_endpoint_path, ref_path))
+
+    def findPagePath(self, metadata, mode):
+        for dirpath, dirnames, filenames in os.walk(self.fs_endpoint_path):
+            for f in filenames:
+                slug, _ = os.path.splitext(f)
+                if slug == metadata['slug']:
+                    path = os.path.join(dirpath, f)
+                    rel_path = os.path.relpath(path, self.fs_endpoint_path)
+                    config = self._extractConfigFragment(dirpath)
+                    metadata = {'slug': slug, 'config': config}
+                    return rel_path, metadata
+