import logging import sys from argparse import ArgumentParser from pathlib import Path from typing import Self from .common.logging_colored import ColoredFormatter from .manager import ProjectManager class ProjectManagerRunner: def __init__(self, *, path: Path, task: str, tag: str | None, verbose: int = 0): self._path = path self._task = task self._tag = tag self._verbose = verbose @classmethod def _setup_logging(cls, verbose: int): logging_level = logging.WARNING if verbose > 2: logging_level = logging.TRACE elif verbose > 1: logging_level = logging.DEBUG elif verbose > 0: logging_level = logging.INFO if verbose < 0: logging_level = logging.CRITICAL stdout_handler = logging.StreamHandler() stdout_handler.setFormatter(ColoredFormatter("%(message)s")) logging.basicConfig( level=logging_level, format="%(message)s", handlers=[stdout_handler], ) def run(self): self._setup_logging(self._verbose) manager = ProjectManager(self._path) result = manager.run_task(self._task, self._tag) if result["failed"] > 0: sys.exit(1) @classmethod def from_args(cls) -> Self: parser = ArgumentParser() parser.add_argument( "task", nargs="?", default="show", ) parser.add_argument("-p", "--path", type=Path, default=Path.cwd()) parser.add_argument("-v", "--verbose", action="count", default=1) parser.add_argument("-q", "--quiet", action="store_true") args = parser.parse_args() verbose = -1 if args.quiet else args.verbose task = args.task tag = None if ":" in task: task, tag = task.split(":") return cls(path=args.path, task=task, tag=tag, verbose=verbose)