mirror of
https://github.com/home-assistant/core.git
synced 2025-06-25 01:21:51 +02:00
Add range support to icon translations (#145340)
This commit is contained in:
@ -15,6 +15,22 @@
|
||||
"atmospheric_pressure": {
|
||||
"default": "mdi:thermometer-lines"
|
||||
},
|
||||
"battery": {
|
||||
"default": "mdi:battery-unknown",
|
||||
"range": {
|
||||
"0": "mdi:battery-alert",
|
||||
"10": "mdi:battery-10",
|
||||
"20": "mdi:battery-20",
|
||||
"30": "mdi:battery-30",
|
||||
"40": "mdi:battery-40",
|
||||
"50": "mdi:battery-50",
|
||||
"60": "mdi:battery-60",
|
||||
"70": "mdi:battery-70",
|
||||
"80": "mdi:battery-80",
|
||||
"90": "mdi:battery-90",
|
||||
"100": "mdi:battery"
|
||||
}
|
||||
},
|
||||
"blood_glucose_concentration": {
|
||||
"default": "mdi:spoon-sugar"
|
||||
},
|
||||
|
@ -25,6 +25,16 @@ def icon_value_validator(value: Any) -> str:
|
||||
return str(value)
|
||||
|
||||
|
||||
def range_key_validator(value: str) -> str:
|
||||
"""Validate that range key value is numeric."""
|
||||
try:
|
||||
float(value)
|
||||
except (TypeError, ValueError) as err:
|
||||
raise vol.Invalid(f"Invalid range key '{value}', needs to be numeric.") from err
|
||||
|
||||
return value
|
||||
|
||||
|
||||
def require_default_icon_validator(value: dict) -> dict:
|
||||
"""Validate that a default icon is set."""
|
||||
if "_" not in value:
|
||||
@ -48,6 +58,26 @@ def ensure_not_same_as_default(value: dict) -> dict:
|
||||
return value
|
||||
|
||||
|
||||
def ensure_range_is_sorted(value: dict) -> dict:
|
||||
"""Validate that range values are sorted in ascending order."""
|
||||
for section_key, section in value.items():
|
||||
# Only validate range if one exists and this is an icon definition
|
||||
if ranges := section.get("range"):
|
||||
try:
|
||||
range_values = [float(key) for key in ranges]
|
||||
except ValueError as err:
|
||||
raise vol.Invalid(
|
||||
f"Range values for `{section_key}` must be numeric"
|
||||
) from err
|
||||
|
||||
if range_values != sorted(range_values):
|
||||
raise vol.Invalid(
|
||||
f"Range values for `{section_key}` must be in ascending order"
|
||||
)
|
||||
|
||||
return value
|
||||
|
||||
|
||||
DATA_ENTRY_ICONS_SCHEMA = vol.Schema(
|
||||
{
|
||||
"step": {
|
||||
@ -100,19 +130,27 @@ def icon_schema(
|
||||
slug_validator=translation_key_validator,
|
||||
)
|
||||
|
||||
range_validator = cv.schema_with_slug_keys(
|
||||
icon_value_validator,
|
||||
slug_validator=range_key_validator,
|
||||
)
|
||||
|
||||
def icon_schema_slug(marker: type[vol.Marker]) -> dict[vol.Marker, Any]:
|
||||
return {
|
||||
marker("default"): icon_value_validator,
|
||||
vol.Optional("state"): state_validator,
|
||||
vol.Optional("range"): range_validator,
|
||||
vol.Optional("state_attributes"): vol.All(
|
||||
cv.schema_with_slug_keys(
|
||||
{
|
||||
marker("default"): icon_value_validator,
|
||||
marker("state"): state_validator,
|
||||
vol.Optional("state"): state_validator,
|
||||
vol.Optional("range"): range_validator,
|
||||
},
|
||||
slug_validator=translation_key_validator,
|
||||
),
|
||||
ensure_not_same_as_default,
|
||||
ensure_range_is_sorted,
|
||||
),
|
||||
}
|
||||
|
||||
@ -143,6 +181,7 @@ def icon_schema(
|
||||
),
|
||||
require_default_icon_validator,
|
||||
ensure_not_same_as_default,
|
||||
ensure_range_is_sorted,
|
||||
)
|
||||
}
|
||||
)
|
||||
|
Reference in New Issue
Block a user