Skip to content

Commit 9356154

Browse files
authored
Improve code quality of condition validation (#141292)
Streamline condition validation
1 parent 1166c9d commit 9356154

File tree

1 file changed

+42
-47
lines changed

1 file changed

+42
-47
lines changed

homeassistant/helpers/config_validation.py

Lines changed: 42 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1153,41 +1153,6 @@ def _custom_serializer(schema: Any, *, allow_section: bool) -> Any:
11531153
return voluptuous_serialize.UNSUPPORTED
11541154

11551155

1156-
def expand_condition_shorthand(value: Any | None) -> Any:
1157-
"""Expand boolean condition shorthand notations."""
1158-
1159-
if not isinstance(value, dict) or CONF_CONDITIONS in value:
1160-
return value
1161-
1162-
for key, schema in (
1163-
("and", AND_CONDITION_SHORTHAND_SCHEMA),
1164-
("or", OR_CONDITION_SHORTHAND_SCHEMA),
1165-
("not", NOT_CONDITION_SHORTHAND_SCHEMA),
1166-
):
1167-
try:
1168-
schema(value)
1169-
return {
1170-
CONF_CONDITION: key,
1171-
CONF_CONDITIONS: value[key],
1172-
**{k: value[k] for k in value if k != key},
1173-
}
1174-
except vol.MultipleInvalid:
1175-
pass
1176-
1177-
if isinstance(value.get(CONF_CONDITION), list):
1178-
try:
1179-
CONDITION_SHORTHAND_SCHEMA(value)
1180-
return {
1181-
CONF_CONDITION: "and",
1182-
CONF_CONDITIONS: value[CONF_CONDITION],
1183-
**{k: value[k] for k in value if k != CONF_CONDITION},
1184-
}
1185-
except vol.MultipleInvalid:
1186-
pass
1187-
1188-
return value
1189-
1190-
11911156
# Schemas
11921157
def empty_config_schema(domain: str) -> Callable[[dict], dict]:
11931158
"""Return a config schema which logs if there are configuration parameters."""
@@ -1683,7 +1648,43 @@ def STATE_CONDITION_SCHEMA(value: Any) -> dict[str, Any]:
16831648

16841649
DEVICE_CONDITION_SCHEMA = DEVICE_CONDITION_BASE_SCHEMA.extend({}, extra=vol.ALLOW_EXTRA)
16851650

1686-
dynamic_template_condition_action = vol.All(
1651+
1652+
def expand_condition_shorthand(value: Any | None) -> Any:
1653+
"""Expand boolean condition shorthand notations."""
1654+
1655+
if not isinstance(value, dict) or CONF_CONDITIONS in value:
1656+
return value
1657+
1658+
for key, schema in (
1659+
("and", AND_CONDITION_SHORTHAND_SCHEMA),
1660+
("or", OR_CONDITION_SHORTHAND_SCHEMA),
1661+
("not", NOT_CONDITION_SHORTHAND_SCHEMA),
1662+
):
1663+
try:
1664+
schema(value)
1665+
return {
1666+
CONF_CONDITION: key,
1667+
CONF_CONDITIONS: value[key],
1668+
**{k: value[k] for k in value if k != key},
1669+
}
1670+
except vol.MultipleInvalid:
1671+
pass
1672+
1673+
if isinstance(value.get(CONF_CONDITION), list):
1674+
try:
1675+
CONDITION_SHORTHAND_SCHEMA(value)
1676+
return {
1677+
CONF_CONDITION: "and",
1678+
CONF_CONDITIONS: value[CONF_CONDITION],
1679+
**{k: value[k] for k in value if k != CONF_CONDITION},
1680+
}
1681+
except vol.MultipleInvalid:
1682+
pass
1683+
1684+
return value
1685+
1686+
1687+
dynamic_template_condition = vol.All(
16871688
# Wrap a shorthand template condition in a template condition
16881689
dynamic_template,
16891690
lambda config: {
@@ -1724,7 +1725,7 @@ def STATE_CONDITION_SCHEMA(value: Any) -> dict[str, Any]:
17241725
},
17251726
),
17261727
),
1727-
dynamic_template_condition_action,
1728+
dynamic_template_condition,
17281729
)
17291730
)
17301731

@@ -1873,12 +1874,8 @@ def _base_trigger_validator(value: Any) -> Any:
18731874
vol.Exclusive(CONF_FOR_EACH, "repeat"): vol.Any(
18741875
dynamic_template, vol.All(list, template_complex)
18751876
),
1876-
vol.Exclusive(CONF_WHILE, "repeat"): vol.All(
1877-
ensure_list, [CONDITION_SCHEMA]
1878-
),
1879-
vol.Exclusive(CONF_UNTIL, "repeat"): vol.All(
1880-
ensure_list, [CONDITION_SCHEMA]
1881-
),
1877+
vol.Exclusive(CONF_WHILE, "repeat"): CONDITIONS_SCHEMA,
1878+
vol.Exclusive(CONF_UNTIL, "repeat"): CONDITIONS_SCHEMA,
18821879
vol.Required(CONF_SEQUENCE): SCRIPT_SCHEMA,
18831880
},
18841881
has_at_least_one_key(CONF_COUNT, CONF_FOR_EACH, CONF_WHILE, CONF_UNTIL),
@@ -1894,9 +1891,7 @@ def _base_trigger_validator(value: Any) -> Any:
18941891
[
18951892
{
18961893
vol.Optional(CONF_ALIAS): string,
1897-
vol.Required(CONF_CONDITIONS): vol.All(
1898-
ensure_list, [CONDITION_SCHEMA]
1899-
),
1894+
vol.Required(CONF_CONDITIONS): CONDITIONS_SCHEMA,
19001895
vol.Required(CONF_SEQUENCE): SCRIPT_SCHEMA,
19011896
}
19021897
],
@@ -1917,7 +1912,7 @@ def _base_trigger_validator(value: Any) -> Any:
19171912
_SCRIPT_IF_SCHEMA = vol.Schema(
19181913
{
19191914
**SCRIPT_ACTION_BASE_SCHEMA,
1920-
vol.Required(CONF_IF): vol.All(ensure_list, [CONDITION_SCHEMA]),
1915+
vol.Required(CONF_IF): CONDITIONS_SCHEMA,
19211916
vol.Required(CONF_THEN): SCRIPT_SCHEMA,
19221917
vol.Optional(CONF_ELSE): SCRIPT_SCHEMA,
19231918
}

0 commit comments

Comments
 (0)