Mercurial > piecrust2
view piecrust/sources/autoconfig.py @ 156:683baa977d97
Simplify `AutoConfigSource` by inheriting from `SimplePageSource`.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Sat, 27 Dec 2014 18:14:46 -0800 |
parents | 432cd534ce08 |
children | f43f19975671 |
line wrap: on
line source
import os import os.path import logging from piecrust.sources.base import ( SimplePageSource, IPreparingSource, SimplePaginationSourceMixin, PageNotFoundError, InvalidFileSystemEndpointError, PageFactory, MODE_CREATING, MODE_PARSING) logger = logging.getLogger(__name__) class AutoConfigSource(SimplePageSource, SimplePaginationSourceMixin): SOURCE_NAME = 'autoconfig' def __init__(self, app, name, config): super(AutoConfigSource, self).__init__(app, name, config) self.setting_name = config.get('setting_name', name) self.collapse_single_values = config.get('collapse_single_values', False) self.only_single_values = config.get('only_single_values', False) def buildPageFactories(self): if not os.path.isdir(self.fs_endpoint_path): raise InvalidFileSystemEndpointError(self.name, self.fs_endpoint_path) for dirpath, dirnames, filenames in os.walk(self.fs_endpoint_path): if not filenames: continue config = self._extractConfigFragment(dirpath) for f in filenames: slug, ext = os.path.splitext(f) path = os.path.join(dirpath, f) metadata = { 'slug': slug, 'config': config} yield PageFactory(self, path, metadata) def _extractConfigFragment(self, path): rel_path = os.path.relpath(path, self.fs_endpoint_path) if rel_path == '.': values = [] else: values = rel_path.split(os.sep) if self.only_single_values and len(values) > 1: raise Exception("Only one folder level is allowed for pages " "in source '%s'." % self.name) if self.collapse_single_values and len(values) == 1: values = values[0] return {self.setting_name: values} def findPagePath(self, metadata, mode): for dirpath, dirnames, filenames in os.walk(self.fs_endpoint_path): for f in filenames: slug, _ = os.path.splitext(f) if slug == metadata['slug']: path = os.path.join(dirpath, f) rel_path = os.path.relpath(path, self.fs_endpoint_path) config = self._extractConfigFragment(dirpath) metadata = {'slug': slug, 'config': config} return rel_path, metadata