Source code for law.cli.cli
# coding: utf-8
"""
Law command line interface entry point.
"""
import sys
from importlib import import_module
from argparse import ArgumentParser
import law
progs = ["run", "index", "config", "software", "completion", "location", "quickstart"]
[docs]def run(argv=None):
"""
Entry point to the law cli. Sets up all parsers, parses all arguments given by *argv*, and
executes the requested subprogram. When *None*, *argv* defaults to ``sys.argv[1:]``.
"""
# setup the main parser and sub parsers
parser = ArgumentParser(
prog="law",
description="The law command line tool.",
)
sub_parsers = parser.add_subparsers(
help="subcommands",
dest="command",
)
# add main arguments
parser.add_argument(
"--version",
"-V",
action="version",
version=law.__version__,
)
# setup all progs
mods = {}
for prog in progs:
mods[prog] = import_module("law.cli." + prog)
mods[prog].setup_parser(sub_parsers)
# default argv
if not argv:
argv = sys.argv[1:]
# argv that is passed to the prog execution when set
prog_argv = None
# parse args and dispatch execution, with "run" being a special case
prog = argv[0] if argv else None
if prog == "run":
# only pass the prog and the task family to the parser
# and let luigi's parsing handle the rest downstream in execute
args = parser.parse_args(argv[:2])
prog_argv = ["law run"] + argv
else:
args = parser.parse_args(argv)
# the parser determines the prog, so overwrite it
prog = args.command
if not prog:
parser.print_help()
return 0
exec_args = (args,)
if prog_argv is not None:
exec_args += (prog_argv,)
return mods[prog].execute(*exec_args)