From 05324dedd00e76a85badadc25a94c1831c8f6c12 Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Mon, 12 May 2025 15:38:31 +0200 Subject: [PATCH] Deduplicate condition schemas (#144739) --- homeassistant/helpers/config_validation.py | 50 +++++++++------------- 1 file changed, 20 insertions(+), 30 deletions(-) diff --git a/homeassistant/helpers/config_validation.py b/homeassistant/helpers/config_validation.py index 0ce2c9e02e0..4c760bd9d70 100644 --- a/homeassistant/helpers/config_validation.py +++ b/homeassistant/helpers/config_validation.py @@ -1084,9 +1084,12 @@ def renamed( return validator +type ValueSchemas = dict[Hashable, VolSchemaType | Callable[[Any], dict[str, Any]]] + + def key_value_schemas( key: str, - value_schemas: dict[Hashable, VolSchemaType | Callable[[Any], dict[str, Any]]], + value_schemas: ValueSchemas, default_schema: VolSchemaType | None = None, default_description: str | None = None, ) -> Callable[[Any], dict[Hashable, Any]]: @@ -1735,26 +1738,25 @@ CONDITION_SHORTHAND_SCHEMA = vol.Schema( } ) +BUILT_IN_CONDITIONS: ValueSchemas = { + "and": AND_CONDITION_SCHEMA, + "device": DEVICE_CONDITION_SCHEMA, + "not": NOT_CONDITION_SCHEMA, + "numeric_state": NUMERIC_STATE_CONDITION_SCHEMA, + "or": OR_CONDITION_SCHEMA, + "state": STATE_CONDITION_SCHEMA, + "sun": SUN_CONDITION_SCHEMA, + "template": TEMPLATE_CONDITION_SCHEMA, + "time": TIME_CONDITION_SCHEMA, + "trigger": TRIGGER_CONDITION_SCHEMA, + "zone": ZONE_CONDITION_SCHEMA, +} + CONDITION_SCHEMA: vol.Schema = vol.Schema( vol.Any( vol.All( expand_condition_shorthand, - key_value_schemas( - CONF_CONDITION, - { - "and": AND_CONDITION_SCHEMA, - "device": DEVICE_CONDITION_SCHEMA, - "not": NOT_CONDITION_SCHEMA, - "numeric_state": NUMERIC_STATE_CONDITION_SCHEMA, - "or": OR_CONDITION_SCHEMA, - "state": STATE_CONDITION_SCHEMA, - "sun": SUN_CONDITION_SCHEMA, - "template": TEMPLATE_CONDITION_SCHEMA, - "time": TIME_CONDITION_SCHEMA, - "trigger": TRIGGER_CONDITION_SCHEMA, - "zone": ZONE_CONDITION_SCHEMA, - }, - ), + key_value_schemas(CONF_CONDITION, BUILT_IN_CONDITIONS), ), dynamic_template_condition, ) @@ -1780,19 +1782,7 @@ CONDITION_ACTION_SCHEMA: vol.Schema = vol.Schema( expand_condition_shorthand, key_value_schemas( CONF_CONDITION, - { - "and": AND_CONDITION_SCHEMA, - "device": DEVICE_CONDITION_SCHEMA, - "not": NOT_CONDITION_SCHEMA, - "numeric_state": NUMERIC_STATE_CONDITION_SCHEMA, - "or": OR_CONDITION_SCHEMA, - "state": STATE_CONDITION_SCHEMA, - "sun": SUN_CONDITION_SCHEMA, - "template": TEMPLATE_CONDITION_SCHEMA, - "time": TIME_CONDITION_SCHEMA, - "trigger": TRIGGER_CONDITION_SCHEMA, - "zone": ZONE_CONDITION_SCHEMA, - }, + BUILT_IN_CONDITIONS, dynamic_template_condition_action, "a list of conditions or a valid template", ),