mirror of
https://github.com/home-assistant/core.git
synced 2026-05-18 14:29:57 +01:00
d766aae436
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: frenck <195327+frenck@users.noreply.github.com>
91 lines
3.3 KiB
Python
91 lines
3.3 KiB
Python
"""The GitHub integration."""
|
|
|
|
from types import MappingProxyType
|
|
|
|
from aiogithubapi import GitHubAPI
|
|
|
|
from homeassistant.config_entries import ConfigSubentry
|
|
from homeassistant.const import CONF_ACCESS_TOKEN, Platform
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.helpers import device_registry as dr
|
|
from homeassistant.helpers.aiohttp_client import (
|
|
SERVER_SOFTWARE,
|
|
async_get_clientsession,
|
|
)
|
|
|
|
from .const import CONF_REPOSITORIES, CONF_REPOSITORY, DOMAIN, SUBENTRY_TYPE_REPOSITORY
|
|
from .coordinator import GithubConfigEntry, GitHubDataUpdateCoordinator
|
|
|
|
PLATFORMS: list[Platform] = [Platform.SENSOR]
|
|
|
|
|
|
async def async_setup_entry(hass: HomeAssistant, entry: GithubConfigEntry) -> bool:
|
|
"""Set up GitHub from a config entry."""
|
|
client = GitHubAPI(
|
|
token=entry.data[CONF_ACCESS_TOKEN],
|
|
session=async_get_clientsession(hass),
|
|
client_name=SERVER_SOFTWARE,
|
|
)
|
|
|
|
entry.runtime_data = {}
|
|
for repository_subentry in entry.get_subentries_of_type(SUBENTRY_TYPE_REPOSITORY):
|
|
repository = repository_subentry.data[CONF_REPOSITORY]
|
|
coordinator = GitHubDataUpdateCoordinator(
|
|
hass=hass,
|
|
config_entry=entry,
|
|
client=client,
|
|
repository=repository,
|
|
)
|
|
|
|
await coordinator.async_config_entry_first_refresh()
|
|
|
|
if not entry.pref_disable_polling:
|
|
await coordinator.subscribe()
|
|
|
|
entry.runtime_data[repository_subentry.subentry_id] = coordinator
|
|
|
|
entry.async_on_unload(entry.add_update_listener(async_update_entry))
|
|
|
|
await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
|
|
return True
|
|
|
|
|
|
async def async_update_entry(hass: HomeAssistant, entry: GithubConfigEntry) -> None:
|
|
"""Update entry."""
|
|
await hass.config_entries.async_reload(entry.entry_id)
|
|
|
|
|
|
async def async_unload_entry(hass: HomeAssistant, entry: GithubConfigEntry) -> bool:
|
|
"""Unload a config entry."""
|
|
repositories = entry.runtime_data
|
|
for coordinator in repositories.values():
|
|
coordinator.unsubscribe()
|
|
|
|
return await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
|
|
|
|
|
|
async def async_migrate_entry(hass: HomeAssistant, entry: GithubConfigEntry) -> bool:
|
|
"""Migrate old entry."""
|
|
if entry.minor_version == 1:
|
|
dev_reg = dr.async_get(hass)
|
|
# In minor version 2 we migrated repositories from entry options to
|
|
# subentries, so we need to convert the list from
|
|
# entry.options[CONF_REPOSITORIES] into individual subentries.
|
|
for repository in entry.options[CONF_REPOSITORIES]:
|
|
subentry = ConfigSubentry(
|
|
data=MappingProxyType({CONF_REPOSITORY: repository}),
|
|
subentry_type=SUBENTRY_TYPE_REPOSITORY,
|
|
title=repository,
|
|
unique_id=repository,
|
|
)
|
|
hass.config_entries.async_add_subentry(entry, subentry)
|
|
if device := dev_reg.async_get_device({(DOMAIN, repository)}):
|
|
dev_reg.async_update_device(
|
|
device.id,
|
|
remove_config_entry_id=entry.entry_id,
|
|
add_config_subentry_id=subentry.subentry_id,
|
|
add_config_entry_id=entry.entry_id,
|
|
)
|
|
hass.config_entries.async_update_entry(entry, minor_version=2)
|
|
return True
|