annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
148
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1 import os
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2 import os.path
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
3 import logging
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
4 from piecrust.sources.base import (
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
5 PageSource, IPreparingSource, SimplePaginationSourceMixin,
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
6 PageNotFoundError, InvalidFileSystemEndpointError,
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
7 PageFactory, MODE_CREATING, MODE_PARSING)
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
8
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
9
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
10 logger = logging.getLogger(__name__)
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
11
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
12
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
13 class AutoConfigSource(PageSource,
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
14 SimplePaginationSourceMixin):
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
15 SOURCE_NAME = 'autoconfig'
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
16 PATH_FORMAT = '%(values)s/%(slug)s.%(ext)s'
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
17
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
18 def __init__(self, app, name, config):
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
19 super(AutoConfigSource, self).__init__(app, name, config)
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
20 self.fs_endpoint = config.get('fs_endpoint', name)
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
21 self.fs_endpoint_path = os.path.join(self.root_dir, self.fs_endpoint)
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
22 self.supported_extensions = list(app.config.get('site/auto_formats').keys())
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
23 self.default_auto_format = app.config.get('site/default_auto_format')
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
24 self.setting_name = config.get('setting_name', name)
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
25 self.collapse_single_values = config.get('collapse_single_values', False)
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
26 self.only_single_values = config.get('only_single_values', False)
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
27
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
28 def buildPageFactories(self):
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
29 if not os.path.isdir(self.fs_endpoint_path):
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
30 raise InvalidFileSystemEndpointError(self.name, self.fs_endpoint_path)
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
31
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
32 for dirpath, dirnames, filenames in os.walk(self.fs_endpoint_path):
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
33 if not filenames:
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
34 continue
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
35 config = self._extractConfigFragment(dirpath)
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
36 for f in filenames:
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
37 slug, ext = os.path.splitext(f)
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
38 path = os.path.join(dirpath, f)
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
39 metadata = {
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
40 'slug': slug,
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
41 'config': config}
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
42 yield PageFactory(self, path, metadata)
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
43
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
44 def _extractConfigFragment(self, path):
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
45 rel_path = os.path.relpath(path, self.fs_endpoint_path)
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
46 if rel_path == '.':
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
47 values = []
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
48 else:
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
49 values = rel_path.split(os.sep)
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
50 if self.only_single_values and len(values) > 1:
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
51 raise Exception("Only one folder level is allowed for pages "
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
52 "in source '%s'." % self.name)
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
53 if self.collapse_single_values and len(values) == 1:
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
54 values = values[0]
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
55 return {self.setting_name: values}
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
56
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
57 def resolveRef(self, ref_path):
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
58 return os.path.normpath(
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
59 os.path.join(self.fs_endpoint_path, ref_path))
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
60
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
61 def findPagePath(self, metadata, mode):
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
62 for dirpath, dirnames, filenames in os.walk(self.fs_endpoint_path):
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
63 for f in filenames:
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
64 slug, _ = os.path.splitext(f)
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
65 if slug == metadata['slug']:
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
66 path = os.path.join(dirpath, f)
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
67 rel_path = os.path.relpath(path, self.fs_endpoint_path)
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
68 config = self._extractConfigFragment(dirpath)
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
69 metadata = {'slug': slug, 'config': config}
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
70 return rel_path, metadata
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
71