Source code for src.cli.parser

"""Command line interface (CLI) argument parser module for this project.
"""

import argparse


# TODO:
#   - Fill out the argument parser
#   - Add clingo output formatter
#   - Figure out way to display options for each subcommand in sphinx documentation
[docs] def arg_parser() -> argparse.ArgumentParser: parser = argparse.ArgumentParser( description=__doc__, formatter_class=lambda prog: argparse.HelpFormatter( prog, max_help_position=55, width=100 ), ) # Parse Arguments mainargparser = parser.add_subparsers( title="subcommands", description="Data procurement, preprocessing and querying pipeline sections.", help="Type the 'subcommand' name followed by '-h' or '--help' for more information.", ) # Main options mainoptions = parser.add_argument_group("Main Arguments") mainoptions.add_argument( "-o", "--output", "--output-file", type=str, metavar="<FILE>", dest="output", default=None, help="OPTIONAL: Output filename for the JSON/logic file. If not specified, then a new file with the major in the filename is created in the package's resource directory.", ) mainoptions.add_argument( "-v", "--verbose", action="store_true", dest="verbose", default=False, help="OPTIONAL: Print output to screen.", ) mainoptions.add_argument( "-c", "--clingo", action="store_true", dest="clingo", default=False, help="OPTIONAL: Convert JSON file to Clingo logic file. NOTE: Both or at least one of '--clingo' or '--ergo' must be specified for JSON conversion. Use Clingo to execute the query. NOTE: At least one of '--clingo' or '--ergo' must be specified for query execution.", ) mainoptions.add_argument( "-e", "--ergo", "--ergoai", action="store_true", dest="ergoai", default=False, help="OPTIONAL: Convert JSON file to ErgoAI logic file. NOTE: Both or at least one of '--clingo' or '--ergo' must be specified for JSON conversion. WARNING: Ergo conversion can only be done once per python session. NOTE: At least one of '--clingo' or '--ergo' must be specified for query execution. DANGER: ErgoAI query execution is not fully supported.", ) # Graph construction options graphoptions = mainargparser.add_parser( "graph", parents=[mainoptions], formatter_class=lambda prog: argparse.HelpFormatter( prog, max_help_position=55, width=100 ), add_help=False, help="Creates knowledge graph of Stony Brook's course catalogue via an input knowledge base (as a URL).", ) graphoptions.add_argument( "-m", "--major", type=str, metavar="<MAJOR>", dest="major", default=None, help="REQUIRED: SBU major three letter code (e.g. 'CSE' for computer science).", ) # Define constants _COURSE_CATALOG_URL: str = ( "https://prod.ps.stonybrook.edu/psc/csprodg/EMPLOYEE/CAMP/c/COMMUNITY_ACCESS.SSS_BROWSE_CATLG.GBL?" ) graphoptions.add_argument( "-u", "--url", type=str, metavar="<URL>", dest="url", default=_COURSE_CATALOG_URL, help="OPTIONAL: Stony brook Univiersity (SBU) course catalog (knowledge base) URL. If not provided, then the default URL is used.", ) graphoptions.add_argument( "-w", "--wait-time", type=int, metavar="<WAIT_TIME>", dest="wait_time", default=10, help="OPTIONAL: Maximum wait time (in seconds) for each click operation. Defaults to 10.", ) graphoptions.add_argument( "--open-browser", action="store_false", dest="headless", default=True, help="OPTIONAL: Open browser during course catalog scraping.", ) graphoptions.set_defaults(method="graph") # Graph conversion options JSON -> Clingo/ERGO convertoptions = mainargparser.add_parser( "convert", parents=[mainoptions], formatter_class=lambda prog: argparse.HelpFormatter( prog, max_help_position=55, width=100 ), add_help=False, help="Convert knowledge graph JSON to logic file knowledge graph/base.", ) convertoptions.add_argument( "-j", "--json", "--json-file", type=str, metavar="<FILE>", dest="json_file", default=None, help="REQUIRED: Input JSON file containing course information.", ) convertoptions.set_defaults(method="convert") # Query options queryoptions = mainargparser.add_parser( "query", parents=[mainoptions], formatter_class=lambda prog: argparse.HelpFormatter( prog, max_help_position=55, width=100 ), add_help=False, help="Executes queries provided a knowledge base/graph.", ) queryoptions.add_argument( "-k", "--knowledge", type=str, metavar="<FILE>", dest="knowledge", default=None, help="OPTIONAL: Input knowledge base/graph file to be queried. NOTE: If using Clingo, the query can be in the knowlege base file.", ) queryoptions.add_argument( "-n", "--num-models", type=int, metavar="<MODEL>", dest="num_models", default=None, help="OPTIONAL: Number of models to generate for Clingo queries. Defaults to None.", ) queryoptions.add_argument( "-t", "--num-threads", type=int, metavar="<THREADS>", dest="parallel_mode", default=None, help="OPTIONAL: Maxiumu number of threads to use while executing Clingo queries. Defaults to None.", ) queryoptions.add_argument( "--config", type=str, metavar="<STR>", dest="configuration", default="handy", help="OPTIONAL: Configuration for Clingo queries. Options are 'handy' or 'competition'. Further explanations of these options can be obtained by typing: 'clingo --help=3' Defaults to 'handy'.", ) queryoptions.add_argument( "-q", "--query", type=str, metavar="<FILE | STR>", dest="query", default=None, action="append", nargs="+", help="OPTIONAL: Query or query file paths to be passed to Clingo or ErgoAI. Clingo can take multiple input files. ErgoAI can only take string inputs. \nNOTE: Can be specified multiple times.", ) queryoptions.set_defaults(method="query") return parser