From a9c51c46c421553c7a5fa564796f2152d7fa2bd2 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sat, 1 Apr 2023 19:36:15 -1000 Subject: [PATCH] feat: add ip_addresses_by_version to ServiceInfo Consumers of zeroconf commonly have to recreate the ip_address objects which has a bit of overhead. Since we are using the built-in objects there is little risk of the API changing in the future. They are now available as ip_addresses_by_version --- src/zeroconf/_services/info.py | 10 ++++++++++ tests/services/test_info.py | 11 +++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/zeroconf/_services/info.py b/src/zeroconf/_services/info.py index 69c2bc9c9..0ba83f2d7 100644 --- a/src/zeroconf/_services/info.py +++ b/src/zeroconf/_services/info.py @@ -233,6 +233,16 @@ def addresses_by_version(self, version: IPVersion) -> List[bytes]: *(addr.packed for addr in self._ipv6_addresses), ] + def ip_addresses_by_version( + self, version: IPVersion + ) -> Union[List[ipaddress.IPv4Address], List[ipaddress.IPv6Address], List[ipaddress._BaseAddress]]: + """List ip_address objects matching IP version.""" + if version == IPVersion.V4Only: + return self._ipv4_addresses + if version == IPVersion.V6Only: + return self._ipv6_addresses + return [*self._ipv4_addresses, *self._ipv6_addresses] + def parsed_addresses(self, version: IPVersion = IPVersion.All) -> List[str]: """List addresses in their parsed string form.""" result = self.addresses_by_version(version) diff --git a/tests/services/test_info.py b/tests/services/test_info.py index 2dec272a9..e02d6d54e 100644 --- a/tests/services/test_info.py +++ b/tests/services/test_info.py @@ -9,6 +9,7 @@ import socket import threading import unittest +from ipaddress import ip_address from threading import Event from typing import Iterable, List, Optional from unittest.mock import patch @@ -540,8 +541,18 @@ def test_multiple_addresses(): for info in infos: assert info.addresses == [address] assert info.addresses_by_version(r.IPVersion.All) == [address, address_v6, address_v6_ll] + assert info.ip_addresses_by_version(r.IPVersion.All) == [ + ip_address(address), + ip_address(address_v6), + ip_address(address_v6_ll), + ] assert info.addresses_by_version(r.IPVersion.V4Only) == [address] + assert info.ip_addresses_by_version(r.IPVersion.V4Only) == [ip_address(address)] assert info.addresses_by_version(r.IPVersion.V6Only) == [address_v6, address_v6_ll] + assert info.ip_addresses_by_version(r.IPVersion.V6Only) == [ + ip_address(address_v6), + ip_address(address_v6_ll), + ] assert info.parsed_addresses() == [address_parsed, address_v6_parsed, address_v6_ll_parsed] assert info.parsed_addresses(r.IPVersion.V4Only) == [address_parsed] assert info.parsed_addresses(r.IPVersion.V6Only) == [address_v6_parsed, address_v6_ll_parsed]