python-izone 1.3.7__tar.gz → 1.3.8__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. {python_izone-1.3.7 → python_izone-1.3.8}/PKG-INFO +1 -1
  2. python_izone-1.3.8/docs/release-notes/v1.3.8.md +9 -0
  3. {python_izone-1.3.7 → python_izone-1.3.8}/pizone/discovery.py +9 -5
  4. {python_izone-1.3.7 → python_izone-1.3.8}/pizone/version.py +2 -2
  5. {python_izone-1.3.7 → python_izone-1.3.8}/tests/test_discovery_api.py +6 -1
  6. {python_izone-1.3.7 → python_izone-1.3.8}/.gitattributes +0 -0
  7. {python_izone-1.3.7 → python_izone-1.3.8}/.github/workflows/main.yml +0 -0
  8. {python_izone-1.3.7 → python_izone-1.3.8}/.gitignore +0 -0
  9. {python_izone-1.3.7 → python_izone-1.3.8}/.pre-commit-config.yaml +0 -0
  10. {python_izone-1.3.7 → python_izone-1.3.8}/.python-version +0 -0
  11. {python_izone-1.3.7 → python_izone-1.3.8}/.vscode/.ropeproject/config.py +0 -0
  12. {python_izone-1.3.7 → python_izone-1.3.8}/.vscode/extensions.json +0 -0
  13. {python_izone-1.3.7 → python_izone-1.3.8}/.vscode/launch.json +0 -0
  14. {python_izone-1.3.7 → python_izone-1.3.8}/.vscode/settings.json +0 -0
  15. {python_izone-1.3.7 → python_izone-1.3.8}/README.md +0 -0
  16. {python_izone-1.3.7 → python_izone-1.3.8}/api_docs/AC-DOC-1401-11_iZoneEthernetInterface.pdf +0 -0
  17. {python_izone-1.3.7 → python_izone-1.3.8}/api_docs/iPower_JSON_datastrings_Out.h +0 -0
  18. {python_izone-1.3.7 → python_izone-1.3.8}/api_docs/iZone_JSON_datastrings.h +0 -0
  19. {python_izone-1.3.7 → python_izone-1.3.8}/docs/release-notes/v1.3.4.md +0 -0
  20. {python_izone-1.3.7 → python_izone-1.3.8}/docs/release-notes/v1.3.5.md +0 -0
  21. {python_izone-1.3.7 → python_izone-1.3.8}/docs/release-notes/v1.3.6.md +0 -0
  22. {python_izone-1.3.7 → python_izone-1.3.8}/docs/release-notes/v1.3.7.md +0 -0
  23. {python_izone-1.3.7 → python_izone-1.3.8}/licence.txt +0 -0
  24. {python_izone-1.3.7 → python_izone-1.3.8}/pizone/__init__.py +0 -0
  25. {python_izone-1.3.7 → python_izone-1.3.8}/pizone/const.py +0 -0
  26. {python_izone-1.3.7 → python_izone-1.3.8}/pizone/controller.py +0 -0
  27. {python_izone-1.3.7 → python_izone-1.3.8}/pizone/exceptions.py +0 -0
  28. {python_izone-1.3.7 → python_izone-1.3.8}/pizone/power.py +0 -0
  29. {python_izone-1.3.7 → python_izone-1.3.8}/pizone/py.typed +0 -0
  30. {python_izone-1.3.7 → python_izone-1.3.8}/pizone/types.py +0 -0
  31. {python_izone-1.3.7 → python_izone-1.3.8}/pizone/zone.py +0 -0
  32. {python_izone-1.3.7 → python_izone-1.3.8}/pyproject.toml +0 -0
  33. {python_izone-1.3.7 → python_izone-1.3.8}/scripts/check +0 -0
  34. {python_izone-1.3.7 → python_izone-1.3.8}/scripts/coverage +0 -0
  35. {python_izone-1.3.7 → python_izone-1.3.8}/tests/__init__.py +0 -0
  36. {python_izone-1.3.7 → python_izone-1.3.8}/tests/conftest.py +0 -0
  37. {python_izone-1.3.7 → python_izone-1.3.8}/tests/http_fakes.py +0 -0
  38. {python_izone-1.3.7 → python_izone-1.3.8}/tests/power_data.py +0 -0
  39. {python_izone-1.3.7 → python_izone-1.3.8}/tests/resources.py +0 -0
  40. {python_izone-1.3.7 → python_izone-1.3.8}/tests/test_controller.py +0 -0
  41. {python_izone-1.3.7 → python_izone-1.3.8}/tests/test_discovery.py +0 -0
  42. {python_izone-1.3.7 → python_izone-1.3.8}/tests/test_fullstack.py +0 -0
  43. {python_izone-1.3.7 → python_izone-1.3.8}/tests/test_http.py +0 -0
  44. {python_izone-1.3.7 → python_izone-1.3.8}/tests/test_power.py +0 -0
  45. {python_izone-1.3.7 → python_izone-1.3.8}/tests/test_zone.py +0 -0
  46. {python_izone-1.3.7 → python_izone-1.3.8}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-izone
3
- Version: 1.3.7
3
+ Version: 1.3.8
4
4
  Summary: A python interface to the iZone airconditioner controller
5
5
  Project-URL: Homepage, https://github.com/Swamp-Ig/pizone
6
6
  Author-email: Penny Wood <pypl@ninjateaparty.com>
@@ -0,0 +1,9 @@
1
+ # Release notes — v1.3.8
2
+
3
+ **Compare range:** https://github.com/Swamp-Ig/pizone/compare/v1.3.7...v1.3.8
4
+
5
+ ## Since v1.3.7
6
+
7
+ - `discover_all` skips controllers that become claimed mid-scan (`ControllerAlreadyClaimedError`) instead of failing the scan
8
+ - Expected UDP `sendto` failures (blocked broadcast / interface down) log at debug instead of warning with a traceback
9
+ - Drop dead `RuntimeError` suppress around UDP `_cache_endpoint` (claimed endpoints already return earlier; that path raises `ControllerAlreadyClaimedError`)
@@ -549,7 +549,7 @@ class DiscoveryService:
549
549
  continue
550
550
  try:
551
551
  self._cache_endpoint(endpoint)
552
- except RuntimeError:
552
+ except ControllerAlreadyClaimedError:
553
553
  continue
554
554
  verified.append(endpoint)
555
555
  if endpoint.uid not in notified:
@@ -799,8 +799,13 @@ class DiscoveryService:
799
799
  """Return the aiohttp session used for HTTP requests."""
800
800
  return self._session
801
801
 
802
- def _on_error_received(self, _: Exception) -> None:
803
- _LOG.warning("Error passed and ignored to error_received", exc_info=True)
802
+ def _on_error_received(self, exc: Exception) -> None:
803
+ # Expected when broadcast is blocked (firewall / no permission) or the
804
+ # interface is down; scan just finds nothing. Keep unexpected errors loud.
805
+ if isinstance(exc, OSError):
806
+ _LOG.debug("UDP error ignored: %s", exc)
807
+ return
808
+ _LOG.warning("Error passed and ignored to error_received: %s", exc)
804
809
 
805
810
  def _find_by_addr(self, addr: tuple[str, int]) -> Controller | None:
806
811
  for ctrl in self._controllers.values():
@@ -923,8 +928,7 @@ class DiscoveryService:
923
928
  previous = self._known_endpoints.get(endpoint.uid)
924
929
  newly_seen = previous is None
925
930
  host_changed = previous is not None and previous.host != endpoint.host
926
- with suppress(RuntimeError):
927
- self._cache_endpoint(endpoint)
931
+ self._cache_endpoint(endpoint)
928
932
  if newly_seen or host_changed:
929
933
  self._emit_endpoint_discovered(endpoint)
930
934
 
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '1.3.7'
22
- __version_tuple__ = version_tuple = (1, 3, 7)
21
+ __version__ = version = '1.3.8'
22
+ __version_tuple__ = version_tuple = (1, 3, 8)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -588,9 +588,14 @@ async def test_discover_all_excludes_created_controllers() -> None:
588
588
  FakeHttpSession(get_response=_system_settings_response("000025841")),
589
589
  )
590
590
  await service.create_controller("000025841", "10.0.0.90")
591
+
592
+ async def _scan_reports_claimed() -> None:
593
+ assert service._scan_collector is not None
594
+ service._scan_collector["000025841"] = "10.0.0.90"
595
+
591
596
  with (
592
597
  patch("pizone.discovery.asyncio.sleep", AsyncMock()),
593
- patch.object(service, "scan", AsyncMock()),
598
+ patch.object(service, "scan", side_effect=_scan_reports_claimed),
594
599
  ):
595
600
  endpoints = await service.discover_all()
596
601
  assert endpoints == []
File without changes
File without changes
File without changes
File without changes
File without changes