Mercurial > piecrust2
annotate piecrust/appconfig.py @ 1151:0d699f04968c
cm: Update dependencies and fix imports of Flask plugins.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Sat, 03 Nov 2018 19:42:02 -0700 |
parents | 97b1b46cc156 |
children | 10520472cc73 |
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 |
805
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
10 from piecrust import APP_VERSION, CACHE_VERSION, DEFAULT_DATE_FORMAT |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
11 from piecrust.appconfigdefaults import ( |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
12 default_configuration, |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
13 default_theme_content_model_base, |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
14 default_content_model_base, |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
15 get_default_content_model, get_default_content_model_for_blog) |
584
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
16 from piecrust.cache import NullCache |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
17 from piecrust.configuration import ( |
805
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
18 Configuration, ConfigurationError, ConfigurationLoader, |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
839
diff
changeset
|
19 try_get_dict_values, set_dict_value, |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
839
diff
changeset
|
20 merge_dicts, visit_dict) |
584
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
21 from piecrust.sources.base import REALM_USER, REALM_THEME |
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 logger = logging.getLogger(__name__) |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
25 |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
26 |
805
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
27 class InvalidConfigurationPathError(Exception): |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
28 pass |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
29 |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
30 |
584
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
31 class VariantNotFoundError(Exception): |
666
81d9c3a3a0b5
internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents:
663
diff
changeset
|
32 def __init__(self, variant_name, message=None): |
584
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
33 super(VariantNotFoundError, self).__init__( |
805
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
34 message or ("No such configuration variant: %s" % |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
35 variant_name)) |
666
81d9c3a3a0b5
internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents:
663
diff
changeset
|
36 |
81d9c3a3a0b5
internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents:
663
diff
changeset
|
37 |
584
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
38 class PieCrustConfiguration(Configuration): |
681
894d286b348f
internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents:
675
diff
changeset
|
39 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
|
40 cache=None, validate=True, theme_config=False): |
683
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
41 if theme_config and theme_path: |
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
42 raise Exception("Can't be a theme site config and still have a " |
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
43 "theme applied.") |
663
3ceeca7bb71c
themes: Add support for a `--theme` argument to `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents:
585
diff
changeset
|
44 super(PieCrustConfiguration, self).__init__() |
681
894d286b348f
internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents:
675
diff
changeset
|
45 self._path = path |
894d286b348f
internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents:
675
diff
changeset
|
46 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
|
47 self._cache = cache or NullCache() |
948
6c445771a8dc
internal: Fix caching issues with config variants.
Ludovic Chabant <ludovic@chabant.com>
parents:
887
diff
changeset
|
48 self._cache_hash_mod = '' |
681
894d286b348f
internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents:
675
diff
changeset
|
49 self._custom_paths = [] |
894d286b348f
internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents:
675
diff
changeset
|
50 self._post_fixups = [] |
663
3ceeca7bb71c
themes: Add support for a `--theme` argument to `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents:
585
diff
changeset
|
51 self.theme_config = theme_config |
3ceeca7bb71c
themes: Add support for a `--theme` argument to `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents:
585
diff
changeset
|
52 # 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
|
53 # our attributes. |
805
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
54 if values is not None: |
663
3ceeca7bb71c
themes: Add support for a `--theme` argument to `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents:
585
diff
changeset
|
55 self.setAll(values, validate=validate) |
584
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
56 |
681
894d286b348f
internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents:
675
diff
changeset
|
57 def addPath(self, p): |
805
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
58 if not p: |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
59 raise InvalidConfigurationPathError() |
666
81d9c3a3a0b5
internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents:
663
diff
changeset
|
60 self._ensureNotLoaded() |
681
894d286b348f
internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents:
675
diff
changeset
|
61 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
|
62 |
81d9c3a3a0b5
internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents:
663
diff
changeset
|
63 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
|
64 self._ensureNotLoaded() |
81d9c3a3a0b5
internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents:
663
diff
changeset
|
65 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
|
66 self.addPath(variant_path) |
681
894d286b348f
internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents:
675
diff
changeset
|
67 elif raise_if_not_found: |
894d286b348f
internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents:
675
diff
changeset
|
68 logger.error( |
805
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
69 "Configuration variants should now be `.yml` files " |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
70 "located in the `configs/` directory of your website.") |
681
894d286b348f
internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents:
675
diff
changeset
|
71 raise VariantNotFoundError(variant_path) |
666
81d9c3a3a0b5
internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents:
663
diff
changeset
|
72 |
81d9c3a3a0b5
internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents:
663
diff
changeset
|
73 def addVariantValue(self, path, value): |
681
894d286b348f
internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents:
675
diff
changeset
|
74 def _fixup(config): |
666
81d9c3a3a0b5
internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents:
663
diff
changeset
|
75 set_dict_value(config, path, value) |
683
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
76 |
681
894d286b348f
internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents:
675
diff
changeset
|
77 self._post_fixups.append(_fixup) |
948
6c445771a8dc
internal: Fix caching issues with config variants.
Ludovic Chabant <ludovic@chabant.com>
parents:
887
diff
changeset
|
78 self._cache_hash_mod += '&val[%s=%s]' % (path, repr(value)) |
666
81d9c3a3a0b5
internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents:
663
diff
changeset
|
79 |
683
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
80 def setAll(self, values, validate=False): |
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
81 # Override base class implementation |
805
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
82 values = self._processConfigs({}, values) |
683
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
83 if validate: |
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
84 values = self._validateAll(values) |
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
85 self._values = values |
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
86 |
666
81d9c3a3a0b5
internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents:
663
diff
changeset
|
87 def _ensureNotLoaded(self): |
81d9c3a3a0b5
internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents:
663
diff
changeset
|
88 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
|
89 raise Exception("The configurations has been loaded.") |
584
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
90 |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
91 def _load(self): |
683
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
92 # Figure out where to load this configuration from. |
805
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
93 paths = [] |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
94 if self._theme_path: |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
95 paths.append(self._theme_path) |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
96 if self._path: |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
97 paths.append(self._path) |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
98 paths += self._custom_paths |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
99 |
683
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
100 # Build the cache-key. |
686
1a6c4c2683fd
internal: Fix incorrect check for cache times.
Ludovic Chabant <ludovic@chabant.com>
parents:
683
diff
changeset
|
101 path_times = [os.path.getmtime(p) for p in paths] |
584
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
102 cache_key_hash = hashlib.md5( |
805
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
103 ("version=%s&cache=%d" % ( |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
104 APP_VERSION, CACHE_VERSION)).encode('utf8')) |
683
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
105 for p in paths: |
584
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
106 cache_key_hash.update(("&path=%s" % p).encode('utf8')) |
948
6c445771a8dc
internal: Fix caching issues with config variants.
Ludovic Chabant <ludovic@chabant.com>
parents:
887
diff
changeset
|
107 if self._cache_hash_mod: |
6c445771a8dc
internal: Fix caching issues with config variants.
Ludovic Chabant <ludovic@chabant.com>
parents:
887
diff
changeset
|
108 cache_key_hash.update(self._cache_hash_mod.encode('utf8')) |
584
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
109 cache_key = cache_key_hash.hexdigest() |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
110 |
683
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
111 # Check the cache for a valid version. |
839
b8f089092281
bug: Fix crashes for commands run outside of a website.
Ludovic Chabant <ludovic@chabant.com>
parents:
805
diff
changeset
|
112 if path_times and self._cache.isValid('config.json', path_times): |
584
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
113 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
|
114 config_text = self._cache.read('config.json') |
584
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
115 self._values = json.loads( |
805
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
116 config_text, |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
117 object_pairs_hook=collections.OrderedDict) |
584
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
118 |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
119 actual_cache_key = self._values.get('__cache_key') |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
120 if actual_cache_key == cache_key: |
683
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
121 # The cached version has the same key! Awesome! |
584
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
122 self._values['__cache_valid'] = True |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
123 return |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
124 logger.debug("Outdated cache key '%s' (expected '%s')." % ( |
805
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
125 actual_cache_key, cache_key)) |
584
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
126 |
683
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
127 # Nope, load from the paths. |
585
25df894f9ab9
internal: Some fixes to the new app configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
584
diff
changeset
|
128 try: |
805
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
129 # Theme values. |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
130 theme_values = None |
683
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
131 if self._theme_path: |
805
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
132 logger.debug("Loading theme layer from: %s" % self._theme_path) |
683
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
133 theme_values = self._loadFrom(self._theme_path) |
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
134 |
805
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
135 # Site and variant values. |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
136 site_paths = [] |
683
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
137 if self._path: |
805
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
138 site_paths.append(self._path) |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
139 site_paths += self._custom_paths |
585
25df894f9ab9
internal: Some fixes to the new app configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
584
diff
changeset
|
140 |
805
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
141 site_values = {} |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
142 for path in site_paths: |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
143 logger.debug("Loading config layer from: %s" % path) |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
144 cur_values = self._loadFrom(path) |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
145 merge_dicts(site_values, cur_values) |
683
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
146 |
805
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
147 # Do it! |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
148 values = self._processConfigs(theme_values, site_values) |
585
25df894f9ab9
internal: Some fixes to the new app configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
584
diff
changeset
|
149 self._values = self._validateAll(values) |
25df894f9ab9
internal: Some fixes to the new app configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
584
diff
changeset
|
150 except Exception as ex: |
711
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
686
diff
changeset
|
151 logger.exception(ex) |
681
894d286b348f
internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents:
675
diff
changeset
|
152 raise Exception( |
805
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
153 "Error loading configuration from: %s" % |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
154 ', '.join(paths)) from ex |
584
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
155 |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
156 logger.debug("Caching configuration...") |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
157 self._values['__cache_key'] = cache_key |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
158 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
|
159 self._cache.write('config.json', config_text) |
584
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
160 |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
161 self._values['__cache_valid'] = False |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
162 |
683
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
163 def _loadFrom(self, path): |
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
164 logger.debug("Loading configuration from: %s" % path) |
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
165 with open(path, 'r', encoding='utf-8') as fp: |
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
166 values = yaml.load( |
805
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
167 fp.read(), |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
168 Loader=ConfigurationLoader) |
683
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
169 if values is None: |
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
170 values = {} |
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
171 return values |
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
172 |
805
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
173 def _processConfigs(self, theme_values, site_values): |
683
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
174 # Start with the default configuration. |
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
175 values = copy.deepcopy(default_configuration) |
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
176 |
805
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
177 # If we have a theme, apply the theme on that. So stuff like routes |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
178 # will now look like: |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
179 # [custom theme] + [default theme] + [default] |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
180 if theme_values is not None: |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
181 self._processThemeLayer(theme_values, values) |
683
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
182 |
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
183 # Make all sources belong to the "theme" realm at this point. |
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
184 srcc = values['site'].get('sources') |
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
185 if srcc: |
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
186 for sn, sc in srcc.items(): |
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
187 sc['realm'] = REALM_THEME |
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
188 |
805
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
189 # Now we apply the site stuff. We want to end up with: |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
190 # [custom site] + [default site] + [custom theme] + [default theme] + |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
191 # [default] |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
192 if site_values is not None: |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
193 self._processSiteLayer(site_values, values) |
683
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
194 |
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
195 # Set the theme site flag. |
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
196 if self.theme_config: |
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
197 values['site']['theme_site'] = True |
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
198 |
805
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
199 # Run final fixups |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
200 if self._post_fixups: |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
201 logger.debug("Applying %d configuration fixups." % |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
202 len(self._post_fixups)) |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
203 for f in self._post_fixups: |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
204 f(values) |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
205 |
683
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
206 return values |
ec384174b8b2
internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents:
681
diff
changeset
|
207 |
805
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
208 def _processThemeLayer(self, theme_values, values): |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
209 # Generate the default theme model. |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
210 gen_default_theme_model = bool(try_get_dict_values( |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
211 (theme_values, 'site/use_default_theme_content'), |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
212 default=True)) |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
213 if gen_default_theme_model: |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
839
diff
changeset
|
214 logger.debug("Generating default theme content model...") |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
839
diff
changeset
|
215 cc = copy.deepcopy(default_theme_content_model_base) |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
839
diff
changeset
|
216 merge_dicts(values, cc) |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
839
diff
changeset
|
217 |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
839
diff
changeset
|
218 # Merge the theme config into the result config. |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
839
diff
changeset
|
219 merge_dicts(values, theme_values) |
805
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
220 |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
221 def _processSiteLayer(self, site_values, values): |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
222 # Default site content. |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
223 gen_default_site_model = bool(try_get_dict_values( |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
224 (site_values, 'site/use_default_content'), |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
225 (values, 'site/use_default_content'), |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
226 default=True)) |
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
227 if gen_default_site_model: |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
839
diff
changeset
|
228 logger.debug("Generating default content model...") |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
839
diff
changeset
|
229 cc = copy.deepcopy(default_content_model_base) |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
839
diff
changeset
|
230 merge_dicts(values, cc) |
805
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
231 |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
839
diff
changeset
|
232 dcm = get_default_content_model(site_values, values) |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
839
diff
changeset
|
233 merge_dicts(values, dcm) |
805
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
234 |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
839
diff
changeset
|
235 blogsc = try_get_dict_values( |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
839
diff
changeset
|
236 (site_values, 'site/blogs'), |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
839
diff
changeset
|
237 (values, 'site/blogs')) |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
839
diff
changeset
|
238 if blogsc is None: |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
839
diff
changeset
|
239 blogsc = ['posts'] |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
839
diff
changeset
|
240 set_dict_value(site_values, 'site/blogs', blogsc) |
805
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
241 |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
839
diff
changeset
|
242 is_only_blog = (len(blogsc) == 1) |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
839
diff
changeset
|
243 for blog_name in reversed(blogsc): |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
839
diff
changeset
|
244 blog_cfg = get_default_content_model_for_blog( |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
839
diff
changeset
|
245 blog_name, is_only_blog, site_values, values, |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
839
diff
changeset
|
246 theme_site=self.theme_config) |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
839
diff
changeset
|
247 merge_dicts(values, blog_cfg) |
805
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
248 |
1150
97b1b46cc156
config: Allow tweaking the configuration of default routes.
Ludovic Chabant <ludovic@chabant.com>
parents:
1098
diff
changeset
|
249 for route in dcm['site']['routes']: |
97b1b46cc156
config: Allow tweaking the configuration of default routes.
Ludovic Chabant <ludovic@chabant.com>
parents:
1098
diff
changeset
|
250 values |
97b1b46cc156
config: Allow tweaking the configuration of default routes.
Ludovic Chabant <ludovic@chabant.com>
parents:
1098
diff
changeset
|
251 |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
839
diff
changeset
|
252 # Merge the site config into the result config. |
1150
97b1b46cc156
config: Allow tweaking the configuration of default routes.
Ludovic Chabant <ludovic@chabant.com>
parents:
1098
diff
changeset
|
253 _merge_route_configs(values, site_values) |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
839
diff
changeset
|
254 merge_dicts(values, site_values) |
805
fd694f1297c7
config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents:
792
diff
changeset
|
255 |
584
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
256 def _validateAll(self, values): |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
257 if values is None: |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
258 values = {} |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
259 |
681
894d286b348f
internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents:
675
diff
changeset
|
260 # 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
|
261 # the configuration tree, calling validation functions as we |
894d286b348f
internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents:
675
diff
changeset
|
262 # find them. |
584
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
263 cachec = collections.OrderedDict() |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
264 values['__cache'] = cachec |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
265 cache_writer = _ConfigCacheWriter(cachec) |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
266 globs = globals() |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
267 |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
268 def _visitor(path, val, parent_val, parent_key): |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
269 callback_name = '_validate_' + path.replace('/', '_') |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
270 callback = globs.get(callback_name) |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
271 if callback: |
585
25df894f9ab9
internal: Some fixes to the new app configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
584
diff
changeset
|
272 try: |
25df894f9ab9
internal: Some fixes to the new app configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
584
diff
changeset
|
273 val2 = callback(val, values, cache_writer) |
25df894f9ab9
internal: Some fixes to the new app configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
584
diff
changeset
|
274 except Exception as ex: |
711
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
686
diff
changeset
|
275 logger.exception(ex) |
585
25df894f9ab9
internal: Some fixes to the new app configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
584
diff
changeset
|
276 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
|
277 callback_name) from ex |
584
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
278 if val2 is None: |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
279 raise Exception("Validator '%s' isn't returning a " |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
280 "coerced value." % callback_name) |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
281 parent_val[parent_key] = val2 |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
282 |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
283 visit_dict(values, _visitor) |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
284 |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
285 return values |
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 |
1150
97b1b46cc156
config: Allow tweaking the configuration of default routes.
Ludovic Chabant <ludovic@chabant.com>
parents:
1098
diff
changeset
|
288 def _merge_route_configs(values, from_default): |
97b1b46cc156
config: Allow tweaking the configuration of default routes.
Ludovic Chabant <ludovic@chabant.com>
parents:
1098
diff
changeset
|
289 actual_routes = values.get('site', {}).get('routes', []) |
97b1b46cc156
config: Allow tweaking the configuration of default routes.
Ludovic Chabant <ludovic@chabant.com>
parents:
1098
diff
changeset
|
290 default_routes = from_default.get('site', {}).get('routes', []) |
97b1b46cc156
config: Allow tweaking the configuration of default routes.
Ludovic Chabant <ludovic@chabant.com>
parents:
1098
diff
changeset
|
291 for dr in list(default_routes): # copy because we'll trim it as we go. |
97b1b46cc156
config: Allow tweaking the configuration of default routes.
Ludovic Chabant <ludovic@chabant.com>
parents:
1098
diff
changeset
|
292 ar = next((i for i in actual_routes |
97b1b46cc156
config: Allow tweaking the configuration of default routes.
Ludovic Chabant <ludovic@chabant.com>
parents:
1098
diff
changeset
|
293 if i.get('source') == dr['source']), |
97b1b46cc156
config: Allow tweaking the configuration of default routes.
Ludovic Chabant <ludovic@chabant.com>
parents:
1098
diff
changeset
|
294 None) |
97b1b46cc156
config: Allow tweaking the configuration of default routes.
Ludovic Chabant <ludovic@chabant.com>
parents:
1098
diff
changeset
|
295 if ar is not None: |
97b1b46cc156
config: Allow tweaking the configuration of default routes.
Ludovic Chabant <ludovic@chabant.com>
parents:
1098
diff
changeset
|
296 merge_dicts(ar, dr) |
97b1b46cc156
config: Allow tweaking the configuration of default routes.
Ludovic Chabant <ludovic@chabant.com>
parents:
1098
diff
changeset
|
297 default_routes.remove(dr) |
97b1b46cc156
config: Allow tweaking the configuration of default routes.
Ludovic Chabant <ludovic@chabant.com>
parents:
1098
diff
changeset
|
298 |
97b1b46cc156
config: Allow tweaking the configuration of default routes.
Ludovic Chabant <ludovic@chabant.com>
parents:
1098
diff
changeset
|
299 |
584
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
300 class _ConfigCacheWriter(object): |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
301 def __init__(self, cache_dict): |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
302 self._cache_dict = cache_dict |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
303 |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
304 def write(self, name, val): |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
305 logger.debug("Caching configuration item '%s' = %s" % (name, val)) |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
306 self._cache_dict[name] = val |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
307 |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
308 |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
309 # Configuration value validators. |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
310 # |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
311 # Make sure we have basic site stuff. |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
312 def _validate_site(v, values, cache): |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
313 sources = v.get('sources') |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
314 if not sources: |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
315 raise ConfigurationError("No sources were defined.") |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
316 routes = v.get('routes') |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
317 if not routes: |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
318 raise ConfigurationError("No routes were defined.") |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
319 taxonomies = v.get('taxonomies') |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
320 if taxonomies is None: |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
321 v['taxonomies'] = {} |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
322 return v |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
323 |
711
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
686
diff
changeset
|
324 |
752
7dbddfed8129
config: Fix how we parse the root URL to allow for absolute and user URLs.
Ludovic Chabant <ludovic@chabant.com>
parents:
743
diff
changeset
|
325 # Make sure the site root ends with a slash. |
584
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
326 def _validate_site_root(v, values, cache): |
752
7dbddfed8129
config: Fix how we parse the root URL to allow for absolute and user URLs.
Ludovic Chabant <ludovic@chabant.com>
parents:
743
diff
changeset
|
327 url_bits = urllib.parse.urlparse(v) |
7dbddfed8129
config: Fix how we parse the root URL to allow for absolute and user URLs.
Ludovic Chabant <ludovic@chabant.com>
parents:
743
diff
changeset
|
328 if url_bits.params or url_bits.query or url_bits.fragment: |
7dbddfed8129
config: Fix how we parse the root URL to allow for absolute and user URLs.
Ludovic Chabant <ludovic@chabant.com>
parents:
743
diff
changeset
|
329 raise ConfigurationError("Root URL is invalid: %s" % v) |
7dbddfed8129
config: Fix how we parse the root URL to allow for absolute and user URLs.
Ludovic Chabant <ludovic@chabant.com>
parents:
743
diff
changeset
|
330 |
7dbddfed8129
config: Fix how we parse the root URL to allow for absolute and user URLs.
Ludovic Chabant <ludovic@chabant.com>
parents:
743
diff
changeset
|
331 path = url_bits.path.rstrip('/') + '/' |
7dbddfed8129
config: Fix how we parse the root URL to allow for absolute and user URLs.
Ludovic Chabant <ludovic@chabant.com>
parents:
743
diff
changeset
|
332 if '%' not in path: |
7dbddfed8129
config: Fix how we parse the root URL to allow for absolute and user URLs.
Ludovic Chabant <ludovic@chabant.com>
parents:
743
diff
changeset
|
333 path = urllib.parse.quote(path) |
7dbddfed8129
config: Fix how we parse the root URL to allow for absolute and user URLs.
Ludovic Chabant <ludovic@chabant.com>
parents:
743
diff
changeset
|
334 |
7dbddfed8129
config: Fix how we parse the root URL to allow for absolute and user URLs.
Ludovic Chabant <ludovic@chabant.com>
parents:
743
diff
changeset
|
335 root_url = urllib.parse.urlunparse(( |
7dbddfed8129
config: Fix how we parse the root URL to allow for absolute and user URLs.
Ludovic Chabant <ludovic@chabant.com>
parents:
743
diff
changeset
|
336 url_bits.scheme, url_bits.netloc, path, '', '', '')) |
584
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
337 return root_url |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
338 |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
339 |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
340 # 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
|
341 def _validate_site_auto_formats(v, values, cache): |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
342 if not isinstance(v, dict): |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
343 raise ConfigurationError("The 'site/auto_formats' setting must be " |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
344 "a dictionary.") |
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 v.setdefault('html', values['site']['default_format']) |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
347 auto_formats_re = r"\.(%s)$" % ( |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
839
diff
changeset
|
348 '|'.join( |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
839
diff
changeset
|
349 [re.escape(i) for i in list(v.keys())])) |
584
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
350 cache.write('auto_formats_re', auto_formats_re) |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
351 return v |
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 # Check that the default auto-format is known. |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
355 def _validate_site_default_auto_format(v, values, cache): |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
356 if v not in values['site']['auto_formats']: |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
357 raise ConfigurationError( |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
839
diff
changeset
|
358 "Default auto-format '%s' is not declared." % v) |
584
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
359 return v |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
360 |
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 # Cache pagination suffix regex and format. |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
363 def _validate_site_pagination_suffix(v, values, cache): |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
364 if len(v) == 0 or v[0] != '/': |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
365 raise ConfigurationError("The 'site/pagination_suffix' setting " |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
366 "must start with a slash.") |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
367 if '%num%' not in v: |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
368 raise ConfigurationError("The 'site/pagination_suffix' setting " |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
369 "must contain the '%num%' placeholder.") |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
370 |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
371 pgn_suffix_fmt = v.replace('%num%', '%(num)d') |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
372 cache.write('pagination_suffix_format', pgn_suffix_fmt) |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
373 |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
374 pgn_suffix_re = re.escape(v) |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
375 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
|
376 '$') |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
377 cache.write('pagination_suffix_re', pgn_suffix_re) |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
378 return v |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
379 |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
380 |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
381 # Make sure theme sources is a list. |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
382 def _validate_site_theme_sources(v, values, cache): |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
383 if not isinstance(v, list): |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
384 v = [v] |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
385 return v |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
386 |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
387 |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
388 def _validate_site_sources(v, values, cache): |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
389 # Basic checks. |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
390 if not v: |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
391 raise ConfigurationError("There are no sources defined.") |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
392 if not isinstance(v, dict): |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
393 raise ConfigurationError("The 'site/sources' setting must be a " |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
394 "dictionary.") |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
395 |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
396 # 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
|
397 # 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
|
398 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
|
399 'assets', 'pagination', 'siblings', |
25df894f9ab9
internal: Some fixes to the new app configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
584
diff
changeset
|
400 'family']) |
584
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
401 for sn, sc in v.items(): |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
402 if not isinstance(sc, dict): |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
403 raise ConfigurationError("All sources in 'site/sources' must " |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
404 "be dictionaries.") |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
405 sc.setdefault('type', 'default') |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
406 sc.setdefault('fs_endpoint', sn) |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
407 sc.setdefault('ignore_missing_dir', False) |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
839
diff
changeset
|
408 sc.setdefault('data_endpoint', None) |
853
f070a4fc033c
core: Continue PieCrust3 refactor, simplify pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
409 sc.setdefault('data_type', None) |
979
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
948
diff
changeset
|
410 sc.setdefault('default_layout', 'default') |
584
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
411 sc.setdefault('item_name', sn) |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
412 sc.setdefault('items_per_page', 5) |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
413 sc.setdefault('date_format', DEFAULT_DATE_FORMAT) |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
414 sc.setdefault('realm', REALM_USER) |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
853
diff
changeset
|
415 sc.setdefault('pipeline', None) |
584
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
416 |
585
25df894f9ab9
internal: Some fixes to the new app configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
584
diff
changeset
|
417 # Validate endpoints. |
25df894f9ab9
internal: Some fixes to the new app configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
584
diff
changeset
|
418 endpoint = sc['data_endpoint'] |
25df894f9ab9
internal: Some fixes to the new app configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
584
diff
changeset
|
419 if endpoint in reserved_endpoints: |
25df894f9ab9
internal: Some fixes to the new app configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
584
diff
changeset
|
420 raise ConfigurationError( |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
839
diff
changeset
|
421 "Source '%s' is using a reserved endpoint name: %s" % |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
839
diff
changeset
|
422 (sn, endpoint)) |
711
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
686
diff
changeset
|
423 |
584
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
424 return v |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
425 |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
426 |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
427 def _validate_site_routes(v, values, cache): |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
428 if not v: |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
429 raise ConfigurationError("There are no routes defined.") |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
430 if not isinstance(v, list): |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
431 raise ConfigurationError("The 'site/routes' setting must be a " |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
432 "list.") |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
433 |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
434 # Check routes are referencing correct sources, have default |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
435 # values, etc. |
853
f070a4fc033c
core: Continue PieCrust3 refactor, simplify pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
436 used_sources = set() |
1098
2323f0788170
config: Report error if a non-asset source has no URL route.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
437 source_configs = values['site']['sources'] |
2323f0788170
config: Report error if a non-asset source has no URL route.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
438 existing_sources = set(source_configs.keys()) |
584
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
439 for rc in v: |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
440 if not isinstance(rc, dict): |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
441 raise ConfigurationError("All routes in 'site/routes' must be " |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
442 "dictionaries.") |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
443 rc_url = rc.get('url') |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
444 if not rc_url: |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
445 raise ConfigurationError("All routes in 'site/routes' must " |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
446 "have an 'url'.") |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
447 if rc_url[0] != '/': |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
448 raise ConfigurationError("Route URLs must start with '/'.") |
711
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
686
diff
changeset
|
449 |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
686
diff
changeset
|
450 r_source = rc.get('source') |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
839
diff
changeset
|
451 if r_source is None: |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
839
diff
changeset
|
452 raise ConfigurationError("Routes must specify a source.") |
853
f070a4fc033c
core: Continue PieCrust3 refactor, simplify pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
453 if r_source not in existing_sources: |
584
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
454 raise ConfigurationError("Route is referencing unknown " |
711
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
686
diff
changeset
|
455 "source: %s" % r_source) |
853
f070a4fc033c
core: Continue PieCrust3 refactor, simplify pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
456 if r_source in used_sources: |
f070a4fc033c
core: Continue PieCrust3 refactor, simplify pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
457 raise ConfigurationError("Source '%s' already has a route." % |
f070a4fc033c
core: Continue PieCrust3 refactor, simplify pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
458 r_source) |
f070a4fc033c
core: Continue PieCrust3 refactor, simplify pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
459 used_sources.add(r_source) |
711
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
686
diff
changeset
|
460 |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
853
diff
changeset
|
461 rc.setdefault('pass', 1) |
584
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
462 rc.setdefault('page_suffix', '/%num%') |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
463 |
1098
2323f0788170
config: Report error if a non-asset source has no URL route.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
464 # Raise errors about non-asset sources that have no URL routes. |
2323f0788170
config: Report error if a non-asset source has no URL route.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
465 sources_with_no_route = list(filter( |
2323f0788170
config: Report error if a non-asset source has no URL route.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
466 lambda s: source_configs[s].get('pipeline') != 'asset', |
2323f0788170
config: Report error if a non-asset source has no URL route.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
467 existing_sources.difference(used_sources))) |
2323f0788170
config: Report error if a non-asset source has no URL route.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
468 if sources_with_no_route: |
2323f0788170
config: Report error if a non-asset source has no URL route.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
469 raise ConfigurationError( |
2323f0788170
config: Report error if a non-asset source has no URL route.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
470 "The following sources have no routes: %s" % |
2323f0788170
config: Report error if a non-asset source has no URL route.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
471 ', '.join(sources_with_no_route)) |
2323f0788170
config: Report error if a non-asset source has no URL route.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
472 |
584
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 |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
476 def _validate_site_taxonomies(v, values, cache): |
711
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
686
diff
changeset
|
477 if not isinstance(v, dict): |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
686
diff
changeset
|
478 raise ConfigurationError( |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
839
diff
changeset
|
479 "The 'site/taxonomies' setting must be a mapping.") |
584
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
480 for tn, tc in v.items(): |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
481 tc.setdefault('multiple', False) |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
482 tc.setdefault('term', tn) |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
483 tc.setdefault('page', '_%s.%%ext%%' % tc['term']) |
711
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
686
diff
changeset
|
484 return v |
584
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
485 |
711
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
686
diff
changeset
|
486 |
584
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
487 def _validate_site_plugins(v, values, cache): |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
488 if isinstance(v, str): |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
489 v = v.split(',') |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
490 elif not isinstance(v, list): |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
491 raise ConfigurationError( |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
839
diff
changeset
|
492 "The 'site/plugins' setting must be an array, or a " |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
839
diff
changeset
|
493 "comma-separated list.") |
584
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
494 return v |
9ccc933ac2c7
internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
495 |