Add class Cmds

run_sub_commands() was the only way to access subcommands up to now,
Cmds.run() adds another interface, an object as a place to add
customizations affecting all commands, e.g. global command line
options.

Signed-off-by: Jan Lindemann <jan@janware.com>
This commit is contained in:
Jan Lindemann 2018-12-11 14:10:01 +01:00
commit fd125f07fe
2 changed files with 45 additions and 31 deletions

View file

@ -1,13 +1,7 @@
from abc import ABCMeta, abstractmethod from abc import ABCMeta, abstractmethod
import argparse
import os
import sys
import inspect
import re
import importlib
import argparse
import Object import Object
import jwutils.log
class Cmd(Object.Object): # export class Cmd(Object.Object): # export
@ -30,27 +24,3 @@ class Cmd(Object.Object): # export
r.set_defaults(func=self.run) r.set_defaults(func=self.run)
return r 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)

View file

@ -0,0 +1,44 @@
import os
import sys
import argparse
import Object
import jwutils.log
import importlib
import inspect
import re
class Cmds(Object.Object): # export
def __init__(self, description = '', filter = '^Cmd.*', modules=None):
self.__description = description
self.__filter = filter
self.__modules = modules
self.__parser = argparse.ArgumentParser(usage=os.path.basename(sys.argv[0]) + ' [command] [options]',
formatter_class=argparse.ArgumentDefaultsHelpFormatter, description=self.__description)
self.__parser.add_argument('--log-flags', help='Log flags', default='stderr,position,prio,color')
self.__parser.add_argument('--log-level', help='Log level', default=jwutils.log.NOTICE)
subparsers = self.__parser.add_subparsers(title='Available commands', metavar='')
if self.__modules == None:
self.__modules = [ '__main__' ]
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):
continue
if inspect.isabstract(c):
continue
c().add_parser(subparsers)
def parser():
return self.__parser
def run(self):
args = self.__parser.parse_args()
jwutils.log.set_level(args.log_level)
jwutils.log.set_flags(args.log_flags)
args.func(args)
def run_sub_commands(description = '', filter = '^Cmd.*', modules=None): # export
cmds = Cmds(description, filter, modules)
cmds.run()