mirror of
https://github.com/home-assistant/core.git
synced 2025-07-19 19:27:45 +00:00
Add range support to icon translations (#145340)
This commit is contained in:
parent
981842ee87
commit
5ddadcbd65
@ -15,6 +15,22 @@
|
|||||||
"atmospheric_pressure": {
|
"atmospheric_pressure": {
|
||||||
"default": "mdi:thermometer-lines"
|
"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": {
|
"blood_glucose_concentration": {
|
||||||
"default": "mdi:spoon-sugar"
|
"default": "mdi:spoon-sugar"
|
||||||
},
|
},
|
||||||
|
@ -25,6 +25,16 @@ def icon_value_validator(value: Any) -> str:
|
|||||||
return str(value)
|
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:
|
def require_default_icon_validator(value: dict) -> dict:
|
||||||
"""Validate that a default icon is set."""
|
"""Validate that a default icon is set."""
|
||||||
if "_" not in value:
|
if "_" not in value:
|
||||||
@ -48,6 +58,26 @@ def ensure_not_same_as_default(value: dict) -> dict:
|
|||||||
return value
|
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(
|
DATA_ENTRY_ICONS_SCHEMA = vol.Schema(
|
||||||
{
|
{
|
||||||
"step": {
|
"step": {
|
||||||
@ -100,19 +130,27 @@ def icon_schema(
|
|||||||
slug_validator=translation_key_validator,
|
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]:
|
def icon_schema_slug(marker: type[vol.Marker]) -> dict[vol.Marker, Any]:
|
||||||
return {
|
return {
|
||||||
marker("default"): icon_value_validator,
|
marker("default"): icon_value_validator,
|
||||||
vol.Optional("state"): state_validator,
|
vol.Optional("state"): state_validator,
|
||||||
|
vol.Optional("range"): range_validator,
|
||||||
vol.Optional("state_attributes"): vol.All(
|
vol.Optional("state_attributes"): vol.All(
|
||||||
cv.schema_with_slug_keys(
|
cv.schema_with_slug_keys(
|
||||||
{
|
{
|
||||||
marker("default"): icon_value_validator,
|
marker("default"): icon_value_validator,
|
||||||
marker("state"): state_validator,
|
vol.Optional("state"): state_validator,
|
||||||
|
vol.Optional("range"): range_validator,
|
||||||
},
|
},
|
||||||
slug_validator=translation_key_validator,
|
slug_validator=translation_key_validator,
|
||||||
),
|
),
|
||||||
ensure_not_same_as_default,
|
ensure_not_same_as_default,
|
||||||
|
ensure_range_is_sorted,
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -143,6 +181,7 @@ def icon_schema(
|
|||||||
),
|
),
|
||||||
require_default_icon_validator,
|
require_default_icon_validator,
|
||||||
ensure_not_same_as_default,
|
ensure_not_same_as_default,
|
||||||
|
ensure_range_is_sorted,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user