view foodtruck/configuration.py @ 601:effbc78b5528

admin: Better error reporting, general clean-up.
author Ludovic Chabant <ludovic@chabant.com>
date Sun, 24 Jan 2016 10:42:33 -0800
parents foodtruck/config.py@79a31a3c947b
children efc1dc916e7c
line wrap: on
line source

import os.path
import copy
import logging
import yaml
from piecrust.configuration import (
        Configuration, ConfigurationError, ConfigurationLoader,
        merge_dicts)


logger = logging.getLogger(__name__)


def get_foodtruck_config(dirname=None):
    dirname = dirname or os.getcwd()
    cfg_path = os.path.join(dirname, 'foodtruck.yml')
    return FoodTruckConfiguration(cfg_path)


class FoodTruckConfigNotFoundError(Exception):
    pass


class FoodTruckConfiguration(Configuration):
    def __init__(self, cfg_path):
        super(FoodTruckConfiguration, self).__init__()
        self.cfg_path = cfg_path

    def _load(self):
        try:
            with open(self.cfg_path, 'r', encoding='utf-8') as fp:
                values = yaml.load(
                        fp.read(),
                        Loader=ConfigurationLoader)

            self._values = self._validateAll(values)
        except OSError:
            raise FoodTruckConfigNotFoundError()
        except Exception as ex:
            raise ConfigurationError(
                    "Error loading configuration from: %s" %
                    self.cfg_path) from ex

    def _validateAll(self, values):
        if values is None:
            values = {}

        values = merge_dicts(copy.deepcopy(default_configuration), values)

        return values

    def save(self):
        with open(self.cfg_path, 'w', encoding='utf8') as fp:
            self.cfg.write(fp)


default_configuration = {
        'triggers': {
            'bake': 'chef bake'
            },
        'scm': {
            'type': 'hg'
            },
        'security': {
            'username': '',
            'password': ''
            }
        }