import logging from collections import Counter from pathlib import Path from typing import Dict, Iterable from .command import CommandError from .entries.nodejs import NodejsEntry from .entries.python import PythonEntry from .entry import Entry, EntryCommandNotImplementedError from .resolver import EntryDetector, EntryResolver __all__ = ("ProjectManager",) logger = logging.getLogger("project") class ProjectManager: _logger = logger def __init__(self, basepath: Path): self._basepaht = basepath self._resolver = EntryResolver( EntryDetector(PythonEntry, NodejsEntry), ["node_modules", ".venv", ".git"] ) def _iter_entries(self) -> Iterable[Entry]: return self._resolver.resolve(self._basepaht) def run_command(self, command_name: str) -> Dict[str, int]: counter = Counter() for entry in self._iter_entries(): try: entry.run_command(command_name) counter["success"] += 1 except EntryCommandNotImplementedError: self._logger.warn(f"{command_name} {entry}") counter["skipped"] += 1 except CommandError as error: self._logger.error(f"{entry}\n{error.output}") counter["failed"] += 1 except Exception: self._logger.exception(entry) counter["failed"] += 1 self._logger.info(f"result {dict(counter)}") return counter