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)