annotate piecrust/app.py @ 486:aae241804096

themes: Don't fixup template directories, it's actually better as-is. Prepending `theme/` is not too much trouble, and directories without that are useful for handling possible user overrides.
author Ludovic Chabant <ludovic@chabant.com>
date Wed, 22 Jul 2015 20:00:14 -0700
parents 3b6cbadd0c64
children 39175c48a4ae
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
1 import re
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2 import json
411
e7b865f8f335 bake: Enable multiprocess baking.
Ludovic Chabant <ludovic@chabant.com>
parents: 371
diff changeset
3 import time
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
4 import os.path
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
5 import codecs
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
6 import hashlib
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
7 import logging
67
563ce5dd02af I don't care what the YAML spec says, ordered maps are the only sane way.
Ludovic Chabant <ludovic@chabant.com>
parents: 56
diff changeset
8 import collections
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
9 import yaml
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
10 from werkzeug.utils import cached_property
271
12657039c436 internal: Re-use the cached resource directory.
Ludovic Chabant <ludovic@chabant.com>
parents: 260
diff changeset
11 from piecrust import (
12657039c436 internal: Re-use the cached resource directory.
Ludovic Chabant <ludovic@chabant.com>
parents: 260
diff changeset
12 APP_VERSION, RESOURCES_DIR,
36
485682a6de50 New site layout support.
Ludovic Chabant <ludovic@chabant.com>
parents: 31
diff changeset
13 CACHE_DIR, TEMPLATES_DIR, ASSETS_DIR,
307
869a206facd5 internal: Remove mentions of plugins directories and sources.
Ludovic Chabant <ludovic@chabant.com>
parents: 271
diff changeset
14 THEME_DIR,
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
15 CONFIG_PATH, THEME_CONFIG_PATH,
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
16 DEFAULT_FORMAT, DEFAULT_TEMPLATE_ENGINE, DEFAULT_POSTS_FS,
307
869a206facd5 internal: Remove mentions of plugins directories and sources.
Ludovic Chabant <ludovic@chabant.com>
parents: 271
diff changeset
17 DEFAULT_DATE_FORMAT, DEFAULT_THEME_SOURCE)
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
18 from piecrust.cache import ExtensibleCache, NullCache, NullExtensibleCache
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
19 from piecrust.plugins.base import PluginLoader
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
20 from piecrust.environment import StandardEnvironment
307
869a206facd5 internal: Remove mentions of plugins directories and sources.
Ludovic Chabant <ludovic@chabant.com>
parents: 271
diff changeset
21 from piecrust.configuration import (
869a206facd5 internal: Remove mentions of plugins directories and sources.
Ludovic Chabant <ludovic@chabant.com>
parents: 271
diff changeset
22 Configuration, ConfigurationError, ConfigurationLoader,
869a206facd5 internal: Remove mentions of plugins directories and sources.
Ludovic Chabant <ludovic@chabant.com>
parents: 271
diff changeset
23 merge_dicts)
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
24 from piecrust.routing import Route
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
25 from piecrust.sources.base import REALM_USER, REALM_THEME
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
26 from piecrust.taxonomies import Taxonomy
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
27
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
28
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
29 logger = logging.getLogger(__name__)
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
30
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
31
486
aae241804096 themes: Don't fixup template directories, it's actually better as-is.
Ludovic Chabant <ludovic@chabant.com>
parents: 479
diff changeset
32 CACHE_VERSION = 21
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
33
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
34
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
35 class VariantNotFoundError(Exception):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
36 def __init__(self, variant_path, message=None):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
37 super(VariantNotFoundError, self).__init__(
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
38 message or ("No such configuration variant: %s" % variant_path))
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
39
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
40
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
41 class PieCrustConfiguration(Configuration):
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
42 def __init__(self, paths=None, cache=None, values=None, validate=True):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
43 super(PieCrustConfiguration, self).__init__(values, validate)
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
44 self.paths = paths
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
45 self.cache = cache or NullCache()
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
46 self.fixups = []
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
47
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
48 def applyVariant(self, variant_path, raise_if_not_found=True):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
49 variant = self.get(variant_path)
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
50 if variant is None:
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
51 if raise_if_not_found:
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
52 raise VariantNotFoundError(variant_path)
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
53 return
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
54 if not isinstance(variant, dict):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
55 raise VariantNotFoundError(variant_path,
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
56 "Configuration variant '%s' is not an array. "
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
57 "Check your configuration file." % variant_path)
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
58 self.merge(variant)
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
59
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
60 def _load(self):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
61 if self.paths is None:
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
62 self._values = self._validateAll({})
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
63 return
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
64
5
474c9882decf Upgrade to Python 3.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
65 path_times = [os.path.getmtime(p) for p in self.paths]
479
3b6cbadd0c64 themes: Add config paths to the cache key.
Ludovic Chabant <ludovic@chabant.com>
parents: 478
diff changeset
66 cache_key_hash = hashlib.md5(("version=%s&cache=%d" % (
3b6cbadd0c64 themes: Add config paths to the cache key.
Ludovic Chabant <ludovic@chabant.com>
parents: 478
diff changeset
67 APP_VERSION, CACHE_VERSION)).encode('utf8'))
3b6cbadd0c64 themes: Add config paths to the cache key.
Ludovic Chabant <ludovic@chabant.com>
parents: 478
diff changeset
68 for p in self.paths:
3b6cbadd0c64 themes: Add config paths to the cache key.
Ludovic Chabant <ludovic@chabant.com>
parents: 478
diff changeset
69 cache_key_hash.update(("&path=%s" % p).encode('utf8'))
3b6cbadd0c64 themes: Add config paths to the cache key.
Ludovic Chabant <ludovic@chabant.com>
parents: 478
diff changeset
70 cache_key = cache_key_hash.hexdigest()
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
71
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
72 if self.cache.isValid('config.json', path_times):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
73 logger.debug("Loading configuration from cache...")
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
74 config_text = self.cache.read('config.json')
67
563ce5dd02af I don't care what the YAML spec says, ordered maps are the only sane way.
Ludovic Chabant <ludovic@chabant.com>
parents: 56
diff changeset
75 self._values = json.loads(config_text,
563ce5dd02af I don't care what the YAML spec says, ordered maps are the only sane way.
Ludovic Chabant <ludovic@chabant.com>
parents: 56
diff changeset
76 object_pairs_hook=collections.OrderedDict)
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
77
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
78 actual_cache_key = self._values.get('__cache_key')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
79 if actual_cache_key == cache_key:
39
2f717f961996 Better error reporting and cache validation.
Ludovic Chabant <ludovic@chabant.com>
parents: 36
diff changeset
80 self._values['__cache_valid'] = True
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
81 return
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
82 logger.debug("Outdated cache key '%s' (expected '%s')." % (
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
83 actual_cache_key, cache_key))
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
84
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
85 values = {}
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
86 logger.debug("Loading configuration from: %s" % self.paths)
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
87 for i, p in enumerate(self.paths):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
88 with codecs.open(p, 'r', 'utf-8') as fp:
67
563ce5dd02af I don't care what the YAML spec says, ordered maps are the only sane way.
Ludovic Chabant <ludovic@chabant.com>
parents: 56
diff changeset
89 loaded_values = yaml.load(fp.read(),
107
10fc9c8bf682 Better support for times in YAML interop.
Ludovic Chabant <ludovic@chabant.com>
parents: 93
diff changeset
90 Loader=ConfigurationLoader)
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
91 if loaded_values is None:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
92 loaded_values = {}
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
93 for fixup in self.fixups:
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
94 fixup(i, loaded_values)
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
95 merge_dicts(values, loaded_values)
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
96
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
97 for fixup in self.fixups:
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
98 fixup(len(self.paths), values)
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
99
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
100 self._values = self._validateAll(values)
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
101
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
102 logger.debug("Caching configuration...")
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
103 self._values['__cache_key'] = cache_key
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
104 config_text = json.dumps(self._values)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
105 self.cache.write('config.json', config_text)
39
2f717f961996 Better error reporting and cache validation.
Ludovic Chabant <ludovic@chabant.com>
parents: 36
diff changeset
106 self._values['__cache_valid'] = False
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
107
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
108 def _validateAll(self, values):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
109 # Put all the defaults in the `site` section.
93
28ea3e69d67e Use the `OrderedDict` correctly when fresh-loading the app config.
Ludovic Chabant <ludovic@chabant.com>
parents: 87
diff changeset
110 default_sitec = collections.OrderedDict({
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
111 'title': "Untitled PieCrust website",
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
112 'root': '/',
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
113 'default_format': DEFAULT_FORMAT,
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
114 'default_template_engine': DEFAULT_TEMPLATE_ENGINE,
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
115 'enable_gzip': True,
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
116 'pretty_urls': False,
256
da5e6e00fb41 bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents: 230
diff changeset
117 'trailing_slash': False,
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
118 'date_format': DEFAULT_DATE_FORMAT,
143
5b12c1d96523 Use ordered dictionaries to preserve priorities between auto-formats.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
119 'auto_formats': collections.OrderedDict([
5b12c1d96523 Use ordered dictionaries to preserve priorities between auto-formats.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
120 ('html', ''),
5b12c1d96523 Use ordered dictionaries to preserve priorities between auto-formats.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
121 ('md', 'markdown'),
5b12c1d96523 Use ordered dictionaries to preserve priorities between auto-formats.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
122 ('textile', 'textile')]),
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
123 'default_auto_format': 'md',
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
124 'pagination_suffix': '/%num%',
307
869a206facd5 internal: Remove mentions of plugins directories and sources.
Ludovic Chabant <ludovic@chabant.com>
parents: 271
diff changeset
125 'plugins': None,
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
126 'themes_sources': [DEFAULT_THEME_SOURCE],
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
127 'cache_time': 28800,
83
f9f67086415c Allow adding to the default content model instead of replacing it.
Ludovic Chabant <ludovic@chabant.com>
parents: 76
diff changeset
128 'enable_debug_info': True,
223
7decf00eee47 serve: Don't expose the debug info right away when running with `--debug`.
Ludovic Chabant <ludovic@chabant.com>
parents: 173
diff changeset
129 'show_debug_info': False,
83
f9f67086415c Allow adding to the default content model instead of replacing it.
Ludovic Chabant <ludovic@chabant.com>
parents: 76
diff changeset
130 'use_default_content': True
93
28ea3e69d67e Use the `OrderedDict` correctly when fresh-loading the app config.
Ludovic Chabant <ludovic@chabant.com>
parents: 87
diff changeset
131 })
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
132 sitec = values.get('site')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
133 if sitec is None:
93
28ea3e69d67e Use the `OrderedDict` correctly when fresh-loading the app config.
Ludovic Chabant <ludovic@chabant.com>
parents: 87
diff changeset
134 sitec = collections.OrderedDict()
5
474c9882decf Upgrade to Python 3.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
135 for key, val in default_sitec.items():
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
136 sitec.setdefault(key, val)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
137 values['site'] = sitec
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
138
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
139 # Add a section for our cached information.
93
28ea3e69d67e Use the `OrderedDict` correctly when fresh-loading the app config.
Ludovic Chabant <ludovic@chabant.com>
parents: 87
diff changeset
140 cachec = collections.OrderedDict()
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
141 values['__cache'] = cachec
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
142
329
422052d2e978 internal: Try handling URLs in a consistent way.
Ludovic Chabant <ludovic@chabant.com>
parents: 320
diff changeset
143 # Make sure the site root starts and ends with a slash.
422052d2e978 internal: Try handling URLs in a consistent way.
Ludovic Chabant <ludovic@chabant.com>
parents: 320
diff changeset
144 if not sitec['root'].startswith('/'):
422052d2e978 internal: Try handling URLs in a consistent way.
Ludovic Chabant <ludovic@chabant.com>
parents: 320
diff changeset
145 raise ConfigurationError("The `site/root` setting must start "
422052d2e978 internal: Try handling URLs in a consistent way.
Ludovic Chabant <ludovic@chabant.com>
parents: 320
diff changeset
146 "with a slash.")
422052d2e978 internal: Try handling URLs in a consistent way.
Ludovic Chabant <ludovic@chabant.com>
parents: 320
diff changeset
147 sitec['root'] = sitec['root'].rstrip('/') + '/'
422052d2e978 internal: Try handling URLs in a consistent way.
Ludovic Chabant <ludovic@chabant.com>
parents: 320
diff changeset
148
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
149 # Cache auto-format regexes.
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
150 if not isinstance(sitec['auto_formats'], dict):
257
e6ae65212c32 cosmetic: PEP8 compliance.
Ludovic Chabant <ludovic@chabant.com>
parents: 256
diff changeset
151 raise ConfigurationError("The 'site/auto_formats' setting must be "
e6ae65212c32 cosmetic: PEP8 compliance.
Ludovic Chabant <ludovic@chabant.com>
parents: 256
diff changeset
152 "a dictionary.")
31
8c15fc45d712 Make sure `.html` is part of auto-formats.
Ludovic Chabant <ludovic@chabant.com>
parents: 26
diff changeset
153 html_auto_format = sitec['auto_formats']
8c15fc45d712 Make sure `.html` is part of auto-formats.
Ludovic Chabant <ludovic@chabant.com>
parents: 26
diff changeset
154 if not html_auto_format:
8c15fc45d712 Make sure `.html` is part of auto-formats.
Ludovic Chabant <ludovic@chabant.com>
parents: 26
diff changeset
155 sitec['auto_formats']['html'] = sitec['default_format']
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
156 cachec['auto_formats_re'] = r"\.(%s)$" % (
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
157 '|'.join(
257
e6ae65212c32 cosmetic: PEP8 compliance.
Ludovic Chabant <ludovic@chabant.com>
parents: 256
diff changeset
158 [re.escape(i) for i in
e6ae65212c32 cosmetic: PEP8 compliance.
Ludovic Chabant <ludovic@chabant.com>
parents: 256
diff changeset
159 list(sitec['auto_formats'].keys())]))
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
160 if sitec['default_auto_format'] not in sitec['auto_formats']:
257
e6ae65212c32 cosmetic: PEP8 compliance.
Ludovic Chabant <ludovic@chabant.com>
parents: 256
diff changeset
161 raise ConfigurationError("Default auto-format '%s' is not "
e6ae65212c32 cosmetic: PEP8 compliance.
Ludovic Chabant <ludovic@chabant.com>
parents: 256
diff changeset
162 "declared." %
e6ae65212c32 cosmetic: PEP8 compliance.
Ludovic Chabant <ludovic@chabant.com>
parents: 256
diff changeset
163 sitec['default_auto_format'])
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
164
256
da5e6e00fb41 bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents: 230
diff changeset
165 # Cache pagination suffix regex and format.
da5e6e00fb41 bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents: 230
diff changeset
166 pgn_suffix = sitec['pagination_suffix']
da5e6e00fb41 bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents: 230
diff changeset
167 if len(pgn_suffix) == 0 or pgn_suffix[0] != '/':
da5e6e00fb41 bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents: 230
diff changeset
168 raise ConfigurationError("The 'site/pagination_suffix' setting "
da5e6e00fb41 bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents: 230
diff changeset
169 "must start with a slash.")
da5e6e00fb41 bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents: 230
diff changeset
170 if '%num%' not in pgn_suffix:
da5e6e00fb41 bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents: 230
diff changeset
171 raise ConfigurationError("The 'site/pagination_suffix' setting "
da5e6e00fb41 bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents: 230
diff changeset
172 "must contain the '%num%' placeholder.")
da5e6e00fb41 bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents: 230
diff changeset
173
da5e6e00fb41 bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents: 230
diff changeset
174 pgn_suffix_fmt = pgn_suffix.replace('%num%', '%(num)d')
da5e6e00fb41 bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents: 230
diff changeset
175 cachec['pagination_suffix_format'] = pgn_suffix_fmt
da5e6e00fb41 bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents: 230
diff changeset
176
da5e6e00fb41 bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents: 230
diff changeset
177 pgn_suffix_re = re.escape(pgn_suffix)
da5e6e00fb41 bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents: 230
diff changeset
178 pgn_suffix_re = (pgn_suffix_re.replace("\\%num\\%", "(?P<num>\\d+)") +
da5e6e00fb41 bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents: 230
diff changeset
179 '$')
da5e6e00fb41 bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents: 230
diff changeset
180 cachec['pagination_suffix_re'] = pgn_suffix_re
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
181
307
869a206facd5 internal: Remove mentions of plugins directories and sources.
Ludovic Chabant <ludovic@chabant.com>
parents: 271
diff changeset
182 # Make sure theme sources is a list.
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
183 if not isinstance(sitec['themes_sources'], list):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
184 sitec['themes_sources'] = [sitec['themes_sources']]
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
185
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
186 # Figure out if we need to validate sources/routes, or auto-generate
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
187 # them from simple blog settings.
83
f9f67086415c Allow adding to the default content model instead of replacing it.
Ludovic Chabant <ludovic@chabant.com>
parents: 76
diff changeset
188 orig_sources = sitec.get('sources')
f9f67086415c Allow adding to the default content model instead of replacing it.
Ludovic Chabant <ludovic@chabant.com>
parents: 76
diff changeset
189 orig_routes = sitec.get('routes')
f9f67086415c Allow adding to the default content model instead of replacing it.
Ludovic Chabant <ludovic@chabant.com>
parents: 76
diff changeset
190 orig_taxonomies = sitec.get('taxonomies')
f9f67086415c Allow adding to the default content model instead of replacing it.
Ludovic Chabant <ludovic@chabant.com>
parents: 76
diff changeset
191 use_default_content = sitec.get('use_default_content')
f9f67086415c Allow adding to the default content model instead of replacing it.
Ludovic Chabant <ludovic@chabant.com>
parents: 76
diff changeset
192 if (orig_sources is None or orig_routes is None or
f9f67086415c Allow adding to the default content model instead of replacing it.
Ludovic Chabant <ludovic@chabant.com>
parents: 76
diff changeset
193 orig_taxonomies is None or use_default_content):
f9f67086415c Allow adding to the default content model instead of replacing it.
Ludovic Chabant <ludovic@chabant.com>
parents: 76
diff changeset
194
f9f67086415c Allow adding to the default content model instead of replacing it.
Ludovic Chabant <ludovic@chabant.com>
parents: 76
diff changeset
195 # Setup defaults for various settings.
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
196 posts_fs = sitec.setdefault('posts_fs', DEFAULT_POSTS_FS)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
197 blogsc = sitec.setdefault('blogs', ['posts'])
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
198
345
ad3e6496f5c3 config: Add `default_page_layout` and `default_post_layout` settings.
Ludovic Chabant <ludovic@chabant.com>
parents: 334
diff changeset
199 g_page_layout = sitec.get('default_page_layout', 'default')
ad3e6496f5c3 config: Add `default_page_layout` and `default_post_layout` settings.
Ludovic Chabant <ludovic@chabant.com>
parents: 334
diff changeset
200 g_post_layout = sitec.get('default_post_layout', 'post')
26
3701daa97927 Use the same defaults as in PieCrust 1.
Ludovic Chabant <ludovic@chabant.com>
parents: 6
diff changeset
201 g_post_url = sitec.get('post_url', '%year%/%month%/%day%/%slug%')
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
202 g_tag_url = sitec.get('tag_url', 'tag/%tag%')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
203 g_category_url = sitec.get('category_url', '%category%')
260
07b4b8484c0a sources: Use `posts_*` and `items_*` settings more appropriately.
Ludovic Chabant <ludovic@chabant.com>
parents: 257
diff changeset
204 g_posts_per_page = sitec.get('posts_per_page', 5)
07b4b8484c0a sources: Use `posts_*` and `items_*` settings more appropriately.
Ludovic Chabant <ludovic@chabant.com>
parents: 257
diff changeset
205 g_posts_filters = sitec.get('posts_filters')
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
206 g_date_format = sitec.get('date_format', DEFAULT_DATE_FORMAT)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
207
83
f9f67086415c Allow adding to the default content model instead of replacing it.
Ludovic Chabant <ludovic@chabant.com>
parents: 76
diff changeset
208 # The normal pages and tags/categories.
93
28ea3e69d67e Use the `OrderedDict` correctly when fresh-loading the app config.
Ludovic Chabant <ludovic@chabant.com>
parents: 87
diff changeset
209 sourcesc = collections.OrderedDict()
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
210 sourcesc['pages'] = {
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
211 'type': 'default',
84
b3ce11b2cf36 Don't complain about missing `pages` or `posts` directories by default.
Ludovic Chabant <ludovic@chabant.com>
parents: 76
diff changeset
212 'ignore_missing_dir': True,
83
f9f67086415c Allow adding to the default content model instead of replacing it.
Ludovic Chabant <ludovic@chabant.com>
parents: 76
diff changeset
213 'data_endpoint': 'site.pages',
345
ad3e6496f5c3 config: Add `default_page_layout` and `default_post_layout` settings.
Ludovic Chabant <ludovic@chabant.com>
parents: 334
diff changeset
214 'default_layout': g_page_layout,
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
215 'item_name': 'page'}
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
216 sitec['sources'] = sourcesc
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
217
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
218 routesc = []
39
2f717f961996 Better error reporting and cache validation.
Ludovic Chabant <ludovic@chabant.com>
parents: 36
diff changeset
219 routesc.append({
230
016d42c23ba9 internal: Make the simple page source use `slug` everywhere.
Ludovic Chabant <ludovic@chabant.com>
parents: 223
diff changeset
220 'url': '/%path:slug%',
39
2f717f961996 Better error reporting and cache validation.
Ludovic Chabant <ludovic@chabant.com>
parents: 36
diff changeset
221 'source': 'pages',
230
016d42c23ba9 internal: Make the simple page source use `slug` everywhere.
Ludovic Chabant <ludovic@chabant.com>
parents: 223
diff changeset
222 'func': 'pcurl(slug)'})
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
223 sitec['routes'] = routesc
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
224
93
28ea3e69d67e Use the `OrderedDict` correctly when fresh-loading the app config.
Ludovic Chabant <ludovic@chabant.com>
parents: 87
diff changeset
225 taxonomiesc = collections.OrderedDict()
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
226 taxonomiesc['tags'] = {
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
227 'multiple': True,
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
228 'term': 'tag'}
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
229 taxonomiesc['categories'] = {
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
230 'term': 'category'}
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
231 sitec['taxonomies'] = taxonomiesc
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
232
83
f9f67086415c Allow adding to the default content model instead of replacing it.
Ludovic Chabant <ludovic@chabant.com>
parents: 76
diff changeset
233 # Setup sources/routes/taxonomies for each blog.
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
234 for blog_name in blogsc:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
235 blogc = values.get(blog_name, {})
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
236 url_prefix = blog_name + '/'
320
edcc9dc17b37 config: Assign correct data endpoint for blogs to be v1-compatible.
Ludovic Chabant <ludovic@chabant.com>
parents: 311
diff changeset
237 fs_endpoint = 'posts/%s' % blog_name
edcc9dc17b37 config: Assign correct data endpoint for blogs to be v1-compatible.
Ludovic Chabant <ludovic@chabant.com>
parents: 311
diff changeset
238 data_endpoint = blog_name
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
239 item_name = '%s-post' % blog_name
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
240 items_per_page = blogc.get('posts_per_page', g_posts_per_page)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
241 items_filters = blogc.get('posts_filters', g_posts_filters)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
242 date_format = blogc.get('date_format', g_date_format)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
243 if len(blogsc) == 1:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
244 url_prefix = ''
320
edcc9dc17b37 config: Assign correct data endpoint for blogs to be v1-compatible.
Ludovic Chabant <ludovic@chabant.com>
parents: 311
diff changeset
245 fs_endpoint = 'posts'
edcc9dc17b37 config: Assign correct data endpoint for blogs to be v1-compatible.
Ludovic Chabant <ludovic@chabant.com>
parents: 311
diff changeset
246 data_endpoint = 'blog'
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
247 item_name = 'post'
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
248 sourcesc[blog_name] = {
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
249 'type': 'posts/%s' % posts_fs,
320
edcc9dc17b37 config: Assign correct data endpoint for blogs to be v1-compatible.
Ludovic Chabant <ludovic@chabant.com>
parents: 311
diff changeset
250 'fs_endpoint': fs_endpoint,
edcc9dc17b37 config: Assign correct data endpoint for blogs to be v1-compatible.
Ludovic Chabant <ludovic@chabant.com>
parents: 311
diff changeset
251 'data_endpoint': data_endpoint,
84
b3ce11b2cf36 Don't complain about missing `pages` or `posts` directories by default.
Ludovic Chabant <ludovic@chabant.com>
parents: 76
diff changeset
252 'ignore_missing_dir': True,
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
253 'data_type': 'blog',
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
254 'item_name': item_name,
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
255 'items_per_page': items_per_page,
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
256 'items_filters': items_filters,
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
257 'date_format': date_format,
345
ad3e6496f5c3 config: Add `default_page_layout` and `default_post_layout` settings.
Ludovic Chabant <ludovic@chabant.com>
parents: 334
diff changeset
258 'default_layout': g_post_layout}
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
259 tax_page_prefix = ''
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
260 if len(blogsc) > 1:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
261 tax_page_prefix = blog_name + '/'
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
262 sourcesc[blog_name]['taxonomy_pages'] = {
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
263 'tags': ('pages:%s_tag.%%ext%%;'
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
264 'theme_pages:_tag.%%ext%%' %
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
265 tax_page_prefix),
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
266 'categories': ('pages:%s_category.%%ext%%;'
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
267 'theme_pages:_category.%%ext%%' %
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
268 tax_page_prefix)}
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
269
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
270 post_url = blogc.get('post_url', url_prefix + g_post_url)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
271 post_url = '/' + post_url.lstrip('/')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
272 tag_url = blogc.get('tag_url', url_prefix + g_tag_url)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
273 tag_url = '/' + tag_url.lstrip('/')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
274 category_url = blogc.get('category_url', url_prefix + g_category_url)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
275 category_url = '/' + category_url.lstrip('/')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
276 routesc.append({'url': post_url, 'source': blog_name,
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
277 'func': 'pcposturl(year,month,day,slug)'})
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
278 routesc.append({'url': tag_url, 'source': blog_name,
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
279 'taxonomy': 'tags',
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
280 'func': 'pctagurl(tag)'})
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
281 routesc.append({'url': category_url, 'source': blog_name,
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
282 'taxonomy': 'categories',
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
283 'func': 'pccaturl(category)'})
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
284
83
f9f67086415c Allow adding to the default content model instead of replacing it.
Ludovic Chabant <ludovic@chabant.com>
parents: 76
diff changeset
285 # If the user defined some additional sources/routes/taxonomies,
152
8d956bd94ad2 Better combine user sources/routes with the default ones.
Ludovic Chabant <ludovic@chabant.com>
parents: 143
diff changeset
286 # add them to the default ones. For routes, the order matters,
8d956bd94ad2 Better combine user sources/routes with the default ones.
Ludovic Chabant <ludovic@chabant.com>
parents: 143
diff changeset
287 # though, so we make sure to add the user routes at the front
8d956bd94ad2 Better combine user sources/routes with the default ones.
Ludovic Chabant <ludovic@chabant.com>
parents: 143
diff changeset
288 # of the list so they're evaluated first.
83
f9f67086415c Allow adding to the default content model instead of replacing it.
Ludovic Chabant <ludovic@chabant.com>
parents: 76
diff changeset
289 if orig_sources:
93
28ea3e69d67e Use the `OrderedDict` correctly when fresh-loading the app config.
Ludovic Chabant <ludovic@chabant.com>
parents: 87
diff changeset
290 sourcesc.update(orig_sources)
152
8d956bd94ad2 Better combine user sources/routes with the default ones.
Ludovic Chabant <ludovic@chabant.com>
parents: 143
diff changeset
291 sitec['sources'] = sourcesc
83
f9f67086415c Allow adding to the default content model instead of replacing it.
Ludovic Chabant <ludovic@chabant.com>
parents: 76
diff changeset
292 if orig_routes:
152
8d956bd94ad2 Better combine user sources/routes with the default ones.
Ludovic Chabant <ludovic@chabant.com>
parents: 143
diff changeset
293 routesc = orig_routes + routesc
8d956bd94ad2 Better combine user sources/routes with the default ones.
Ludovic Chabant <ludovic@chabant.com>
parents: 143
diff changeset
294 sitec['routes'] = routesc
83
f9f67086415c Allow adding to the default content model instead of replacing it.
Ludovic Chabant <ludovic@chabant.com>
parents: 76
diff changeset
295 if orig_taxonomies:
93
28ea3e69d67e Use the `OrderedDict` correctly when fresh-loading the app config.
Ludovic Chabant <ludovic@chabant.com>
parents: 87
diff changeset
296 taxonomiesc.update(orig_taxonomies)
152
8d956bd94ad2 Better combine user sources/routes with the default ones.
Ludovic Chabant <ludovic@chabant.com>
parents: 143
diff changeset
297 sitec['taxonomies'] = taxonomiesc
83
f9f67086415c Allow adding to the default content model instead of replacing it.
Ludovic Chabant <ludovic@chabant.com>
parents: 76
diff changeset
298
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
299 # Validate sources/routes.
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
300 sourcesc = sitec.get('sources')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
301 routesc = sitec.get('routes')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
302 if not sourcesc:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
303 raise ConfigurationError("There are no sources defined.")
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
304 if not routesc:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
305 raise ConfigurationError("There are no routes defined.")
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
306 if not isinstance(sourcesc, dict):
257
e6ae65212c32 cosmetic: PEP8 compliance.
Ludovic Chabant <ludovic@chabant.com>
parents: 256
diff changeset
307 raise ConfigurationError("The 'site/sources' setting must be a "
e6ae65212c32 cosmetic: PEP8 compliance.
Ludovic Chabant <ludovic@chabant.com>
parents: 256
diff changeset
308 "dictionary.")
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
309 if not isinstance(routesc, list):
257
e6ae65212c32 cosmetic: PEP8 compliance.
Ludovic Chabant <ludovic@chabant.com>
parents: 256
diff changeset
310 raise ConfigurationError("The 'site/routes' setting must be a "
e6ae65212c32 cosmetic: PEP8 compliance.
Ludovic Chabant <ludovic@chabant.com>
parents: 256
diff changeset
311 "list.")
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
312
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
313 # Add the theme page source if no sources were defined in the theme
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
314 # configuration itself.
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
315 has_any_theme_source = False
5
474c9882decf Upgrade to Python 3.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
316 for sn, sc in sourcesc.items():
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
317 if sc.get('realm') == REALM_THEME:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
318 has_any_theme_source = True
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
319 break
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
320 if not has_any_theme_source:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
321 sitec['sources']['theme_pages'] = {
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
322 'theme_source': True,
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
323 'fs_endpoint': 'pages',
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
324 'data_endpoint': 'site/pages',
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
325 'item_name': 'page',
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
326 'realm': REALM_THEME}
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
327 sitec['routes'].append({
230
016d42c23ba9 internal: Make the simple page source use `slug` everywhere.
Ludovic Chabant <ludovic@chabant.com>
parents: 223
diff changeset
328 'url': '/%path:slug%',
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
329 'source': 'theme_pages',
230
016d42c23ba9 internal: Make the simple page source use `slug` everywhere.
Ludovic Chabant <ludovic@chabant.com>
parents: 223
diff changeset
330 'func': 'pcurl(slug)'})
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
331
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
332 # Sources have the `default` scanner by default, duh. Also, a bunch
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
333 # of other default values for other configuration stuff.
5
474c9882decf Upgrade to Python 3.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
334 for sn, sc in sourcesc.items():
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
335 if not isinstance(sc, dict):
257
e6ae65212c32 cosmetic: PEP8 compliance.
Ludovic Chabant <ludovic@chabant.com>
parents: 256
diff changeset
336 raise ConfigurationError("All sources in 'site/sources' must "
e6ae65212c32 cosmetic: PEP8 compliance.
Ludovic Chabant <ludovic@chabant.com>
parents: 256
diff changeset
337 "be dictionaries.")
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
338 sc.setdefault('type', 'default')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
339 sc.setdefault('fs_endpoint', sn)
152
8d956bd94ad2 Better combine user sources/routes with the default ones.
Ludovic Chabant <ludovic@chabant.com>
parents: 143
diff changeset
340 sc.setdefault('ignore_missing_dir', False)
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
341 sc.setdefault('data_endpoint', sn)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
342 sc.setdefault('data_type', 'iterator')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
343 sc.setdefault('item_name', sn)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
344 sc.setdefault('items_per_page', 5)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
345 sc.setdefault('date_format', DEFAULT_DATE_FORMAT)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
346 sc.setdefault('realm', REALM_USER)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
347
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
348 # Check routes are referencing correct routes, have default
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
349 # values, etc.
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
350 for rc in routesc:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
351 if not isinstance(rc, dict):
257
e6ae65212c32 cosmetic: PEP8 compliance.
Ludovic Chabant <ludovic@chabant.com>
parents: 256
diff changeset
352 raise ConfigurationError("All routes in 'site/routes' must be "
e6ae65212c32 cosmetic: PEP8 compliance.
Ludovic Chabant <ludovic@chabant.com>
parents: 256
diff changeset
353 "dictionaries.")
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
354 rc_url = rc.get('url')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
355 if not rc_url:
257
e6ae65212c32 cosmetic: PEP8 compliance.
Ludovic Chabant <ludovic@chabant.com>
parents: 256
diff changeset
356 raise ConfigurationError("All routes in 'site/routes' must "
e6ae65212c32 cosmetic: PEP8 compliance.
Ludovic Chabant <ludovic@chabant.com>
parents: 256
diff changeset
357 "have an 'url'.")
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
358 if rc_url[0] != '/':
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
359 raise ConfigurationError("Route URLs must start with '/'.")
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
360 if rc.get('source') is None:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
361 raise ConfigurationError("Routes must specify a source.")
5
474c9882decf Upgrade to Python 3.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
362 if rc['source'] not in list(sourcesc.keys()):
257
e6ae65212c32 cosmetic: PEP8 compliance.
Ludovic Chabant <ludovic@chabant.com>
parents: 256
diff changeset
363 raise ConfigurationError("Route is referencing unknown "
e6ae65212c32 cosmetic: PEP8 compliance.
Ludovic Chabant <ludovic@chabant.com>
parents: 256
diff changeset
364 "source: %s" % rc['source'])
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
365 rc.setdefault('taxonomy', None)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
366 rc.setdefault('page_suffix', '/%num%')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
367
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
368 # Validate taxonomies.
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
369 sitec.setdefault('taxonomies', {})
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
370 taxonomiesc = sitec.get('taxonomies')
5
474c9882decf Upgrade to Python 3.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
371 for tn, tc in taxonomiesc.items():
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
372 tc.setdefault('multiple', False)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
373 tc.setdefault('term', tn)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
374 tc.setdefault('page', '_%s.%%ext%%' % tc['term'])
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
375
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
376 # Validate endpoints, and make sure the theme has a default source.
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
377 reserved_endpoints = set(['piecrust', 'site', 'page', 'route',
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
378 'assets', 'pagination', 'siblings',
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
379 'family'])
5
474c9882decf Upgrade to Python 3.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
380 for name, src in sitec['sources'].items():
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
381 endpoint = src['data_endpoint']
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
382 if endpoint in reserved_endpoints:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
383 raise ConfigurationError(
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
384 "Source '%s' is using a reserved endpoint name: %s" %
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
385 (name, endpoint))
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
386
311
47ffac7ab25d config: Make sure `site/plugins` is transformed into a list.
Ludovic Chabant <ludovic@chabant.com>
parents: 307
diff changeset
387 # Make sure the `plugins` setting is a list.
47ffac7ab25d config: Make sure `site/plugins` is transformed into a list.
Ludovic Chabant <ludovic@chabant.com>
parents: 307
diff changeset
388 user_plugins = sitec.get('plugins')
47ffac7ab25d config: Make sure `site/plugins` is transformed into a list.
Ludovic Chabant <ludovic@chabant.com>
parents: 307
diff changeset
389 if user_plugins:
47ffac7ab25d config: Make sure `site/plugins` is transformed into a list.
Ludovic Chabant <ludovic@chabant.com>
parents: 307
diff changeset
390 if isinstance(user_plugins, str):
47ffac7ab25d config: Make sure `site/plugins` is transformed into a list.
Ludovic Chabant <ludovic@chabant.com>
parents: 307
diff changeset
391 sitec['plugins'] = user_plugins.split(',')
47ffac7ab25d config: Make sure `site/plugins` is transformed into a list.
Ludovic Chabant <ludovic@chabant.com>
parents: 307
diff changeset
392 elif not isinstance(user_plugins, list):
47ffac7ab25d config: Make sure `site/plugins` is transformed into a list.
Ludovic Chabant <ludovic@chabant.com>
parents: 307
diff changeset
393 raise ConfigurationError(
47ffac7ab25d config: Make sure `site/plugins` is transformed into a list.
Ludovic Chabant <ludovic@chabant.com>
parents: 307
diff changeset
394 "The 'site/plugins' setting must be an array, or a "
47ffac7ab25d config: Make sure `site/plugins` is transformed into a list.
Ludovic Chabant <ludovic@chabant.com>
parents: 307
diff changeset
395 "comma-separated list.")
47ffac7ab25d config: Make sure `site/plugins` is transformed into a list.
Ludovic Chabant <ludovic@chabant.com>
parents: 307
diff changeset
396
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
397 # Done validating!
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
398 return values
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
399
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
400
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
401 class PieCrust(object):
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
402 def __init__(self, root_dir, cache=True, debug=False, theme_site=False,
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
403 env=None):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
404 self.root_dir = root_dir
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
405 self.debug = debug
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
406 self.theme_site = theme_site
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
407 self.plugin_loader = PluginLoader(self)
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
408
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
409 if cache:
371
c2ca72fb7f0b caching: Use separate caches for config variants and other contexts.
Ludovic Chabant <ludovic@chabant.com>
parents: 369
diff changeset
410 cache_dir = os.path.join(self.cache_dir, 'default')
c2ca72fb7f0b caching: Use separate caches for config variants and other contexts.
Ludovic Chabant <ludovic@chabant.com>
parents: 369
diff changeset
411 self.cache = ExtensibleCache(cache_dir)
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
412 else:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
413 self.cache = NullExtensibleCache()
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
414
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
415 self.env = env
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
416 if self.env is None:
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
417 self.env = StandardEnvironment()
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
418 self.env.initialize(self)
411
e7b865f8f335 bake: Enable multiprocess baking.
Ludovic Chabant <ludovic@chabant.com>
parents: 371
diff changeset
419 self.env.registerTimer('SiteConfigLoad')
e7b865f8f335 bake: Enable multiprocess baking.
Ludovic Chabant <ludovic@chabant.com>
parents: 371
diff changeset
420 self.env.registerTimer('PageLoad')
419
6801ad5aa1d4 internal: Optimize page segments rendering.
Ludovic Chabant <ludovic@chabant.com>
parents: 415
diff changeset
421 self.env.registerTimer("PageDataBuild")
411
e7b865f8f335 bake: Enable multiprocess baking.
Ludovic Chabant <ludovic@chabant.com>
parents: 371
diff changeset
422
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
423 @cached_property
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
424 def config(self):
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
425 logger.debug("Creating site configuration...")
411
e7b865f8f335 bake: Enable multiprocess baking.
Ludovic Chabant <ludovic@chabant.com>
parents: 371
diff changeset
426 start_time = time.perf_counter()
e7b865f8f335 bake: Enable multiprocess baking.
Ludovic Chabant <ludovic@chabant.com>
parents: 371
diff changeset
427
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
428 paths = []
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
429 if self.theme_dir:
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
430 paths.append(os.path.join(self.theme_dir, THEME_CONFIG_PATH))
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
431 paths.append(os.path.join(self.root_dir, CONFIG_PATH))
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
432
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
433 config_cache = self.cache.getCache('app')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
434 config = PieCrustConfiguration(paths, config_cache)
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
435 if self.theme_dir:
486
aae241804096 themes: Don't fixup template directories, it's actually better as-is.
Ludovic Chabant <ludovic@chabant.com>
parents: 479
diff changeset
436 # We'll need to flag all page sources as coming from
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
437 # the theme.
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
438 def _fixupThemeSources(index, config):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
439 if index != 0:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
440 return
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
441 sitec = config.get('site')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
442 if sitec is None:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
443 sitec = {}
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
444 config['site'] = sitec
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
445 srcc = sitec.get('sources')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
446 if srcc is not None:
5
474c9882decf Upgrade to Python 3.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
447 for sn, sc in srcc.items():
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
448 sc['realm'] = REALM_THEME
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
449 config.fixups.append(_fixupThemeSources)
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
450
411
e7b865f8f335 bake: Enable multiprocess baking.
Ludovic Chabant <ludovic@chabant.com>
parents: 371
diff changeset
451 self.env.stepTimer('SiteConfigLoad', time.perf_counter() - start_time)
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
452 return config
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
453
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
454 @cached_property
36
485682a6de50 New site layout support.
Ludovic Chabant <ludovic@chabant.com>
parents: 31
diff changeset
455 def assets_dirs(self):
485682a6de50 New site layout support.
Ludovic Chabant <ludovic@chabant.com>
parents: 31
diff changeset
456 assets_dirs = self._get_configurable_dirs(ASSETS_DIR,
485682a6de50 New site layout support.
Ludovic Chabant <ludovic@chabant.com>
parents: 31
diff changeset
457 'site/assets_dirs')
485682a6de50 New site layout support.
Ludovic Chabant <ludovic@chabant.com>
parents: 31
diff changeset
458
485682a6de50 New site layout support.
Ludovic Chabant <ludovic@chabant.com>
parents: 31
diff changeset
459 # Also add the theme directory, if any.
485682a6de50 New site layout support.
Ludovic Chabant <ludovic@chabant.com>
parents: 31
diff changeset
460 if self.theme_dir:
485682a6de50 New site layout support.
Ludovic Chabant <ludovic@chabant.com>
parents: 31
diff changeset
461 default_theme_dir = os.path.join(self.theme_dir, ASSETS_DIR)
485682a6de50 New site layout support.
Ludovic Chabant <ludovic@chabant.com>
parents: 31
diff changeset
462 if os.path.isdir(default_theme_dir):
485682a6de50 New site layout support.
Ludovic Chabant <ludovic@chabant.com>
parents: 31
diff changeset
463 assets_dirs.append(default_theme_dir)
485682a6de50 New site layout support.
Ludovic Chabant <ludovic@chabant.com>
parents: 31
diff changeset
464
485682a6de50 New site layout support.
Ludovic Chabant <ludovic@chabant.com>
parents: 31
diff changeset
465 return assets_dirs
485682a6de50 New site layout support.
Ludovic Chabant <ludovic@chabant.com>
parents: 31
diff changeset
466
485682a6de50 New site layout support.
Ludovic Chabant <ludovic@chabant.com>
parents: 31
diff changeset
467 @cached_property
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
468 def templates_dirs(self):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
469 templates_dirs = self._get_configurable_dirs(TEMPLATES_DIR,
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
470 'site/templates_dirs')
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
471
36
485682a6de50 New site layout support.
Ludovic Chabant <ludovic@chabant.com>
parents: 31
diff changeset
472 # Also, add the theme directory, if any.
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
473 if self.theme_dir:
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
474 default_theme_dir = os.path.join(self.theme_dir, TEMPLATES_DIR)
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
475 if os.path.isdir(default_theme_dir):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
476 templates_dirs.append(default_theme_dir)
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
477
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
478 return templates_dirs
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
479
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
480 @cached_property
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
481 def theme_dir(self):
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
482 td = self._get_dir(THEME_DIR)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
483 if td is not None:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
484 return td
271
12657039c436 internal: Re-use the cached resource directory.
Ludovic Chabant <ludovic@chabant.com>
parents: 260
diff changeset
485 return os.path.join(RESOURCES_DIR, 'theme')
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
486
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
487 @cached_property
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
488 def cache_dir(self):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
489 return os.path.join(self.root_dir, CACHE_DIR)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
490
371
c2ca72fb7f0b caching: Use separate caches for config variants and other contexts.
Ludovic Chabant <ludovic@chabant.com>
parents: 369
diff changeset
491 @property # Not a cached property because its result can change.
c2ca72fb7f0b caching: Use separate caches for config variants and other contexts.
Ludovic Chabant <ludovic@chabant.com>
parents: 369
diff changeset
492 def sub_cache_dir(self):
c2ca72fb7f0b caching: Use separate caches for config variants and other contexts.
Ludovic Chabant <ludovic@chabant.com>
parents: 369
diff changeset
493 if self.cache.enabled:
c2ca72fb7f0b caching: Use separate caches for config variants and other contexts.
Ludovic Chabant <ludovic@chabant.com>
parents: 369
diff changeset
494 return self.cache.base_dir
c2ca72fb7f0b caching: Use separate caches for config variants and other contexts.
Ludovic Chabant <ludovic@chabant.com>
parents: 369
diff changeset
495 return None
c2ca72fb7f0b caching: Use separate caches for config variants and other contexts.
Ludovic Chabant <ludovic@chabant.com>
parents: 369
diff changeset
496
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
497 @cached_property
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
498 def sources(self):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
499 defs = {}
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
500 for cls in self.plugin_loader.getSources():
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
501 defs[cls.SOURCE_NAME] = cls
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
502
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
503 sources = []
5
474c9882decf Upgrade to Python 3.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
504 for n, s in self.config.get('site/sources').items():
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
505 cls = defs.get(s['type'])
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
506 if cls is None:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
507 raise ConfigurationError("No such page source type: %s" % s['type'])
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
508 src = cls(self, n, s)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
509 sources.append(src)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
510 return sources
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
511
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
512 @cached_property
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
513 def routes(self):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
514 routes = []
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
515 for r in self.config.get('site/routes'):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
516 rte = Route(self, r)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
517 routes.append(rte)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
518 return routes
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
519
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
520 @cached_property
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
521 def taxonomies(self):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
522 taxonomies = []
5
474c9882decf Upgrade to Python 3.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
523 for tn, tc in self.config.get('site/taxonomies').items():
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
524 tax = Taxonomy(self, tn, tc)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
525 taxonomies.append(tax)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
526 return taxonomies
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
527
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
528 def getSource(self, source_name):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
529 for source in self.sources:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
530 if source.name == source_name:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
531 return source
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
532 return None
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
533
363
dd25bd3ce1f9 serve: Refactoring and fixes to be able to serve taxonomy pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 345
diff changeset
534 def getRoutes(self, source_name, *, skip_taxonomies=False):
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
535 for route in self.routes:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
536 if route.source_name == source_name:
334
b034f6f15e22 bake: Several bug taxonomy-related fixes for incorrect incremental bakes.
Ludovic Chabant <ludovic@chabant.com>
parents: 329
diff changeset
537 if not skip_taxonomies or route.taxonomy_name is None:
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
538 yield route
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
539
369
4b1019bb2533 serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 364
diff changeset
540 def getRoute(self, source_name, route_metadata, *, skip_taxonomies=False):
363
dd25bd3ce1f9 serve: Refactoring and fixes to be able to serve taxonomy pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 345
diff changeset
541 for route in self.getRoutes(source_name,
dd25bd3ce1f9 serve: Refactoring and fixes to be able to serve taxonomy pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 345
diff changeset
542 skip_taxonomies=skip_taxonomies):
369
4b1019bb2533 serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 364
diff changeset
543 if (route_metadata is None or
4b1019bb2533 serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 364
diff changeset
544 route.matchesMetadata(route_metadata)):
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
545 return route
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
546 return None
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
547
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
548 def getTaxonomyRoute(self, tax_name, source_name):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
549 for route in self.routes:
334
b034f6f15e22 bake: Several bug taxonomy-related fixes for incorrect incremental bakes.
Ludovic Chabant <ludovic@chabant.com>
parents: 329
diff changeset
550 if route.taxonomy_name == tax_name and route.source_name == source_name:
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
551 return route
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
552 return None
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
553
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
554 def getTaxonomy(self, tax_name):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
555 for tax in self.taxonomies:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
556 if tax.name == tax_name:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
557 return tax
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
558 return None
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
559
371
c2ca72fb7f0b caching: Use separate caches for config variants and other contexts.
Ludovic Chabant <ludovic@chabant.com>
parents: 369
diff changeset
560 def useSubCache(self, cache_name, cache_key):
c2ca72fb7f0b caching: Use separate caches for config variants and other contexts.
Ludovic Chabant <ludovic@chabant.com>
parents: 369
diff changeset
561 cache_hash = hashlib.md5(cache_key.encode('utf8')).hexdigest()
c2ca72fb7f0b caching: Use separate caches for config variants and other contexts.
Ludovic Chabant <ludovic@chabant.com>
parents: 369
diff changeset
562 cache_dir = os.path.join(self.cache_dir,
c2ca72fb7f0b caching: Use separate caches for config variants and other contexts.
Ludovic Chabant <ludovic@chabant.com>
parents: 369
diff changeset
563 '%s_%s' % (cache_name, cache_hash))
c2ca72fb7f0b caching: Use separate caches for config variants and other contexts.
Ludovic Chabant <ludovic@chabant.com>
parents: 369
diff changeset
564 self._useSubCacheDir(cache_dir)
c2ca72fb7f0b caching: Use separate caches for config variants and other contexts.
Ludovic Chabant <ludovic@chabant.com>
parents: 369
diff changeset
565
c2ca72fb7f0b caching: Use separate caches for config variants and other contexts.
Ludovic Chabant <ludovic@chabant.com>
parents: 369
diff changeset
566 def _useSubCacheDir(self, cache_dir):
c2ca72fb7f0b caching: Use separate caches for config variants and other contexts.
Ludovic Chabant <ludovic@chabant.com>
parents: 369
diff changeset
567 assert cache_dir
c2ca72fb7f0b caching: Use separate caches for config variants and other contexts.
Ludovic Chabant <ludovic@chabant.com>
parents: 369
diff changeset
568 logger.debug("Moving cache to: %s" % cache_dir)
c2ca72fb7f0b caching: Use separate caches for config variants and other contexts.
Ludovic Chabant <ludovic@chabant.com>
parents: 369
diff changeset
569 self.cache = ExtensibleCache(cache_dir)
c2ca72fb7f0b caching: Use separate caches for config variants and other contexts.
Ludovic Chabant <ludovic@chabant.com>
parents: 369
diff changeset
570 self.env._onSubCacheDirChanged(self)
c2ca72fb7f0b caching: Use separate caches for config variants and other contexts.
Ludovic Chabant <ludovic@chabant.com>
parents: 369
diff changeset
571
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
572 def _get_dir(self, default_rel_dir):
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
573 abs_dir = os.path.join(self.root_dir, default_rel_dir)
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
574 if os.path.isdir(abs_dir):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
575 return abs_dir
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
576 return None
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
577
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
578 def _get_configurable_dirs(self, default_rel_dir, conf_name):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
579 dirs = []
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
580
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
581 # Add custom directories from the configuration.
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
582 conf_dirs = self.config.get(conf_name)
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
583 if conf_dirs is not None:
5
474c9882decf Upgrade to Python 3.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
584 if isinstance(conf_dirs, str):
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
585 dirs.append(os.path.join(self.root_dir, conf_dirs))
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
586 else:
56
2d617b889b00 Make template directories properly absolute.
Ludovic Chabant <ludovic@chabant.com>
parents: 39
diff changeset
587 dirs += [os.path.join(self.root_dir, p) for p in conf_dirs]
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
588
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
589 # Add the default directory if it exists.
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
590 default_dir = os.path.join(self.root_dir, default_rel_dir)
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
591 if os.path.isdir(default_dir):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
592 dirs.append(default_dir)
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
593
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
594 return dirs
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
595
466
456db44dcc53 bake: Pass the config variants and values from the CLI to the baker.
Ludovic Chabant <ludovic@chabant.com>
parents: 419
diff changeset
596
456db44dcc53 bake: Pass the config variants and values from the CLI to the baker.
Ludovic Chabant <ludovic@chabant.com>
parents: 419
diff changeset
597 def apply_variant_and_values(app, config_variant=None, config_values=None):
456db44dcc53 bake: Pass the config variants and values from the CLI to the baker.
Ludovic Chabant <ludovic@chabant.com>
parents: 419
diff changeset
598 if config_variant is not None:
456db44dcc53 bake: Pass the config variants and values from the CLI to the baker.
Ludovic Chabant <ludovic@chabant.com>
parents: 419
diff changeset
599 logger.debug("Applying configuration variant '%s'." % config_variant)
456db44dcc53 bake: Pass the config variants and values from the CLI to the baker.
Ludovic Chabant <ludovic@chabant.com>
parents: 419
diff changeset
600 app.config.applyVariant('variants/' + config_variant)
456db44dcc53 bake: Pass the config variants and values from the CLI to the baker.
Ludovic Chabant <ludovic@chabant.com>
parents: 419
diff changeset
601
456db44dcc53 bake: Pass the config variants and values from the CLI to the baker.
Ludovic Chabant <ludovic@chabant.com>
parents: 419
diff changeset
602 if config_values is not None:
456db44dcc53 bake: Pass the config variants and values from the CLI to the baker.
Ludovic Chabant <ludovic@chabant.com>
parents: 419
diff changeset
603 for name, value in config_values:
456db44dcc53 bake: Pass the config variants and values from the CLI to the baker.
Ludovic Chabant <ludovic@chabant.com>
parents: 419
diff changeset
604 logger.debug("Setting configuration '%s' to: %s" % (name, value))
456db44dcc53 bake: Pass the config variants and values from the CLI to the baker.
Ludovic Chabant <ludovic@chabant.com>
parents: 419
diff changeset
605 app.config.set(name, value)
456db44dcc53 bake: Pass the config variants and values from the CLI to the baker.
Ludovic Chabant <ludovic@chabant.com>
parents: 419
diff changeset
606