annotate piecrust/sources/autoconfig.py @ 156:683baa977d97

Simplify `AutoConfigSource` by inheriting from `SimplePageSource`.
author Ludovic Chabant <ludovic@chabant.com>
date Sat, 27 Dec 2014 18:14:46 -0800
parents 432cd534ce08
children f43f19975671
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 (
156
683baa977d97 Simplify `AutoConfigSource` by inheriting from `SimplePageSource`.
Ludovic Chabant <ludovic@chabant.com>
parents: 148
diff changeset
5 SimplePageSource, IPreparingSource, SimplePaginationSourceMixin,
148
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
156
683baa977d97 Simplify `AutoConfigSource` by inheriting from `SimplePageSource`.
Ludovic Chabant <ludovic@chabant.com>
parents: 148
diff changeset
13 class AutoConfigSource(SimplePageSource,
148
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
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
17 def __init__(self, app, name, config):
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
18 super(AutoConfigSource, self).__init__(app, name, config)
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
19 self.setting_name = config.get('setting_name', name)
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
20 self.collapse_single_values = config.get('collapse_single_values', False)
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
21 self.only_single_values = config.get('only_single_values', False)
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
22
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
23 def buildPageFactories(self):
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
24 if not os.path.isdir(self.fs_endpoint_path):
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
25 raise InvalidFileSystemEndpointError(self.name, self.fs_endpoint_path)
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
26
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
27 for dirpath, dirnames, filenames in os.walk(self.fs_endpoint_path):
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
28 if not filenames:
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
29 continue
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
30 config = self._extractConfigFragment(dirpath)
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
31 for f in filenames:
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
32 slug, ext = os.path.splitext(f)
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
33 path = os.path.join(dirpath, f)
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
34 metadata = {
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
35 'slug': slug,
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
36 'config': config}
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
37 yield PageFactory(self, path, metadata)
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
38
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
39 def _extractConfigFragment(self, path):
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
40 rel_path = os.path.relpath(path, self.fs_endpoint_path)
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
41 if rel_path == '.':
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
42 values = []
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
43 else:
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
44 values = rel_path.split(os.sep)
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
45 if self.only_single_values and len(values) > 1:
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
46 raise Exception("Only one folder level is allowed for pages "
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
47 "in source '%s'." % self.name)
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
48 if self.collapse_single_values and len(values) == 1:
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
49 values = values[0]
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
50 return {self.setting_name: values}
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
51
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
52 def findPagePath(self, metadata, mode):
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
53 for dirpath, dirnames, filenames in os.walk(self.fs_endpoint_path):
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
54 for f in filenames:
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
55 slug, _ = os.path.splitext(f)
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
56 if slug == metadata['slug']:
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
57 path = os.path.join(dirpath, f)
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
58 rel_path = os.path.relpath(path, self.fs_endpoint_path)
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
59 config = self._extractConfigFragment(dirpath)
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
60 metadata = {'slug': slug, 'config': config}
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
61 return rel_path, metadata
432cd534ce08 Add `autoconfig` page source.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
62