diff --git a/script/hassfest/__main__.py b/script/hassfest/__main__.py index 78b46b8db57..99e32e57f43 100644 --- a/script/hassfest/__main__.py +++ b/script/hassfest/__main__.py @@ -2,10 +2,28 @@ import pathlib import sys -from . import codeowners, config_flow, dependencies, manifest, services, ssdp, zeroconf +from . import ( + codeowners, + config_flow, + dependencies, + json, + manifest, + services, + ssdp, + zeroconf, +) from .model import Config, Integration -PLUGINS = [codeowners, config_flow, dependencies, manifest, services, ssdp, zeroconf] +PLUGINS = [ + json, + codeowners, + config_flow, + dependencies, + manifest, + services, + ssdp, + zeroconf, +] def get_config() -> Config: diff --git a/script/hassfest/json.py b/script/hassfest/json.py new file mode 100644 index 00000000000..73b6c372b4f --- /dev/null +++ b/script/hassfest/json.py @@ -0,0 +1,29 @@ +"""Validate integration JSON files.""" +import json +from typing import Dict + +from .model import Integration + + +def validate_json_files(integration: Integration): + """Validate JSON files for integration.""" + for json_file in integration.path.glob("**/*.json"): + if not json_file.is_file(): + continue + + try: + json.loads(json_file.read_text()) + except json.JSONDecodeError: + relative_path = json_file.relative_to(integration.path) + integration.add_error("json", f"Invalid JSON file {relative_path}") + + return + + +def validate(integrations: Dict[str, Integration], config): + """Handle JSON files inside integrations.""" + for integration in integrations.values(): + if not integration.manifest: + continue + + validate_json_files(integration)