Seperated argument parser creation from main kas entry point

With Sphinx it is possible to create the command line documentation
automatically if there is a function that returns just the command line
parser.

Currently the creation of the argument parser is rather entangled with
the rest of kas. This patches seperates this.

Signed-off-by: Claudius Heine <ch@denx.de>
This commit is contained in:
Claudius Heine 2017-06-28 14:48:41 +02:00 committed by Daniel Wagner
parent 546b51f450
commit 503fd3d47a
4 changed files with 49 additions and 15 deletions

View File

@ -25,7 +25,7 @@
import os import os
from .config import load_config from .config import load_config
from .libkas import find_program, run_cmd from .libkas import find_program, run_cmd, kasplugin
from .libcmds import (Macro, Command, SetupDir, SetupProxy, from .libcmds import (Macro, Command, SetupDir, SetupProxy,
CleanupSSHAgent, SetupSSHAgent, SetupEnviron, CleanupSSHAgent, SetupSSHAgent, SetupEnviron,
WriteConfig, SetupHome, ReposFetch, WriteConfig, SetupHome, ReposFetch,
@ -35,12 +35,17 @@ __license__ = 'MIT'
__copyright__ = 'Copyright (c) Siemens AG, 2017' __copyright__ = 'Copyright (c) Siemens AG, 2017'
@kasplugin
class Build: class Build:
""" """
This class implements the build plugin for kas. This class implements the build plugin for kas.
""" """
def __init__(self, parser): @classmethod
def get_argparser(cls, parser):
"""
Returns an a parser for the build plugin
"""
bld_psr = parser.add_parser('build') bld_psr = parser.add_parser('build')
bld_psr.add_argument('config', bld_psr.add_argument('config',

View File

@ -42,10 +42,16 @@ try:
except ImportError: except ImportError:
HAVE_COLORLOG = False HAVE_COLORLOG = False
from .build import Build
from .shell import Shell
from . import __version__ from . import __version__
# Import kas plugins
# Since they are added by decorators, they don't need to be called,
# just imported.
# pylint: disable=unused-import
from .libkas import kasplugin
from . import build
from . import shell
__license__ = 'MIT' __license__ = 'MIT'
__copyright__ = 'Copyright (c) Siemens AG, 2017' __copyright__ = 'Copyright (c) Siemens AG, 2017'
@ -90,12 +96,10 @@ def _atexit_handler(loop):
os.killpg(os.getpid(), signal.SIGTERM) os.killpg(os.getpid(), signal.SIGTERM)
def kas(argv): def kas_get_argparser():
""" """
The main entry point of kas. Creates a argparser for kas with all plugins.
""" """
create_logger()
parser = argparse.ArgumentParser(description='Steer ebs-yocto builds') parser = argparse.ArgumentParser(description='Steer ebs-yocto builds')
parser.add_argument('--version', action='version', parser.add_argument('--version', action='version',
@ -106,12 +110,22 @@ def kas(argv):
help='Enable debug logging') help='Enable debug logging')
subparser = parser.add_subparsers(help='sub command help', dest='cmd') subparser = parser.add_subparsers(help='sub command help', dest='cmd')
sub_cmds = [Build(subparser), Shell(subparser)] for ext_plugin in pkg_resources.iter_entry_points('kas.plugins'):
ext_plugin.load()
for plugin in pkg_resources.iter_entry_points('kas.plugins'): for plugin in getattr(kasplugin, 'plugins', []):
cmd = plugin.load() plugin.get_argparser(subparser)
sub_cmds.append(cmd(subparser))
return parser
def kas(argv):
"""
The main entry point of kas.
"""
create_logger()
parser = kas_get_argparser()
args = parser.parse_args(argv) args = parser.parse_args(argv)
if args.debug: if args.debug:
@ -123,8 +137,8 @@ def kas(argv):
loop.add_signal_handler(sig, interruption) loop.add_signal_handler(sig, interruption)
atexit.register(_atexit_handler, loop=loop) atexit.register(_atexit_handler, loop=loop)
for cmd in sub_cmds: for plugin in getattr(kasplugin, 'plugins', []):
if cmd.run(args): if plugin().run(args):
return return
parser.print_help() parser.print_help()

View File

@ -355,3 +355,12 @@ def ssh_no_host_key_check(_):
os.mkdir(home + '/.ssh') os.mkdir(home + '/.ssh')
with open(home + '/.ssh/config', 'w') as fds: with open(home + '/.ssh/config', 'w') as fds:
fds.write('Host *\n\tStrictHostKeyChecking no\n\n') fds.write('Host *\n\tStrictHostKeyChecking no\n\n')
def kasplugin(plugin_class):
"""
A decorator that registeres kas plugins
"""
if not hasattr(kasplugin, 'plugins'):
setattr(kasplugin, 'plugins', [])
getattr(kasplugin, 'plugins').append(plugin_class)

View File

@ -25,6 +25,7 @@
""" """
import subprocess import subprocess
from kas.libkas import kasplugin
from kas.config import load_config from kas.config import load_config
from kas.libcmds import (Macro, Command, SetupProxy, SetupEnviron, SetupHome) from kas.libcmds import (Macro, Command, SetupProxy, SetupEnviron, SetupHome)
@ -32,12 +33,17 @@ __license__ = 'MIT'
__copyright__ = 'Copyright (c) Siemens AG, 2017' __copyright__ = 'Copyright (c) Siemens AG, 2017'
@kasplugin
class Shell: class Shell:
""" """
Implements a kas plugin that opens a shell within the kas environment. Implements a kas plugin that opens a shell within the kas environment.
""" """
def __init__(self, parser): @classmethod
def get_argparser(cls, parser):
"""
Returns a parser for the shell plugin
"""
sh_prs = parser.add_parser('shell') sh_prs = parser.add_parser('shell')
sh_prs.add_argument('config', sh_prs.add_argument('config',