jw-python/tools/python/jwutils/Cmd.py

56 lines
1.6 KiB
Python
Raw Normal View History

from abc import ABCMeta, abstractmethod
import argparse
import os
import sys
import inspect
import re
import importlib
import Object
import jwutils.log
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 = '', filter = '^Cmd.*', modules=None): # export
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')
parser.add_argument('--log-flags', help='Log flags', default='stderr,position,prio,color')
subparsers = parser.add_subparsers(title='Available commands', metavar='')
if modules == None:
modules = [ '__main__' ]
for m in modules:
if m != '__main__':
importlib.import_module(m)
for name, c in inspect.getmembers(sys.modules[m], inspect.isclass):
if not re.match(filter, name):
continue
if inspect.isabstract(c):
continue
c().add_parser(subparsers)
args = parser.parse_args()
jwutils.log.set_level(args.log_level)
jwutils.log.set_flags(args.log_flags)
args.func(args)