Source code for magpie.cli
import argparse
import importlib
import os
import sys
from typing import TYPE_CHECKING
from magpie.__meta__ import __version__
if TYPE_CHECKING:
from typing import Callable
[docs]def magpie_helper_cli(args=None):
"""
Groups all sub-helper CLI listed in :py:mod:`magpie.cli` as a common ``magpie_helper``.
Dispatches the provided arguments to the appropriate sub-helper CLI as requested. Each sub-helper CLI must implement
functions ``make_parser`` and ``main`` to generate the arguments and dispatch them to the corresponding caller.
"""
parser = argparse.ArgumentParser(description="Execute Magpie helper operations.")
parser.add_argument("--version", action="version", version="%(prog)s {}".format(__version__),
help="prints the version of the library and exits")
subparsers = parser.add_subparsers(title="Helper", dest="helper", description="Name of the helper to execute.")
helpers_dir = os.path.dirname(__file__)
helper_mods = os.listdir(helpers_dir)
helpers = dict()
for module_item in sorted(helper_mods):
helper_path = os.path.join(helpers_dir, module_item)
if os.path.isfile(helper_path) and "__init__" not in module_item and module_item.endswith(".py"):
helper_name = module_item.replace(".py", "")
helper_root = "magpie.cli"
helper_module = importlib.import_module("{}.{}".format(helper_root, helper_name), helper_root)
parser_maker = getattr(helper_module, "make_parser", None) # type: Callable[[], argparse.ArgumentParser]
helper_caller = getattr(helper_module, "main", None)
if parser_maker and helper_caller:
# add help disabled otherwise conflicts with this main helper's help
helper_parser = parser_maker()
subparsers.add_parser(helper_name, parents=[helper_parser],
add_help=False, help=helper_parser.description,
description=helper_parser.description, usage=helper_parser.usage)
helpers[helper_name] = {"caller": helper_caller, "parser": helper_parser}
args = args or sys.argv[1:] # same as was parse args does, but we must provide them to subparser
ns = parser.parse_args(args=args) # if 'helper' is unknown, auto prints the help message with exit(2)
helper_name = vars(ns).pop("helper")
if not helper_name:
parser.print_help()
return 0
helper_args = args[1:]
helper_caller = helpers[helper_name]["caller"]
helper_parser = helpers[helper_name]["parser"]
result = helper_caller(args=helper_args, parser=helper_parser, namespace=ns)
return 0 if result is None else result
if __name__ == "__main__":
magpie_helper_cli()