changeset 7405:e4b9a1d1fea1

cli: initial introduction of 'kallithea-cli' command This commit adds a command 'kallithea-cli' that intends to replace the existing set of 'gearbox' commands that relate to setting up kallithea. Gearbox would still be used for 'gearbox serve', but other commands like 'make-config', 'setup-db', etc. would be converted to 'kallithea-cli' commands. The python package 'Click' is used to generate the CLI. Using decorators, this package makes it very easy to generate a CLI out of simple methods. See: http://click.pocoo.org/7/ Using Gearbox for custom commands is possible, but documentation on this topic is limited. As the added value of Gearbox for that use case is not clear, we can well switch to something else if it seems better/easier.
author Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
date Sun, 18 Nov 2018 20:02:17 +0100
parents 22c8f23cc75b
children 7784a1212471
files kallithea/bin/kallithea_cli.py kallithea/bin/kallithea_cli_base.py setup.py
diffstat 3 files changed, 73 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kallithea/bin/kallithea_cli.py	Sun Nov 18 20:02:17 2018 +0100
@@ -0,0 +1,16 @@
+# -*- 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/>.
+
+# 'cli' is the main entry point for 'kallithea-cli', specified in setup.py as entry_points console_scripts
+from kallithea.bin.kallithea_cli_base import cli
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kallithea/bin/kallithea_cli_base.py	Sun Nov 18 20:02:17 2018 +0100
@@ -0,0 +1,55 @@
+# -*- 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/>.
+
+import click
+import functools
+import os
+
+import kallithea
+import logging.config
+import paste.deploy
+
+
+# This placeholder is the main entry point for the kallithea-cli command
+@click.group()
+def cli():
+    """Various commands to manage a Kallithea instance."""
+
+def register_command(config_file=False, config_file_initialize_app=False):
+    """Register a kallithea-cli subcommand.
+
+    If one of the config_file flags are true, a config file must be specified
+    with -c and it is read and logging is configured. The configuration is
+    available in the kallithea.CONFIG dict.
+
+    If config_file_initialize_app is true, Kallithea, TurboGears global state
+    (including tg.config), and database access will also be fully initialized.
+    """
+    cli_command = cli.command()
+    if config_file or config_file_initialize_app:
+        def annotator(annotated):
+            @click.option('--config_file', '-c', help="Path to .ini file with app configuration.",
+                type=click.Path(dir_okay=False, exists=True, readable=True), required=True)
+            @functools.wraps(annotated) # reuse meta data from the wrapped function so click can see other options
+            def runtime_wrapper(config_file, *args, **kwargs):
+                path_to_ini_file = os.path.realpath(config_file)
+                kallithea.CONFIG = paste.deploy.appconfig('config:' + path_to_ini_file)
+                logging.config.fileConfig(path_to_ini_file)
+                if config_file_initialize_app:
+                    kallithea.config.middleware.make_app_without_logging(kallithea.CONFIG.global_conf, **kallithea.CONFIG.local_conf)
+                    kallithea.lib.utils.setup_cache_regions(kallithea.CONFIG)
+                return annotated(*args, **kwargs)
+            return cli_command(runtime_wrapper)
+        return annotator
+    return cli_command
--- a/setup.py	Mon Nov 05 00:31:07 2018 +0100
+++ b/setup.py	Sun Nov 18 20:02:17 2018 +0100
@@ -61,6 +61,7 @@
     "decorator >= 3.3.2, < 4.4",
     "Paste >= 2.0.3, < 3",
     "bleach >= 3.0, < 3.1",
+    "Click >= 7.0, < 8",
 ]
 
 if sys.version_info < (2, 7):
@@ -152,6 +153,7 @@
     kallithea-api =    kallithea.bin.kallithea_api:main
     kallithea-gist =   kallithea.bin.kallithea_gist:main
     kallithea-config = kallithea.bin.kallithea_config:main
+    kallithea-cli =    kallithea.bin.kallithea_cli:cli
 
     [paste.app_factory]
     main = kallithea.config.middleware:make_app