43 lines
1.3 KiB
Python
43 lines
1.3 KiB
Python
import logging
|
|
from collections import Counter
|
|
from pathlib import Path
|
|
from typing import Iterable
|
|
|
|
from .common.command import CommandError
|
|
from .entry import Entry, EntryResolver
|
|
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, tag: str | None = None) -> dict[str, int]:
|
|
counter = Counter()
|
|
for entry in self._iter_entries():
|
|
try:
|
|
if entry.run_task(task_name, tag):
|
|
counter["success"] += 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
|