From d2303eb83fab7ded60659b1951191b11078ff400 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 10 Dec 2024 18:27:40 +0100 Subject: [PATCH] Bump pydantic to 2.10.3 and update required deps (#131963) --- .github/workflows/wheels.yml | 27 ------------------- .../components/aussie_broadband/manifest.json | 2 +- .../components/bang_olufsen/const.py | 16 +++++------ .../components/bang_olufsen/entity.py | 2 +- .../components/bang_olufsen/media_player.py | 14 +++++----- homeassistant/components/google/__init__.py | 4 +-- homeassistant/components/google/calendar.py | 10 +++---- .../components/google/coordinator.py | 4 +-- .../components/purpleair/diagnostics.py | 2 +- .../components/purpleair/manifest.json | 2 +- .../components/unifiprotect/services.py | 2 +- homeassistant/components/xbox/manifest.json | 2 +- .../components/zwave_js/triggers/event.py | 2 +- homeassistant/package_constraints.txt | 5 ++-- requirements_all.txt | 6 ++--- requirements_test.txt | 2 +- requirements_test_all.txt | 6 ++--- script/gen_requirements_all.py | 5 ++-- .../lacrosse_view/test_config_flow.py | 6 ++--- tests/components/peco/test_sensor.py | 4 +-- .../youtube/snapshots/test_sensor.ambr | 2 +- 21 files changed, 48 insertions(+), 77 deletions(-) diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml index 749f95fa922..a36b3073aab 100644 --- a/.github/workflows/wheels.yml +++ b/.github/workflows/wheels.yml @@ -197,33 +197,6 @@ jobs: split -l $(expr $(expr $(cat requirements_all.txt | wc -l) + 1) / 3) requirements_all_wheels_${{ matrix.arch }}.txt requirements_all.txt - - name: Create requirements for cython<3 - if: matrix.abi == 'cp312' - run: | - # Some dependencies still require 'cython<3' - # and don't yet use isolated build environments. - # Build these first. - # pydantic: https://github.com/pydantic/pydantic/issues/7689 - - touch requirements_old-cython.txt - cat homeassistant/package_constraints.txt | grep 'pydantic==' >> requirements_old-cython.txt - - - name: Build wheels (old cython) - uses: home-assistant/wheels@2024.11.0 - if: matrix.abi == 'cp312' - with: - abi: ${{ matrix.abi }} - tag: musllinux_1_2 - arch: ${{ matrix.arch }} - wheels-key: ${{ secrets.WHEELS_KEY }} - env-file: true - apk: "bluez-dev;libffi-dev;openssl-dev;glib-dev;eudev-dev;libxml2-dev;libxslt-dev;libpng-dev;libjpeg-turbo-dev;tiff-dev;cups-dev;gmp-dev;mpfr-dev;mpc1-dev;ffmpeg-dev;gammu-dev;yaml-dev;openblas-dev;fftw-dev;lapack-dev;gfortran;blas-dev;eigen-dev;freetype-dev;glew-dev;harfbuzz-dev;hdf5-dev;libdc1394-dev;libtbb-dev;mesa-dev;openexr-dev;openjpeg-dev;uchardet-dev" - skip-binary: aiohttp;charset-normalizer;grpcio;multidict;SQLAlchemy;propcache;protobuf;pydantic;pymicro-vad;yarl - constraints: "homeassistant/package_constraints.txt" - requirements-diff: "requirements_diff.txt" - requirements: "requirements_old-cython.txt" - pip: "'cython<3'" - - name: Build wheels (part 1) uses: home-assistant/wheels@2024.11.0 with: diff --git a/homeassistant/components/aussie_broadband/manifest.json b/homeassistant/components/aussie_broadband/manifest.json index 877a46a3650..456b8962461 100644 --- a/homeassistant/components/aussie_broadband/manifest.json +++ b/homeassistant/components/aussie_broadband/manifest.json @@ -6,5 +6,5 @@ "documentation": "https://www.home-assistant.io/integrations/aussie_broadband", "iot_class": "cloud_polling", "loggers": ["aussiebb"], - "requirements": ["pyaussiebb==0.0.15"] + "requirements": ["pyaussiebb==0.1.4"] } diff --git a/homeassistant/components/bang_olufsen/const.py b/homeassistant/components/bang_olufsen/const.py index 9f0649e610b..7f87ce11097 100644 --- a/homeassistant/components/bang_olufsen/const.py +++ b/homeassistant/components/bang_olufsen/const.py @@ -137,7 +137,7 @@ VALID_MEDIA_TYPES: Final[tuple] = ( # Fallback sources to use in case of API failure. FALLBACK_SOURCES: Final[SourceArray] = SourceArray( items=[ - Source( + Source( # type: ignore[call-arg] id="uriStreamer", is_enabled=True, is_playable=True, @@ -145,7 +145,7 @@ FALLBACK_SOURCES: Final[SourceArray] = SourceArray( type=SourceTypeEnum(value="uriStreamer"), is_seekable=False, ), - Source( + Source( # type: ignore[call-arg] id="bluetooth", is_enabled=True, is_playable=True, @@ -153,7 +153,7 @@ FALLBACK_SOURCES: Final[SourceArray] = SourceArray( type=SourceTypeEnum(value="bluetooth"), is_seekable=False, ), - Source( + Source( # type: ignore[call-arg] id="spotify", is_enabled=True, is_playable=True, @@ -161,7 +161,7 @@ FALLBACK_SOURCES: Final[SourceArray] = SourceArray( type=SourceTypeEnum(value="spotify"), is_seekable=True, ), - Source( + Source( # type: ignore[call-arg] id="lineIn", is_enabled=True, is_playable=True, @@ -169,7 +169,7 @@ FALLBACK_SOURCES: Final[SourceArray] = SourceArray( type=SourceTypeEnum(value="lineIn"), is_seekable=False, ), - Source( + Source( # type: ignore[call-arg] id="spdif", is_enabled=True, is_playable=True, @@ -177,7 +177,7 @@ FALLBACK_SOURCES: Final[SourceArray] = SourceArray( type=SourceTypeEnum(value="spdif"), is_seekable=False, ), - Source( + Source( # type: ignore[call-arg] id="netRadio", is_enabled=True, is_playable=True, @@ -185,7 +185,7 @@ FALLBACK_SOURCES: Final[SourceArray] = SourceArray( type=SourceTypeEnum(value="netRadio"), is_seekable=False, ), - Source( + Source( # type: ignore[call-arg] id="deezer", is_enabled=True, is_playable=True, @@ -193,7 +193,7 @@ FALLBACK_SOURCES: Final[SourceArray] = SourceArray( type=SourceTypeEnum(value="deezer"), is_seekable=True, ), - Source( + Source( # type: ignore[call-arg] id="tidalConnect", is_enabled=True, is_playable=True, diff --git a/homeassistant/components/bang_olufsen/entity.py b/homeassistant/components/bang_olufsen/entity.py index 8ed68da1678..77fe7c6a1ff 100644 --- a/homeassistant/components/bang_olufsen/entity.py +++ b/homeassistant/components/bang_olufsen/entity.py @@ -42,7 +42,7 @@ class BangOlufsenBase: # Objects that get directly updated by notifications. self._playback_metadata: PlaybackContentMetadata = PlaybackContentMetadata() - self._playback_progress: PlaybackProgress = PlaybackProgress(total_duration=0) + self._playback_progress: PlaybackProgress = PlaybackProgress(total_duration=0) # type: ignore[call-arg] self._playback_source: Source = Source() self._playback_state: RenderingState = RenderingState() self._source_change: Source = Source() diff --git a/homeassistant/components/bang_olufsen/media_player.py b/homeassistant/components/bang_olufsen/media_player.py index 282ecdd2ae5..d8b7a1bf940 100644 --- a/homeassistant/components/bang_olufsen/media_player.py +++ b/homeassistant/components/bang_olufsen/media_player.py @@ -210,9 +210,9 @@ class BangOlufsenMediaPlayer(BangOlufsenEntity, MediaPlayerEntity): # Misc. variables. self._audio_sources: dict[str, str] = {} self._media_image: Art = Art() - self._software_status: SoftwareUpdateStatus = SoftwareUpdateStatus( + self._software_status: SoftwareUpdateStatus = SoftwareUpdateStatus( # type: ignore[call-arg] software_version="", - state=SoftwareUpdateState(seconds_remaining=0, value="idle"), + state=SoftwareUpdateState(seconds_remaining=0, value="idle"), # type: ignore[call-arg] ) self._sources: dict[str, str] = {} self._state: str = MediaPlayerState.IDLE @@ -896,9 +896,9 @@ class BangOlufsenMediaPlayer(BangOlufsenEntity, MediaPlayerEntity): elif media_type == BangOlufsenMediaType.RADIO: await self._client.run_provided_scene( - scene_properties=SceneProperties( + scene_properties=SceneProperties( # type: ignore[call-arg] action_list=[ - Action( + Action( # type: ignore[call-arg] type="radio", radio_station_id=media_id, ) @@ -919,7 +919,7 @@ class BangOlufsenMediaPlayer(BangOlufsenEntity, MediaPlayerEntity): deezer_id = kwargs[ATTR_MEDIA_EXTRA]["id"] await self._client.start_deezer_flow( - user_flow=UserFlow(user_id=deezer_id) + user_flow=UserFlow(user_id=deezer_id) # type: ignore[call-arg] ) # Play a playlist or album. @@ -929,7 +929,7 @@ class BangOlufsenMediaPlayer(BangOlufsenEntity, MediaPlayerEntity): start_from = kwargs[ATTR_MEDIA_EXTRA]["start_from"] await self._client.add_to_queue( - play_queue_item=PlayQueueItem( + play_queue_item=PlayQueueItem( # type: ignore[call-arg] provider=PlayQueueItemType(value=media_type), start_now_from_position=start_from, type="playlist", @@ -940,7 +940,7 @@ class BangOlufsenMediaPlayer(BangOlufsenEntity, MediaPlayerEntity): # Play a track. else: await self._client.add_to_queue( - play_queue_item=PlayQueueItem( + play_queue_item=PlayQueueItem( # type: ignore[call-arg] provider=PlayQueueItemType(value=media_type), start_now_from_position=0, type="track", diff --git a/homeassistant/components/google/__init__.py b/homeassistant/components/google/__init__.py index 2ad400aabab..1d204883579 100644 --- a/homeassistant/components/google/__init__.py +++ b/homeassistant/components/google/__init__.py @@ -277,10 +277,10 @@ async def async_setup_add_event_service( elif EVENT_START_DATETIME in call.data and EVENT_END_DATETIME in call.data: start_dt = call.data[EVENT_START_DATETIME] end_dt = call.data[EVENT_END_DATETIME] - start = DateOrDatetime( + start = DateOrDatetime( # type: ignore[call-arg] date_time=start_dt, timezone=str(hass.config.time_zone) ) - end = DateOrDatetime(date_time=end_dt, timezone=str(hass.config.time_zone)) + end = DateOrDatetime(date_time=end_dt, timezone=str(hass.config.time_zone)) # type: ignore[call-arg] if start is None or end is None: raise ValueError( diff --git a/homeassistant/components/google/calendar.py b/homeassistant/components/google/calendar.py index 5ac5dae616c..045e0e31b46 100644 --- a/homeassistant/components/google/calendar.py +++ b/homeassistant/components/google/calendar.py @@ -272,7 +272,7 @@ async def async_setup_entry( entity_description.search, ) else: - request_template = SyncEventsRequest( + request_template = SyncEventsRequest( # type: ignore[call-arg] calendar_id=calendar_id, start_time=dt_util.now() + SYNC_EVENT_MIN_TIME, ) @@ -437,11 +437,11 @@ class GoogleCalendarEntity( start: DateOrDatetime end: DateOrDatetime if isinstance(dtstart, datetime): - start = DateOrDatetime( + start = DateOrDatetime( # type: ignore[call-arg] date_time=dt_util.as_local(dtstart), timezone=str(dt_util.get_default_time_zone()), ) - end = DateOrDatetime( + end = DateOrDatetime( # type: ignore[call-arg] date_time=dt_util.as_local(dtend), timezone=str(dt_util.get_default_time_zone()), ) @@ -543,8 +543,8 @@ async def async_create_event(entity: GoogleCalendarEntity, call: ServiceCall) -> elif EVENT_START_DATETIME in call.data and EVENT_END_DATETIME in call.data: start_dt = call.data[EVENT_START_DATETIME] end_dt = call.data[EVENT_END_DATETIME] - start = DateOrDatetime(date_time=start_dt, timezone=str(hass.config.time_zone)) - end = DateOrDatetime(date_time=end_dt, timezone=str(hass.config.time_zone)) + start = DateOrDatetime(date_time=start_dt, timezone=str(hass.config.time_zone)) # type: ignore[call-arg] + end = DateOrDatetime(date_time=end_dt, timezone=str(hass.config.time_zone)) # type: ignore[call-arg] if start is None or end is None: raise ValueError("Missing required fields to set start or end date/datetime") diff --git a/homeassistant/components/google/coordinator.py b/homeassistant/components/google/coordinator.py index 19198041c05..06f33782479 100644 --- a/homeassistant/components/google/coordinator.py +++ b/homeassistant/components/google/coordinator.py @@ -131,7 +131,7 @@ class CalendarQueryUpdateCoordinator(DataUpdateCoordinator[list[Event]]): self, start_date: datetime, end_date: datetime ) -> Iterable[Event]: """Get all events in a specific time frame.""" - request = ListEventsRequest( + request = ListEventsRequest( # type: ignore[call-arg] calendar_id=self.calendar_id, start_time=start_date, end_time=end_date, @@ -149,7 +149,7 @@ class CalendarQueryUpdateCoordinator(DataUpdateCoordinator[list[Event]]): async def _async_update_data(self) -> list[Event]: """Fetch data from API endpoint.""" - request = ListEventsRequest(calendar_id=self.calendar_id, search=self._search) + request = ListEventsRequest(calendar_id=self.calendar_id, search=self._search) # type: ignore[call-arg] try: result = await self.calendar_service.async_list_events(request) except ApiException as err: diff --git a/homeassistant/components/purpleair/diagnostics.py b/homeassistant/components/purpleair/diagnostics.py index a3b3af857fb..30f1deeb368 100644 --- a/homeassistant/components/purpleair/diagnostics.py +++ b/homeassistant/components/purpleair/diagnostics.py @@ -37,7 +37,7 @@ async def async_get_config_entry_diagnostics( return async_redact_data( { "entry": entry.as_dict(), - "data": coordinator.data.dict(), + "data": coordinator.data.dict(), # type: ignore[deprecated] }, TO_REDACT, ) diff --git a/homeassistant/components/purpleair/manifest.json b/homeassistant/components/purpleair/manifest.json index cf74365d6d8..87cb375c347 100644 --- a/homeassistant/components/purpleair/manifest.json +++ b/homeassistant/components/purpleair/manifest.json @@ -5,5 +5,5 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/purpleair", "iot_class": "cloud_polling", - "requirements": ["aiopurpleair==2022.12.1"] + "requirements": ["aiopurpleair==2023.12.0"] } diff --git a/homeassistant/components/unifiprotect/services.py b/homeassistant/components/unifiprotect/services.py index 119fe52756c..9c045164d6d 100644 --- a/homeassistant/components/unifiprotect/services.py +++ b/homeassistant/components/unifiprotect/services.py @@ -6,7 +6,7 @@ import asyncio import functools from typing import Any, cast -from pydantic import ValidationError +from pydantic.v1 import ValidationError from uiprotect.api import ProtectApiClient from uiprotect.data import Camera, Chime from uiprotect.exceptions import ClientError diff --git a/homeassistant/components/xbox/manifest.json b/homeassistant/components/xbox/manifest.json index 30a6c3bc700..3fc2071e66b 100644 --- a/homeassistant/components/xbox/manifest.json +++ b/homeassistant/components/xbox/manifest.json @@ -6,5 +6,5 @@ "dependencies": ["auth", "application_credentials"], "documentation": "https://www.home-assistant.io/integrations/xbox", "iot_class": "cloud_polling", - "requirements": ["xbox-webapi==2.0.11"] + "requirements": ["xbox-webapi==2.1.0"] } diff --git a/homeassistant/components/zwave_js/triggers/event.py b/homeassistant/components/zwave_js/triggers/event.py index 9938d08408c..db52683c173 100644 --- a/homeassistant/components/zwave_js/triggers/event.py +++ b/homeassistant/components/zwave_js/triggers/event.py @@ -5,7 +5,7 @@ from __future__ import annotations from collections.abc import Callable import functools -from pydantic import ValidationError +from pydantic.v1 import ValidationError import voluptuous as vol from zwave_js_server.client import Client from zwave_js_server.model.controller import CONTROLLER_EVENT_MODEL_MAP diff --git a/homeassistant/package_constraints.txt b/homeassistant/package_constraints.txt index cd45f15fe7c..932c7439336 100644 --- a/homeassistant/package_constraints.txt +++ b/homeassistant/package_constraints.txt @@ -125,9 +125,8 @@ multidict>=6.0.2 # Version 2.0 added typing, prevent accidental fallbacks backoff>=2.0 -# Required to avoid breaking (#101042). -# v2 has breaking changes (#99218). -pydantic==1.10.19 +# ensure pydantic version does not float since it might have breaking changes +pydantic==2.10.3 # Required for Python 3.12.4 compatibility (#119223). mashumaro>=3.13.1 diff --git a/requirements_all.txt b/requirements_all.txt index 3f619ac2e0e..85431a1ec9e 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -328,7 +328,7 @@ aiopegelonline==0.1.0 aiopulse==0.4.6 # homeassistant.components.purpleair -aiopurpleair==2022.12.1 +aiopurpleair==2023.12.0 # homeassistant.components.hunterdouglas_powerview aiopvapi==3.1.1 @@ -1781,7 +1781,7 @@ pyatmo==8.1.0 pyatv==0.16.0 # homeassistant.components.aussie_broadband -pyaussiebb==0.0.15 +pyaussiebb==0.1.4 # homeassistant.components.balboa pybalboa==1.0.2 @@ -3020,7 +3020,7 @@ wolf-comm==0.0.15 wyoming==1.5.4 # homeassistant.components.xbox -xbox-webapi==2.0.11 +xbox-webapi==2.1.0 # homeassistant.components.xiaomi_ble xiaomi-ble==0.33.0 diff --git a/requirements_test.txt b/requirements_test.txt index 06a0fd035d3..50e5957bf96 100644 --- a/requirements_test.txt +++ b/requirements_test.txt @@ -14,7 +14,7 @@ license-expression==30.4.0 mock-open==1.4.0 mypy-dev==1.14.0a6 pre-commit==4.0.0 -pydantic==1.10.19 +pydantic==2.10.3 pylint==3.3.2 pylint-per-file-ignores==1.3.2 pipdeptree==2.23.4 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index bfddb35b041..5cf2a1f3e34 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -310,7 +310,7 @@ aiopegelonline==0.1.0 aiopulse==0.4.6 # homeassistant.components.purpleair -aiopurpleair==2022.12.1 +aiopurpleair==2023.12.0 # homeassistant.components.hunterdouglas_powerview aiopvapi==3.1.1 @@ -1455,7 +1455,7 @@ pyatmo==8.1.0 pyatv==0.16.0 # homeassistant.components.aussie_broadband -pyaussiebb==0.0.15 +pyaussiebb==0.1.4 # homeassistant.components.balboa pybalboa==1.0.2 @@ -2415,7 +2415,7 @@ wolf-comm==0.0.15 wyoming==1.5.4 # homeassistant.components.xbox -xbox-webapi==2.0.11 +xbox-webapi==2.1.0 # homeassistant.components.xiaomi_ble xiaomi-ble==0.33.0 diff --git a/script/gen_requirements_all.py b/script/gen_requirements_all.py index 97ffcac79a4..648798f79c8 100755 --- a/script/gen_requirements_all.py +++ b/script/gen_requirements_all.py @@ -158,9 +158,8 @@ multidict>=6.0.2 # Version 2.0 added typing, prevent accidental fallbacks backoff>=2.0 -# Required to avoid breaking (#101042). -# v2 has breaking changes (#99218). -pydantic==1.10.19 +# ensure pydantic version does not float since it might have breaking changes +pydantic==2.10.3 # Required for Python 3.12.4 compatibility (#119223). mashumaro>=3.13.1 diff --git a/tests/components/lacrosse_view/test_config_flow.py b/tests/components/lacrosse_view/test_config_flow.py index 9ca7fb78bdd..f953d9a3841 100644 --- a/tests/components/lacrosse_view/test_config_flow.py +++ b/tests/components/lacrosse_view/test_config_flow.py @@ -30,7 +30,7 @@ async def test_form(hass: HomeAssistant, mock_setup_entry: AsyncMock) -> None: ), patch( "lacrosse_view.LaCrosse.get_locations", - return_value=[Location(id=1, name="Test")], + return_value=[Location(id="1", name="Test")], ), ): result2 = await hass.config_entries.flow.async_configure( @@ -206,7 +206,7 @@ async def test_already_configured_device( ), patch( "lacrosse_view.LaCrosse.get_locations", - return_value=[Location(id=1, name="Test")], + return_value=[Location(id="1", name="Test")], ), ): result2 = await hass.config_entries.flow.async_configure( @@ -262,7 +262,7 @@ async def test_reauth(hass: HomeAssistant) -> None: patch("lacrosse_view.LaCrosse.login", return_value=True), patch( "lacrosse_view.LaCrosse.get_locations", - return_value=[Location(id=1, name="Test")], + return_value=[Location(id="1", name="Test")], ), ): result2 = await hass.config_entries.flow.async_configure( diff --git a/tests/components/peco/test_sensor.py b/tests/components/peco/test_sensor.py index 9cbef9fa1e6..4c9a3fca104 100644 --- a/tests/components/peco/test_sensor.py +++ b/tests/components/peco/test_sensor.py @@ -39,7 +39,7 @@ async def test_sensor_available( "peco.PecoOutageApi.get_outage_totals", return_value=OutageResults( customers_out=123, - percent_customers_out=15.589, + percent_customers_out=15, outage_count=456, customers_served=789, ), @@ -74,7 +74,7 @@ async def test_sensor_available( "peco.PecoOutageApi.get_outage_count", return_value=OutageResults( customers_out=123, - percent_customers_out=15.589, + percent_customers_out=15, outage_count=456, customers_served=789, ), diff --git a/tests/components/youtube/snapshots/test_sensor.ambr b/tests/components/youtube/snapshots/test_sensor.ambr index dce546b4803..f4549e89c8c 100644 --- a/tests/components/youtube/snapshots/test_sensor.ambr +++ b/tests/components/youtube/snapshots/test_sensor.ambr @@ -4,7 +4,7 @@ 'attributes': ReadOnlyDict({ 'entity_picture': 'https://i.ytimg.com/vi/wysukDrMdqU/maxresdefault.jpg', 'friendly_name': 'Google for Developers Latest upload', - 'published_at': datetime.datetime(2023, 5, 11, 0, 20, 46, tzinfo=datetime.timezone.utc), + 'published_at': datetime.datetime(2023, 5, 11, 0, 20, 46, tzinfo=TzInfo(UTC)), 'video_id': 'wysukDrMdqU', }), 'context': ,