From 33d3b7a7b30615fc165fb8f6e0b8277a7e04df00 Mon Sep 17 00:00:00 2001 From: Jan Lindemann Date: Tue, 7 Apr 2020 09:23:13 +0200 Subject: [PATCH] jwutils.Cmds: Cmd.add_subcommands() fails for multiple commands jwutils.Cmd.add_subcommands() had two issues. First, it failed for more than one command, and with that fixed, it only added the first command of a list of commands passed as an argument. This commit fixes both issues and leaves some logging and cleanup in place, which was used during debugging. Signed-off-by: Jan Lindemann --- tools/python/jwutils/Cmd.py | 2 +- tools/python/jwutils/Cmds.py | 48 ++++++++++++++++++++---------------- 2 files changed, 28 insertions(+), 22 deletions(-) diff --git a/tools/python/jwutils/Cmd.py b/tools/python/jwutils/Cmd.py index 6c9fdcd..329cc5a 100644 --- a/tools/python/jwutils/Cmd.py +++ b/tools/python/jwutils/Cmd.py @@ -35,7 +35,7 @@ class Cmd(ABC): # export if isinstance(cmd, list): for c in cmd: self.add_subcommands(c) - return + return self.child_classes.append(cmd) def add_arguments(self, parser): diff --git a/tools/python/jwutils/Cmds.py b/tools/python/jwutils/Cmds.py index c604fd2..42ef048 100644 --- a/tools/python/jwutils/Cmds.py +++ b/tools/python/jwutils/Cmds.py @@ -8,7 +8,7 @@ import pickle import asyncio import jwutils -from jwutils import log +from jwutils.log import * class Cmds: # export @@ -24,17 +24,24 @@ class Cmds: # export if len(cmd.child_classes) > len(cmd.children): for c in cmd.child_classes: cmd.children.append(self.__instantiate(c)) - for sub_cmd in cmd.children: - subparsers = parser.add_subparsers(title='Available commands of ' + cmd.name, metavar='') - self.__add_cmd_to_parser(sub_cmd, subparsers) + if len(cmd.children) > 0: + subparsers = parser.add_subparsers(title='Available subcommands of ' + cmd.name, metavar='') + for sub_cmd in cmd.children: + self.__add_cmd_to_parser(sub_cmd, subparsers) def __init__(self, description = '', filter = '^Cmd.*', modules=None, eloop=None): self.__description = description self.__filter = filter self.__modules = modules self.__cmds = [] - default_log_level = log.NOTICE - default_log_flags = 'stderr,position,prio,color' + self.eloop = eloop + self.__own_eloop = False + if eloop is None: + self.eloop = asyncio.get_event_loop() + self.__own_eloop = True + + log_level = NOTICE + log_flags = 'stderr,position,prio,color' # poor man's parsing in the absence of a complete command-line definition for i in range(1, len(sys.argv)): if i >= len(sys.argv) - 1: @@ -42,34 +49,33 @@ class Cmds: # export arg = sys.argv[i] if arg == '--log-level': i += 1 - default_log_level = sys.argv[i] + log_level = sys.argv[i] continue if arg == '--log-flags': - default_log_flags = sys.argv[i] + log_flags = sys.argv[i] continue - log.set_flags(default_log_flags) - log.set_level(default_log_level) - self.__parser = argparse.ArgumentParser(usage=os.path.basename(sys.argv[0]) + ' [command] [options]', + set_flags(log_flags) + set_level(log_level) + slog(DEBUG, "set log level to {}".format(log_level)) + self.__parser = argparse.ArgumentParser(usage=os.path.basename(sys.argv[0]) + ' [options]', formatter_class=argparse.ArgumentDefaultsHelpFormatter, description=self.__description) - self.__parser.add_argument('--log-flags', help='Log flags', default=default_log_flags) - self.__parser.add_argument('--log-level', help='Log level', default=default_log_level) - self.eloop = eloop - self.__own_eloop = False - if eloop is None: - self.eloop = asyncio.get_event_loop() - self.__own_eloop = True + self.__parser.add_argument('--log-flags', help='Log flags', default=log_flags) + self.__parser.add_argument('--log-level', help='Log level', default=log_level) if self.__modules == None: self.__modules = [ '__main__' ] subcmds = set() + slog(DEBUG, '-- searching for commands') for m in self.__modules: if m != '__main__': importlib.import_module(m) for name, c in inspect.getmembers(sys.modules[m], inspect.isclass): if not re.match(self.__filter, name): + slog(DEBUG, 'o "{}.{}" has wrong name'.format(m, name)) continue if inspect.isabstract(c): + slog(DEBUG, 'o "{}.{}" is abstract'.format(m, name)) continue - log.slog(log.DEBUG, 'instantiating command "{}"'.format(c)) + slog(DEBUG, 'o "{}.{}" is fine, instantiating'.format(m, name)) cmd = self.__instantiate(c) #cmd.add_parser(subparsers) self.__cmds.append(cmd) @@ -84,8 +90,8 @@ class Cmds: # export async def __run(self): args = self.__parser.parse_args() - log.set_flags(args.log_flags) - log.set_level(args.log_level) + set_flags(args.log_flags) + set_level(args.log_level) return await args.func(args) def __del__(self):