Skip to content

Commit ed53f62

Browse files
authored
Add support for updating multiple records at once to ServiceInfo (#474)
- Adds `update_records` method to `ServiceInfo`
1 parent b853413 commit ed53f62

2 files changed

Lines changed: 24 additions & 10 deletions

File tree

zeroconf/__init__.py

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1984,20 +1984,33 @@ def get_name(self) -> str:
19841984
return self.name[: len(self.name) - len(self.type) - 1]
19851985

19861986
def update_record(self, zc: 'Zeroconf', now: float, record: Optional[DNSRecord]) -> None:
1987-
"""Updates service information from a DNS record."""
1988-
if record is None or record.is_expired(now):
1989-
return
1987+
"""Updates service information from a DNS record.
1988+
1989+
This method is deprecated and will be removed in a future version.
1990+
update_records should be implemented instead.
1991+
"""
1992+
if record is not None:
1993+
self.update_records(zc, now, [record])
19901994

1991-
self._process_record(record)
1995+
def update_records(self, zc: 'Zeroconf', now: float, records: List[DNSRecord]) -> None:
1996+
"""Updates service information from a DNS record."""
1997+
update_addresses = False
1998+
for record in records:
1999+
if isinstance(record, DNSService):
2000+
update_addresses = True
2001+
self._process_record(record, now)
19922002

19932003
# Only update addresses if the DNSService (.server) has changed
1994-
if not isinstance(record, DNSService):
2004+
if not update_addresses:
19952005
return
19962006

1997-
for cached_record in self._get_address_records_from_cache(zc):
1998-
self._process_record(cached_record)
2007+
for record in self._get_address_records_from_cache(zc):
2008+
self._process_record(record, now)
2009+
2010+
def _process_record(self, record: DNSRecord, now: float) -> None:
2011+
if record.is_expired(now):
2012+
return
19992013

2000-
def _process_record(self, record: DNSRecord) -> None:
20012014
if isinstance(record, DNSAddress):
20022015
if record.key == self.server_key and record.address not in self._addresses:
20032016
self._addresses.append(record.address)
@@ -2087,8 +2100,7 @@ def load_from_cache(self, zc: 'Zeroconf') -> bool:
20872100
cached_txt_record = zc.cache.get_by_details(self.name, _TYPE_TXT, _CLASS_IN)
20882101
if cached_txt_record:
20892102
record_updates.append(cached_txt_record)
2090-
for record in record_updates:
2091-
self.update_record(zc, now, record)
2103+
self.update_records(zc, now, record_updates)
20922104
return self._is_complete
20932105

20942106
@property

zeroconf/test.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1625,6 +1625,8 @@ def test_service_info_rejects_non_matching_updates(self):
16251625
info = ServiceInfo(
16261626
service_type, service_name, 22, 0, 0, desc, service_server, addresses=[service_address]
16271627
)
1628+
# Verify backwards compatiblity with calling with None
1629+
info.update_record(zc, now, None)
16281630
# Matching updates
16291631
info.update_record(
16301632
zc,

0 commit comments

Comments
 (0)