view piecrust/themes/base.py @ 1158:5762a0b821ac

core: Remove yaml deprecation warning.
author Ludovic Chabant <ludovic@chabant.com>
date Tue, 11 Jun 2019 16:40:11 -0700
parents 40a40305c4e1
children
line wrap: on
line source

import sys
import os.path
import yaml
from piecrust import CONFIG_PATH, THEMES_DIR


class Theme(object):
    def getPath(self):
        mod_name = type(self).__module__
        mod_file = sys.modules[mod_name].__file__
        return os.path.dirname(mod_file)


class ThemeNotFoundError(Exception):
    pass


class ThemeLoader(object):
    def __init__(self, root_dir):
        self.root_dir = root_dir

    def getThemeDir(self):
        # Pre-load the config quickly to see if we're loading a specific
        # theme from somehwere.
        # TODO: make configs and themes load together to speed this up.
        config_path = os.path.join(self.root_dir, CONFIG_PATH)
        with open(config_path, 'r', encoding='utf8') as fp:
            config = yaml.load(fp.read(), Loader=yaml.SafeLoader)
        if not config:
            return None
        site_config = config.get('site', {})
        theme = site_config.get('theme', None)
        if theme is None:
            return None

        # Get the list of directories in which themes are installed.
        from piecrust.pathutil import expandall
        dirs = []
        themes_dirs = site_config.get('themes_dirs', [])
        if isinstance(themes_dirs, str):
            dirs.append(os.path.join(self.root_dir, expandall(themes_dirs)))
        else:
            dirs += [os.path.join(self.root_dir, expandall(p))
                     for p in themes_dirs]

        # Add the default `themes` directory.
        default_themes_dir = os.path.join(self.root_dir, THEMES_DIR)
        if os.path.isdir(default_themes_dir):
            dirs.append(default_themes_dir)

        # Try to find the theme the user wants.
        for d in dirs:
            theme_dir = os.path.join(d, theme)
            if os.path.isdir(theme_dir):
                return theme_dir

        raise ThemeNotFoundError(
            "Can't find theme '%s'. Looked in: %s" %
            (theme, ', '.join(dirs)))