annotate piecrust/appconfig.py @ 681:894d286b348f

internal: Refactor config loading some more. * Remove fixup code in the app to make the app config class more standalone. * Remove support for old-style variants... maybe bring it back later. * Try and fix various bugs introduced by subtle config value overriding order changes.
author Ludovic Chabant <ludovic@chabant.com>
date Tue, 08 Mar 2016 01:07:34 -0800
parents 3df808b133f8
children ec384174b8b2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
584
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1 import re
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2 import os.path
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
3 import copy
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
4 import json
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
5 import urllib
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
6 import logging
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
7 import hashlib
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
8 import collections
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
9 import yaml
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
10 from piecrust import (
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
11 APP_VERSION, CACHE_VERSION,
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
12 DEFAULT_FORMAT, DEFAULT_TEMPLATE_ENGINE, DEFAULT_POSTS_FS,
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
13 DEFAULT_DATE_FORMAT, DEFAULT_THEME_SOURCE)
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
14 from piecrust.cache import NullCache
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
15 from piecrust.configuration import (
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
16 Configuration, ConfigurationError, ConfigurationLoader,
666
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
17 get_dict_value, set_dict_value, merge_dicts, visit_dict)
584
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
18 from piecrust.sources.base import REALM_USER, REALM_THEME
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
19
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
20
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
21 logger = logging.getLogger(__name__)
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
22
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
23
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
24 class VariantNotFoundError(Exception):
666
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
25 def __init__(self, variant_name, message=None):
584
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
26 super(VariantNotFoundError, self).__init__(
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
27 message or ("No such configuration variant: %s" %
666
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
28 variant_name))
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
29
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
30
584
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
31 class PieCrustConfiguration(Configuration):
681
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
32 def __init__(self, *, path=None, theme_path=None, values=None,
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
33 cache=None, validate=True, theme_config=False):
663
3ceeca7bb71c themes: Add support for a `--theme` argument to `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents: 585
diff changeset
34 super(PieCrustConfiguration, self).__init__()
681
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
35 self._path = path
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
36 self._theme_path = theme_path
666
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
37 self._cache = cache or NullCache()
681
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
38 self._custom_paths = []
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
39 self._post_fixups = []
663
3ceeca7bb71c themes: Add support for a `--theme` argument to `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents: 585
diff changeset
40 self.theme_config = theme_config
3ceeca7bb71c themes: Add support for a `--theme` argument to `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents: 585
diff changeset
41 # Set the values after we set the rest, since our validation needs
3ceeca7bb71c themes: Add support for a `--theme` argument to `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents: 585
diff changeset
42 # our attributes.
3ceeca7bb71c themes: Add support for a `--theme` argument to `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents: 585
diff changeset
43 if values:
3ceeca7bb71c themes: Add support for a `--theme` argument to `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents: 585
diff changeset
44 self.setAll(values, validate=validate)
584
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
45
681
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
46 def addPath(self, p):
666
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
47 self._ensureNotLoaded()
681
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
48 self._custom_paths.append(p)
666
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
49
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
50 def addVariant(self, variant_path, raise_if_not_found=True):
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
51 self._ensureNotLoaded()
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
52 if os.path.isfile(variant_path):
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
53 self.addPath(variant_path)
681
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
54 elif raise_if_not_found:
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
55 logger.error(
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
56 "Configuration variants should now be `.yml` files "
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
57 "located in the `configs/` directory of your website.")
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
58 raise VariantNotFoundError(variant_path)
666
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
59
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
60
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
61 def addVariantValue(self, path, value):
681
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
62 def _fixup(config):
666
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
63 set_dict_value(config, path, value)
681
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
64 self._post_fixups.append(_fixup)
666
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
65
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
66 def _ensureNotLoaded(self):
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
67 if self._values is not None:
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
68 raise Exception("The configurations has been loaded.")
584
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
69
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
70 def _load(self):
681
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
71 paths_and_fixups = []
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
72 if self._theme_path:
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
73 paths_and_fixups.append((self._theme_path, self._fixupThemeConfig))
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
74 if self._path:
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
75 paths_and_fixups.append((self._path, None))
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
76 paths_and_fixups += [(p, None) for p in self._custom_paths]
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
77
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
78 if not paths_and_fixups:
584
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
79 self._values = self._validateAll({})
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
80 return
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
81
681
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
82 path_times = [os.path.getmtime(p[0]) for p in paths_and_fixups]
584
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
83
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
84 cache_key_hash = hashlib.md5(
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
85 ("version=%s&cache=%d" % (
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
86 APP_VERSION, CACHE_VERSION)).encode('utf8'))
681
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
87 for p, _ in paths_and_fixups:
584
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
88 cache_key_hash.update(("&path=%s" % p).encode('utf8'))
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
89 cache_key = cache_key_hash.hexdigest()
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
90
666
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
91 if self._cache.isValid('config.json', path_times):
584
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
92 logger.debug("Loading configuration from cache...")
666
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
93 config_text = self._cache.read('config.json')
584
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
94 self._values = json.loads(
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
95 config_text,
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
96 object_pairs_hook=collections.OrderedDict)
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
97
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
98 actual_cache_key = self._values.get('__cache_key')
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
99 if actual_cache_key == cache_key:
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
100 self._values['__cache_valid'] = True
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
101 return
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
102 logger.debug("Outdated cache key '%s' (expected '%s')." % (
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
103 actual_cache_key, cache_key))
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
104
681
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
105 logger.debug("Loading configuration from: %s" %
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
106 ', '.join([p[0] for p in paths_and_fixups]))
584
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
107 values = {}
585
25df894f9ab9 internal: Some fixes to the new app configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 584
diff changeset
108 try:
681
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
109 for p, f in paths_and_fixups:
585
25df894f9ab9 internal: Some fixes to the new app configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 584
diff changeset
110 with open(p, 'r', encoding='utf-8') as fp:
25df894f9ab9 internal: Some fixes to the new app configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 584
diff changeset
111 loaded_values = yaml.load(
25df894f9ab9 internal: Some fixes to the new app configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 584
diff changeset
112 fp.read(),
25df894f9ab9 internal: Some fixes to the new app configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 584
diff changeset
113 Loader=ConfigurationLoader)
25df894f9ab9 internal: Some fixes to the new app configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 584
diff changeset
114 if loaded_values is None:
25df894f9ab9 internal: Some fixes to the new app configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 584
diff changeset
115 loaded_values = {}
681
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
116 if f:
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
117 f(loaded_values)
585
25df894f9ab9 internal: Some fixes to the new app configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 584
diff changeset
118 merge_dicts(values, loaded_values)
25df894f9ab9 internal: Some fixes to the new app configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 584
diff changeset
119
681
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
120 for f in self._post_fixups:
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
121 f(values)
584
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
122
585
25df894f9ab9 internal: Some fixes to the new app configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 584
diff changeset
123 self._values = self._validateAll(values)
25df894f9ab9 internal: Some fixes to the new app configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 584
diff changeset
124 except Exception as ex:
681
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
125 raise Exception(
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
126 "Error loading configuration from: %s" %
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
127 ', '.join([p[0] for p in paths_and_fixups])) from ex
584
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
128
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
129 logger.debug("Caching configuration...")
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
130 self._values['__cache_key'] = cache_key
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
131 config_text = json.dumps(self._values)
666
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
132 self._cache.write('config.json', config_text)
584
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
133
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
134 self._values['__cache_valid'] = False
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
135
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
136 def _validateAll(self, values):
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
137 if values is None:
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
138 values = {}
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
139
681
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
140 # We 'prepend' newer values to default values, so we need to do
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
141 # things in the following order so that the final list is made of:
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
142 # (1) user values, (2) site values, (3) theme values.
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
143 # Still, we need to do a few theme-related things before generating
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
144 # the default site content model.
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
145 values = self._preValidateThemeConfig(values)
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
146 values = self._validateSiteConfig(values)
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
147 values = self._validateThemeConfig(values)
663
3ceeca7bb71c themes: Add support for a `--theme` argument to `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents: 585
diff changeset
148
681
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
149 # Add a section for our cached information, and start visiting
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
150 # the configuration tree, calling validation functions as we
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
151 # find them.
584
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
152 cachec = collections.OrderedDict()
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
153 values['__cache'] = cachec
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
154 cache_writer = _ConfigCacheWriter(cachec)
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
155 globs = globals()
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
156
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
157 def _visitor(path, val, parent_val, parent_key):
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
158 callback_name = '_validate_' + path.replace('/', '_')
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
159 callback = globs.get(callback_name)
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
160 if callback:
585
25df894f9ab9 internal: Some fixes to the new app configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 584
diff changeset
161 try:
25df894f9ab9 internal: Some fixes to the new app configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 584
diff changeset
162 val2 = callback(val, values, cache_writer)
25df894f9ab9 internal: Some fixes to the new app configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 584
diff changeset
163 except Exception as ex:
25df894f9ab9 internal: Some fixes to the new app configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 584
diff changeset
164 raise Exception("Error raised in validator '%s'." %
25df894f9ab9 internal: Some fixes to the new app configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 584
diff changeset
165 callback_name) from ex
584
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
166 if val2 is None:
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
167 raise Exception("Validator '%s' isn't returning a "
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
168 "coerced value." % callback_name)
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
169 parent_val[parent_key] = val2
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
170
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
171 visit_dict(values, _visitor)
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
172
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
173 return values
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
174
681
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
175 def _fixupThemeConfig(self, values):
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
176 # Make all sources belong to the "theme" realm.
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
177 sitec = values.get('site')
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
178 if sitec:
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
179 srcc = sitec.get('sources')
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
180 if srcc:
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
181 for sn, sc in srcc.items():
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
182 sc['realm'] = REALM_THEME
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
183
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
184 def _preValidateThemeConfig(self, values):
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
185 if not self._theme_path:
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
186 return values
584
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
187
681
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
188 sitec = values.setdefault('site', collections.OrderedDict())
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
189 gen_default_theme_model = bool(sitec.setdefault(
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
190 'use_default_theme_content', True))
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
191 if gen_default_theme_model:
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
192 pmcopy = copy.deepcopy(default_theme_content_pre_model)
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
193 values = merge_dicts(pmcopy, values)
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
194 return values
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
195
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
196
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
197 def _validateThemeConfig(self, values):
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
198 if not self._theme_path:
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
199 return values
584
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
200
681
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
201 # Create the default theme content model if needed.
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
202 sitec = values.setdefault('site', collections.OrderedDict())
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
203 gen_default_theme_model = bool(sitec.setdefault(
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
204 'use_default_theme_content', True))
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
205 if gen_default_theme_model:
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
206 logger.debug("Generating default theme content model...")
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
207 dcmcopy = copy.deepcopy(default_theme_content_model_base)
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
208 values = merge_dicts(dcmcopy, values)
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
209 return values
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
210
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
211
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
212 def _validateSiteConfig(self, values):
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
213 # Add the loaded values to the default configuration.
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
214 dccopy = copy.deepcopy(default_configuration)
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
215 values = merge_dicts(dccopy, values)
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
216
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
217 # Set the theme site flag.
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
218 sitec = values['site']
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
219 if self.theme_config:
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
220 sitec['theme_site'] = True
584
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
221
681
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
222 # Create the default content model if needed.
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
223 gen_default_model = bool(sitec['use_default_content'])
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
224 if gen_default_model:
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
225 logger.debug("Generating default content model...")
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
226 dcmcopy = copy.deepcopy(default_content_model_base)
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
227 values = merge_dicts(dcmcopy, values)
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
228
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
229 blogsc = values['site'].get('blogs')
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
230 if blogsc is None:
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
231 blogsc = ['posts']
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
232 values['site']['blogs'] = blogsc
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
233
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
234 is_only_blog = (len(blogsc) == 1)
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
235 for blog_name in blogsc:
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
236 blog_cfg = get_default_content_model_for_blog(
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
237 blog_name, is_only_blog, values,
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
238 theme_site=self.theme_config)
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
239 values = merge_dicts(blog_cfg, values)
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
240
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
241 dcm = get_default_content_model(values)
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
242 values = merge_dicts(dcm, values)
585
25df894f9ab9 internal: Some fixes to the new app configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 584
diff changeset
243
584
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
244 return values
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
245
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
246
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
247 class _ConfigCacheWriter(object):
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
248 def __init__(self, cache_dict):
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
249 self._cache_dict = cache_dict
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
250
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
251 def write(self, name, val):
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
252 logger.debug("Caching configuration item '%s' = %s" % (name, val))
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
253 self._cache_dict[name] = val
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
254
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
255
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
256 default_configuration = collections.OrderedDict({
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
257 'site': collections.OrderedDict({
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
258 'title': "Untitled PieCrust website",
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
259 'root': '/',
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
260 'default_format': DEFAULT_FORMAT,
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
261 'default_template_engine': DEFAULT_TEMPLATE_ENGINE,
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
262 'enable_gzip': True,
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
263 'pretty_urls': False,
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
264 'trailing_slash': False,
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
265 'date_format': DEFAULT_DATE_FORMAT,
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
266 'auto_formats': collections.OrderedDict([
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
267 ('html', ''),
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
268 ('md', 'markdown'),
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
269 ('textile', 'textile')]),
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
270 'default_auto_format': 'md',
585
25df894f9ab9 internal: Some fixes to the new app configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 584
diff changeset
271 'default_pagination_source': None,
584
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
272 'pagination_suffix': '/%num%',
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
273 'slugify_mode': 'encode',
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
274 'themes_sources': [DEFAULT_THEME_SOURCE],
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
275 'cache_time': 28800,
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
276 'enable_debug_info': True,
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
277 'show_debug_info': False,
663
3ceeca7bb71c themes: Add support for a `--theme` argument to `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents: 585
diff changeset
278 'use_default_content': True,
3ceeca7bb71c themes: Add support for a `--theme` argument to `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents: 585
diff changeset
279 'theme_site': False
584
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
280 }),
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
281 'baker': collections.OrderedDict({
585
25df894f9ab9 internal: Some fixes to the new app configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 584
diff changeset
282 'no_bake_setting': 'draft',
25df894f9ab9 internal: Some fixes to the new app configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 584
diff changeset
283 'workers': None,
25df894f9ab9 internal: Some fixes to the new app configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 584
diff changeset
284 'batch_size': None
584
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
285 })
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
286 })
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
287
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
288
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
289 default_content_model_base = collections.OrderedDict({
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
290 'site': collections.OrderedDict({
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
291 'posts_fs': DEFAULT_POSTS_FS,
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
292 'default_page_layout': 'default',
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
293 'default_post_layout': 'post',
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
294 'post_url': '%year%/%month%/%day%/%slug%',
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
295 'tag_url': 'tag/%tag%',
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
296 'category_url': '%category%',
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
297 'posts_per_page': 5
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
298 })
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
299 })
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
300
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
301
681
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
302 default_theme_content_pre_model = collections.OrderedDict({
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
303 'site': collections.OrderedDict({
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
304 'theme_tag_page': 'theme_pages:_tag.%ext%',
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
305 'theme_category_page': 'theme_pages:_category.%ext%'
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
306 })
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
307 })
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
308
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
309
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
310 default_theme_content_model_base = collections.OrderedDict({
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
311 'site': collections.OrderedDict({
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
312 'sources': collections.OrderedDict({
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
313 'theme_pages': {
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
314 'type': 'default',
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
315 'ignore_missing_dir': True,
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
316 'fs_endpoint': 'pages',
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
317 'data_endpoint': 'site.pages',
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
318 'default_layout': 'default',
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
319 'item_name': 'page',
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
320 'realm': REALM_THEME
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
321 }
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
322 }),
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
323 'routes': [
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
324 {
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
325 'url': '/%path:slug%',
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
326 'source': 'theme_pages',
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
327 'func': 'pcurl(slug)'
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
328 }
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
329 ]
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
330 })
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
331 })
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
332
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
333
584
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
334 def get_default_content_model(values):
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
335 default_layout = values['site']['default_page_layout']
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
336 return collections.OrderedDict({
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
337 'site': collections.OrderedDict({
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
338 'sources': collections.OrderedDict({
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
339 'pages': {
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
340 'type': 'default',
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
341 'ignore_missing_dir': True,
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
342 'data_endpoint': 'site.pages',
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
343 'default_layout': default_layout,
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
344 'item_name': 'page'
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
345 }
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
346 }),
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
347 'routes': [
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
348 {
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
349 'url': '/%path:slug%',
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
350 'source': 'pages',
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
351 'func': 'pcurl(slug)'
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
352 }
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
353 ],
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
354 'taxonomies': collections.OrderedDict({
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
355 'tags': {
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
356 'multiple': True,
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
357 'term': 'tag'
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
358 },
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
359 'categories': {
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
360 'term': 'category'
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
361 }
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
362 })
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
363 })
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
364 })
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
365
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
366
663
3ceeca7bb71c themes: Add support for a `--theme` argument to `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents: 585
diff changeset
367 def get_default_content_model_for_blog(
3ceeca7bb71c themes: Add support for a `--theme` argument to `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents: 585
diff changeset
368 blog_name, is_only_blog, values, theme_site=False):
584
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
369 posts_fs = values['site']['posts_fs']
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
370 blog_cfg = values.get(blog_name, {})
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
371
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
372 if is_only_blog:
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
373 url_prefix = ''
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
374 tax_page_prefix = ''
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
375 fs_endpoint = 'posts'
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
376 data_endpoint = 'blog'
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
377 item_name = 'post'
675
3df808b133f8 internal: Improve how theme configuration is validated and merged.
Ludovic Chabant <ludovic@chabant.com>
parents: 666
diff changeset
378
3df808b133f8 internal: Improve how theme configuration is validated and merged.
Ludovic Chabant <ludovic@chabant.com>
parents: 666
diff changeset
379 if theme_site:
3df808b133f8 internal: Improve how theme configuration is validated and merged.
Ludovic Chabant <ludovic@chabant.com>
parents: 666
diff changeset
380 # If this is a theme site, show posts from a `sample` directory
3df808b133f8 internal: Improve how theme configuration is validated and merged.
Ludovic Chabant <ludovic@chabant.com>
parents: 666
diff changeset
381 # so it's clearer that those won't show up when the theme is
3df808b133f8 internal: Improve how theme configuration is validated and merged.
Ludovic Chabant <ludovic@chabant.com>
parents: 666
diff changeset
382 # actually applied to a normal site.
3df808b133f8 internal: Improve how theme configuration is validated and merged.
Ludovic Chabant <ludovic@chabant.com>
parents: 666
diff changeset
383 fs_endpoint = 'sample/posts'
584
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
384 else:
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
385 url_prefix = blog_name + '/'
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
386 tax_page_prefix = blog_name + '/'
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
387 fs_endpoint = 'posts/%s' % blog_name
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
388 data_endpoint = blog_name
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
389 item_name = '%s-post' % blog_name
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
390
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
391 items_per_page = blog_cfg.get(
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
392 'posts_per_page', values['site']['posts_per_page'])
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
393 date_format = blog_cfg.get(
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
394 'date_format', values['site']['date_format'])
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
395 default_layout = blog_cfg.get(
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
396 'default_layout', values['site']['default_post_layout'])
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
397
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
398 post_url = '/' + blog_cfg.get(
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
399 'post_url',
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
400 url_prefix + values['site']['post_url']).lstrip('/')
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
401 tag_url = '/' + blog_cfg.get(
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
402 'tag_url',
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
403 url_prefix + values['site']['tag_url']).lstrip('/')
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
404 category_url = '/' + blog_cfg.get(
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
405 'category_url',
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
406 url_prefix + values['site']['category_url']).lstrip('/')
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
407
663
3ceeca7bb71c themes: Add support for a `--theme` argument to `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents: 585
diff changeset
408 tags_taxonomy = 'pages:%s_tag.%%ext%%' % tax_page_prefix
3ceeca7bb71c themes: Add support for a `--theme` argument to `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents: 585
diff changeset
409 category_taxonomy = 'pages:%s_category.%%ext%%' % tax_page_prefix
3ceeca7bb71c themes: Add support for a `--theme` argument to `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents: 585
diff changeset
410 if not theme_site:
675
3df808b133f8 internal: Improve how theme configuration is validated and merged.
Ludovic Chabant <ludovic@chabant.com>
parents: 666
diff changeset
411 theme_tag_page = values['site'].get('theme_tag_page')
3df808b133f8 internal: Improve how theme configuration is validated and merged.
Ludovic Chabant <ludovic@chabant.com>
parents: 666
diff changeset
412 if theme_tag_page:
3df808b133f8 internal: Improve how theme configuration is validated and merged.
Ludovic Chabant <ludovic@chabant.com>
parents: 666
diff changeset
413 tags_taxonomy += ';' + theme_tag_page
3df808b133f8 internal: Improve how theme configuration is validated and merged.
Ludovic Chabant <ludovic@chabant.com>
parents: 666
diff changeset
414 theme_category_page = values['site'].get('theme_category_page')
3df808b133f8 internal: Improve how theme configuration is validated and merged.
Ludovic Chabant <ludovic@chabant.com>
parents: 666
diff changeset
415 if theme_category_page:
3df808b133f8 internal: Improve how theme configuration is validated and merged.
Ludovic Chabant <ludovic@chabant.com>
parents: 666
diff changeset
416 category_taxonomy += ';' + theme_category_page
663
3ceeca7bb71c themes: Add support for a `--theme` argument to `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents: 585
diff changeset
417
584
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
418 return collections.OrderedDict({
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
419 'site': collections.OrderedDict({
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
420 'sources': collections.OrderedDict({
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
421 blog_name: collections.OrderedDict({
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
422 'type': 'posts/%s' % posts_fs,
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
423 'fs_endpoint': fs_endpoint,
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
424 'data_endpoint': data_endpoint,
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
425 'item_name': item_name,
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
426 'ignore_missing_dir': True,
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
427 'data_type': 'blog',
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
428 'items_per_page': items_per_page,
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
429 'date_format': date_format,
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
430 'default_layout': default_layout,
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
431 'taxonomy_pages': collections.OrderedDict({
663
3ceeca7bb71c themes: Add support for a `--theme` argument to `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents: 585
diff changeset
432 'tags': tags_taxonomy,
3ceeca7bb71c themes: Add support for a `--theme` argument to `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents: 585
diff changeset
433 'categories': category_taxonomy
584
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
434 })
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
435 })
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
436 }),
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
437 'routes': [
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
438 {
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
439 'url': post_url,
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
440 'source': blog_name,
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
441 'func': 'pcposturl(year,month,day,slug)'
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
442 },
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
443 {
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
444 'url': tag_url,
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
445 'source': blog_name,
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
446 'taxonomy': 'tags',
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
447 'func': 'pctagurl(tag)'
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
448 },
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
449 {
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
450 'url': category_url,
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
451 'source': blog_name,
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
452 'taxonomy': 'categories',
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
453 'func': 'pccaturl(category)'
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
454 }
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
455 ]
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
456 })
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
457 })
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
458
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
459
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
460 # Configuration value validators.
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
461 #
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
462 # Make sure we have basic site stuff.
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
463 def _validate_site(v, values, cache):
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
464 sources = v.get('sources')
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
465 if not sources:
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
466 raise ConfigurationError("No sources were defined.")
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
467 routes = v.get('routes')
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
468 if not routes:
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
469 raise ConfigurationError("No routes were defined.")
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
470 taxonomies = v.get('taxonomies')
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
471 if taxonomies is None:
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
472 v['taxonomies'] = {}
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
473 return v
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
474
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
475 # Make sure the site root starts and ends with a slash.
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
476 def _validate_site_root(v, values, cache):
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
477 if not v.startswith('/'):
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
478 raise ConfigurationError("The `site/root` setting must start "
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
479 "with a slash.")
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
480 root_url = urllib.parse.quote(v.rstrip('/') + '/')
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
481 return root_url
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
482
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
483
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
484 # Cache auto-format regexes, check that `.html` is in there.
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
485 def _validate_site_auto_formats(v, values, cache):
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
486 if not isinstance(v, dict):
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
487 raise ConfigurationError("The 'site/auto_formats' setting must be "
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
488 "a dictionary.")
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
489
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
490 v.setdefault('html', values['site']['default_format'])
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
491 auto_formats_re = r"\.(%s)$" % (
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
492 '|'.join(
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
493 [re.escape(i) for i in list(v.keys())]))
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
494 cache.write('auto_formats_re', auto_formats_re)
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
495 return v
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
496
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
497
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
498 # Check that the default auto-format is known.
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
499 def _validate_site_default_auto_format(v, values, cache):
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
500 if v not in values['site']['auto_formats']:
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
501 raise ConfigurationError(
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
502 "Default auto-format '%s' is not declared." % v)
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
503 return v
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
504
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
505
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
506 # Cache pagination suffix regex and format.
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
507 def _validate_site_pagination_suffix(v, values, cache):
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
508 if len(v) == 0 or v[0] != '/':
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
509 raise ConfigurationError("The 'site/pagination_suffix' setting "
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
510 "must start with a slash.")
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
511 if '%num%' not in v:
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
512 raise ConfigurationError("The 'site/pagination_suffix' setting "
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
513 "must contain the '%num%' placeholder.")
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
514
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
515 pgn_suffix_fmt = v.replace('%num%', '%(num)d')
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
516 cache.write('pagination_suffix_format', pgn_suffix_fmt)
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
517
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
518 pgn_suffix_re = re.escape(v)
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
519 pgn_suffix_re = (pgn_suffix_re.replace("\\%num\\%", "(?P<num>\\d+)") +
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
520 '$')
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
521 cache.write('pagination_suffix_re', pgn_suffix_re)
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
522 return v
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
523
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
524
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
525 # Make sure theme sources is a list.
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
526 def _validate_site_theme_sources(v, values, cache):
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
527 if not isinstance(v, list):
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
528 v = [v]
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
529 return v
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
530
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
531
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
532 def _validate_site_sources(v, values, cache):
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
533 # Basic checks.
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
534 if not v:
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
535 raise ConfigurationError("There are no sources defined.")
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
536 if not isinstance(v, dict):
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
537 raise ConfigurationError("The 'site/sources' setting must be a "
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
538 "dictionary.")
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
539
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
540 # Sources have the `default` scanner by default, duh. Also, a bunch
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
541 # of other default values for other configuration stuff.
585
25df894f9ab9 internal: Some fixes to the new app configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 584
diff changeset
542 reserved_endpoints = set(['piecrust', 'site', 'page', 'route',
25df894f9ab9 internal: Some fixes to the new app configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 584
diff changeset
543 'assets', 'pagination', 'siblings',
25df894f9ab9 internal: Some fixes to the new app configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 584
diff changeset
544 'family'])
584
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
545 for sn, sc in v.items():
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
546 if not isinstance(sc, dict):
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
547 raise ConfigurationError("All sources in 'site/sources' must "
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
548 "be dictionaries.")
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
549 sc.setdefault('type', 'default')
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
550 sc.setdefault('fs_endpoint', sn)
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
551 sc.setdefault('ignore_missing_dir', False)
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
552 sc.setdefault('data_endpoint', sn)
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
553 sc.setdefault('data_type', 'iterator')
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
554 sc.setdefault('item_name', sn)
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
555 sc.setdefault('items_per_page', 5)
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
556 sc.setdefault('date_format', DEFAULT_DATE_FORMAT)
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
557 sc.setdefault('realm', REALM_USER)
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
558
585
25df894f9ab9 internal: Some fixes to the new app configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 584
diff changeset
559 # Validate endpoints.
25df894f9ab9 internal: Some fixes to the new app configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 584
diff changeset
560 endpoint = sc['data_endpoint']
25df894f9ab9 internal: Some fixes to the new app configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 584
diff changeset
561 if endpoint in reserved_endpoints:
25df894f9ab9 internal: Some fixes to the new app configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 584
diff changeset
562 raise ConfigurationError(
25df894f9ab9 internal: Some fixes to the new app configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 584
diff changeset
563 "Source '%s' is using a reserved endpoint name: %s" %
25df894f9ab9 internal: Some fixes to the new app configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 584
diff changeset
564 (sn, endpoint))
25df894f9ab9 internal: Some fixes to the new app configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 584
diff changeset
565
584
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
566 return v
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
567
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
568
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
569 def _validate_site_routes(v, values, cache):
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
570 if not v:
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
571 raise ConfigurationError("There are no routes defined.")
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
572 if not isinstance(v, list):
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
573 raise ConfigurationError("The 'site/routes' setting must be a "
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
574 "list.")
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
575
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
576 # Check routes are referencing correct sources, have default
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
577 # values, etc.
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
578 for rc in v:
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
579 if not isinstance(rc, dict):
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
580 raise ConfigurationError("All routes in 'site/routes' must be "
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
581 "dictionaries.")
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
582 rc_url = rc.get('url')
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
583 if not rc_url:
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
584 raise ConfigurationError("All routes in 'site/routes' must "
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
585 "have an 'url'.")
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
586 if rc_url[0] != '/':
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
587 raise ConfigurationError("Route URLs must start with '/'.")
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
588 if rc.get('source') is None:
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
589 raise ConfigurationError("Routes must specify a source.")
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
590 if rc['source'] not in list(values['site']['sources'].keys()):
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
591 raise ConfigurationError("Route is referencing unknown "
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
592 "source: %s" % rc['source'])
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
593 rc.setdefault('taxonomy', None)
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
594 rc.setdefault('page_suffix', '/%num%')
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
595
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
596 return v
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
597
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
598
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
599 def _validate_site_taxonomies(v, values, cache):
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
600 for tn, tc in v.items():
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
601 tc.setdefault('multiple', False)
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
602 tc.setdefault('term', tn)
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
603 tc.setdefault('page', '_%s.%%ext%%' % tc['term'])
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
604
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
605 return v
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
606
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
607
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
608 def _validate_site_plugins(v, values, cache):
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
609 if isinstance(v, str):
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
610 v = v.split(',')
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
611 elif not isinstance(v, list):
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
612 raise ConfigurationError(
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
613 "The 'site/plugins' setting must be an array, or a "
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
614 "comma-separated list.")
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
615 return v
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
616