Bump google air quality api to 2.0.0 (#158234)

This commit is contained in:
Thomas55555
2025-12-08 13:41:28 +01:00
committed by GitHub
parent 470f5a2396
commit a6c7bd76eb
9 changed files with 37 additions and 29 deletions
@@ -52,9 +52,9 @@ async def _validate_input(
description_placeholders: dict[str, str],
) -> bool:
try:
await api.async_air_quality(
await api.async_get_current_conditions(
lat=user_input[CONF_LOCATION][CONF_LATITUDE],
long=user_input[CONF_LOCATION][CONF_LONGITUDE],
lon=user_input[CONF_LOCATION][CONF_LONGITUDE],
)
except GoogleAirQualityApiError as err:
errors["base"] = "cannot_connect"
@@ -7,7 +7,7 @@ from typing import Final
from google_air_quality_api.api import GoogleAirQualityApi
from google_air_quality_api.exceptions import GoogleAirQualityApiError
from google_air_quality_api.model import AirQualityData
from google_air_quality_api.model import AirQualityCurrentConditionsData
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_LATITUDE, CONF_LONGITUDE
@@ -23,7 +23,9 @@ UPDATE_INTERVAL: Final = timedelta(hours=1)
type GoogleAirQualityConfigEntry = ConfigEntry[GoogleAirQualityRuntimeData]
class GoogleAirQualityUpdateCoordinator(DataUpdateCoordinator[AirQualityData]):
class GoogleAirQualityUpdateCoordinator(
DataUpdateCoordinator[AirQualityCurrentConditionsData]
):
"""Coordinator for fetching Google AirQuality data."""
config_entry: GoogleAirQualityConfigEntry
@@ -48,10 +50,10 @@ class GoogleAirQualityUpdateCoordinator(DataUpdateCoordinator[AirQualityData]):
self.lat = subentry.data[CONF_LATITUDE]
self.long = subentry.data[CONF_LONGITUDE]
async def _async_update_data(self) -> AirQualityData:
async def _async_update_data(self) -> AirQualityCurrentConditionsData:
"""Fetch air quality data for this coordinate."""
try:
return await self.client.async_air_quality(self.lat, self.long)
return await self.client.async_get_current_conditions(self.lat, self.long)
except GoogleAirQualityApiError as ex:
_LOGGER.debug("Cannot fetch air quality data: %s", str(ex))
raise UpdateFailed(
@@ -8,5 +8,5 @@
"iot_class": "cloud_polling",
"loggers": ["google_air_quality_api"],
"quality_scale": "bronze",
"requirements": ["google_air_quality_api==1.1.3"]
"requirements": ["google_air_quality_api==2.0.0"]
}
@@ -4,7 +4,7 @@ from collections.abc import Callable
from dataclasses import dataclass
import logging
from google_air_quality_api.model import AirQualityData
from google_air_quality_api.model import AirQualityCurrentConditionsData
from homeassistant.components.sensor import (
SensorDeviceClass,
@@ -33,15 +33,17 @@ PARALLEL_UPDATES = 0
class AirQualitySensorEntityDescription(SensorEntityDescription):
"""Describes Air Quality sensor entity."""
exists_fn: Callable[[AirQualityData], bool] = lambda _: True
options_fn: Callable[[AirQualityData], list[str] | None] = lambda _: None
value_fn: Callable[[AirQualityData], StateType]
native_unit_of_measurement_fn: Callable[[AirQualityData], str | None] = (
exists_fn: Callable[[AirQualityCurrentConditionsData], bool] = lambda _: True
options_fn: Callable[[AirQualityCurrentConditionsData], list[str] | None] = (
lambda _: None
)
translation_placeholders_fn: Callable[[AirQualityData], dict[str, str]] | None = (
None
)
value_fn: Callable[[AirQualityCurrentConditionsData], StateType]
native_unit_of_measurement_fn: Callable[
[AirQualityCurrentConditionsData], str | None
] = lambda _: None
translation_placeholders_fn: (
Callable[[AirQualityCurrentConditionsData], dict[str, str]] | None
) = None
AIR_QUALITY_SENSOR_TYPES: tuple[AirQualitySensorEntityDescription, ...] = (
+1 -1
View File
@@ -1096,7 +1096,7 @@ google-nest-sdm==9.1.2
google-photos-library-api==0.12.1
# homeassistant.components.google_air_quality
google_air_quality_api==1.1.3
google_air_quality_api==2.0.0
# homeassistant.components.slide
# homeassistant.components.slide_local
+1 -1
View File
@@ -972,7 +972,7 @@ google-nest-sdm==9.1.2
google-photos-library-api==0.12.1
# homeassistant.components.google_air_quality
google_air_quality_api==1.1.3
google_air_quality_api==2.0.0
# homeassistant.components.slide
# homeassistant.components.slide_local
@@ -4,7 +4,7 @@ from collections.abc import AsyncGenerator, Generator
from typing import Any
from unittest.mock import AsyncMock, Mock, patch
from google_air_quality_api.model import AirQualityData
from google_air_quality_api.model import AirQualityCurrentConditionsData
import pytest
from homeassistant.components.google_air_quality import CONF_REFERRER
@@ -81,7 +81,9 @@ def mock_client_api() -> Generator[Mock]:
),
):
api = mock_api.return_value
api.async_air_quality.return_value = AirQualityData.from_dict(responses)
api.async_get_current_conditions.return_value = (
AirQualityCurrentConditionsData.from_dict(responses)
)
yield api
@@ -68,7 +68,7 @@ async def test_create_entry(
},
)
mock_api.async_air_quality.assert_called_once_with(lat=10.1, long=20.1)
mock_api.async_get_current_conditions.assert_called_once_with(lat=10.1, lon=20.1)
_assert_create_entry_result(result)
assert len(mock_setup_entry.mock_calls) == 1
@@ -101,7 +101,7 @@ async def test_form_with_referrer(
},
)
mock_api.async_air_quality.assert_called_once_with(lat=10.1, long=20.1)
mock_api.async_get_current_conditions.assert_called_once_with(lat=10.1, lon=20.1)
_assert_create_entry_result(result, expected_referrer="test-referrer")
assert len(mock_setup_entry.mock_calls) == 1
@@ -126,7 +126,7 @@ async def test_form_exceptions(
DOMAIN, context={"source": SOURCE_USER}
)
mock_api.async_air_quality.side_effect = api_exception
mock_api.async_get_current_conditions.side_effect = api_exception
result = await hass.config_entries.flow.async_configure(
result["flow_id"],
{
@@ -154,7 +154,7 @@ async def test_form_exceptions(
# FlowResultType.CREATE_ENTRY or FlowResultType.ABORT so
# we can show the config flow is able to recover from an error.
mock_api.async_air_quality.side_effect = None
mock_api.async_get_current_conditions.side_effect = None
result = await hass.config_entries.flow.async_configure(
result["flow_id"],
{
@@ -196,7 +196,7 @@ async def test_form_api_key_already_configured(
assert result["type"] is FlowResultType.ABORT
assert result["reason"] == "already_configured"
assert mock_api.async_air_quality.call_count == 0
assert mock_api.async_get_current_conditions.call_count == 0
async def test_form_location_already_configured(
@@ -224,7 +224,7 @@ async def test_form_location_already_configured(
assert result["type"] is FlowResultType.ABORT
assert result["reason"] == "already_configured"
assert mock_api.async_air_quality.call_count == 0
assert mock_api.async_get_current_conditions.call_count == 0
async def test_form_not_already_configured(
@@ -251,7 +251,9 @@ async def test_form_not_already_configured(
},
)
mock_api.async_air_quality.assert_called_once_with(lat=10.1002, long=20.0998)
mock_api.async_get_current_conditions.assert_called_once_with(
lat=10.1002, lon=20.0998
)
assert result["type"] is FlowResultType.CREATE_ENTRY
assert result["title"] == "Google Air Quality"
@@ -281,7 +283,7 @@ async def test_subentry_flow(
await hass.async_block_till_done()
# After initial setup for 1 subentry, each API is called once
assert mock_api.async_air_quality.call_count == 1
assert mock_api.async_get_current_conditions.call_count == 1
result = await hass.config_entries.subentries.async_init(
(mock_config_entry.entry_id, "location"),
@@ -313,7 +315,7 @@ async def test_subentry_flow(
# Initial setup: 1 of each API call
# Subentry flow validation: 1 current conditions call
# Reload with 2 subentries: 2 of each API call
assert mock_api.async_air_quality.call_count == 1 + 1 + 2
assert mock_api.async_get_current_conditions.call_count == 1 + 1 + 2
entry = hass.config_entries.async_get_entry(mock_config_entry.entry_id)
assert len(entry.subentries) == 2
@@ -33,7 +33,7 @@ async def test_config_not_ready(
) -> None:
"""Test for setup failure if an API call fails."""
mock_config_entry.add_to_hass(hass)
mock_api.async_air_quality.side_effect = GoogleAirQualityApiError()
mock_api.async_get_current_conditions.side_effect = GoogleAirQualityApiError()
await hass.config_entries.async_setup(mock_config_entry.entry_id)