import logging from collections import Counter from pathlib import Path from typing import Dict, Iterable from .entry import Entry, EntryCommandNotImplementedError from .nodejs.entry import NodejsEntry from .python.entry import PythonEntry 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)) def _iter_entries(self) -> Iterable[Entry]: return self._resolver.resolve(self._basepaht) def run_command(self, command: str) -> Dict[str, int]: counter = Counter() for entry in self._iter_entries(): try: getattr(entry, command)() counter["success"] += 1 except EntryCommandNotImplementedError: self._logger.warn(f"{command} {entry}") counter["skipped"] += 1 except Exception: self._logger.exception(entry) counter["failed"] += 1 self._logger.info(f"result {dict(counter)}") return counter