| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- """Hacs validation manager."""
- from __future__ import annotations
- import asyncio
- from importlib import import_module
- import os
- from pathlib import Path
- from typing import TYPE_CHECKING
- from homeassistant.core import HomeAssistant
- from ..repositories.base import HacsRepository
- from .base import ActionValidationBase
- if TYPE_CHECKING:
- from ..base import HacsBase
- class ValidationManager:
- """Hacs validation manager."""
- def __init__(self, hacs: HacsBase, hass: HomeAssistant) -> None:
- """Initialize the setup manager class."""
- self.hacs = hacs
- self.hass = hass
- self._validatiors: dict[str, ActionValidationBase] = {}
- @property
- def validatiors(self) -> list[ActionValidationBase]:
- """Return all list of all tasks."""
- return list(self._validatiors.values())
- async def async_load(self, repository: HacsRepository) -> None:
- """Load all tasks."""
- self._validatiors = {}
- validator_files = Path(__file__).parent
- validator_modules = (
- module.stem
- for module in validator_files.glob("*.py")
- if module.name not in ("base.py", "__init__.py", "manager.py")
- )
- async def _load_module(module: str):
- task_module = import_module(f"{__package__}.{module}")
- if task := await task_module.async_setup_validator(repository=repository):
- self._validatiors[task.slug] = task
- await asyncio.gather(*[_load_module(task) for task in validator_modules])
- async def async_run_repository_checks(self, repository: HacsRepository) -> None:
- """Run all validators for a repository."""
- if not self.hacs.system.action:
- return
- await self.async_load(repository)
- is_pull_from_fork = (
- not os.getenv("INPUT_REPOSITORY")
- and os.getenv("GITHUB_REPOSITORY") != repository.data.full_name
- )
- validatiors = [
- validator
- for validator in self.validatiors or []
- if (
- (not validator.categories or repository.data.category in validator.categories)
- and validator.slug not in os.getenv("INPUT_IGNORE", "").split(" ")
- and (not is_pull_from_fork or validator.allow_fork)
- )
- ]
- await asyncio.gather(*[validator.execute_validation() for validator in validatiors])
- total = len(validatiors)
- failed = len([x for x in validatiors if x.failed])
- if failed != 0:
- repository.logger.error("%s %s/%s checks failed", repository.string, failed, total)
- exit(1)
- else:
- repository.logger.info("%s All (%s) checks passed", repository.string, total)
|