jw-python/tools/python/jwutils/Cmd.py
Jan Lindemann 2b23026bfa Add HDRDIR_SCOPE_SUFFIX to ytools include files
Change ytools header location from #include <header.h> to
#include <ytools/header.h>.

Signed-off-by: Jan Lindemann <jan@janware.com>
2017-12-18 19:32:49 +01:00

56 lines
1.6 KiB
Python

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)