view kallithea/lib/paster_commands/make_config.py @ 6896:e338b3468987

make-config: drop support for comma separated custom values - just specify multiple values The comma splitting was undocumented and untested - let's keep it simple.
author Mads Kiilerich <mads@kiilerich.com>
date Thu, 14 Sep 2017 02:08:07 +0200
parents 7691290837d2
children bed1d9158eb4
line wrap: on
line source

# -*- coding: utf-8 -*-
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
"""
kallithea.lib.paster_commands.make_config
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

make-config gearbox command for Kallithea

:license: GPLv3, see LICENSE.md for more details.
"""


import os
import sys
import uuid
import argparse

import mako.exceptions
from mako.template import Template

TMPL = 'template.ini.mako'
here = os.path.dirname(os.path.abspath(__file__))

from kallithea.lib.paster_commands.common import BasePasterCommand


class Command(BasePasterCommand):
    """Kallithea: Create a new config file

    make-config is part of a two-phase installation process (the
    second phase is setup-app). make-config creates a bare configuration
    file (possibly filling in defaults from the extra
    variables you give).
    """

    takes_config_file = False # at least not an existing one ...

    def take_action(self, args):
        _run(args)

    def get_parser(self, prog_name):
        parser = super(Command, self).get_parser(prog_name)

        parser.add_argument('config_file', nargs='?',
            help='application config file to write')

        parser.add_argument('custom', nargs=argparse.REMAINDER,
            help='custom values for the config file')

        parser.add_argument('--show-defaults', action='store_true',
            help="Show the default values that can be overridden")

        return parser


def _run(args):
    if args.config_file is None:
        if not args.show_defaults:
            raise ValueError("Missing argument: config_file")
    else:
        if args.show_defaults:
            raise ValueError("Can't specify both config_file and --show_defaults")

    # defaults that can be overwritten by arguments
    tmpl_stored_args = {
        'http_server': 'waitress',
        'lang': 'en',
        'database_engine': 'sqlite',
        'host': '127.0.0.1',
        'port': 5000,
        'error_aggregation_service': None,
    }
    for parameter in args.custom:
        kv = parameter.split('=', 1)
        if len(kv) == 2:
            k, v = kv
            tmpl_stored_args[k] = v
        else:
            raise ValueError("Invalid name=value parameter %r" % parameter)

    if args.show_defaults:
        for k, v in tmpl_stored_args.iteritems():
            print '%s=%s' % (k, v)
        sys.exit(0)

    # use default that cannot be replaced
    tmpl_stored_args.update({
        'uuid': lambda: uuid.uuid4().hex,
    })
    try:
        # built in template
        tmpl_file = os.path.join(here, TMPL)

        with open(tmpl_file, 'rb') as f:
            tmpl_data = f.read().decode('utf-8')
            tmpl = Template(tmpl_data).render(**tmpl_stored_args)
        with open(args.config_file, 'wb') as f:
            f.write(tmpl.encode('utf-8'))
        print 'Wrote new config file in %s' % (os.path.abspath(args.config_file))

    except Exception:
        print mako.exceptions.text_error_template().render()