48 lines
1.2 KiB
Python
48 lines
1.2 KiB
Python
|
import sys
|
||
|
import argparse
|
||
|
import inspect
|
||
|
from phi.logging import setup_logging, get_logger
|
||
|
|
||
|
log = get_logger(__name__)
|
||
|
|
||
|
parser = argparse.ArgumentParser()
|
||
|
subparses = parser.add_subparsers(title='actions', dest='action')
|
||
|
|
||
|
cli_callbacks = {}
|
||
|
|
||
|
|
||
|
def register(action_info='', param_infos=[]):
|
||
|
def decorator(action):
|
||
|
# Get function name and arguments
|
||
|
action_name = action.__name__
|
||
|
param_names = inspect.getfullargspec(action)[0]
|
||
|
|
||
|
# Create subparser for specific action
|
||
|
subparser = subparses.add_parser(action_name, help=action_info)
|
||
|
|
||
|
for i, name in enumerate(param_names):
|
||
|
info = param_infos[i] if i<len(param_infos) else ''
|
||
|
subparser.add_argument(dest=name, help=info)
|
||
|
|
||
|
# Register action
|
||
|
cli_callbacks[action_name] = action, param_names
|
||
|
return action
|
||
|
|
||
|
return decorator
|
||
|
|
||
|
|
||
|
def run(args):
|
||
|
for action_name, (action, param_names) in cli_callbacks.items():
|
||
|
if args['action'] == action_name:
|
||
|
action(**{pname: args[pname] for pname in param_names})
|
||
|
|
||
|
|
||
|
def add_arg(name, example, info):
|
||
|
parser.add_argument(name, metavar=example, help=info)
|
||
|
|
||
|
|
||
|
def get_args():
|
||
|
namespace = parser.parse_args(sys.argv[1:])
|
||
|
args = namespace.__dict__
|
||
|
return args
|