mirror of
ssh://git.janware.com/srv/git/janware/proj/jw-python
synced 2026-01-15 01:52:56 +01:00
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:
parent
4b7dad4b6b
commit
fd125f07fe
2 changed files with 45 additions and 31 deletions
|
|
@ -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)
|
|
||||||
|
|
|
||||||
44
tools/python/jwutils/Cmds.py
Normal file
44
tools/python/jwutils/Cmds.py
Normal 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()
|
||||||
Loading…
Add table
Add a link
Reference in a new issue