From 22cabb4eac82af6648fc5c785e04325a332ac90d Mon Sep 17 00:00:00 2001 From: Jan Lindemann Date: Sat, 14 Oct 2017 17:25:24 +0200 Subject: [PATCH] Add Cmd.py Signed-off-by: Jan Lindemann --- tools/python/jwutils/Cmd.py | 48 +++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 tools/python/jwutils/Cmd.py diff --git a/tools/python/jwutils/Cmd.py b/tools/python/jwutils/Cmd.py new file mode 100644 index 0000000..523ee62 --- /dev/null +++ b/tools/python/jwutils/Cmd.py @@ -0,0 +1,48 @@ +from abc import ABCMeta, abstractmethod +import argparse +import os +import sys +import inspect +import re + +import Object + +class Cmd(Object.Object): # export + + __metaclass__=ABCMeta + + @abstractmethod + def run(self, args): + pass + + def __init__(self, name, help): + self.name = name + self.help = help + + def _run(self, args): + pass + + def add_parser(self, parsers): + r = parsers.add_parser(self.name, help=self.help, + formatter_class=argparse.ArgumentDefaultsHelpFormatter) + r.set_defaults(func=self.run) + return r + +def run_sub_commands(description = '', prefix = 'Cmd'): # export + + classes = inspect.getmembers(sys.modules["__main__"], inspect.isclass) + parser = argparse.ArgumentParser(usage=os.path.basename(sys.argv[0]) + ' [command] [options]', + formatter_class=argparse.ArgumentDefaultsHelpFormatter, description=description) + parser.add_argument('--log-level', help='Log level', default='notice') + subparsers = parser.add_subparsers(title='Available commands', metavar='') + + for (name, cls) in classes: + if not re.match('^Cmd.', name): + continue + if inspect.isabstract(cls): + continue + cls().add_parser(subparsers) + + args=parser.parse_args() + jwutils.log.set_level(args.log_level) + args.func(args)