Remove implict name check from Entity base class (#101905)
This commit is contained in:
parent
d0fb994199
commit
e5ebdf7ad4
2 changed files with 39 additions and 102 deletions
|
@ -268,9 +268,6 @@ class Entity(ABC):
|
||||||
# it should be using async_write_ha_state.
|
# it should be using async_write_ha_state.
|
||||||
_async_update_ha_state_reported = False
|
_async_update_ha_state_reported = False
|
||||||
|
|
||||||
# If we reported this entity is implicitly using device name
|
|
||||||
_implicit_device_name_reported = False
|
|
||||||
|
|
||||||
# If we reported this entity was added without its platform set
|
# If we reported this entity was added without its platform set
|
||||||
_no_platform_reported = False
|
_no_platform_reported = False
|
||||||
|
|
||||||
|
@ -358,22 +355,6 @@ class Entity(ABC):
|
||||||
"""Return a unique ID."""
|
"""Return a unique ID."""
|
||||||
return self._attr_unique_id
|
return self._attr_unique_id
|
||||||
|
|
||||||
def _report_implicit_device_name(self) -> None:
|
|
||||||
"""Report entities which use implicit device name."""
|
|
||||||
if self._implicit_device_name_reported:
|
|
||||||
return
|
|
||||||
report_issue = self._suggest_report_issue()
|
|
||||||
_LOGGER.warning(
|
|
||||||
(
|
|
||||||
"Entity %s (%s) is implicitly using device name by not setting its "
|
|
||||||
"name. Instead, the name should be set to None, please %s"
|
|
||||||
),
|
|
||||||
self.entity_id,
|
|
||||||
type(self),
|
|
||||||
report_issue,
|
|
||||||
)
|
|
||||||
self._implicit_device_name_reported = True
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def use_device_name(self) -> bool:
|
def use_device_name(self) -> bool:
|
||||||
"""Return if this entity does not have its own name.
|
"""Return if this entity does not have its own name.
|
||||||
|
@ -388,20 +369,8 @@ class Entity(ABC):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
if hasattr(self, "entity_description"):
|
if hasattr(self, "entity_description"):
|
||||||
if not (name := self.entity_description.name):
|
return not self.entity_description.name
|
||||||
return True
|
|
||||||
if name is UNDEFINED and not self._default_to_device_class_name():
|
|
||||||
# Backwards compatibility with leaving EntityDescription.name unassigned
|
|
||||||
# for device name.
|
|
||||||
# Deprecated in HA Core 2023.6, remove in HA Core 2023.9
|
|
||||||
self._report_implicit_device_name()
|
|
||||||
return True
|
|
||||||
return False
|
|
||||||
if self.name is UNDEFINED and not self._default_to_device_class_name():
|
|
||||||
# Backwards compatibility with not overriding name property for device name.
|
|
||||||
# Deprecated in HA Core 2023.6, remove in HA Core 2023.9
|
|
||||||
self._report_implicit_device_name()
|
|
||||||
return True
|
|
||||||
return not self.name
|
return not self.name
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
|
|
@ -956,17 +956,11 @@ async def test_entity_description_fallback() -> None:
|
||||||
|
|
||||||
async def _test_friendly_name(
|
async def _test_friendly_name(
|
||||||
hass: HomeAssistant,
|
hass: HomeAssistant,
|
||||||
caplog: pytest.LogCaptureFixture,
|
|
||||||
ent: entity.Entity,
|
ent: entity.Entity,
|
||||||
expected_friendly_name: str | None,
|
expected_friendly_name: str | None,
|
||||||
warn_implicit_name: bool,
|
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Test friendly name."""
|
"""Test friendly name."""
|
||||||
|
|
||||||
expected_warning = (
|
|
||||||
f"Entity {ent.entity_id} ({type(ent)}) is implicitly using device name"
|
|
||||||
)
|
|
||||||
|
|
||||||
async def async_setup_entry(hass, config_entry, async_add_entities):
|
async def async_setup_entry(hass, config_entry, async_add_entities):
|
||||||
"""Mock setup entry method."""
|
"""Mock setup entry method."""
|
||||||
async_add_entities([ent])
|
async_add_entities([ent])
|
||||||
|
@ -985,7 +979,6 @@ async def _test_friendly_name(
|
||||||
assert len(hass.states.async_entity_ids()) == 1
|
assert len(hass.states.async_entity_ids()) == 1
|
||||||
state = hass.states.async_all()[0]
|
state = hass.states.async_all()[0]
|
||||||
assert state.attributes.get(ATTR_FRIENDLY_NAME) == expected_friendly_name
|
assert state.attributes.get(ATTR_FRIENDLY_NAME) == expected_friendly_name
|
||||||
assert (expected_warning in caplog.text) is warn_implicit_name
|
|
||||||
|
|
||||||
await async_update_entity(hass, ent.entity_id)
|
await async_update_entity(hass, ent.entity_id)
|
||||||
assert state.attributes.get(ATTR_FRIENDLY_NAME) == expected_friendly_name
|
assert state.attributes.get(ATTR_FRIENDLY_NAME) == expected_friendly_name
|
||||||
|
@ -997,25 +990,22 @@ async def _test_friendly_name(
|
||||||
"entity_name",
|
"entity_name",
|
||||||
"device_name",
|
"device_name",
|
||||||
"expected_friendly_name",
|
"expected_friendly_name",
|
||||||
"warn_implicit_name",
|
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
(False, "Entity Blu", "Device Bla", "Entity Blu", False),
|
(False, "Entity Blu", "Device Bla", "Entity Blu"),
|
||||||
(False, None, "Device Bla", None, False),
|
(False, None, "Device Bla", None),
|
||||||
(True, "Entity Blu", "Device Bla", "Device Bla Entity Blu", False),
|
(True, "Entity Blu", "Device Bla", "Device Bla Entity Blu"),
|
||||||
(True, None, "Device Bla", "Device Bla", False),
|
(True, None, "Device Bla", "Device Bla"),
|
||||||
(True, "Entity Blu", UNDEFINED, "Entity Blu", False),
|
(True, "Entity Blu", UNDEFINED, "Entity Blu"),
|
||||||
(True, "Entity Blu", None, "Mock Title Entity Blu", False),
|
(True, "Entity Blu", None, "Mock Title Entity Blu"),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
async def test_friendly_name_attr(
|
async def test_friendly_name_attr(
|
||||||
hass: HomeAssistant,
|
hass: HomeAssistant,
|
||||||
caplog: pytest.LogCaptureFixture,
|
|
||||||
has_entity_name: bool,
|
has_entity_name: bool,
|
||||||
entity_name: str | None,
|
entity_name: str | None,
|
||||||
device_name: str | None | UndefinedType,
|
device_name: str | None | UndefinedType,
|
||||||
expected_friendly_name: str | None,
|
expected_friendly_name: str | None,
|
||||||
warn_implicit_name: bool,
|
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Test friendly name when the entity uses _attr_*."""
|
"""Test friendly name when the entity uses _attr_*."""
|
||||||
|
|
||||||
|
@ -1031,31 +1021,27 @@ async def test_friendly_name_attr(
|
||||||
ent._attr_name = entity_name
|
ent._attr_name = entity_name
|
||||||
await _test_friendly_name(
|
await _test_friendly_name(
|
||||||
hass,
|
hass,
|
||||||
caplog,
|
|
||||||
ent,
|
ent,
|
||||||
expected_friendly_name,
|
expected_friendly_name,
|
||||||
warn_implicit_name,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
("has_entity_name", "entity_name", "expected_friendly_name", "warn_implicit_name"),
|
("has_entity_name", "entity_name", "expected_friendly_name"),
|
||||||
(
|
(
|
||||||
(False, "Entity Blu", "Entity Blu", False),
|
(False, "Entity Blu", "Entity Blu"),
|
||||||
(False, None, None, False),
|
(False, None, None),
|
||||||
(False, UNDEFINED, None, False),
|
(False, UNDEFINED, None),
|
||||||
(True, "Entity Blu", "Device Bla Entity Blu", False),
|
(True, "Entity Blu", "Device Bla Entity Blu"),
|
||||||
(True, None, "Device Bla", False),
|
(True, None, "Device Bla"),
|
||||||
(True, UNDEFINED, "Device Bla", True),
|
(True, UNDEFINED, "Device Bla None"),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
async def test_friendly_name_description(
|
async def test_friendly_name_description(
|
||||||
hass: HomeAssistant,
|
hass: HomeAssistant,
|
||||||
caplog: pytest.LogCaptureFixture,
|
|
||||||
has_entity_name: bool,
|
has_entity_name: bool,
|
||||||
entity_name: str | None,
|
entity_name: str | None,
|
||||||
expected_friendly_name: str | None,
|
expected_friendly_name: str | None,
|
||||||
warn_implicit_name: bool,
|
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Test friendly name when the entity has an entity description."""
|
"""Test friendly name when the entity has an entity description."""
|
||||||
|
|
||||||
|
@ -1072,31 +1058,27 @@ async def test_friendly_name_description(
|
||||||
)
|
)
|
||||||
await _test_friendly_name(
|
await _test_friendly_name(
|
||||||
hass,
|
hass,
|
||||||
caplog,
|
|
||||||
ent,
|
ent,
|
||||||
expected_friendly_name,
|
expected_friendly_name,
|
||||||
warn_implicit_name,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
("has_entity_name", "entity_name", "expected_friendly_name", "warn_implicit_name"),
|
("has_entity_name", "entity_name", "expected_friendly_name"),
|
||||||
(
|
(
|
||||||
(False, "Entity Blu", "Entity Blu", False),
|
(False, "Entity Blu", "Entity Blu"),
|
||||||
(False, None, None, False),
|
(False, None, None),
|
||||||
(False, UNDEFINED, None, False),
|
(False, UNDEFINED, None),
|
||||||
(True, "Entity Blu", "Device Bla Entity Blu", False),
|
(True, "Entity Blu", "Device Bla Entity Blu"),
|
||||||
(True, None, "Device Bla", False),
|
(True, None, "Device Bla"),
|
||||||
(True, UNDEFINED, "Device Bla English cls", False),
|
(True, UNDEFINED, "Device Bla English cls"),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
async def test_friendly_name_description_device_class_name(
|
async def test_friendly_name_description_device_class_name(
|
||||||
hass: HomeAssistant,
|
hass: HomeAssistant,
|
||||||
caplog: pytest.LogCaptureFixture,
|
|
||||||
has_entity_name: bool,
|
has_entity_name: bool,
|
||||||
entity_name: str | None,
|
entity_name: str | None,
|
||||||
expected_friendly_name: str | None,
|
expected_friendly_name: str | None,
|
||||||
warn_implicit_name: bool,
|
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Test friendly name when the entity has an entity description."""
|
"""Test friendly name when the entity has an entity description."""
|
||||||
|
|
||||||
|
@ -1139,31 +1121,27 @@ async def test_friendly_name_description_device_class_name(
|
||||||
):
|
):
|
||||||
await _test_friendly_name(
|
await _test_friendly_name(
|
||||||
hass,
|
hass,
|
||||||
caplog,
|
|
||||||
ent,
|
ent,
|
||||||
expected_friendly_name,
|
expected_friendly_name,
|
||||||
warn_implicit_name,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
("has_entity_name", "entity_name", "expected_friendly_name", "warn_implicit_name"),
|
("has_entity_name", "entity_name", "expected_friendly_name"),
|
||||||
(
|
(
|
||||||
(False, "Entity Blu", "Entity Blu", False),
|
(False, "Entity Blu", "Entity Blu"),
|
||||||
(False, None, None, False),
|
(False, None, None),
|
||||||
(False, UNDEFINED, None, False),
|
(False, UNDEFINED, None),
|
||||||
(True, "Entity Blu", "Device Bla Entity Blu", False),
|
(True, "Entity Blu", "Device Bla Entity Blu"),
|
||||||
(True, None, "Device Bla", False),
|
(True, None, "Device Bla"),
|
||||||
(True, UNDEFINED, "Device Bla", True),
|
(True, UNDEFINED, "Device Bla None"),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
async def test_friendly_name_property(
|
async def test_friendly_name_property(
|
||||||
hass: HomeAssistant,
|
hass: HomeAssistant,
|
||||||
caplog: pytest.LogCaptureFixture,
|
|
||||||
has_entity_name: bool,
|
has_entity_name: bool,
|
||||||
entity_name: str | None,
|
entity_name: str | None,
|
||||||
expected_friendly_name: str | None,
|
expected_friendly_name: str | None,
|
||||||
warn_implicit_name: bool,
|
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Test friendly name when the entity has overridden the name property."""
|
"""Test friendly name when the entity has overridden the name property."""
|
||||||
|
|
||||||
|
@ -1179,32 +1157,28 @@ async def test_friendly_name_property(
|
||||||
)
|
)
|
||||||
await _test_friendly_name(
|
await _test_friendly_name(
|
||||||
hass,
|
hass,
|
||||||
caplog,
|
|
||||||
ent,
|
ent,
|
||||||
expected_friendly_name,
|
expected_friendly_name,
|
||||||
warn_implicit_name,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
("has_entity_name", "entity_name", "expected_friendly_name", "warn_implicit_name"),
|
("has_entity_name", "entity_name", "expected_friendly_name"),
|
||||||
(
|
(
|
||||||
(False, "Entity Blu", "Entity Blu", False),
|
(False, "Entity Blu", "Entity Blu"),
|
||||||
(False, None, None, False),
|
(False, None, None),
|
||||||
(False, UNDEFINED, None, False),
|
(False, UNDEFINED, None),
|
||||||
(True, "Entity Blu", "Device Bla Entity Blu", False),
|
(True, "Entity Blu", "Device Bla Entity Blu"),
|
||||||
(True, None, "Device Bla", False),
|
(True, None, "Device Bla"),
|
||||||
# Won't use the device class name because the entity overrides the name property
|
# Won't use the device class name because the entity overrides the name property
|
||||||
(True, UNDEFINED, "Device Bla None", False),
|
(True, UNDEFINED, "Device Bla None"),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
async def test_friendly_name_property_device_class_name(
|
async def test_friendly_name_property_device_class_name(
|
||||||
hass: HomeAssistant,
|
hass: HomeAssistant,
|
||||||
caplog: pytest.LogCaptureFixture,
|
|
||||||
has_entity_name: bool,
|
has_entity_name: bool,
|
||||||
entity_name: str | None,
|
entity_name: str | None,
|
||||||
expected_friendly_name: str | None,
|
expected_friendly_name: str | None,
|
||||||
warn_implicit_name: bool,
|
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Test friendly name when the entity has overridden the name property."""
|
"""Test friendly name when the entity has overridden the name property."""
|
||||||
|
|
||||||
|
@ -1244,26 +1218,22 @@ async def test_friendly_name_property_device_class_name(
|
||||||
):
|
):
|
||||||
await _test_friendly_name(
|
await _test_friendly_name(
|
||||||
hass,
|
hass,
|
||||||
caplog,
|
|
||||||
ent,
|
ent,
|
||||||
expected_friendly_name,
|
expected_friendly_name,
|
||||||
warn_implicit_name,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
("has_entity_name", "expected_friendly_name", "warn_implicit_name"),
|
("has_entity_name", "expected_friendly_name"),
|
||||||
(
|
(
|
||||||
(False, None, False),
|
(False, None),
|
||||||
(True, "Device Bla English cls", False),
|
(True, "Device Bla English cls"),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
async def test_friendly_name_device_class_name(
|
async def test_friendly_name_device_class_name(
|
||||||
hass: HomeAssistant,
|
hass: HomeAssistant,
|
||||||
caplog: pytest.LogCaptureFixture,
|
|
||||||
has_entity_name: bool,
|
has_entity_name: bool,
|
||||||
expected_friendly_name: str | None,
|
expected_friendly_name: str | None,
|
||||||
warn_implicit_name: bool,
|
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Test friendly name when the entity has not set the name in any way."""
|
"""Test friendly name when the entity has not set the name in any way."""
|
||||||
|
|
||||||
|
@ -1302,10 +1272,8 @@ async def test_friendly_name_device_class_name(
|
||||||
):
|
):
|
||||||
await _test_friendly_name(
|
await _test_friendly_name(
|
||||||
hass,
|
hass,
|
||||||
caplog,
|
|
||||||
ent,
|
ent,
|
||||||
expected_friendly_name,
|
expected_friendly_name,
|
||||||
warn_implicit_name,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue