Add discovery rule to quality_scale hassfest validation (#131890)

This commit is contained in:
epenet 2024-11-29 16:06:38 +01:00 committed by GitHub
parent 954ac0d288
commit 0fc365a114
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 48 additions and 1 deletions

View File

@ -17,6 +17,7 @@ from .quality_scale_validation import (
config_entry_unloading,
config_flow,
diagnostics,
discovery,
reauthentication_flow,
reconfiguration_flow,
strict_typing,
@ -73,7 +74,7 @@ ALL_RULES = [
# GOLD: [
Rule("devices", ScaledQualityScaleTiers.GOLD),
Rule("diagnostics", ScaledQualityScaleTiers.GOLD, diagnostics),
Rule("discovery", ScaledQualityScaleTiers.GOLD),
Rule("discovery", ScaledQualityScaleTiers.GOLD, discovery),
Rule("discovery-update-info", ScaledQualityScaleTiers.GOLD),
Rule("docs-data-update", ScaledQualityScaleTiers.GOLD),
Rule("docs-examples", ScaledQualityScaleTiers.GOLD),

View File

@ -0,0 +1,46 @@
"""Enforce that the integration supports discovery.
https://developers.home-assistant.io/docs/core/integration-quality-scale/rules/discovery/
"""
import ast
from script.hassfest.model import Integration
DISCOVERY_FUNCTIONS = [
"async_step_discovery",
"async_step_bluetooth",
"async_step_hassio",
"async_step_homekit",
"async_step_mqtt",
"async_step_ssdp",
"async_step_zeroconf",
"async_step_dhcp",
"async_step_usb",
]
def _has_discovery_function(module: ast.Module) -> bool:
"""Test if the module defines at least one of the discovery functions."""
return any(
type(item) is ast.AsyncFunctionDef and item.name in DISCOVERY_FUNCTIONS
for item in ast.walk(module)
)
def validate(integration: Integration) -> list[str] | None:
"""Validate that the integration implements diagnostics."""
config_flow_file = integration.path / "config_flow.py"
if not config_flow_file.exists():
return ["Integration is missing config_flow.py"]
config_flow = ast.parse(config_flow_file.read_text())
if not _has_discovery_function(config_flow):
return [
f"Integration is missing one of {DISCOVERY_FUNCTIONS} "
f"in {config_flow_file}"
]
return None