Bump pydantic to 2.10.3 and update required deps (#131963)

This commit is contained in:
J. Nick Koston 2024-12-10 18:27:40 +01:00 committed by GitHub
parent f99239538c
commit d2303eb83f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
21 changed files with 48 additions and 77 deletions

View File

@ -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 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) - name: Build wheels (part 1)
uses: home-assistant/wheels@2024.11.0 uses: home-assistant/wheels@2024.11.0
with: with:

View File

@ -6,5 +6,5 @@
"documentation": "https://www.home-assistant.io/integrations/aussie_broadband", "documentation": "https://www.home-assistant.io/integrations/aussie_broadband",
"iot_class": "cloud_polling", "iot_class": "cloud_polling",
"loggers": ["aussiebb"], "loggers": ["aussiebb"],
"requirements": ["pyaussiebb==0.0.15"] "requirements": ["pyaussiebb==0.1.4"]
} }

View File

@ -137,7 +137,7 @@ VALID_MEDIA_TYPES: Final[tuple] = (
# Fallback sources to use in case of API failure. # Fallback sources to use in case of API failure.
FALLBACK_SOURCES: Final[SourceArray] = SourceArray( FALLBACK_SOURCES: Final[SourceArray] = SourceArray(
items=[ items=[
Source( Source( # type: ignore[call-arg]
id="uriStreamer", id="uriStreamer",
is_enabled=True, is_enabled=True,
is_playable=True, is_playable=True,
@ -145,7 +145,7 @@ FALLBACK_SOURCES: Final[SourceArray] = SourceArray(
type=SourceTypeEnum(value="uriStreamer"), type=SourceTypeEnum(value="uriStreamer"),
is_seekable=False, is_seekable=False,
), ),
Source( Source( # type: ignore[call-arg]
id="bluetooth", id="bluetooth",
is_enabled=True, is_enabled=True,
is_playable=True, is_playable=True,
@ -153,7 +153,7 @@ FALLBACK_SOURCES: Final[SourceArray] = SourceArray(
type=SourceTypeEnum(value="bluetooth"), type=SourceTypeEnum(value="bluetooth"),
is_seekable=False, is_seekable=False,
), ),
Source( Source( # type: ignore[call-arg]
id="spotify", id="spotify",
is_enabled=True, is_enabled=True,
is_playable=True, is_playable=True,
@ -161,7 +161,7 @@ FALLBACK_SOURCES: Final[SourceArray] = SourceArray(
type=SourceTypeEnum(value="spotify"), type=SourceTypeEnum(value="spotify"),
is_seekable=True, is_seekable=True,
), ),
Source( Source( # type: ignore[call-arg]
id="lineIn", id="lineIn",
is_enabled=True, is_enabled=True,
is_playable=True, is_playable=True,
@ -169,7 +169,7 @@ FALLBACK_SOURCES: Final[SourceArray] = SourceArray(
type=SourceTypeEnum(value="lineIn"), type=SourceTypeEnum(value="lineIn"),
is_seekable=False, is_seekable=False,
), ),
Source( Source( # type: ignore[call-arg]
id="spdif", id="spdif",
is_enabled=True, is_enabled=True,
is_playable=True, is_playable=True,
@ -177,7 +177,7 @@ FALLBACK_SOURCES: Final[SourceArray] = SourceArray(
type=SourceTypeEnum(value="spdif"), type=SourceTypeEnum(value="spdif"),
is_seekable=False, is_seekable=False,
), ),
Source( Source( # type: ignore[call-arg]
id="netRadio", id="netRadio",
is_enabled=True, is_enabled=True,
is_playable=True, is_playable=True,
@ -185,7 +185,7 @@ FALLBACK_SOURCES: Final[SourceArray] = SourceArray(
type=SourceTypeEnum(value="netRadio"), type=SourceTypeEnum(value="netRadio"),
is_seekable=False, is_seekable=False,
), ),
Source( Source( # type: ignore[call-arg]
id="deezer", id="deezer",
is_enabled=True, is_enabled=True,
is_playable=True, is_playable=True,
@ -193,7 +193,7 @@ FALLBACK_SOURCES: Final[SourceArray] = SourceArray(
type=SourceTypeEnum(value="deezer"), type=SourceTypeEnum(value="deezer"),
is_seekable=True, is_seekable=True,
), ),
Source( Source( # type: ignore[call-arg]
id="tidalConnect", id="tidalConnect",
is_enabled=True, is_enabled=True,
is_playable=True, is_playable=True,

View File

@ -42,7 +42,7 @@ class BangOlufsenBase:
# Objects that get directly updated by notifications. # Objects that get directly updated by notifications.
self._playback_metadata: PlaybackContentMetadata = PlaybackContentMetadata() 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_source: Source = Source()
self._playback_state: RenderingState = RenderingState() self._playback_state: RenderingState = RenderingState()
self._source_change: Source = Source() self._source_change: Source = Source()

View File

@ -210,9 +210,9 @@ class BangOlufsenMediaPlayer(BangOlufsenEntity, MediaPlayerEntity):
# Misc. variables. # Misc. variables.
self._audio_sources: dict[str, str] = {} self._audio_sources: dict[str, str] = {}
self._media_image: Art = Art() self._media_image: Art = Art()
self._software_status: SoftwareUpdateStatus = SoftwareUpdateStatus( self._software_status: SoftwareUpdateStatus = SoftwareUpdateStatus( # type: ignore[call-arg]
software_version="", 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._sources: dict[str, str] = {}
self._state: str = MediaPlayerState.IDLE self._state: str = MediaPlayerState.IDLE
@ -896,9 +896,9 @@ class BangOlufsenMediaPlayer(BangOlufsenEntity, MediaPlayerEntity):
elif media_type == BangOlufsenMediaType.RADIO: elif media_type == BangOlufsenMediaType.RADIO:
await self._client.run_provided_scene( await self._client.run_provided_scene(
scene_properties=SceneProperties( scene_properties=SceneProperties( # type: ignore[call-arg]
action_list=[ action_list=[
Action( Action( # type: ignore[call-arg]
type="radio", type="radio",
radio_station_id=media_id, radio_station_id=media_id,
) )
@ -919,7 +919,7 @@ class BangOlufsenMediaPlayer(BangOlufsenEntity, MediaPlayerEntity):
deezer_id = kwargs[ATTR_MEDIA_EXTRA]["id"] deezer_id = kwargs[ATTR_MEDIA_EXTRA]["id"]
await self._client.start_deezer_flow( 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. # Play a playlist or album.
@ -929,7 +929,7 @@ class BangOlufsenMediaPlayer(BangOlufsenEntity, MediaPlayerEntity):
start_from = kwargs[ATTR_MEDIA_EXTRA]["start_from"] start_from = kwargs[ATTR_MEDIA_EXTRA]["start_from"]
await self._client.add_to_queue( await self._client.add_to_queue(
play_queue_item=PlayQueueItem( play_queue_item=PlayQueueItem( # type: ignore[call-arg]
provider=PlayQueueItemType(value=media_type), provider=PlayQueueItemType(value=media_type),
start_now_from_position=start_from, start_now_from_position=start_from,
type="playlist", type="playlist",
@ -940,7 +940,7 @@ class BangOlufsenMediaPlayer(BangOlufsenEntity, MediaPlayerEntity):
# Play a track. # Play a track.
else: else:
await self._client.add_to_queue( await self._client.add_to_queue(
play_queue_item=PlayQueueItem( play_queue_item=PlayQueueItem( # type: ignore[call-arg]
provider=PlayQueueItemType(value=media_type), provider=PlayQueueItemType(value=media_type),
start_now_from_position=0, start_now_from_position=0,
type="track", type="track",

View File

@ -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: elif EVENT_START_DATETIME in call.data and EVENT_END_DATETIME in call.data:
start_dt = call.data[EVENT_START_DATETIME] start_dt = call.data[EVENT_START_DATETIME]
end_dt = call.data[EVENT_END_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) 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: if start is None or end is None:
raise ValueError( raise ValueError(

View File

@ -272,7 +272,7 @@ async def async_setup_entry(
entity_description.search, entity_description.search,
) )
else: else:
request_template = SyncEventsRequest( request_template = SyncEventsRequest( # type: ignore[call-arg]
calendar_id=calendar_id, calendar_id=calendar_id,
start_time=dt_util.now() + SYNC_EVENT_MIN_TIME, start_time=dt_util.now() + SYNC_EVENT_MIN_TIME,
) )
@ -437,11 +437,11 @@ class GoogleCalendarEntity(
start: DateOrDatetime start: DateOrDatetime
end: DateOrDatetime end: DateOrDatetime
if isinstance(dtstart, datetime): if isinstance(dtstart, datetime):
start = DateOrDatetime( start = DateOrDatetime( # type: ignore[call-arg]
date_time=dt_util.as_local(dtstart), date_time=dt_util.as_local(dtstart),
timezone=str(dt_util.get_default_time_zone()), timezone=str(dt_util.get_default_time_zone()),
) )
end = DateOrDatetime( end = DateOrDatetime( # type: ignore[call-arg]
date_time=dt_util.as_local(dtend), date_time=dt_util.as_local(dtend),
timezone=str(dt_util.get_default_time_zone()), 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: elif EVENT_START_DATETIME in call.data and EVENT_END_DATETIME in call.data:
start_dt = call.data[EVENT_START_DATETIME] start_dt = call.data[EVENT_START_DATETIME]
end_dt = call.data[EVENT_END_DATETIME] end_dt = call.data[EVENT_END_DATETIME]
start = DateOrDatetime(date_time=start_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)) end = DateOrDatetime(date_time=end_dt, timezone=str(hass.config.time_zone)) # type: ignore[call-arg]
if start is None or end is None: if start is None or end is None:
raise ValueError("Missing required fields to set start or end date/datetime") raise ValueError("Missing required fields to set start or end date/datetime")

View File

@ -131,7 +131,7 @@ class CalendarQueryUpdateCoordinator(DataUpdateCoordinator[list[Event]]):
self, start_date: datetime, end_date: datetime self, start_date: datetime, end_date: datetime
) -> Iterable[Event]: ) -> Iterable[Event]:
"""Get all events in a specific time frame.""" """Get all events in a specific time frame."""
request = ListEventsRequest( request = ListEventsRequest( # type: ignore[call-arg]
calendar_id=self.calendar_id, calendar_id=self.calendar_id,
start_time=start_date, start_time=start_date,
end_time=end_date, end_time=end_date,
@ -149,7 +149,7 @@ class CalendarQueryUpdateCoordinator(DataUpdateCoordinator[list[Event]]):
async def _async_update_data(self) -> list[Event]: async def _async_update_data(self) -> list[Event]:
"""Fetch data from API endpoint.""" """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: try:
result = await self.calendar_service.async_list_events(request) result = await self.calendar_service.async_list_events(request)
except ApiException as err: except ApiException as err:

View File

@ -37,7 +37,7 @@ async def async_get_config_entry_diagnostics(
return async_redact_data( return async_redact_data(
{ {
"entry": entry.as_dict(), "entry": entry.as_dict(),
"data": coordinator.data.dict(), "data": coordinator.data.dict(), # type: ignore[deprecated]
}, },
TO_REDACT, TO_REDACT,
) )

View File

@ -5,5 +5,5 @@
"config_flow": true, "config_flow": true,
"documentation": "https://www.home-assistant.io/integrations/purpleair", "documentation": "https://www.home-assistant.io/integrations/purpleair",
"iot_class": "cloud_polling", "iot_class": "cloud_polling",
"requirements": ["aiopurpleair==2022.12.1"] "requirements": ["aiopurpleair==2023.12.0"]
} }

View File

@ -6,7 +6,7 @@ import asyncio
import functools import functools
from typing import Any, cast from typing import Any, cast
from pydantic import ValidationError from pydantic.v1 import ValidationError
from uiprotect.api import ProtectApiClient from uiprotect.api import ProtectApiClient
from uiprotect.data import Camera, Chime from uiprotect.data import Camera, Chime
from uiprotect.exceptions import ClientError from uiprotect.exceptions import ClientError

View File

@ -6,5 +6,5 @@
"dependencies": ["auth", "application_credentials"], "dependencies": ["auth", "application_credentials"],
"documentation": "https://www.home-assistant.io/integrations/xbox", "documentation": "https://www.home-assistant.io/integrations/xbox",
"iot_class": "cloud_polling", "iot_class": "cloud_polling",
"requirements": ["xbox-webapi==2.0.11"] "requirements": ["xbox-webapi==2.1.0"]
} }

View File

@ -5,7 +5,7 @@ from __future__ import annotations
from collections.abc import Callable from collections.abc import Callable
import functools import functools
from pydantic import ValidationError from pydantic.v1 import ValidationError
import voluptuous as vol import voluptuous as vol
from zwave_js_server.client import Client from zwave_js_server.client import Client
from zwave_js_server.model.controller import CONTROLLER_EVENT_MODEL_MAP from zwave_js_server.model.controller import CONTROLLER_EVENT_MODEL_MAP

View File

@ -125,9 +125,8 @@ multidict>=6.0.2
# Version 2.0 added typing, prevent accidental fallbacks # Version 2.0 added typing, prevent accidental fallbacks
backoff>=2.0 backoff>=2.0
# Required to avoid breaking (#101042). # ensure pydantic version does not float since it might have breaking changes
# v2 has breaking changes (#99218). pydantic==2.10.3
pydantic==1.10.19
# Required for Python 3.12.4 compatibility (#119223). # Required for Python 3.12.4 compatibility (#119223).
mashumaro>=3.13.1 mashumaro>=3.13.1

View File

@ -328,7 +328,7 @@ aiopegelonline==0.1.0
aiopulse==0.4.6 aiopulse==0.4.6
# homeassistant.components.purpleair # homeassistant.components.purpleair
aiopurpleair==2022.12.1 aiopurpleair==2023.12.0
# homeassistant.components.hunterdouglas_powerview # homeassistant.components.hunterdouglas_powerview
aiopvapi==3.1.1 aiopvapi==3.1.1
@ -1781,7 +1781,7 @@ pyatmo==8.1.0
pyatv==0.16.0 pyatv==0.16.0
# homeassistant.components.aussie_broadband # homeassistant.components.aussie_broadband
pyaussiebb==0.0.15 pyaussiebb==0.1.4
# homeassistant.components.balboa # homeassistant.components.balboa
pybalboa==1.0.2 pybalboa==1.0.2
@ -3020,7 +3020,7 @@ wolf-comm==0.0.15
wyoming==1.5.4 wyoming==1.5.4
# homeassistant.components.xbox # homeassistant.components.xbox
xbox-webapi==2.0.11 xbox-webapi==2.1.0
# homeassistant.components.xiaomi_ble # homeassistant.components.xiaomi_ble
xiaomi-ble==0.33.0 xiaomi-ble==0.33.0

View File

@ -14,7 +14,7 @@ license-expression==30.4.0
mock-open==1.4.0 mock-open==1.4.0
mypy-dev==1.14.0a6 mypy-dev==1.14.0a6
pre-commit==4.0.0 pre-commit==4.0.0
pydantic==1.10.19 pydantic==2.10.3
pylint==3.3.2 pylint==3.3.2
pylint-per-file-ignores==1.3.2 pylint-per-file-ignores==1.3.2
pipdeptree==2.23.4 pipdeptree==2.23.4

View File

@ -310,7 +310,7 @@ aiopegelonline==0.1.0
aiopulse==0.4.6 aiopulse==0.4.6
# homeassistant.components.purpleair # homeassistant.components.purpleair
aiopurpleair==2022.12.1 aiopurpleair==2023.12.0
# homeassistant.components.hunterdouglas_powerview # homeassistant.components.hunterdouglas_powerview
aiopvapi==3.1.1 aiopvapi==3.1.1
@ -1455,7 +1455,7 @@ pyatmo==8.1.0
pyatv==0.16.0 pyatv==0.16.0
# homeassistant.components.aussie_broadband # homeassistant.components.aussie_broadband
pyaussiebb==0.0.15 pyaussiebb==0.1.4
# homeassistant.components.balboa # homeassistant.components.balboa
pybalboa==1.0.2 pybalboa==1.0.2
@ -2415,7 +2415,7 @@ wolf-comm==0.0.15
wyoming==1.5.4 wyoming==1.5.4
# homeassistant.components.xbox # homeassistant.components.xbox
xbox-webapi==2.0.11 xbox-webapi==2.1.0
# homeassistant.components.xiaomi_ble # homeassistant.components.xiaomi_ble
xiaomi-ble==0.33.0 xiaomi-ble==0.33.0

View File

@ -158,9 +158,8 @@ multidict>=6.0.2
# Version 2.0 added typing, prevent accidental fallbacks # Version 2.0 added typing, prevent accidental fallbacks
backoff>=2.0 backoff>=2.0
# Required to avoid breaking (#101042). # ensure pydantic version does not float since it might have breaking changes
# v2 has breaking changes (#99218). pydantic==2.10.3
pydantic==1.10.19
# Required for Python 3.12.4 compatibility (#119223). # Required for Python 3.12.4 compatibility (#119223).
mashumaro>=3.13.1 mashumaro>=3.13.1

View File

@ -30,7 +30,7 @@ async def test_form(hass: HomeAssistant, mock_setup_entry: AsyncMock) -> None:
), ),
patch( patch(
"lacrosse_view.LaCrosse.get_locations", "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( result2 = await hass.config_entries.flow.async_configure(
@ -206,7 +206,7 @@ async def test_already_configured_device(
), ),
patch( patch(
"lacrosse_view.LaCrosse.get_locations", "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( 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.login", return_value=True),
patch( patch(
"lacrosse_view.LaCrosse.get_locations", "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( result2 = await hass.config_entries.flow.async_configure(

View File

@ -39,7 +39,7 @@ async def test_sensor_available(
"peco.PecoOutageApi.get_outage_totals", "peco.PecoOutageApi.get_outage_totals",
return_value=OutageResults( return_value=OutageResults(
customers_out=123, customers_out=123,
percent_customers_out=15.589, percent_customers_out=15,
outage_count=456, outage_count=456,
customers_served=789, customers_served=789,
), ),
@ -74,7 +74,7 @@ async def test_sensor_available(
"peco.PecoOutageApi.get_outage_count", "peco.PecoOutageApi.get_outage_count",
return_value=OutageResults( return_value=OutageResults(
customers_out=123, customers_out=123,
percent_customers_out=15.589, percent_customers_out=15,
outage_count=456, outage_count=456,
customers_served=789, customers_served=789,
), ),

View File

@ -4,7 +4,7 @@
'attributes': ReadOnlyDict({ 'attributes': ReadOnlyDict({
'entity_picture': 'https://i.ytimg.com/vi/wysukDrMdqU/maxresdefault.jpg', 'entity_picture': 'https://i.ytimg.com/vi/wysukDrMdqU/maxresdefault.jpg',
'friendly_name': 'Google for Developers Latest upload', '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', 'video_id': 'wysukDrMdqU',
}), }),
'context': <ANY>, 'context': <ANY>,