import logging from collections import Counter from pathlib import Path from typing import Iterable from .command import CommandError from .entry import Entry, EntryResolver, EntryTaskNotImplementedError from .preset.entry import PresetEntryDetector __all__ = ("ProjectManager",) logger = logging.getLogger("project") class ProjectManager: DEFAULT_IGNORE = ["node_modules", ".venv", ".git", "tests"] _logger = logger def __init__(self, basepath: Path): self._basepaht = basepath self._resolver = EntryResolver( PresetEntryDetector(), self.DEFAULT_IGNORE, ) def _iter_entries(self) -> Iterable[Entry]: return self._resolver.resolve(self._basepaht) def run_task(self, task_name: str) -> dict[str, int]: counter = Counter() for entry in self._iter_entries(): try: entry.run_task(task_name) counter["success"] += 1 except EntryTaskNotImplementedError: self._logger.warning("%s %s", task_name, entry) counter["skipped"] += 1 except CommandError as error: self._logger.error("%s\n%s", entry, error.output) counter["failed"] += 1 except: self._logger.exception(entry) counter["failed"] += 1 self._logger.info("result %s", dict(counter)) return counter