Source code for pynenc.cli.main_cli

import argparse
import logging
import sys

from pynenc.cli.config_cli import add_config_subparser
from pynenc.cli.monitor_cli import add_monitor_subparser
from pynenc.cli.namespace import PynencCLINamespace
from pynenc.cli.runner_cli import add_runner_subparser
from pynenc.util.import_app import find_app_instance


[docs] def main() -> None: """ Execute the Pynenc Command Line Interface. This function initializes and processes the command line arguments for the Pynenc application, sets up logging, and executes the appropriate subcommand function based on the user input. The CLI supports various subcommands for different functionalities, such as running tasks and configuring the application. The `--app` parameter is required for most commands, but optional for monitoring which can auto-discover apps. The main steps include: - Parsing command line arguments with `argparse`. - Setting up logging based on verbosity. - Importing the application instance. - Executing the function associated with the chosen subcommand. Exceptions: - Various exceptions can be raised depending on the subcommands executed and the application's behavior. """ parser = argparse.ArgumentParser(description="Pynenc Command Line Interface") parser.add_argument( "--app", help="Specify the application module (e.g., 'core.src.api.backtes') " "or file path (e.g., 'core/src/api/backtes.py')", ) parser.add_argument( "-v", "--verbose", action="store_true", help="Increase output verbosity" ) # Create subparsers for different CLI commands subparsers = parser.add_subparsers(dest="command", required=True) # Add subparsers for different commands add_runner_subparser(subparsers) add_config_subparser(subparsers) add_monitor_subparser(subparsers) # Parse the arguments into custom namespace PynencCLINamespace args = PynencCLINamespace() parser.parse_args(namespace=args) # Setup logging log_level = logging.DEBUG if args.verbose else logging.WARNING logging.basicConfig(level=log_level, format="%(levelname)s: %(message)s") # Only require --app for non-monitor commands if args.command != "monitor" and not args.app: parser.error("the --app argument is required for this command") try: if args.app: app_instance = find_app_instance(args.app) args.app_instance = app_instance args.func(args) except ValueError as e: logging.error(f"Failed to load application: {str(e)}") sys.exit(1) except Exception as e: logging.error(f"An unexpected error occurred: {str(e)}") sys.exit(1)
if __name__ == "__main__": main()