Files
project-manager/project_manager/runner.py
T
2026-08-28 15:44:46 +03:00

67 lines
1.9 KiB
Python

import logging
import sys
from argparse import ArgumentParser
from pathlib import Path
from typing import Self
from .common.logging_colored import ColoredFormatter
from .entry.entry import PartialTaskKey
from .manager import ProjectManager
class ProjectManagerRunner:
def __init__(
self,
*,
path: Path,
task_key: PartialTaskKey,
verbose: int = 0,
):
self._path = path
self._task_key = task_key
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_key)
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_key = PartialTaskKey.from_str(args.task)
return cls(path=args.path, task_key=task_key, verbose=verbose)