manager.py 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. """Hacs validation manager."""
  2. from __future__ import annotations
  3. import asyncio
  4. from importlib import import_module
  5. import os
  6. from pathlib import Path
  7. from typing import TYPE_CHECKING
  8. from homeassistant.core import HomeAssistant
  9. from ..repositories.base import HacsRepository
  10. from .base import ActionValidationBase
  11. if TYPE_CHECKING:
  12. from ..base import HacsBase
  13. class ValidationManager:
  14. """Hacs validation manager."""
  15. def __init__(self, hacs: HacsBase, hass: HomeAssistant) -> None:
  16. """Initialize the setup manager class."""
  17. self.hacs = hacs
  18. self.hass = hass
  19. self._validatiors: dict[str, ActionValidationBase] = {}
  20. @property
  21. def validatiors(self) -> list[ActionValidationBase]:
  22. """Return all list of all tasks."""
  23. return list(self._validatiors.values())
  24. async def async_load(self, repository: HacsRepository) -> None:
  25. """Load all tasks."""
  26. self._validatiors = {}
  27. validator_files = Path(__file__).parent
  28. validator_modules = (
  29. module.stem
  30. for module in validator_files.glob("*.py")
  31. if module.name not in ("base.py", "__init__.py", "manager.py")
  32. )
  33. async def _load_module(module: str):
  34. task_module = import_module(f"{__package__}.{module}")
  35. if task := await task_module.async_setup_validator(repository=repository):
  36. self._validatiors[task.slug] = task
  37. await asyncio.gather(*[_load_module(task) for task in validator_modules])
  38. async def async_run_repository_checks(self, repository: HacsRepository) -> None:
  39. """Run all validators for a repository."""
  40. if not self.hacs.system.action:
  41. return
  42. await self.async_load(repository)
  43. is_pull_from_fork = (
  44. not os.getenv("INPUT_REPOSITORY")
  45. and os.getenv("GITHUB_REPOSITORY") != repository.data.full_name
  46. )
  47. validatiors = [
  48. validator
  49. for validator in self.validatiors or []
  50. if (
  51. (not validator.categories or repository.data.category in validator.categories)
  52. and validator.slug not in os.getenv("INPUT_IGNORE", "").split(" ")
  53. and (not is_pull_from_fork or validator.allow_fork)
  54. )
  55. ]
  56. await asyncio.gather(*[validator.execute_validation() for validator in validatiors])
  57. total = len(validatiors)
  58. failed = len([x for x in validatiors if x.failed])
  59. if failed != 0:
  60. repository.logger.error("%s %s/%s checks failed", repository.string, failed, total)
  61. exit(1)
  62. else:
  63. repository.logger.info("%s All (%s) checks passed", repository.string, total)