validate.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. """Validation utilities."""
  2. from __future__ import annotations
  3. from dataclasses import dataclass, field
  4. from awesomeversion import AwesomeVersion
  5. from homeassistant.helpers.config_validation import url as url_validator
  6. import voluptuous as vol
  7. from ..const import LOCALE
  8. @dataclass
  9. class Validate:
  10. """Validate."""
  11. errors: list[str] = field(default_factory=list)
  12. @property
  13. def success(self) -> bool:
  14. """Return bool if the validation was a success."""
  15. return len(self.errors) == 0
  16. def _country_validator(values) -> list[str]:
  17. """Custom country validator."""
  18. countries = []
  19. if isinstance(values, str):
  20. countries.append(values.upper())
  21. elif isinstance(values, list):
  22. for value in values:
  23. countries.append(value.upper())
  24. else:
  25. raise vol.Invalid(f"Value '{values}' is not a string or list.", path=["country"])
  26. for country in countries:
  27. if country not in LOCALE:
  28. raise vol.Invalid(f"Value '{country}' is not in {LOCALE}.", path=["country"])
  29. return countries
  30. HACS_MANIFEST_JSON_SCHEMA = vol.Schema(
  31. {
  32. vol.Optional("content_in_root"): bool,
  33. vol.Optional("country"): _country_validator,
  34. vol.Optional("filename"): str,
  35. vol.Optional("hacs"): vol.Coerce(AwesomeVersion),
  36. vol.Optional("hide_default_branch"): bool,
  37. vol.Optional("homeassistant"): vol.Coerce(AwesomeVersion),
  38. vol.Optional("persistent_directory"): str,
  39. vol.Optional("render_readme"): bool,
  40. vol.Optional("zip_release"): bool,
  41. vol.Required("name"): str,
  42. },
  43. extra=vol.PREVENT_EXTRA,
  44. )
  45. INTEGRATION_MANIFEST_JSON_SCHEMA = vol.Schema(
  46. {
  47. vol.Required("codeowners"): list,
  48. vol.Required("documentation"): url_validator,
  49. vol.Required("domain"): str,
  50. vol.Required("issue_tracker"): url_validator,
  51. vol.Required("name"): str,
  52. vol.Required("version"): vol.Coerce(AwesomeVersion),
  53. },
  54. extra=vol.ALLOW_EXTRA,
  55. )