phi/src/phi/cli.py

55 lines
1.4 KiB
Python

import sys
import argparse
import inspect
from phi.logging import setup_logging, get_logger
from phi.compat.argparse import BooleanOptionalAction
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 add_flag(name, info):
parser.add_argument(
name, action=BooleanOptionalAction, help=info, required=False, default=False
)
def get_args():
namespace = parser.parse_args(sys.argv[1:])
args = namespace.__dict__
return args