diff piecrust/appconfigdefaults.py @ 805:fd694f1297c7

config: Cleanup config loading code. Add support for a `local.yml` config.
author Ludovic Chabant <ludovic@chabant.com>
date Mon, 10 Oct 2016 21:41:59 -0700
parents
children 4850f8c21b6e
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/piecrust/appconfigdefaults.py	Mon Oct 10 21:41:59 2016 -0700
@@ -0,0 +1,269 @@
+import collections
+from piecrust import (
+    DEFAULT_FORMAT, DEFAULT_TEMPLATE_ENGINE, DEFAULT_POSTS_FS,
+    DEFAULT_DATE_FORMAT, DEFAULT_THEME_SOURCE)
+from piecrust.configuration import (
+    get_dict_values, try_get_dict_values)
+from piecrust.sources.base import REALM_THEME
+
+
+default_configuration = collections.OrderedDict({
+    'site': collections.OrderedDict({
+        'title': "Untitled PieCrust website",
+        'root': '/',
+        'default_format': DEFAULT_FORMAT,
+        'default_template_engine': DEFAULT_TEMPLATE_ENGINE,
+        'enable_gzip': True,
+        'pretty_urls': False,
+        'trailing_slash': False,
+        'date_format': DEFAULT_DATE_FORMAT,
+        'auto_formats': collections.OrderedDict([
+            ('html', ''),
+            ('md', 'markdown'),
+            ('textile', 'textile')]),
+        'default_auto_format': 'md',
+        'default_pagination_source': None,
+        'pagination_suffix': '/%num%',
+        'slugify_mode': 'encode',
+        'themes_sources': [DEFAULT_THEME_SOURCE],
+        'cache_time': 28800,
+        'enable_debug_info': True,
+        'show_debug_info': False,
+        'use_default_content': True,
+        'use_default_theme_content': True,
+        'theme_site': False
+    }),
+    'baker': collections.OrderedDict({
+        'no_bake_setting': 'draft',
+        'workers': None,
+        'batch_size': None
+    })
+})
+
+
+default_theme_content_model_base = collections.OrderedDict({
+    'site': collections.OrderedDict({
+        'sources': collections.OrderedDict({
+            'theme_pages': {
+                'type': 'default',
+                'ignore_missing_dir': True,
+                'fs_endpoint': 'pages',
+                'data_endpoint': 'site.pages',
+                'default_layout': 'default',
+                'item_name': 'page',
+                'realm': REALM_THEME
+            }
+        }),
+        'routes': [
+            {
+                'url': '/%slug%',
+                'source': 'theme_pages',
+                'func': 'pcurl'
+            }
+        ],
+        'theme_tag_page': 'theme_pages:_tag.%ext%',
+        'theme_category_page': 'theme_pages:_category.%ext%',
+        'theme_month_page': 'theme_pages:_month.%ext%',
+        'theme_year_page': 'theme_pages:_year.%ext%'
+    })
+})
+
+
+default_content_model_base = collections.OrderedDict({
+    'site': collections.OrderedDict({
+        'posts_fs': DEFAULT_POSTS_FS,
+        'default_page_layout': 'default',
+        'default_post_layout': 'post',
+        'post_url': '/%year%/%month%/%day%/%slug%',
+        'year_url': '/archives/%year%',
+        'tag_url': '/tag/%tag%',
+        'category_url': '/%category%',
+        'posts_per_page': 5
+    })
+})
+
+
+def get_default_content_model(site_values, values):
+    default_layout = get_dict_values(
+        (site_values, 'site/default_page_layout'),
+        (values, 'site/default_page_layout'))
+    return collections.OrderedDict({
+        'site': collections.OrderedDict({
+            'sources': collections.OrderedDict({
+                'pages': {
+                    'type': 'default',
+                    'ignore_missing_dir': True,
+                    'data_endpoint': 'site.pages',
+                    'default_layout': default_layout,
+                    'item_name': 'page'
+                }
+            }),
+            'routes': [
+                {
+                    'url': '/%slug%',
+                    'source': 'pages',
+                    'func': 'pcurl'
+                }
+            ],
+            'taxonomies': collections.OrderedDict([
+                ('tags', {
+                    'multiple': True,
+                    'term': 'tag'
+                }),
+                ('categories', {
+                    'term': 'category',
+                    'func_name': 'pccaturl'
+                })
+            ])
+        })
+    })
+
+
+def get_default_content_model_for_blog(blog_name, is_only_blog,
+                                       site_values, values,
+                                       theme_site=False):
+    # Get the global (default) values for various things we're interested in.
+    defs = {}
+    names = ['posts_fs', 'posts_per_page', 'date_format',
+             'default_post_layout', 'post_url', 'year_url']
+    for n in names:
+        defs[n] = get_dict_values(
+            (site_values, 'site/%s' % n),
+            (values, 'site/%s' % n))
+
+    # More stuff we need.
+    if is_only_blog:
+        url_prefix = ''
+        page_prefix = ''
+        fs_endpoint = 'posts'
+        data_endpoint = 'blog'
+        item_name = 'post'
+        tpl_func_prefix = 'pc'
+
+        if theme_site:
+            # If this is a theme site, show posts from a `sample` directory
+            # so it's clearer that those won't show up when the theme is
+            # actually applied to a normal site.
+            fs_endpoint = 'sample/posts'
+    else:
+        url_prefix = blog_name + '/'
+        page_prefix = blog_name + '/'
+        data_endpoint = blog_name
+        fs_endpoint = 'posts/%s' % blog_name
+        item_name = try_get_dict_values(
+            (site_values, '%s/item_name' % blog_name),
+            (values, '%s/item_name' % blog_name),
+            default=('%spost' % blog_name))
+        tpl_func_prefix = try_get_dict_values(
+            (site_values, '%s/func_prefix' % blog_name),
+            (values, '%s/func_prefix' % blog_name),
+            default=('pc%s' % blog_name))
+
+    # Figure out the settings values for this blog, specifically.
+    # The value could be set on the blog config itself, globally, or left at
+    # its default. We already handle the "globally vs. default" with the
+    # `defs` map that we computed above.
+    blog_cfg = values.get(blog_name, {})
+    blog_values = {}
+    for n in names:
+        blog_values[n] = blog_cfg.get(n, defs[n])
+
+    posts_fs = blog_values['posts_fs']
+    posts_per_page = blog_values['posts_per_page']
+    date_format = blog_values['date_format']
+    default_layout = blog_values['default_post_layout']
+    post_url = '/' + url_prefix + blog_values['post_url'].lstrip('/')
+    year_url = '/' + url_prefix + blog_values['year_url'].lstrip('/')
+
+    year_archive = 'pages:%s_year.%%ext%%' % page_prefix
+    if not theme_site:
+        theme_year_page = try_get_dict_values(
+            (site_values, 'site/theme_year_page'),
+            (values, 'site/theme_year_page'))
+        if theme_year_page:
+            year_archive += ';' + theme_year_page
+
+    cfg = collections.OrderedDict({
+        'site': collections.OrderedDict({
+            'sources': collections.OrderedDict({
+                blog_name: collections.OrderedDict({
+                    'type': 'posts/%s' % posts_fs,
+                    'fs_endpoint': fs_endpoint,
+                    'data_endpoint': data_endpoint,
+                    'item_name': item_name,
+                    'ignore_missing_dir': True,
+                    'data_type': 'blog',
+                    'items_per_page': posts_per_page,
+                    'date_format': date_format,
+                    'default_layout': default_layout
+                })
+            }),
+            'generators': collections.OrderedDict({
+                ('%s_archives' % blog_name): collections.OrderedDict({
+                    'type': 'blog_archives',
+                    'source': blog_name,
+                    'page': year_archive
+                })
+            }),
+            'routes': [
+                {
+                    'url': post_url,
+                    'source': blog_name,
+                    'func': ('%sposturl' % tpl_func_prefix)
+                },
+                {
+                    'url': year_url,
+                    'generator': ('%s_archives' % blog_name),
+                    'func': ('%syearurl' % tpl_func_prefix)
+                }
+            ]
+        })
+    })
+
+    # Add a generator and a route for each taxonomy.
+    taxonomies_cfg = try_get_dict_values(
+        (site_values, 'site/taxonomies'),
+        (values, 'site/taxonomies'),
+        default={}).copy()
+    for tax_name, tax_cfg in taxonomies_cfg.items():
+        term = tax_cfg.get('term', tax_name)
+
+        # Generator.
+        page_ref = 'pages:%s_%s.%%ext%%' % (page_prefix, term)
+        if not theme_site:
+            theme_page_ref = try_get_dict_values(
+                (site_values, 'site/theme_%s_page' % term),
+                (values, 'site/theme_%s_page' % term))
+            if theme_page_ref:
+                page_ref += ';' + theme_page_ref
+        tax_gen_name = '%s_%s' % (blog_name, tax_name)
+        tax_gen = collections.OrderedDict({
+            'type': 'taxonomy',
+            'source': blog_name,
+            'taxonomy': tax_name,
+            'page': page_ref
+        })
+        cfg['site']['generators'][tax_gen_name] = tax_gen
+
+        # Route.
+        tax_url_cfg_name = '%s_url' % term
+        tax_url = try_get_dict_values(
+            (blog_cfg, tax_url_cfg_name),
+            (site_values, 'site/%s' % tax_url_cfg_name),
+            (values, 'site/%s' % tax_url_cfg_name),
+            default=('%s/%%%s%%' % (term, term)))
+        tax_url = '/' + url_prefix + tax_url.lstrip('/')
+        tax_func_name = try_get_dict_values(
+            (site_values, 'site/taxonomies/%s/func_name' % tax_name),
+            (values, 'site/taxonomies/%s/func_name' % tax_name),
+            default=('%s%surl' % (tpl_func_prefix, term)))
+        tax_route = collections.OrderedDict({
+            'url': tax_url,
+            'generator': tax_gen_name,
+            'taxonomy': tax_name,
+            'func': tax_func_name
+        })
+        cfg['site']['routes'].append(tax_route)
+
+    return cfg
+