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