From 547dbf77aaf4026743dc7e4353578caa076a3a69 Mon Sep 17 00:00:00 2001
From: ilan <31193909+iloveicedgreentea@users.noreply.github.com>
Date: Mon, 26 Aug 2024 13:26:53 -0400
Subject: [PATCH] Use runtime data instead of hass.data in jvc projector
 (#124608)

* feat: use runtime data instead of hass.data

* fix: extend ConfigEntry
---
 homeassistant/components/jvc_projector/__init__.py   | 12 ++++++------
 .../components/jvc_projector/binary_sensor.py        |  8 +++-----
 homeassistant/components/jvc_projector/remote.py     |  7 +++----
 homeassistant/components/jvc_projector/select.py     |  8 +++-----
 homeassistant/components/jvc_projector/sensor.py     |  8 +++-----
 tests/components/jvc_projector/test_coordinator.py   |  5 ++---
 tests/components/jvc_projector/test_init.py          |  2 --
 7 files changed, 20 insertions(+), 30 deletions(-)

diff --git a/homeassistant/components/jvc_projector/__init__.py b/homeassistant/components/jvc_projector/__init__.py
index 8ce1fb46e3d..09e93127e40 100644
--- a/homeassistant/components/jvc_projector/__init__.py
+++ b/homeassistant/components/jvc_projector/__init__.py
@@ -15,13 +15,14 @@ from homeassistant.const import (
 from homeassistant.core import Event, HomeAssistant
 from homeassistant.exceptions import ConfigEntryAuthFailed, ConfigEntryNotReady
 
-from .const import DOMAIN
 from .coordinator import JvcProjectorDataUpdateCoordinator
 
+type JVCConfigEntry = ConfigEntry[JvcProjectorDataUpdateCoordinator]
+
 PLATFORMS = [Platform.BINARY_SENSOR, Platform.REMOTE, Platform.SELECT, Platform.SENSOR]
 
 
-async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
+async def async_setup_entry(hass: HomeAssistant, entry: JVCConfigEntry) -> bool:
     """Set up integration from a config entry."""
     device = JvcProjector(
         host=entry.data[CONF_HOST],
@@ -43,7 +44,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
     coordinator = JvcProjectorDataUpdateCoordinator(hass, device)
     await coordinator.async_config_entry_first_refresh()
 
-    hass.data.setdefault(DOMAIN, {})[entry.entry_id] = coordinator
+    entry.runtime_data = coordinator
 
     async def disconnect(event: Event) -> None:
         await device.disconnect()
@@ -57,9 +58,8 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
     return True
 
 
-async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
+async def async_unload_entry(hass: HomeAssistant, entry: JVCConfigEntry) -> bool:
     """Unload config entry."""
     if unload_ok := await hass.config_entries.async_unload_platforms(entry, PLATFORMS):
-        await hass.data[DOMAIN][entry.entry_id].device.disconnect()
-        hass.data[DOMAIN].pop(entry.entry_id)
+        await entry.runtime_data.device.disconnect()
     return unload_ok
diff --git a/homeassistant/components/jvc_projector/binary_sensor.py b/homeassistant/components/jvc_projector/binary_sensor.py
index 7e8788aa0a6..6dfac63892b 100644
--- a/homeassistant/components/jvc_projector/binary_sensor.py
+++ b/homeassistant/components/jvc_projector/binary_sensor.py
@@ -5,22 +5,20 @@ from __future__ import annotations
 from jvcprojector import const
 
 from homeassistant.components.binary_sensor import BinarySensorEntity
-from homeassistant.config_entries import ConfigEntry
 from homeassistant.core import HomeAssistant
 from homeassistant.helpers.entity_platform import AddEntitiesCallback
 
-from . import JvcProjectorDataUpdateCoordinator
-from .const import DOMAIN
+from . import JVCConfigEntry, JvcProjectorDataUpdateCoordinator
 from .entity import JvcProjectorEntity
 
 ON_STATUS = (const.ON, const.WARMING)
 
 
 async def async_setup_entry(
-    hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
+    hass: HomeAssistant, entry: JVCConfigEntry, async_add_entities: AddEntitiesCallback
 ) -> None:
     """Set up the JVC Projector platform from a config entry."""
-    coordinator: JvcProjectorDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id]
+    coordinator = entry.runtime_data
 
     async_add_entities([JvcBinarySensor(coordinator)])
 
diff --git a/homeassistant/components/jvc_projector/remote.py b/homeassistant/components/jvc_projector/remote.py
index b69d3b0118b..f90a2816363 100644
--- a/homeassistant/components/jvc_projector/remote.py
+++ b/homeassistant/components/jvc_projector/remote.py
@@ -10,12 +10,11 @@ from typing import Any
 from jvcprojector import const
 
 from homeassistant.components.remote import RemoteEntity
-from homeassistant.config_entries import ConfigEntry
 from homeassistant.core import HomeAssistant
 from homeassistant.exceptions import HomeAssistantError
 from homeassistant.helpers.entity_platform import AddEntitiesCallback
 
-from .const import DOMAIN
+from . import JVCConfigEntry
 from .entity import JvcProjectorEntity
 
 COMMANDS = {
@@ -55,10 +54,10 @@ _LOGGER = logging.getLogger(__name__)
 
 
 async def async_setup_entry(
-    hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
+    hass: HomeAssistant, entry: JVCConfigEntry, async_add_entities: AddEntitiesCallback
 ) -> None:
     """Set up the JVC Projector platform from a config entry."""
-    coordinator = hass.data[DOMAIN][entry.entry_id]
+    coordinator = entry.runtime_data
     async_add_entities([JvcProjectorRemote(coordinator)], True)
 
 
diff --git a/homeassistant/components/jvc_projector/select.py b/homeassistant/components/jvc_projector/select.py
index 1395637fad1..60c80f98fc0 100644
--- a/homeassistant/components/jvc_projector/select.py
+++ b/homeassistant/components/jvc_projector/select.py
@@ -9,12 +9,10 @@ from typing import Final
 from jvcprojector import JvcProjector, const
 
 from homeassistant.components.select import SelectEntity, SelectEntityDescription
-from homeassistant.config_entries import ConfigEntry
 from homeassistant.core import HomeAssistant
 from homeassistant.helpers.entity_platform import AddEntitiesCallback
 
-from . import JvcProjectorDataUpdateCoordinator
-from .const import DOMAIN
+from . import JVCConfigEntry, JvcProjectorDataUpdateCoordinator
 from .entity import JvcProjectorEntity
 
 
@@ -41,11 +39,11 @@ SELECTS: Final[list[JvcProjectorSelectDescription]] = [
 
 async def async_setup_entry(
     hass: HomeAssistant,
-    entry: ConfigEntry,
+    entry: JVCConfigEntry,
     async_add_entities: AddEntitiesCallback,
 ) -> None:
     """Set up the JVC Projector platform from a config entry."""
-    coordinator: JvcProjectorDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id]
+    coordinator = entry.runtime_data
 
     async_add_entities(
         JvcProjectorSelectEntity(coordinator, description) for description in SELECTS
diff --git a/homeassistant/components/jvc_projector/sensor.py b/homeassistant/components/jvc_projector/sensor.py
index 9be04b367e6..3edf51e4316 100644
--- a/homeassistant/components/jvc_projector/sensor.py
+++ b/homeassistant/components/jvc_projector/sensor.py
@@ -9,13 +9,11 @@ from homeassistant.components.sensor import (
     SensorEntity,
     SensorEntityDescription,
 )
-from homeassistant.config_entries import ConfigEntry
 from homeassistant.const import EntityCategory
 from homeassistant.core import HomeAssistant
 from homeassistant.helpers.entity_platform import AddEntitiesCallback
 
-from . import JvcProjectorDataUpdateCoordinator
-from .const import DOMAIN
+from . import JVCConfigEntry, JvcProjectorDataUpdateCoordinator
 from .entity import JvcProjectorEntity
 
 JVC_SENSORS = (
@@ -36,10 +34,10 @@ JVC_SENSORS = (
 
 
 async def async_setup_entry(
-    hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
+    hass: HomeAssistant, entry: JVCConfigEntry, async_add_entities: AddEntitiesCallback
 ) -> None:
     """Set up the JVC Projector platform from a config entry."""
-    coordinator: JvcProjectorDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id]
+    coordinator = entry.runtime_data
 
     async_add_entities(
         JvcSensor(coordinator, description) for description in JVC_SENSORS
diff --git a/tests/components/jvc_projector/test_coordinator.py b/tests/components/jvc_projector/test_coordinator.py
index 24297348653..b9211250aff 100644
--- a/tests/components/jvc_projector/test_coordinator.py
+++ b/tests/components/jvc_projector/test_coordinator.py
@@ -5,7 +5,6 @@ from unittest.mock import AsyncMock
 
 from jvcprojector import JvcProjectorAuthError, JvcProjectorConnectError
 
-from homeassistant.components.jvc_projector import DOMAIN
 from homeassistant.components.jvc_projector.coordinator import (
     INTERVAL_FAST,
     INTERVAL_SLOW,
@@ -29,7 +28,7 @@ async def test_coordinator_update(
     )
     await hass.async_block_till_done()
     assert mock_device.get_state.call_count == 3
-    coordinator = hass.data[DOMAIN][mock_integration.entry_id]
+    coordinator = mock_integration.runtime_data
     assert coordinator.update_interval == INTERVAL_SLOW
 
 
@@ -69,5 +68,5 @@ async def test_coordinator_device_on(
     mock_config_entry.add_to_hass(hass)
     await hass.config_entries.async_setup(mock_config_entry.entry_id)
     await hass.async_block_till_done()
-    coordinator = hass.data[DOMAIN][mock_config_entry.entry_id]
+    coordinator = mock_config_entry.runtime_data
     assert coordinator.update_interval == INTERVAL_FAST
diff --git a/tests/components/jvc_projector/test_init.py b/tests/components/jvc_projector/test_init.py
index ef9de41ca32..baf088a5dba 100644
--- a/tests/components/jvc_projector/test_init.py
+++ b/tests/components/jvc_projector/test_init.py
@@ -38,8 +38,6 @@ async def test_unload_config_entry(
     await hass.config_entries.async_unload(mock_config_entry.entry_id)
     await hass.async_block_till_done()
 
-    assert mock_config_entry.entry_id not in hass.data[DOMAIN]
-
 
 async def test_config_entry_connect_error(
     hass: HomeAssistant,
-- 
GitLab