45 lines
1.4 KiB
Python
45 lines
1.4 KiB
Python
import logging
|
|
from collections import Counter
|
|
from pathlib import Path
|
|
from typing import Dict, Iterable
|
|
|
|
from .command import CommandError
|
|
from .entry import Entry, EntryResolver, EntryTaskNotImplementedError
|
|
from .preset.entry import PresetEntryDetector
|
|
|
|
__all__ = ("ProjectManager",)
|
|
|
|
logger = logging.getLogger("project")
|
|
|
|
|
|
class ProjectManager:
|
|
_logger = logger
|
|
|
|
def __init__(self, basepath: Path):
|
|
self._basepaht = basepath
|
|
self._resolver = EntryResolver(
|
|
PresetEntryDetector(Path(__file__).parent / "default_preset.toml"),
|
|
["node_modules", ".venv", ".git"],
|
|
)
|
|
|
|
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.warn(f"{task_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
|