Source code for discord_dumper.cli

"""Module for command line interface."""

import argparse
import logging
import sys
from typing import NoReturn, Optional, Sequence

from .core import __issues__, __summary__, __version__
from .dumper import dump

LOG_LEVELS = ["CRITICAL", "ERROR", "WARNING", "INFO", "DEBUG"]
logger = logging.getLogger(__name__)


class HelpArgumentParser(argparse.ArgumentParser):
    def error(self, message: str) -> NoReturn:
        """Handle error from argparse.ArgumentParser."""
        self.print_help(sys.stderr)
        self.exit(2, f"{self.prog}: error: {message}\n")


def get_parser() -> argparse.ArgumentParser:
    """Prepare ArgumentParser."""
    parser = HelpArgumentParser(
        prog="discord-dumper",
        description=__summary__,
        formatter_class=argparse.RawTextHelpFormatter,
    )
    parser.add_argument(
        "--version",
        action="version",
        version=f"%(prog)s, version {__version__}",
    )
    parser.add_argument(
        "-v",
        "--verbose",
        help="verbose mode, enable INFO and DEBUG messages.",
        action="store_true",
        required=False,
    )
    parser.add_argument("path")
    parser.add_argument(
        "--no-pretty",
        dest="pretty",
        action="store_false",
        help="Indent and add space in json file.",
    )
    parser.add_argument(
        "--no-images",
        dest="images",
        action="store_false",
        help="Don't save images.",
    )
    parser.add_argument(
        "--fetch",
        action="store_true",
        help="Fetch images for best quality.",
    )
    parser.set_defaults(images=True, pretty=True)
    return parser


def setup_logging(verbose: Optional[bool] = None) -> None:
    """Do setup logging."""
    # Setup logging
    logging.basicConfig(
        level=logging.DEBUG if verbose else logging.WARNING,
        format="[%(asctime)s] [%(levelname)s] [%(name)s] %(message)s",
    )


[docs]def entrypoint(argv: Optional[Sequence[str]] = None) -> None: """Entrypoint for command line interface.""" try: parser = get_parser() args = parser.parse_args(argv) setup_logging(args.verbose) dump( args.path, pretty=args.pretty, images=args.images, fetch=args.fetch, ) except Exception as err: # NoQA: BLE001 logger.critical("Unexpected error", exc_info=err) logger.critical("Please, report this error to %s.", __issues__) sys.exit(1)