Move ZeroconfServiceInfo to service_info helpers (#135653)

* Move ZeroconfServiceInfo to service_info helpers

* Adjust deprecation date

* Fix mypy/pylint

* Fix DeprecatedConstant

* Add deprecation test

* Adjust

* Also deprecate ATTR_PROPERTIES_ID
This commit is contained in:
epenet 2025-01-15 12:25:42 +01:00 committed by GitHub
parent 650e14379c
commit b046ca9abe
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
38 changed files with 162 additions and 86 deletions

View File

@ -10,10 +10,10 @@ from mozart_api.exceptions import ApiException
from mozart_api.mozart_client import MozartClient from mozart_api.mozart_client import MozartClient
import voluptuous as vol import voluptuous as vol
from homeassistant.components.zeroconf import ZeroconfServiceInfo
from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.config_entries import ConfigFlow, ConfigFlowResult
from homeassistant.const import CONF_HOST, CONF_MODEL from homeassistant.const import CONF_HOST, CONF_MODEL
from homeassistant.helpers.selector import SelectSelector, SelectSelectorConfig from homeassistant.helpers.selector import SelectSelector, SelectSelectorConfig
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from homeassistant.util.ssl import get_default_context from homeassistant.util.ssl import get_default_context
from .const import ( from .const import (

View File

@ -7,12 +7,12 @@ from typing import Any
from brother import Brother, SnmpError, UnsupportedModelError from brother import Brother, SnmpError, UnsupportedModelError
import voluptuous as vol import voluptuous as vol
from homeassistant.components import zeroconf
from homeassistant.components.snmp import async_get_snmp_engine from homeassistant.components.snmp import async_get_snmp_engine
from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.config_entries import ConfigFlow, ConfigFlowResult
from homeassistant.const import CONF_HOST, CONF_TYPE from homeassistant.const import CONF_HOST, CONF_TYPE
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.exceptions import HomeAssistantError from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from homeassistant.util.network import is_host_valid from homeassistant.util.network import is_host_valid
from .const import DOMAIN, PRINTER_TYPES from .const import DOMAIN, PRINTER_TYPES
@ -83,7 +83,7 @@ class BrotherConfigFlow(ConfigFlow, domain=DOMAIN):
) )
async def async_step_zeroconf( async def async_step_zeroconf(
self, discovery_info: zeroconf.ZeroconfServiceInfo self, discovery_info: ZeroconfServiceInfo
) -> ConfigFlowResult: ) -> ConfigFlowResult:
"""Handle zeroconf discovery.""" """Handle zeroconf discovery."""
self.host = discovery_info.host self.host = discovery_info.host

View File

@ -10,11 +10,11 @@ from eheimdigital.device import EheimDigitalDevice
from eheimdigital.hub import EheimDigitalHub from eheimdigital.hub import EheimDigitalHub
import voluptuous as vol import voluptuous as vol
from homeassistant.components.zeroconf import ZeroconfServiceInfo
from homeassistant.config_entries import SOURCE_USER, ConfigFlow, ConfigFlowResult from homeassistant.config_entries import SOURCE_USER, ConfigFlow, ConfigFlowResult
from homeassistant.const import CONF_HOST from homeassistant.const import CONF_HOST
from homeassistant.helpers import selector from homeassistant.helpers import selector
from homeassistant.helpers.aiohttp_client import async_get_clientsession from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from .const import DOMAIN, LOGGER from .const import DOMAIN, LOGGER

View File

@ -12,9 +12,9 @@ from elmax_api.model.panel import PanelEntry, PanelStatus
import httpx import httpx
import voluptuous as vol import voluptuous as vol
from homeassistant.components.zeroconf import ZeroconfServiceInfo
from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.config_entries import ConfigFlow, ConfigFlowResult
from homeassistant.exceptions import HomeAssistantError from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from .common import ( from .common import (
build_direct_ssl_context, build_direct_ssl_context,

View File

@ -8,7 +8,6 @@ from typing import Any
from pykodi import CannotConnectError, InvalidAuthError, Kodi, get_kodi_connection from pykodi import CannotConnectError, InvalidAuthError, Kodi, get_kodi_connection
import voluptuous as vol import voluptuous as vol
from homeassistant.components import zeroconf
from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.config_entries import ConfigFlow, ConfigFlowResult
from homeassistant.const import ( from homeassistant.const import (
CONF_HOST, CONF_HOST,
@ -22,6 +21,7 @@ from homeassistant.const import (
from homeassistant.core import HomeAssistant, callback from homeassistant.core import HomeAssistant, callback
from homeassistant.exceptions import HomeAssistantError from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers.aiohttp_client import async_get_clientsession from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from .const import ( from .const import (
CONF_WS_PORT, CONF_WS_PORT,
@ -103,7 +103,7 @@ class KodiConfigFlow(ConfigFlow, domain=DOMAIN):
self._discovery_name: str | None = None self._discovery_name: str | None = None
async def async_step_zeroconf( async def async_step_zeroconf(
self, discovery_info: zeroconf.ZeroconfServiceInfo self, discovery_info: ZeroconfServiceInfo
) -> ConfigFlowResult: ) -> ConfigFlowResult:
"""Handle zeroconf discovery.""" """Handle zeroconf discovery."""
self._host = discovery_info.host self._host = discovery_info.host

View File

@ -7,7 +7,6 @@ from typing import Any
from lektricowifi import Device, DeviceConnectionError from lektricowifi import Device, DeviceConnectionError
import voluptuous as vol import voluptuous as vol
from homeassistant.components.zeroconf import ZeroconfServiceInfo
from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.config_entries import ConfigFlow, ConfigFlowResult
from homeassistant.const import ( from homeassistant.const import (
ATTR_HW_VERSION, ATTR_HW_VERSION,
@ -17,6 +16,7 @@ from homeassistant.const import (
) )
from homeassistant.core import callback from homeassistant.core import callback
from homeassistant.helpers.httpx_client import get_async_client from homeassistant.helpers.httpx_client import get_async_client
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from .const import DOMAIN from .const import DOMAIN

View File

@ -11,12 +11,12 @@ from loqedAPI import cloud_loqed, loqed
import voluptuous as vol import voluptuous as vol
from homeassistant.components import webhook from homeassistant.components import webhook
from homeassistant.components.zeroconf import ZeroconfServiceInfo
from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.config_entries import ConfigFlow, ConfigFlowResult
from homeassistant.const import CONF_API_TOKEN, CONF_NAME, CONF_WEBHOOK_ID from homeassistant.const import CONF_API_TOKEN, CONF_NAME, CONF_WEBHOOK_ID
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.exceptions import HomeAssistantError from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers.aiohttp_client import async_get_clientsession from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from .const import DOMAIN from .const import DOMAIN

View File

@ -16,7 +16,6 @@ from homeassistant.components.hassio import (
AddonState, AddonState,
) )
from homeassistant.components.onboarding import async_is_onboarded from homeassistant.components.onboarding import async_is_onboarded
from homeassistant.components.zeroconf import ZeroconfServiceInfo
from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.config_entries import ConfigFlow, ConfigFlowResult
from homeassistant.const import CONF_URL from homeassistant.const import CONF_URL
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
@ -25,6 +24,7 @@ from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers import aiohttp_client from homeassistant.helpers import aiohttp_client
from homeassistant.helpers.hassio import is_hassio from homeassistant.helpers.hassio import is_hassio
from homeassistant.helpers.service_info.hassio import HassioServiceInfo from homeassistant.helpers.service_info.hassio import HassioServiceInfo
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from .addon import get_addon_manager from .addon import get_addon_manager
from .const import ( from .const import (

View File

@ -16,7 +16,6 @@ from plugwise.exceptions import (
) )
import voluptuous as vol import voluptuous as vol
from homeassistant.components.zeroconf import ZeroconfServiceInfo
from homeassistant.config_entries import SOURCE_USER, ConfigFlow, ConfigFlowResult from homeassistant.config_entries import SOURCE_USER, ConfigFlow, ConfigFlowResult
from homeassistant.const import ( from homeassistant.const import (
ATTR_CONFIGURATION_URL, ATTR_CONFIGURATION_URL,
@ -29,6 +28,7 @@ from homeassistant.const import (
) )
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.aiohttp_client import async_get_clientsession from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from .const import ( from .const import (
DEFAULT_PORT, DEFAULT_PORT,

View File

@ -17,7 +17,6 @@ from aioshelly.exceptions import (
from aioshelly.rpc_device import RpcDevice from aioshelly.rpc_device import RpcDevice
import voluptuous as vol import voluptuous as vol
from homeassistant.components.zeroconf import ZeroconfServiceInfo
from homeassistant.config_entries import ( from homeassistant.config_entries import (
ConfigEntry, ConfigEntry,
ConfigFlow, ConfigFlow,
@ -34,6 +33,7 @@ from homeassistant.const import (
from homeassistant.core import HomeAssistant, callback from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.aiohttp_client import async_get_clientsession from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.selector import SelectSelector, SelectSelectorConfig from homeassistant.helpers.selector import SelectSelector, SelectSelectorConfig
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from .const import ( from .const import (
CONF_BLE_SCANNER_MODE, CONF_BLE_SCANNER_MODE,

View File

@ -14,11 +14,11 @@ from goslideapi.goslideapi import (
) )
import voluptuous as vol import voluptuous as vol
from homeassistant.components.zeroconf import ZeroconfServiceInfo
from homeassistant.config_entries import ConfigFlow, ConfigFlowResult, OptionsFlow from homeassistant.config_entries import ConfigFlow, ConfigFlowResult, OptionsFlow
from homeassistant.const import CONF_API_VERSION, CONF_HOST, CONF_MAC, CONF_PASSWORD from homeassistant.const import CONF_API_VERSION, CONF_HOST, CONF_MAC, CONF_PASSWORD
from homeassistant.core import callback from homeassistant.core import callback
from homeassistant.helpers.device_registry import format_mac from homeassistant.helpers.device_registry import format_mac
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from . import SlideConfigEntry from . import SlideConfigEntry
from .const import CONF_INVERT_POSITION, DOMAIN from .const import CONF_INVERT_POSITION, DOMAIN

View File

@ -6,10 +6,10 @@ from libsoundtouch import soundtouch_device
from requests import RequestException from requests import RequestException
import voluptuous as vol import voluptuous as vol
from homeassistant.components.zeroconf import ZeroconfServiceInfo
from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.config_entries import ConfigFlow, ConfigFlowResult
from homeassistant.const import CONF_HOST from homeassistant.const import CONF_HOST
from homeassistant.helpers import config_validation as cv from homeassistant.helpers import config_validation as cv
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from .const import DOMAIN from .const import DOMAIN

View File

@ -4,9 +4,8 @@ from __future__ import annotations
import contextlib import contextlib
from contextlib import suppress from contextlib import suppress
from dataclasses import dataclass
from fnmatch import translate from fnmatch import translate
from functools import lru_cache from functools import lru_cache, partial
from ipaddress import IPv4Address, IPv6Address from ipaddress import IPv4Address, IPv6Address
import logging import logging
import re import re
@ -30,12 +29,20 @@ from homeassistant.const import (
__version__, __version__,
) )
from homeassistant.core import Event, HomeAssistant, callback from homeassistant.core import Event, HomeAssistant, callback
from homeassistant.data_entry_flow import BaseServiceInfo from homeassistant.helpers import config_validation as cv, discovery_flow, instance_id
from homeassistant.helpers import discovery_flow, instance_id from homeassistant.helpers.deprecation import (
import homeassistant.helpers.config_validation as cv DeprecatedConstant,
all_with_deprecated_constants,
check_if_deprecated_constant,
dir_with_deprecated_constants,
)
from homeassistant.helpers.discovery_flow import DiscoveryKey from homeassistant.helpers.discovery_flow import DiscoveryKey
from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.dispatcher import async_dispatcher_connect
from homeassistant.helpers.network import NoURLAvailableError, get_url from homeassistant.helpers.network import NoURLAvailableError, get_url
from homeassistant.helpers.service_info.zeroconf import (
ATTR_PROPERTIES_ID as _ATTR_PROPERTIES_ID,
ZeroconfServiceInfo as _ZeroconfServiceInfo,
)
from homeassistant.helpers.typing import ConfigType from homeassistant.helpers.typing import ConfigType
from homeassistant.loader import ( from homeassistant.loader import (
HomeKitDiscoveredIntegration, HomeKitDiscoveredIntegration,
@ -83,7 +90,11 @@ ATTR_NAME: Final = "name"
ATTR_PROPERTIES: Final = "properties" ATTR_PROPERTIES: Final = "properties"
# Attributes for ZeroconfServiceInfo[ATTR_PROPERTIES] # Attributes for ZeroconfServiceInfo[ATTR_PROPERTIES]
ATTR_PROPERTIES_ID: Final = "id" _DEPRECATED_ATTR_PROPERTIES_ID = DeprecatedConstant(
_ATTR_PROPERTIES_ID,
"homeassistant.helpers.service_info.zeroconf.ATTR_PROPERTIES_ID",
"2026.2",
)
CONFIG_SCHEMA = vol.Schema( CONFIG_SCHEMA = vol.Schema(
{ {
@ -101,45 +112,11 @@ CONFIG_SCHEMA = vol.Schema(
extra=vol.ALLOW_EXTRA, extra=vol.ALLOW_EXTRA,
) )
_DEPRECATED_ZeroconfServiceInfo = DeprecatedConstant(
@dataclass(slots=True) _ZeroconfServiceInfo,
class ZeroconfServiceInfo(BaseServiceInfo): "homeassistant.helpers.service_info.zeroconf.ZeroconfServiceInfo",
"""Prepared info from mDNS entries. "2026.2",
)
The ip_address is the most recently updated address
that is not a link local or unspecified address.
The ip_addresses are all addresses in order of most
recently updated to least recently updated.
The host is the string representation of the ip_address.
The addresses are the string representations of the
ip_addresses.
It is recommended to use the ip_address to determine
the address to connect to as it will be the most
recently updated address that is not a link local
or unspecified address.
"""
ip_address: IPv4Address | IPv6Address
ip_addresses: list[IPv4Address | IPv6Address]
port: int | None
hostname: str
type: str
name: str
properties: dict[str, Any]
@property
def host(self) -> str:
"""Return the host."""
return str(self.ip_address)
@property
def addresses(self) -> list[str]:
"""Return the addresses."""
return [str(ip_address) for ip_address in self.ip_addresses]
@bind_hass @bind_hass
@ -419,7 +396,7 @@ class ZeroconfDiscovery:
def _async_dismiss_discoveries(self, name: str) -> None: def _async_dismiss_discoveries(self, name: str) -> None:
"""Dismiss all discoveries for the given name.""" """Dismiss all discoveries for the given name."""
for flow in self.hass.config_entries.flow.async_progress_by_init_data_type( for flow in self.hass.config_entries.flow.async_progress_by_init_data_type(
ZeroconfServiceInfo, _ZeroconfServiceInfo,
lambda service_info: bool(service_info.name == name), lambda service_info: bool(service_info.name == name),
): ):
self.hass.config_entries.flow.async_abort(flow["flow_id"]) self.hass.config_entries.flow.async_abort(flow["flow_id"])
@ -595,7 +572,7 @@ def async_get_homekit_discovery(
return None return None
def info_from_service(service: AsyncServiceInfo) -> ZeroconfServiceInfo | None: def info_from_service(service: AsyncServiceInfo) -> _ZeroconfServiceInfo | None:
"""Return prepared info from mDNS entries.""" """Return prepared info from mDNS entries."""
# See https://ietf.org/rfc/rfc6763.html#section-6.4 and # See https://ietf.org/rfc/rfc6763.html#section-6.4 and
# https://ietf.org/rfc/rfc6763.html#section-6.5 for expected encodings # https://ietf.org/rfc/rfc6763.html#section-6.5 for expected encodings
@ -618,7 +595,7 @@ def info_from_service(service: AsyncServiceInfo) -> ZeroconfServiceInfo | None:
assert service.server is not None, ( assert service.server is not None, (
"server cannot be none if there are addresses" "server cannot be none if there are addresses"
) )
return ZeroconfServiceInfo( return _ZeroconfServiceInfo(
ip_address=ip_address, ip_address=ip_address,
ip_addresses=ip_addresses, ip_addresses=ip_addresses,
port=service.port, port=service.port,
@ -684,3 +661,11 @@ def _memorized_fnmatch(name: str, pattern: str) -> bool:
since the devices will not change frequently since the devices will not change frequently
""" """
return bool(_compile_fnmatch(pattern).match(name)) return bool(_compile_fnmatch(pattern).match(name))
# These can be removed if no deprecated constant are in this module anymore
__getattr__ = partial(check_if_deprecated_constant, module_globals=globals())
__dir__ = partial(
dir_with_deprecated_constants, module_globals_keys=[*globals().keys()]
)
__all__ = all_with_deprecated_constants(globals())

View File

@ -19,7 +19,6 @@ from homeassistant.components.hassio import (
AddonManager, AddonManager,
AddonState, AddonState,
) )
from homeassistant.components.zeroconf import ZeroconfServiceInfo
from homeassistant.config_entries import ( from homeassistant.config_entries import (
SOURCE_USB, SOURCE_USB,
ConfigEntriesFlowManager, ConfigEntriesFlowManager,
@ -39,6 +38,7 @@ from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers.aiohttp_client import async_get_clientsession from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.hassio import is_hassio from homeassistant.helpers.hassio import is_hassio
from homeassistant.helpers.service_info.hassio import HassioServiceInfo from homeassistant.helpers.service_info.hassio import HassioServiceInfo
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from homeassistant.helpers.typing import VolDictType from homeassistant.helpers.typing import VolDictType
from . import disconnect_client from . import disconnect_client

View File

@ -7,9 +7,9 @@ import logging
from url_normalize import url_normalize from url_normalize import url_normalize
import voluptuous as vol import voluptuous as vol
from homeassistant.components.zeroconf import ZeroconfServiceInfo
from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.config_entries import ConfigFlow, ConfigFlowResult
from homeassistant.const import CONF_TOKEN, CONF_URL from homeassistant.const import CONF_TOKEN, CONF_URL
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from . import helpers from . import helpers
from .const import DOMAIN from .const import DOMAIN

View File

@ -90,9 +90,9 @@ if TYPE_CHECKING:
from .components.dhcp import DhcpServiceInfo from .components.dhcp import DhcpServiceInfo
from .components.ssdp import SsdpServiceInfo from .components.ssdp import SsdpServiceInfo
from .components.usb import UsbServiceInfo from .components.usb import UsbServiceInfo
from .components.zeroconf import ZeroconfServiceInfo
from .helpers.service_info.hassio import HassioServiceInfo from .helpers.service_info.hassio import HassioServiceInfo
from .helpers.service_info.mqtt import MqttServiceInfo from .helpers.service_info.mqtt import MqttServiceInfo
from .helpers.service_info.zeroconf import ZeroconfServiceInfo
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)

View File

@ -18,9 +18,9 @@ if TYPE_CHECKING:
from homeassistant.components.bluetooth import BluetoothServiceInfoBleak from homeassistant.components.bluetooth import BluetoothServiceInfoBleak
from homeassistant.components.dhcp import DhcpServiceInfo from homeassistant.components.dhcp import DhcpServiceInfo
from homeassistant.components.ssdp import SsdpServiceInfo from homeassistant.components.ssdp import SsdpServiceInfo
from homeassistant.components.zeroconf import ZeroconfServiceInfo
from .service_info.mqtt import MqttServiceInfo from .service_info.mqtt import MqttServiceInfo
from .service_info.zeroconf import ZeroconfServiceInfo
type DiscoveryFunctionType[_R] = Callable[[HomeAssistant], _R] type DiscoveryFunctionType[_R] = Callable[[HomeAssistant], _R]

View File

@ -0,0 +1,50 @@
"""Zeroconf discovery data."""
from dataclasses import dataclass
from ipaddress import IPv4Address, IPv6Address
from typing import Any, Final
from homeassistant.data_entry_flow import BaseServiceInfo
# Attributes for ZeroconfServiceInfo[ATTR_PROPERTIES]
ATTR_PROPERTIES_ID: Final = "id"
@dataclass(slots=True)
class ZeroconfServiceInfo(BaseServiceInfo):
"""Prepared info from mDNS entries.
The ip_address is the most recently updated address
that is not a link local or unspecified address.
The ip_addresses are all addresses in order of most
recently updated to least recently updated.
The host is the string representation of the ip_address.
The addresses are the string representations of the
ip_addresses.
It is recommended to use the ip_address to determine
the address to connect to as it will be the most
recently updated address that is not a link local
or unspecified address.
"""
ip_address: IPv4Address | IPv6Address
ip_addresses: list[IPv4Address | IPv6Address]
port: int | None
hostname: str
type: str
name: str
properties: dict[str, Any]
@property
def host(self) -> str:
"""Return the host."""
return str(self.ip_address)
@property
def addresses(self) -> list[str]:
"""Return the addresses."""
return [str(ip_address) for ip_address in self.ip_addresses]

View File

@ -10,11 +10,11 @@ from airgradient import (
) )
from homeassistant.components.airgradient.const import DOMAIN from homeassistant.components.airgradient.const import DOMAIN
from homeassistant.components.zeroconf import ZeroconfServiceInfo
from homeassistant.config_entries import SOURCE_USER, SOURCE_ZEROCONF from homeassistant.config_entries import SOURCE_USER, SOURCE_ZEROCONF
from homeassistant.const import CONF_HOST from homeassistant.const import CONF_HOST
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType from homeassistant.data_entry_flow import FlowResultType
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from tests.common import MockConfigEntry from tests.common import MockConfigEntry

View File

@ -31,8 +31,8 @@ from homeassistant.components.bang_olufsen.const import (
CONF_BEOLINK_JID, CONF_BEOLINK_JID,
BangOlufsenSource, BangOlufsenSource,
) )
from homeassistant.components.zeroconf import ZeroconfServiceInfo
from homeassistant.const import CONF_HOST, CONF_MODEL, CONF_NAME from homeassistant.const import CONF_HOST, CONF_MODEL, CONF_NAME
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
TEST_HOST = "192.168.0.1" TEST_HOST = "192.168.0.1"
TEST_HOST_INVALID = "192.168.0" TEST_HOST_INVALID = "192.168.0"

View File

@ -5,11 +5,11 @@ from unittest.mock import AsyncMock
from pyblu.errors import PlayerUnreachableError from pyblu.errors import PlayerUnreachableError
from homeassistant.components.bluesound.const import DOMAIN from homeassistant.components.bluesound.const import DOMAIN
from homeassistant.components.zeroconf import ZeroconfServiceInfo
from homeassistant.config_entries import SOURCE_USER, SOURCE_ZEROCONF from homeassistant.config_entries import SOURCE_USER, SOURCE_ZEROCONF
from homeassistant.const import CONF_HOST, CONF_PORT from homeassistant.const import CONF_HOST, CONF_PORT
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType from homeassistant.data_entry_flow import FlowResultType
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from .conftest import PlayerMocks from .conftest import PlayerMocks

View File

@ -6,11 +6,11 @@ from unittest.mock import AsyncMock
from aiostreammagic import StreamMagicError from aiostreammagic import StreamMagicError
from homeassistant.components.cambridge_audio.const import DOMAIN from homeassistant.components.cambridge_audio.const import DOMAIN
from homeassistant.components.zeroconf import ZeroconfServiceInfo
from homeassistant.config_entries import SOURCE_USER, SOURCE_ZEROCONF, ConfigFlowResult from homeassistant.config_entries import SOURCE_USER, SOURCE_ZEROCONF, ConfigFlowResult
from homeassistant.const import CONF_HOST from homeassistant.const import CONF_HOST
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType from homeassistant.data_entry_flow import FlowResultType
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from tests.common import MockConfigEntry from tests.common import MockConfigEntry

View File

@ -14,7 +14,7 @@ from devolo_plc_api.device_api import (
) )
from devolo_plc_api.plcnet_api import LOCAL, REMOTE, LogicalNetwork from devolo_plc_api.plcnet_api import LOCAL, REMOTE, LogicalNetwork
from homeassistant.components.zeroconf import ZeroconfServiceInfo from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
IP = "192.0.2.1" IP = "192.0.2.1"
IP_ALT = "192.0.2.2" IP_ALT = "192.0.2.2"

View File

@ -7,11 +7,11 @@ from aiohttp import ClientConnectionError
import pytest import pytest
from homeassistant.components.eheimdigital.const import DOMAIN from homeassistant.components.eheimdigital.const import DOMAIN
from homeassistant.components.zeroconf import ZeroconfServiceInfo
from homeassistant.config_entries import SOURCE_USER, SOURCE_ZEROCONF from homeassistant.config_entries import SOURCE_USER, SOURCE_ZEROCONF
from homeassistant.const import CONF_HOST from homeassistant.const import CONF_HOST
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType from homeassistant.data_entry_flow import FlowResultType
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
ZEROCONF_DISCOVERY = ZeroconfServiceInfo( ZEROCONF_DISCOVERY = ZeroconfServiceInfo(
ip_address=ip_address("192.0.2.1"), ip_address=ip_address("192.0.2.1"),

View File

@ -8,13 +8,13 @@ from unittest.mock import AsyncMock, patch
import pytest import pytest
from homeassistant.components.lektrico.const import DOMAIN from homeassistant.components.lektrico.const import DOMAIN
from homeassistant.components.zeroconf import ZeroconfServiceInfo
from homeassistant.const import ( from homeassistant.const import (
ATTR_HW_VERSION, ATTR_HW_VERSION,
ATTR_SERIAL_NUMBER, ATTR_SERIAL_NUMBER,
CONF_HOST, CONF_HOST,
CONF_TYPE, CONF_TYPE,
) )
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from tests.common import MockConfigEntry, load_fixture from tests.common import MockConfigEntry, load_fixture

View File

@ -7,11 +7,11 @@ from linkplay.exceptions import LinkPlayRequestException
import pytest import pytest
from homeassistant.components.linkplay.const import DOMAIN from homeassistant.components.linkplay.const import DOMAIN
from homeassistant.components.zeroconf import ZeroconfServiceInfo
from homeassistant.config_entries import SOURCE_USER, SOURCE_ZEROCONF from homeassistant.config_entries import SOURCE_USER, SOURCE_ZEROCONF
from homeassistant.const import CONF_HOST from homeassistant.const import CONF_HOST
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType from homeassistant.data_entry_flow import FlowResultType
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from .conftest import HOST, HOST_REENTRY, NAME, UUID from .conftest import HOST, HOST_REENTRY, NAME, UUID

View File

@ -7,7 +7,7 @@ from unittest.mock import MagicMock, patch
from aiolookin import Climate, Device, Remote from aiolookin import Climate, Device, Remote
from homeassistant.components.zeroconf import ZeroconfServiceInfo from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
DEVICE_ID = "98F33163" DEVICE_ID = "98F33163"
MODULE = "homeassistant.components.lookin" MODULE = "homeassistant.components.lookin"

View File

@ -14,10 +14,10 @@ import pytest
from homeassistant import config_entries from homeassistant import config_entries
from homeassistant.components.matter.const import ADDON_SLUG, DOMAIN from homeassistant.components.matter.const import ADDON_SLUG, DOMAIN
from homeassistant.components.zeroconf import ZeroconfServiceInfo
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType from homeassistant.data_entry_flow import FlowResultType
from homeassistant.helpers.service_info.hassio import HassioServiceInfo from homeassistant.helpers.service_info.hassio import HassioServiceInfo
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from tests.common import MockConfigEntry from tests.common import MockConfigEntry

View File

@ -15,10 +15,10 @@ import pytest
from homeassistant.components.music_assistant.config_flow import CONF_URL from homeassistant.components.music_assistant.config_flow import CONF_URL
from homeassistant.components.music_assistant.const import DEFAULT_NAME, DOMAIN from homeassistant.components.music_assistant.const import DEFAULT_NAME, DOMAIN
from homeassistant.components.zeroconf import ZeroconfServiceInfo
from homeassistant.config_entries import SOURCE_USER, SOURCE_ZEROCONF from homeassistant.config_entries import SOURCE_USER, SOURCE_ZEROCONF
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType from homeassistant.data_entry_flow import FlowResultType
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from tests.common import MockConfigEntry, load_fixture from tests.common import MockConfigEntry, load_fixture

View File

@ -12,13 +12,13 @@ from homeassistant.components.onewire.const import (
INPUT_ENTRY_DEVICE_SELECTION, INPUT_ENTRY_DEVICE_SELECTION,
MANUFACTURER_MAXIM, MANUFACTURER_MAXIM,
) )
from homeassistant.components.zeroconf import ZeroconfServiceInfo
from homeassistant.config_entries import SOURCE_HASSIO, SOURCE_USER, SOURCE_ZEROCONF from homeassistant.config_entries import SOURCE_HASSIO, SOURCE_USER, SOURCE_ZEROCONF
from homeassistant.const import CONF_HOST, CONF_PORT from homeassistant.const import CONF_HOST, CONF_PORT
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType from homeassistant.data_entry_flow import FlowResultType
from homeassistant.helpers import device_registry as dr from homeassistant.helpers import device_registry as dr
from homeassistant.helpers.service_info.hassio import HassioServiceInfo from homeassistant.helpers.service_info.hassio import HassioServiceInfo
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from tests.common import MockConfigEntry from tests.common import MockConfigEntry

View File

@ -19,9 +19,9 @@ import pytest
from homeassistant import config_entries from homeassistant import config_entries
from homeassistant.components import dhcp from homeassistant.components import dhcp
from homeassistant.components.overkiz.const import DOMAIN from homeassistant.components.overkiz.const import DOMAIN
from homeassistant.components.zeroconf import ZeroconfServiceInfo
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType from homeassistant.data_entry_flow import FlowResultType
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from tests.common import MockConfigEntry from tests.common import MockConfigEntry

View File

@ -13,7 +13,6 @@ from plugwise.exceptions import (
import pytest import pytest
from homeassistant.components.plugwise.const import DEFAULT_PORT, DOMAIN from homeassistant.components.plugwise.const import DEFAULT_PORT, DOMAIN
from homeassistant.components.zeroconf import ZeroconfServiceInfo
from homeassistant.config_entries import SOURCE_USER, SOURCE_ZEROCONF, ConfigFlowResult from homeassistant.config_entries import SOURCE_USER, SOURCE_ZEROCONF, ConfigFlowResult
from homeassistant.const import ( from homeassistant.const import (
CONF_HOST, CONF_HOST,
@ -25,6 +24,7 @@ from homeassistant.const import (
) )
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType from homeassistant.data_entry_flow import FlowResultType
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from tests.common import MockConfigEntry from tests.common import MockConfigEntry

View File

@ -4,11 +4,11 @@ from ipaddress import ip_address
from unittest.mock import AsyncMock from unittest.mock import AsyncMock
from homeassistant.components.russound_rio.const import DOMAIN from homeassistant.components.russound_rio.const import DOMAIN
from homeassistant.components.zeroconf import ZeroconfServiceInfo
from homeassistant.config_entries import SOURCE_USER, SOURCE_ZEROCONF, ConfigFlowResult from homeassistant.config_entries import SOURCE_USER, SOURCE_ZEROCONF, ConfigFlowResult
from homeassistant.const import CONF_HOST, CONF_PORT from homeassistant.const import CONF_HOST, CONF_PORT
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType from homeassistant.data_entry_flow import FlowResultType
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from .const import MOCK_CONFIG, MOCK_RECONFIGURATION_CONFIG, MODEL from .const import MOCK_CONFIG, MOCK_RECONFIGURATION_CONFIG, MODEL

View File

@ -12,11 +12,11 @@ from goslideapi.goslideapi import (
import pytest import pytest
from homeassistant.components.slide_local.const import CONF_INVERT_POSITION, DOMAIN from homeassistant.components.slide_local.const import CONF_INVERT_POSITION, DOMAIN
from homeassistant.components.zeroconf import ZeroconfServiceInfo
from homeassistant.config_entries import SOURCE_USER, SOURCE_ZEROCONF from homeassistant.config_entries import SOURCE_USER, SOURCE_ZEROCONF
from homeassistant.const import CONF_API_VERSION, CONF_HOST, CONF_PASSWORD, Platform from homeassistant.const import CONF_API_VERSION, CONF_HOST, CONF_PASSWORD, Platform
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType from homeassistant.data_entry_flow import FlowResultType
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from . import setup_platform from . import setup_platform
from .const import HOST, SLIDE_INFO_DATA from .const import HOST, SLIDE_INFO_DATA

View File

@ -8,11 +8,11 @@ import requests_mock
from requests_mock import ANY, Mocker from requests_mock import ANY, Mocker
from homeassistant.components.soundtouch.const import DOMAIN from homeassistant.components.soundtouch.const import DOMAIN
from homeassistant.components.zeroconf import ZeroconfServiceInfo
from homeassistant.config_entries import SOURCE_USER, SOURCE_ZEROCONF from homeassistant.config_entries import SOURCE_USER, SOURCE_ZEROCONF
from homeassistant.const import CONF_HOST, CONF_SOURCE from homeassistant.const import CONF_HOST, CONF_SOURCE
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType from homeassistant.data_entry_flow import FlowResultType
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from .conftest import DEVICE_1_ID, DEVICE_1_IP, DEVICE_1_NAME from .conftest import DEVICE_1_ID, DEVICE_1_IP, DEVICE_1_NAME

View File

@ -9,10 +9,10 @@ from wyoming.info import Info
from homeassistant import config_entries from homeassistant import config_entries
from homeassistant.components.wyoming.const import DOMAIN from homeassistant.components.wyoming.const import DOMAIN
from homeassistant.components.zeroconf import ZeroconfServiceInfo
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType from homeassistant.data_entry_flow import FlowResultType
from homeassistant.helpers.service_info.hassio import HassioServiceInfo from homeassistant.helpers.service_info.hassio import HassioServiceInfo
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from . import EMPTY_INFO, SATELLITE_INFO, STT_INFO, TTS_INFO from . import EMPTY_INFO, SATELLITE_INFO, STT_INFO, TTS_INFO

View File

@ -24,9 +24,18 @@ from homeassistant.const import (
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.generated import zeroconf as zc_gen from homeassistant.generated import zeroconf as zc_gen
from homeassistant.helpers.discovery_flow import DiscoveryKey from homeassistant.helpers.discovery_flow import DiscoveryKey
from homeassistant.helpers.service_info.zeroconf import (
ATTR_PROPERTIES_ID,
ZeroconfServiceInfo,
)
from homeassistant.setup import ATTR_COMPONENT, async_setup_component from homeassistant.setup import ATTR_COMPONENT, async_setup_component
from tests.common import MockConfigEntry, MockModule, mock_integration from tests.common import (
MockConfigEntry,
MockModule,
import_and_test_deprecated_constant,
mock_integration,
)
NON_UTF8_VALUE = b"ABCDEF\x8a" NON_UTF8_VALUE = b"ABCDEF\x8a"
NON_ASCII_KEY = b"non-ascii-key\x8a" NON_ASCII_KEY = b"non-ascii-key\x8a"
@ -1655,3 +1664,35 @@ async def test_zeroconf_rediscover_no_match(
assert len(mock_service_browser.mock_calls) == 1 assert len(mock_service_browser.mock_calls) == 1
assert len(mock_config_flow.mock_calls) == 1 assert len(mock_config_flow.mock_calls) == 1
@pytest.mark.parametrize(
("constant_name", "replacement_name", "replacement"),
[
(
"ATTR_PROPERTIES_ID",
"homeassistant.helpers.service_info.zeroconf.ATTR_PROPERTIES_ID",
ATTR_PROPERTIES_ID,
),
(
"ZeroconfServiceInfo",
"homeassistant.helpers.service_info.zeroconf.ZeroconfServiceInfo",
ZeroconfServiceInfo,
),
],
)
def test_deprecated_constants(
caplog: pytest.LogCaptureFixture,
constant_name: str,
replacement_name: str,
replacement: Any,
) -> None:
"""Test deprecated automation constants."""
import_and_test_deprecated_constant(
caplog,
zeroconf,
constant_name,
replacement_name,
replacement,
"2026.2",
)

View File

@ -17,12 +17,12 @@ from zwave_js_server.version import VersionInfo
from homeassistant import config_entries from homeassistant import config_entries
from homeassistant.components import usb from homeassistant.components import usb
from homeassistant.components.zeroconf import ZeroconfServiceInfo
from homeassistant.components.zwave_js.config_flow import SERVER_VERSION_TIMEOUT, TITLE from homeassistant.components.zwave_js.config_flow import SERVER_VERSION_TIMEOUT, TITLE
from homeassistant.components.zwave_js.const import ADDON_SLUG, DOMAIN from homeassistant.components.zwave_js.const import ADDON_SLUG, DOMAIN
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType from homeassistant.data_entry_flow import FlowResultType
from homeassistant.helpers.service_info.hassio import HassioServiceInfo from homeassistant.helpers.service_info.hassio import HassioServiceInfo
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from tests.common import MockConfigEntry from tests.common import MockConfigEntry