From a6c7bd76ebd4335106c39397522b14fde8375330 Mon Sep 17 00:00:00 2001 From: Thomas55555 <59625598+Thomas55555@users.noreply.github.com> Date: Mon, 8 Dec 2025 13:41:28 +0100 Subject: [PATCH] Bump google air quality api to 2.0.0 (#158234) --- .../google_air_quality/config_flow.py | 4 ++-- .../google_air_quality/coordinator.py | 10 ++++++---- .../google_air_quality/manifest.json | 2 +- .../components/google_air_quality/sensor.py | 18 +++++++++-------- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- .../components/google_air_quality/conftest.py | 6 ++++-- .../google_air_quality/test_config_flow.py | 20 ++++++++++--------- .../google_air_quality/test_init.py | 2 +- 9 files changed, 37 insertions(+), 29 deletions(-) diff --git a/homeassistant/components/google_air_quality/config_flow.py b/homeassistant/components/google_air_quality/config_flow.py index 67d3bf4fbbdb..c7b5235f989c 100644 --- a/homeassistant/components/google_air_quality/config_flow.py +++ b/homeassistant/components/google_air_quality/config_flow.py @@ -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" diff --git a/homeassistant/components/google_air_quality/coordinator.py b/homeassistant/components/google_air_quality/coordinator.py index 9daaf21ae9e2..2c22214ebb1c 100644 --- a/homeassistant/components/google_air_quality/coordinator.py +++ b/homeassistant/components/google_air_quality/coordinator.py @@ -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( diff --git a/homeassistant/components/google_air_quality/manifest.json b/homeassistant/components/google_air_quality/manifest.json index 66845cd4b689..22789aceb926 100644 --- a/homeassistant/components/google_air_quality/manifest.json +++ b/homeassistant/components/google_air_quality/manifest.json @@ -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"] } diff --git a/homeassistant/components/google_air_quality/sensor.py b/homeassistant/components/google_air_quality/sensor.py index 7d72edf57aee..c48d6771976d 100644 --- a/homeassistant/components/google_air_quality/sensor.py +++ b/homeassistant/components/google_air_quality/sensor.py @@ -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, ...] = ( diff --git a/requirements_all.txt b/requirements_all.txt index 104814f69a54..1115ee7f2785 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -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 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index b980bdaf184e..d83c8f11bd1c 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -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 diff --git a/tests/components/google_air_quality/conftest.py b/tests/components/google_air_quality/conftest.py index 899301e7f57b..0153860d1584 100644 --- a/tests/components/google_air_quality/conftest.py +++ b/tests/components/google_air_quality/conftest.py @@ -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 diff --git a/tests/components/google_air_quality/test_config_flow.py b/tests/components/google_air_quality/test_config_flow.py index a8aad84d5aa4..4ab2dc707abe 100644 --- a/tests/components/google_air_quality/test_config_flow.py +++ b/tests/components/google_air_quality/test_config_flow.py @@ -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 diff --git a/tests/components/google_air_quality/test_init.py b/tests/components/google_air_quality/test_init.py index 777180384ac3..5f0053071c55 100644 --- a/tests/components/google_air_quality/test_init.py +++ b/tests/components/google_air_quality/test_init.py @@ -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)