annotate piecrust/app.py @ 1188:a7c43131d871

bake: Fix file write flushing problem with Python 3.8+ Writing the cache files fails in Python 3.8 because it looks like flushing behaviour has changed. We need to explicitly flush. And even then, in very rare occurrences, it looks like it can still run into racing conditions, so we do a very hacky and ugly "retry" loop when fetching cached data :(
author Ludovic Chabant <ludovic@chabant.com>
date Tue, 15 Jun 2021 22:36:23 -0700
parents 31e8ee0bf5b2
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
411
e7b865f8f335 bake: Enable multiprocess baking.
Ludovic Chabant <ludovic@chabant.com>
parents: 371
diff changeset
1 import time
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2 import os.path
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
3 import logging
758
6abb436fea5b publish: Make publisher more powerful and better exposed on the command line.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
4 import urllib.parse
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
5 from werkzeug.utils import cached_property
271
12657039c436 internal: Re-use the cached resource directory.
Ludovic Chabant <ludovic@chabant.com>
parents: 260
diff changeset
6 from piecrust import (
852
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 848
diff changeset
7 RESOURCES_DIR,
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 848
diff changeset
8 CACHE_DIR, TEMPLATES_DIR, ASSETS_DIR,
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 848
diff changeset
9 THEME_DIR, PLUGINS_DIR,
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 848
diff changeset
10 CONFIG_PATH, THEME_CONFIG_PATH)
584
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents: 568
diff changeset
11 from piecrust.appconfig import PieCrustConfiguration
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents: 568
diff changeset
12 from piecrust.cache import ExtensibleCache, NullExtensibleCache
852
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 848
diff changeset
13 from piecrust.configuration import ConfigurationError
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
14 from piecrust.environment import StandardEnvironment
852
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 848
diff changeset
15 from piecrust.page import Page
758
6abb436fea5b publish: Make publisher more powerful and better exposed on the command line.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
16 from piecrust.plugins.base import PluginLoader
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
17 from piecrust.routing import Route
584
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents: 568
diff changeset
18 from piecrust.sources.base import REALM_THEME
999
46025a1b5434 plugins: Support multiple customizable plugins directories.
Ludovic Chabant <ludovic@chabant.com>
parents: 848
diff changeset
19 from piecrust.uriutil import multi_replace
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
20
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
21
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
22 logger = logging.getLogger(__name__)
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
23
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
24
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
25 class PieCrust(object):
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
26 def __init__(self, root_dir, cache=True, debug=False, theme_site=False,
666
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
27 env=None, cache_key=None):
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
28 self.root_dir = root_dir
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
29 self.debug = debug
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
30 self.theme_site = theme_site
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
31 self.plugin_loader = PluginLoader(self)
666
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
32 self.cache_key = cache_key or 'default'
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 if cache:
666
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
35 self.cache = ExtensibleCache(self.cache_dir)
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
36 else:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
37 self.cache = NullExtensibleCache()
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
38
853
f070a4fc033c core: Continue PieCrust3 refactor, simplify pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
39 if env is None:
f070a4fc033c core: Continue PieCrust3 refactor, simplify pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
40 env = StandardEnvironment()
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
41 self.env = env
853
f070a4fc033c core: Continue PieCrust3 refactor, simplify pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
42 env.initialize(self)
f070a4fc033c core: Continue PieCrust3 refactor, simplify pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
43
f070a4fc033c core: Continue PieCrust3 refactor, simplify pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
44 stats = env.stats
f070a4fc033c core: Continue PieCrust3 refactor, simplify pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
45 stats.registerTimer('SiteConfigLoad')
f070a4fc033c core: Continue PieCrust3 refactor, simplify pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
46 stats.registerTimer('PageLoad')
f070a4fc033c core: Continue PieCrust3 refactor, simplify pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
47 stats.registerTimer("BuildRenderData")
904
cc2647360036 internal: Remove unnecessary timer, add timer for lazy data building.
Ludovic Chabant <ludovic@chabant.com>
parents: 885
diff changeset
48 stats.registerTimer("BuildLazyPageData")
853
f070a4fc033c core: Continue PieCrust3 refactor, simplify pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
49 stats.registerTimer("PageRender")
f070a4fc033c core: Continue PieCrust3 refactor, simplify pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
50 stats.registerTimer("PageRenderSegments")
f070a4fc033c core: Continue PieCrust3 refactor, simplify pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
51 stats.registerTimer("PageRenderLayout")
f070a4fc033c core: Continue PieCrust3 refactor, simplify pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
52 stats.registerTimer("PageSerialize")
876
d1095774bfcf refactor: Fix some issues with record/cache entry collisions, add counters.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
53 stats.registerCounter('PageLoads')
d1095774bfcf refactor: Fix some issues with record/cache entry collisions, add counters.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
54 stats.registerCounter('PageRenderSegments')
d1095774bfcf refactor: Fix some issues with record/cache entry collisions, add counters.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
55 stats.registerCounter('PageRenderLayout')
411
e7b865f8f335 bake: Enable multiprocess baking.
Ludovic Chabant <ludovic@chabant.com>
parents: 371
diff changeset
56
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
57 @cached_property
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
58 def config(self):
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
59 logger.debug("Creating site configuration...")
411
e7b865f8f335 bake: Enable multiprocess baking.
Ludovic Chabant <ludovic@chabant.com>
parents: 371
diff changeset
60 start_time = time.perf_counter()
e7b865f8f335 bake: Enable multiprocess baking.
Ludovic Chabant <ludovic@chabant.com>
parents: 371
diff changeset
61
663
3ceeca7bb71c themes: Add support for a `--theme` argument to `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents: 586
diff changeset
62 if not self.theme_site:
681
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
63 path = os.path.join(self.root_dir, CONFIG_PATH)
663
3ceeca7bb71c themes: Add support for a `--theme` argument to `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents: 586
diff changeset
64 else:
681
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
65 path = os.path.join(self.root_dir, THEME_CONFIG_PATH)
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
66
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
67 theme_path = None
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
68 if not self.theme_site and self.theme_dir:
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
69 theme_path = os.path.join(self.theme_dir, THEME_CONFIG_PATH)
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
70
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
71 config_cache = self.cache.getCache('app')
675
3df808b133f8 internal: Improve how theme configuration is validated and merged.
Ludovic Chabant <ludovic@chabant.com>
parents: 666
diff changeset
72 config = PieCrustConfiguration(
852
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 848
diff changeset
73 path=path, theme_path=theme_path,
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 848
diff changeset
74 cache=config_cache, theme_config=self.theme_site)
681
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
75
805
fd694f1297c7 config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents: 758
diff changeset
76 local_path = os.path.join(
852
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 848
diff changeset
77 self.root_dir, 'configs', 'local.yml')
805
fd694f1297c7 config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents: 758
diff changeset
78 config.addVariant(local_path, raise_if_not_found=False)
fd694f1297c7 config: Cleanup config loading code. Add support for a `local.yml` config.
Ludovic Chabant <ludovic@chabant.com>
parents: 758
diff changeset
79
681
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
80 if self.theme_site:
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
81 variant_path = os.path.join(
852
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 848
diff changeset
82 self.root_dir, 'configs', 'theme_preview.yml')
681
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
83 config.addVariant(variant_path, raise_if_not_found=False)
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
84
852
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 848
diff changeset
85 self.env.stats.stepTimer('SiteConfigLoad',
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 848
diff changeset
86 time.perf_counter() - start_time)
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
87 return config
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
88
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
89 @cached_property
36
485682a6de50 New site layout support.
Ludovic Chabant <ludovic@chabant.com>
parents: 31
diff changeset
90 def assets_dirs(self):
584
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents: 568
diff changeset
91 assets_dirs = self._get_configurable_dirs(
852
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 848
diff changeset
92 ASSETS_DIR, 'site/assets_dirs')
36
485682a6de50 New site layout support.
Ludovic Chabant <ludovic@chabant.com>
parents: 31
diff changeset
93
485682a6de50 New site layout support.
Ludovic Chabant <ludovic@chabant.com>
parents: 31
diff changeset
94 # Also add the theme directory, if any.
485682a6de50 New site layout support.
Ludovic Chabant <ludovic@chabant.com>
parents: 31
diff changeset
95 if self.theme_dir:
485682a6de50 New site layout support.
Ludovic Chabant <ludovic@chabant.com>
parents: 31
diff changeset
96 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
97 if os.path.isdir(default_theme_dir):
485682a6de50 New site layout support.
Ludovic Chabant <ludovic@chabant.com>
parents: 31
diff changeset
98 assets_dirs.append(default_theme_dir)
485682a6de50 New site layout support.
Ludovic Chabant <ludovic@chabant.com>
parents: 31
diff changeset
99
485682a6de50 New site layout support.
Ludovic Chabant <ludovic@chabant.com>
parents: 31
diff changeset
100 return assets_dirs
485682a6de50 New site layout support.
Ludovic Chabant <ludovic@chabant.com>
parents: 31
diff changeset
101
485682a6de50 New site layout support.
Ludovic Chabant <ludovic@chabant.com>
parents: 31
diff changeset
102 @cached_property
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
103 def templates_dirs(self):
584
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents: 568
diff changeset
104 templates_dirs = self._get_configurable_dirs(
852
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 848
diff changeset
105 TEMPLATES_DIR, 'site/templates_dirs')
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
106
36
485682a6de50 New site layout support.
Ludovic Chabant <ludovic@chabant.com>
parents: 31
diff changeset
107 # Also, add the theme directory, if any.
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
108 if self.theme_dir:
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
109 default_theme_dir = os.path.join(self.theme_dir, TEMPLATES_DIR)
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
110 if os.path.isdir(default_theme_dir):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
111 templates_dirs.append(default_theme_dir)
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
112
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
113 return templates_dirs
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
114
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
115 @cached_property
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
116 def theme_dir(self):
709
4285b2c9b872 themes: Add support for loading from a library of themes.
Ludovic Chabant <ludovic@chabant.com>
parents: 681
diff changeset
117 # No theme if the curent site is already a theme.
663
3ceeca7bb71c themes: Add support for a `--theme` argument to `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents: 586
diff changeset
118 if self.theme_site:
3ceeca7bb71c themes: Add support for a `--theme` argument to `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents: 586
diff changeset
119 return None
709
4285b2c9b872 themes: Add support for loading from a library of themes.
Ludovic Chabant <ludovic@chabant.com>
parents: 681
diff changeset
120
4285b2c9b872 themes: Add support for loading from a library of themes.
Ludovic Chabant <ludovic@chabant.com>
parents: 681
diff changeset
121 # See if there's a theme we absolutely want.
999
46025a1b5434 plugins: Support multiple customizable plugins directories.
Ludovic Chabant <ludovic@chabant.com>
parents: 848
diff changeset
122 td = os.path.join(self.root_dir, THEME_DIR)
46025a1b5434 plugins: Support multiple customizable plugins directories.
Ludovic Chabant <ludovic@chabant.com>
parents: 848
diff changeset
123 if os.path.isdir(td):
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
124 return td
709
4285b2c9b872 themes: Add support for loading from a library of themes.
Ludovic Chabant <ludovic@chabant.com>
parents: 681
diff changeset
125
4285b2c9b872 themes: Add support for loading from a library of themes.
Ludovic Chabant <ludovic@chabant.com>
parents: 681
diff changeset
126 # Try to load a theme specified in the configuration.
4285b2c9b872 themes: Add support for loading from a library of themes.
Ludovic Chabant <ludovic@chabant.com>
parents: 681
diff changeset
127 from piecrust.themes.base import ThemeLoader
4285b2c9b872 themes: Add support for loading from a library of themes.
Ludovic Chabant <ludovic@chabant.com>
parents: 681
diff changeset
128 loader = ThemeLoader(self.root_dir)
4285b2c9b872 themes: Add support for loading from a library of themes.
Ludovic Chabant <ludovic@chabant.com>
parents: 681
diff changeset
129 theme_dir = loader.getThemeDir()
4285b2c9b872 themes: Add support for loading from a library of themes.
Ludovic Chabant <ludovic@chabant.com>
parents: 681
diff changeset
130 if theme_dir is not None:
4285b2c9b872 themes: Add support for loading from a library of themes.
Ludovic Chabant <ludovic@chabant.com>
parents: 681
diff changeset
131 return theme_dir
4285b2c9b872 themes: Add support for loading from a library of themes.
Ludovic Chabant <ludovic@chabant.com>
parents: 681
diff changeset
132
4285b2c9b872 themes: Add support for loading from a library of themes.
Ludovic Chabant <ludovic@chabant.com>
parents: 681
diff changeset
133 # Nothing... use the default theme.
271
12657039c436 internal: Re-use the cached resource directory.
Ludovic Chabant <ludovic@chabant.com>
parents: 260
diff changeset
134 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
135
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
136 @cached_property
999
46025a1b5434 plugins: Support multiple customizable plugins directories.
Ludovic Chabant <ludovic@chabant.com>
parents: 848
diff changeset
137 def plugins_dirs(self):
46025a1b5434 plugins: Support multiple customizable plugins directories.
Ludovic Chabant <ludovic@chabant.com>
parents: 848
diff changeset
138 return self._get_configurable_dirs(PLUGINS_DIR, 'site/plugins_dirs')
848
7d83b9484b98 plugins: Add support for "ad-hoc" local plugins.
Ludovic Chabant <ludovic@chabant.com>
parents: 815
diff changeset
139
7d83b9484b98 plugins: Add support for "ad-hoc" local plugins.
Ludovic Chabant <ludovic@chabant.com>
parents: 815
diff changeset
140 @cached_property
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
141 def cache_dir(self):
666
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
142 return os.path.join(self.root_dir, CACHE_DIR, self.cache_key)
371
c2ca72fb7f0b caching: Use separate caches for config variants and other contexts.
Ludovic Chabant <ludovic@chabant.com>
parents: 369
diff changeset
143
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
144 @cached_property
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
145 def sources(self):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
146 defs = {}
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
147 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
148 defs[cls.SOURCE_NAME] = cls
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
149
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
150 sources = []
5
474c9882decf Upgrade to Python 3.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
151 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
152 cls = defs.get(s['type'])
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
153 if cls is None:
584
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents: 568
diff changeset
154 raise ConfigurationError("No such page source type: %s" %
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents: 568
diff changeset
155 s['type'])
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
156 src = cls(self, n, s)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
157 sources.append(src)
852
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 848
diff changeset
158
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
159 return sources
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
160
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
161 @cached_property
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
162 def routes(self):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
163 routes = []
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
164 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
165 rte = Route(self, r)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
166 routes.append(rte)
854
08e02c2a2a1a core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents: 853
diff changeset
167 routes = sorted(routes, key=lambda r: r.pass_num)
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
168 return routes
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
169
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
170 @cached_property
758
6abb436fea5b publish: Make publisher more powerful and better exposed on the command line.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
171 def publishers(self):
6abb436fea5b publish: Make publisher more powerful and better exposed on the command line.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
172 defs_by_name = {}
6abb436fea5b publish: Make publisher more powerful and better exposed on the command line.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
173 defs_by_scheme = {}
6abb436fea5b publish: Make publisher more powerful and better exposed on the command line.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
174 for cls in self.plugin_loader.getPublishers():
6abb436fea5b publish: Make publisher more powerful and better exposed on the command line.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
175 defs_by_name[cls.PUBLISHER_NAME] = cls
6abb436fea5b publish: Make publisher more powerful and better exposed on the command line.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
176 if cls.PUBLISHER_SCHEME:
6abb436fea5b publish: Make publisher more powerful and better exposed on the command line.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
177 defs_by_scheme[cls.PUBLISHER_SCHEME] = cls
6abb436fea5b publish: Make publisher more powerful and better exposed on the command line.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
178
6abb436fea5b publish: Make publisher more powerful and better exposed on the command line.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
179 tgts = []
6abb436fea5b publish: Make publisher more powerful and better exposed on the command line.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
180 publish_config = self.config.get('publish')
6abb436fea5b publish: Make publisher more powerful and better exposed on the command line.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
181 if publish_config is None:
6abb436fea5b publish: Make publisher more powerful and better exposed on the command line.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
182 return tgts
885
13e8b50a2113 publish: Fix publishers API and add a simple "copy" publisher.
Ludovic Chabant <ludovic@chabant.com>
parents: 876
diff changeset
183
758
6abb436fea5b publish: Make publisher more powerful and better exposed on the command line.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
184 for n, t in publish_config.items():
885
13e8b50a2113 publish: Fix publishers API and add a simple "copy" publisher.
Ludovic Chabant <ludovic@chabant.com>
parents: 876
diff changeset
185 pub_class = None
758
6abb436fea5b publish: Make publisher more powerful and better exposed on the command line.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
186 if isinstance(t, dict):
6abb436fea5b publish: Make publisher more powerful and better exposed on the command line.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
187 pub_type = t.get('type')
885
13e8b50a2113 publish: Fix publishers API and add a simple "copy" publisher.
Ludovic Chabant <ludovic@chabant.com>
parents: 876
diff changeset
188 pub_class = defs_by_name[pub_type]
13e8b50a2113 publish: Fix publishers API and add a simple "copy" publisher.
Ludovic Chabant <ludovic@chabant.com>
parents: 876
diff changeset
189 pub_cfg = t
758
6abb436fea5b publish: Make publisher more powerful and better exposed on the command line.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
190 elif isinstance(t, str):
6abb436fea5b publish: Make publisher more powerful and better exposed on the command line.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
191 comps = urllib.parse.urlparse(t)
6abb436fea5b publish: Make publisher more powerful and better exposed on the command line.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
192 pub_type = comps.scheme
885
13e8b50a2113 publish: Fix publishers API and add a simple "copy" publisher.
Ludovic Chabant <ludovic@chabant.com>
parents: 876
diff changeset
193 pub_class = defs_by_scheme[pub_type]
13e8b50a2113 publish: Fix publishers API and add a simple "copy" publisher.
Ludovic Chabant <ludovic@chabant.com>
parents: 876
diff changeset
194 pub_cfg = None
13e8b50a2113 publish: Fix publishers API and add a simple "copy" publisher.
Ludovic Chabant <ludovic@chabant.com>
parents: 876
diff changeset
195 if pub_class is None:
758
6abb436fea5b publish: Make publisher more powerful and better exposed on the command line.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
196 raise ConfigurationError("No such publisher: %s" % pub_type)
885
13e8b50a2113 publish: Fix publishers API and add a simple "copy" publisher.
Ludovic Chabant <ludovic@chabant.com>
parents: 876
diff changeset
197
13e8b50a2113 publish: Fix publishers API and add a simple "copy" publisher.
Ludovic Chabant <ludovic@chabant.com>
parents: 876
diff changeset
198 tgt = pub_class(self, n, pub_cfg)
13e8b50a2113 publish: Fix publishers API and add a simple "copy" publisher.
Ludovic Chabant <ludovic@chabant.com>
parents: 876
diff changeset
199 if pub_cfg is None:
13e8b50a2113 publish: Fix publishers API and add a simple "copy" publisher.
Ludovic Chabant <ludovic@chabant.com>
parents: 876
diff changeset
200 tgt.parseUrlTarget(comps)
13e8b50a2113 publish: Fix publishers API and add a simple "copy" publisher.
Ludovic Chabant <ludovic@chabant.com>
parents: 876
diff changeset
201
758
6abb436fea5b publish: Make publisher more powerful and better exposed on the command line.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
202 tgts.append(tgt)
6abb436fea5b publish: Make publisher more powerful and better exposed on the command line.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
203 return tgts
6abb436fea5b publish: Make publisher more powerful and better exposed on the command line.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
204
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
205 def getSource(self, source_name):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
206 for source in self.sources:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
207 if source.name == source_name:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
208 return source
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
209
853
f070a4fc033c core: Continue PieCrust3 refactor, simplify pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
210 from piecrust.sources.base import SourceNotFoundError
f070a4fc033c core: Continue PieCrust3 refactor, simplify pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
211 raise SourceNotFoundError(source_name)
711
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents: 709
diff changeset
212
853
f070a4fc033c core: Continue PieCrust3 refactor, simplify pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
213 def getSourceRoute(self, source_name):
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
214 for route in self.routes:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
215 if route.source_name == source_name:
853
f070a4fc033c core: Continue PieCrust3 refactor, simplify pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
216 return route
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
217
853
f070a4fc033c core: Continue PieCrust3 refactor, simplify pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
218 from piecrust.routing import RouteNotFoundError
f070a4fc033c core: Continue PieCrust3 refactor, simplify pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
219 raise RouteNotFoundError(source_name)
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
220
758
6abb436fea5b publish: Make publisher more powerful and better exposed on the command line.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
221 def getPublisher(self, target_name):
6abb436fea5b publish: Make publisher more powerful and better exposed on the command line.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
222 for pub in self.publishers:
6abb436fea5b publish: Make publisher more powerful and better exposed on the command line.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
223 if pub.target == target_name:
6abb436fea5b publish: Make publisher more powerful and better exposed on the command line.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
224 return pub
6abb436fea5b publish: Make publisher more powerful and better exposed on the command line.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
225 return None
6abb436fea5b publish: Make publisher more powerful and better exposed on the command line.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
226
1182
31e8ee0bf5b2 prepare: Refactor scaffolding code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1011
diff changeset
227 def getCommand(self, command_name):
31e8ee0bf5b2 prepare: Refactor scaffolding code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1011
diff changeset
228 for cmd in self.plugin_loader.getCommands():
31e8ee0bf5b2 prepare: Refactor scaffolding code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1011
diff changeset
229 if cmd.name == command_name:
31e8ee0bf5b2 prepare: Refactor scaffolding code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1011
diff changeset
230 return cmd
31e8ee0bf5b2 prepare: Refactor scaffolding code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1011
diff changeset
231 return None
31e8ee0bf5b2 prepare: Refactor scaffolding code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1011
diff changeset
232
31e8ee0bf5b2 prepare: Refactor scaffolding code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1011
diff changeset
233 def getCommandExtensions(self, command_name, supported_only=True):
31e8ee0bf5b2 prepare: Refactor scaffolding code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1011
diff changeset
234 extensions = self.plugin_loader.getCommandExtensions()
31e8ee0bf5b2 prepare: Refactor scaffolding code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1011
diff changeset
235 for e in extensions:
31e8ee0bf5b2 prepare: Refactor scaffolding code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1011
diff changeset
236 if (e.command_name == command_name and
31e8ee0bf5b2 prepare: Refactor scaffolding code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1011
diff changeset
237 (not supported_only or e.supports(self))):
31e8ee0bf5b2 prepare: Refactor scaffolding code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1011
diff changeset
238 yield e
31e8ee0bf5b2 prepare: Refactor scaffolding code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1011
diff changeset
239
853
f070a4fc033c core: Continue PieCrust3 refactor, simplify pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
240 def getPage(self, source, content_item):
876
d1095774bfcf refactor: Fix some issues with record/cache entry collisions, add counters.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
241 cache_key = '%s@%s' % (source.name, content_item.spec)
852
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 848
diff changeset
242 return self.env.page_repository.get(
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 848
diff changeset
243 cache_key,
853
f070a4fc033c core: Continue PieCrust3 refactor, simplify pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
244 lambda: Page(source, content_item))
852
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 848
diff changeset
245
999
46025a1b5434 plugins: Support multiple customizable plugins directories.
Ludovic Chabant <ludovic@chabant.com>
parents: 848
diff changeset
246 def resolvePath(self, path):
46025a1b5434 plugins: Support multiple customizable plugins directories.
Ludovic Chabant <ludovic@chabant.com>
parents: 848
diff changeset
247 path = multi_replace(path, {'%theme_dir%': self.theme_dir})
46025a1b5434 plugins: Support multiple customizable plugins directories.
Ludovic Chabant <ludovic@chabant.com>
parents: 848
diff changeset
248 return os.path.join(self.root_dir, path)
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
249
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
250 def _get_configurable_dirs(self, default_rel_dir, conf_name):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
251 dirs = []
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
252
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
253 # Add custom directories from the configuration.
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
254 conf_dirs = self.config.get(conf_name)
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
255 if conf_dirs is not None:
5
474c9882decf Upgrade to Python 3.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
256 if isinstance(conf_dirs, str):
999
46025a1b5434 plugins: Support multiple customizable plugins directories.
Ludovic Chabant <ludovic@chabant.com>
parents: 848
diff changeset
257 dirs.append(self.resolvePath(conf_dirs))
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
258 else:
999
46025a1b5434 plugins: Support multiple customizable plugins directories.
Ludovic Chabant <ludovic@chabant.com>
parents: 848
diff changeset
259 dirs += [self.resolvePath(p) for p in conf_dirs]
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
260
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
261 # 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
262 default_dir = os.path.join(self.root_dir, default_rel_dir)
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
263 if os.path.isdir(default_dir):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
264 dirs.append(default_dir)
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
265
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
266 return dirs
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
267
466
456db44dcc53 bake: Pass the config variants and values from the CLI to the baker.
Ludovic Chabant <ludovic@chabant.com>
parents: 419
diff changeset
268
909
eed19a80c00e chef: Allow multiple config variants to be applied.
Ludovic Chabant <ludovic@chabant.com>
parents: 904
diff changeset
269 def apply_variants_and_values(app, config_variants=None, config_values=None):
eed19a80c00e chef: Allow multiple config variants to be applied.
Ludovic Chabant <ludovic@chabant.com>
parents: 904
diff changeset
270 if config_variants is not None:
eed19a80c00e chef: Allow multiple config variants to be applied.
Ludovic Chabant <ludovic@chabant.com>
parents: 904
diff changeset
271 for value in config_variants:
eed19a80c00e chef: Allow multiple config variants to be applied.
Ludovic Chabant <ludovic@chabant.com>
parents: 904
diff changeset
272 logger.debug("Adding configuration variant '%s'." % value)
eed19a80c00e chef: Allow multiple config variants to be applied.
Ludovic Chabant <ludovic@chabant.com>
parents: 904
diff changeset
273 variant_path = os.path.join(
eed19a80c00e chef: Allow multiple config variants to be applied.
Ludovic Chabant <ludovic@chabant.com>
parents: 904
diff changeset
274 app.root_dir, 'configs', '%s.yml' % value)
eed19a80c00e chef: Allow multiple config variants to be applied.
Ludovic Chabant <ludovic@chabant.com>
parents: 904
diff changeset
275 app.config.addVariant(variant_path)
466
456db44dcc53 bake: Pass the config variants and values from the CLI to the baker.
Ludovic Chabant <ludovic@chabant.com>
parents: 419
diff changeset
276
456db44dcc53 bake: Pass the config variants and values from the CLI to the baker.
Ludovic Chabant <ludovic@chabant.com>
parents: 419
diff changeset
277 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
278 for name, value in config_values:
852
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 848
diff changeset
279 logger.debug("Adding configuration override '%s': %s" %
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 848
diff changeset
280 (name, value))
666
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
281 app.config.addVariantValue(name, value)
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
282
466
456db44dcc53 bake: Pass the config variants and values from the CLI to the baker.
Ludovic Chabant <ludovic@chabant.com>
parents: 419
diff changeset
283
666
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
284 class PieCrustFactory(object):
852
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 848
diff changeset
285 """ A class that builds a PieCrust app instance.
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 848
diff changeset
286 """
666
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
287 def __init__(
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
288 self, root_dir, *,
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
289 cache=True, cache_key=None,
909
eed19a80c00e chef: Allow multiple config variants to be applied.
Ludovic Chabant <ludovic@chabant.com>
parents: 904
diff changeset
290 config_variants=None, config_values=None,
666
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
291 debug=False, theme_site=False):
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
292 self.root_dir = root_dir
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
293 self.cache = cache
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
294 self.cache_key = cache_key
909
eed19a80c00e chef: Allow multiple config variants to be applied.
Ludovic Chabant <ludovic@chabant.com>
parents: 904
diff changeset
295 self.config_variants = config_variants
666
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
296 self.config_values = config_values
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
297 self.debug = debug
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
298 self.theme_site = theme_site
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
299
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
300 def create(self):
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
301 app = PieCrust(
852
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 848
diff changeset
302 self.root_dir,
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 848
diff changeset
303 cache=self.cache,
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 848
diff changeset
304 cache_key=self.cache_key,
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 848
diff changeset
305 debug=self.debug,
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 848
diff changeset
306 theme_site=self.theme_site)
909
eed19a80c00e chef: Allow multiple config variants to be applied.
Ludovic Chabant <ludovic@chabant.com>
parents: 904
diff changeset
307 apply_variants_and_values(
eed19a80c00e chef: Allow multiple config variants to be applied.
Ludovic Chabant <ludovic@chabant.com>
parents: 904
diff changeset
308 app, self.config_variants, self.config_values)
666
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
309 return app
81d9c3a3a0b5 internal: Get rid of the whole "sub cache" business.
Ludovic Chabant <ludovic@chabant.com>
parents: 663
diff changeset
310