[PATCH 3 of 5 WIP] cli: convert 'gearbox make-config' to 'kallithea-cli config create'

Thomas De Schampheleire patrickdepinguin at gmail.com
Tue Oct 2 20:42:34 UTC 2018


# HG changeset patch
# User Thomas De Schampheleire <thomas.de_schampheleire at nokia.com>
# Date 1537821464 -7200
#      Mon Sep 24 22:37:44 2018 +0200
# Node ID c4f4a73ab071a75262ab204e162df94e5c657165
# Parent  4a334ddbbba6d979b093ffd54e60496504cd3883
cli: convert 'gearbox make-config' to 'kallithea-cli config create'

... and update documentation.

diff --git a/docs/contributing.rst b/docs/contributing.rst
--- a/docs/contributing.rst
+++ b/docs/contributing.rst
@@ -39,7 +39,7 @@ To get started with Kallithea developmen
         pip install --upgrade -r dev_requirements.txt
         npm install     # install dependencies - both tools and data
         npm run less    # for generating css from less
-        gearbox make-config my.ini
+        kallithea-cli config create my.ini
         gearbox setup-db -c my.ini --user=user --email=user at example.com --password=password --repos=/tmp
         gearbox serve -c my.ini --reload &
         firefox http://127.0.0.1:5000/
diff --git a/docs/dev/dbmigrations.rst b/docs/dev/dbmigrations.rst
--- a/docs/dev/dbmigrations.rst
+++ b/docs/dev/dbmigrations.rst
@@ -18,7 +18,7 @@ 1. :ref:`Create a Kallithea configuratio
 2. Create a separate throwaway configuration for iterating on the actual
    database changes::
 
-    gearbox make-config temp.ini
+    kallithea-cli config create temp.ini
 
    Edit the file to change database settings. SQLite is typically fine,
    but make sure to change the path to e.g. ``temp.db``, to avoid
diff --git a/docs/installation_win.rst b/docs/installation_win.rst
--- a/docs/installation_win.rst
+++ b/docs/installation_win.rst
@@ -166,7 +166,7 @@ it, reopen it following the same command
 one). When ready, type::
 
   cd C:\Kallithea\Bin
-  gearbox make-config production.ini
+  kallithea-cli config create production.ini
 
 Then you must edit production.ini to fit your needs (IP address, IP
 port, mail settings, database, etc.). `NotePad++`__ or a similar text
diff --git a/docs/installation_win_old.rst b/docs/installation_win_old.rst
--- a/docs/installation_win_old.rst
+++ b/docs/installation_win_old.rst
@@ -204,7 +204,7 @@ if you closed it reopen it following the
 "activate" one). When ready, just type::
 
   cd C:\Kallithea\Bin
-  gearbox make-config production.ini
+  kallithea-cli config create production.ini
 
 Then, you must edit production.ini to fit your needs (network address and
 port, mail settings, database, whatever). I recommend using NotePad++
diff --git a/docs/setup.rst b/docs/setup.rst
--- a/docs/setup.rst
+++ b/docs/setup.rst
@@ -27,14 +27,14 @@ Setting up Kallithea
 First, you will need to create a Kallithea configuration file. Run the
 following command to do so::
 
-    gearbox make-config my.ini
+    kallithea-cli config create my.ini
 
 This will create the file ``my.ini`` in the current directory. This
 configuration file contains the various settings for Kallithea, e.g.
 proxy port, email settings, usage of static files, cache, Celery
 settings, and logging. Extra settings can be specified like::
 
-    gearbox make-config my.ini host=8.8.8.8 "[handler_console]" formatter=color_formatter
+    kallithea-cli config create my.ini host=8.8.8.8 "[handler_console]" formatter=color_formatter
 
 Next, you need to create the databases used by Kallithea. It is recommended to
 use PostgreSQL or SQLite (default). If you choose a database other than the
diff --git a/docs/upgrade.rst b/docs/upgrade.rst
--- a/docs/upgrade.rst
+++ b/docs/upgrade.rst
@@ -105,7 +105,7 @@ 5. Upgrade your configuration
 
 Run the following command to create a new configuration (``.ini``) file::
 
-    gearbox make-config new.ini
+    kallithea-cli config create new.ini
 
 Then compare it with your old config file and see what changed.
 
diff --git a/kallithea/bin/kallithea_cli.py b/kallithea/bin/kallithea_cli.py
--- a/kallithea/bin/kallithea_cli.py
+++ b/kallithea/bin/kallithea_cli.py
@@ -14,7 +14,11 @@
 
 import click
 
+from kallithea.bin.kallithea_cli_config import config
+
 @click.group()
 def cli():
     """Various commands to set up a Kallithea instance."""
     pass
+
+cli.add_command(config)
diff --git a/kallithea/lib/paster_commands/make_config.py b/kallithea/bin/kallithea_cli_config.py
rename from kallithea/lib/paster_commands/make_config.py
rename to kallithea/bin/kallithea_cli_config.py
--- a/kallithea/lib/paster_commands/make_config.py
+++ b/kallithea/bin/kallithea_cli_config.py
@@ -11,35 +11,46 @@
 #
 # 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 click
 import os
-import sys
 import uuid
-import argparse
 from collections import defaultdict
 
 import mako.exceptions
 
-from kallithea.lib.paster_commands.common import BasePasterCommand
 from kallithea.lib import inifile
 
+ at click.group()
+def config():
+    pass
 
-class Command(BasePasterCommand):
-    """Kallithea: Create a new config file
+def show_defaults(ctx, param, value):
+    # Following construct is taken from the Click documentation:
+    # https://click.palletsprojects.com/en/6.x/options/#callbacks-and-eager-options
+    # "The resilient_parsing flag is applied to the context if Click wants to
+    # parse the command line without any destructive behavior that would change
+    # the execution flow. In this case, because we would exit the program, we
+    # instead do nothing."
+    if not value or ctx.resilient_parsing:
+        return
 
-    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).
+    for key, value in inifile.default_variables.items():
+        click.echo('%s=%s' % (key, value))
+
+    ctx.exit()
+
+ at config.command()
+ at click.option('--show-defaults', callback=show_defaults,
+              is_flag=True, expose_value=False, is_eager=True,
+              help='Show the default values that can be overridden')
+ at click.argument('config_file', type=click.Path())
+ at click.argument('key_value_pairs', nargs=-1)
+def create(config_file, key_value_pairs):
+    """Create a new configuration file
+
+    This command creates a default configuration file, possibly adding/updating
+    settings you specify as key=value pairs to this command.
 
     The first key=value arguments are used to customize the Mako variables from
     what is shown with --show-defaults. Any following key=value arguments will be
@@ -47,41 +58,11 @@ class Command(BasePasterCommand):
     is specified and change where the following values go.
     """
 
-    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='"key=value" for customizing 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.show_defaults:
-        if args.config_file is not None:
-            raise ValueError("Can't specify both config file and --show-defaults")
-        for key, value in inifile.default_variables.items():
-            print '%s=%s' % (key, value)
-        sys.exit(0)
-    if args.config_file is None:
-        raise ValueError("Missing argument: config file")
-
     mako_variable_values = {}
     ini_settings = defaultdict(dict)
 
     section_name = None
-    for parameter in args.custom:
+    for parameter in key_value_pairs:
         parts = parameter.split('=', 1)
         if len(parts) == 1 and parameter.startswith('[') and parameter.endswith(']'):
             section_name = parameter
@@ -101,9 +82,9 @@ def _run(args):
         'uuid': lambda: uuid.uuid4().hex,
     })
     try:
-        config_file = os.path.abspath(args.config_file)
-        inifile.create(config_file, mako_variable_values, ini_settings)
-        print 'Wrote new config file in %s' % config_file
+        config_file_abs = os.path.abspath(config_file)
+        inifile.create(config_file_abs, mako_variable_values, ini_settings)
+        click.echo('Wrote new config file in %s' % config_file_abs)
 
     except Exception:
-        print mako.exceptions.text_error_template().render()
+        click.echo(mako.exceptions.text_error_template().render())
diff --git a/setup.py b/setup.py
--- a/setup.py
+++ b/setup.py
@@ -163,7 +163,6 @@ setuptools.setup(
     cleanup-repos=kallithea.lib.paster_commands.cleanup:Command
     install-iis=kallithea.lib.paster_commands.install_iis:Command
     ishell=kallithea.lib.paster_commands.ishell:Command
-    make-config=kallithea.lib.paster_commands.make_config:Command
     make-index=kallithea.lib.paster_commands.make_index:Command
     make-rcext=kallithea.lib.paster_commands.make_rcextensions:Command
     repo-scan=kallithea.lib.paster_commands.repo_scan:Command


More information about the kallithea-general mailing list