mirror of
https://github.com/home-assistant/core.git
synced 2025-07-23 21:27:38 +00:00
Speed up validating domains in templates (#92975)
This path gets called quite a bit since most templates access the state via states.DOMAIN...
This commit is contained in:
parent
5a7c3aaa2d
commit
24284fe379
@ -161,9 +161,19 @@ def split_entity_id(entity_id: str) -> tuple[str, str]:
|
|||||||
return domain, object_id
|
return domain, object_id
|
||||||
|
|
||||||
|
|
||||||
VALID_ENTITY_ID = re.compile(r"^(?!.+__)(?!_)[\da-z_]+(?<!_)\.(?!_)[\da-z_]+(?<!_)$")
|
_OBJECT_ID = r"(?!_)[\da-z_]+(?<!_)"
|
||||||
|
_DOMAIN = r"(?!.+__)" + _OBJECT_ID
|
||||||
|
VALID_DOMAIN = re.compile(r"^" + _DOMAIN + r"$")
|
||||||
|
VALID_ENTITY_ID = re.compile(r"^" + _DOMAIN + r"\." + _OBJECT_ID + r"$")
|
||||||
|
|
||||||
|
|
||||||
|
@functools.lru_cache(64)
|
||||||
|
def valid_domain(domain: str) -> bool:
|
||||||
|
"""Test if a domain a valid format."""
|
||||||
|
return VALID_DOMAIN.match(domain) is not None
|
||||||
|
|
||||||
|
|
||||||
|
@functools.lru_cache(64)
|
||||||
def valid_entity_id(entity_id: str) -> bool:
|
def valid_entity_id(entity_id: str) -> bool:
|
||||||
"""Test if an entity ID is a valid format.
|
"""Test if an entity ID is a valid format.
|
||||||
|
|
||||||
|
@ -63,6 +63,7 @@ from homeassistant.core import (
|
|||||||
State,
|
State,
|
||||||
callback,
|
callback,
|
||||||
split_entity_id,
|
split_entity_id,
|
||||||
|
valid_domain,
|
||||||
valid_entity_id,
|
valid_entity_id,
|
||||||
)
|
)
|
||||||
from homeassistant.exceptions import TemplateError
|
from homeassistant.exceptions import TemplateError
|
||||||
@ -796,7 +797,7 @@ class AllStates:
|
|||||||
if name in _RESERVED_NAMES:
|
if name in _RESERVED_NAMES:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
if not valid_entity_id(f"{name}.entity"):
|
if not valid_domain(name):
|
||||||
raise TemplateError(f"Invalid domain name '{name}'")
|
raise TemplateError(f"Invalid domain name '{name}'")
|
||||||
|
|
||||||
return _domain_states(self._hass, name)
|
return _domain_states(self._hass, name)
|
||||||
|
@ -1384,6 +1384,32 @@ def test_valid_entity_id() -> None:
|
|||||||
assert ha.valid_entity_id(valid), valid
|
assert ha.valid_entity_id(valid), valid
|
||||||
|
|
||||||
|
|
||||||
|
def test_valid_domain() -> None:
|
||||||
|
"""Test valid domain."""
|
||||||
|
for invalid in [
|
||||||
|
"_light",
|
||||||
|
".kitchen",
|
||||||
|
".light.kitchen",
|
||||||
|
"light_.kitchen",
|
||||||
|
"._kitchen",
|
||||||
|
"light.",
|
||||||
|
"light.kitchen__ceiling",
|
||||||
|
"light.kitchen_yo_",
|
||||||
|
"light.kitchen.",
|
||||||
|
"Light",
|
||||||
|
]:
|
||||||
|
assert not ha.valid_domain(invalid), invalid
|
||||||
|
|
||||||
|
for valid in [
|
||||||
|
"1",
|
||||||
|
"1light",
|
||||||
|
"a",
|
||||||
|
"input_boolean",
|
||||||
|
"light",
|
||||||
|
]:
|
||||||
|
assert ha.valid_domain(valid), valid
|
||||||
|
|
||||||
|
|
||||||
async def test_additional_data_in_core_config(
|
async def test_additional_data_in_core_config(
|
||||||
hass: HomeAssistant, hass_storage: dict[str, Any]
|
hass: HomeAssistant, hass_storage: dict[str, Any]
|
||||||
) -> None:
|
) -> None:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user