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.
- {python_izone-1.3.7 → python_izone-1.3.8}/PKG-INFO +1 -1
- python_izone-1.3.8/docs/release-notes/v1.3.8.md +9 -0
- {python_izone-1.3.7 → python_izone-1.3.8}/pizone/discovery.py +9 -5
- {python_izone-1.3.7 → python_izone-1.3.8}/pizone/version.py +2 -2
- {python_izone-1.3.7 → python_izone-1.3.8}/tests/test_discovery_api.py +6 -1
- {python_izone-1.3.7 → python_izone-1.3.8}/.gitattributes +0 -0
- {python_izone-1.3.7 → python_izone-1.3.8}/.github/workflows/main.yml +0 -0
- {python_izone-1.3.7 → python_izone-1.3.8}/.gitignore +0 -0
- {python_izone-1.3.7 → python_izone-1.3.8}/.pre-commit-config.yaml +0 -0
- {python_izone-1.3.7 → python_izone-1.3.8}/.python-version +0 -0
- {python_izone-1.3.7 → python_izone-1.3.8}/.vscode/.ropeproject/config.py +0 -0
- {python_izone-1.3.7 → python_izone-1.3.8}/.vscode/extensions.json +0 -0
- {python_izone-1.3.7 → python_izone-1.3.8}/.vscode/launch.json +0 -0
- {python_izone-1.3.7 → python_izone-1.3.8}/.vscode/settings.json +0 -0
- {python_izone-1.3.7 → python_izone-1.3.8}/README.md +0 -0
- {python_izone-1.3.7 → python_izone-1.3.8}/api_docs/AC-DOC-1401-11_iZoneEthernetInterface.pdf +0 -0
- {python_izone-1.3.7 → python_izone-1.3.8}/api_docs/iPower_JSON_datastrings_Out.h +0 -0
- {python_izone-1.3.7 → python_izone-1.3.8}/api_docs/iZone_JSON_datastrings.h +0 -0
- {python_izone-1.3.7 → python_izone-1.3.8}/docs/release-notes/v1.3.4.md +0 -0
- {python_izone-1.3.7 → python_izone-1.3.8}/docs/release-notes/v1.3.5.md +0 -0
- {python_izone-1.3.7 → python_izone-1.3.8}/docs/release-notes/v1.3.6.md +0 -0
- {python_izone-1.3.7 → python_izone-1.3.8}/docs/release-notes/v1.3.7.md +0 -0
- {python_izone-1.3.7 → python_izone-1.3.8}/licence.txt +0 -0
- {python_izone-1.3.7 → python_izone-1.3.8}/pizone/__init__.py +0 -0
- {python_izone-1.3.7 → python_izone-1.3.8}/pizone/const.py +0 -0
- {python_izone-1.3.7 → python_izone-1.3.8}/pizone/controller.py +0 -0
- {python_izone-1.3.7 → python_izone-1.3.8}/pizone/exceptions.py +0 -0
- {python_izone-1.3.7 → python_izone-1.3.8}/pizone/power.py +0 -0
- {python_izone-1.3.7 → python_izone-1.3.8}/pizone/py.typed +0 -0
- {python_izone-1.3.7 → python_izone-1.3.8}/pizone/types.py +0 -0
- {python_izone-1.3.7 → python_izone-1.3.8}/pizone/zone.py +0 -0
- {python_izone-1.3.7 → python_izone-1.3.8}/pyproject.toml +0 -0
- {python_izone-1.3.7 → python_izone-1.3.8}/scripts/check +0 -0
- {python_izone-1.3.7 → python_izone-1.3.8}/scripts/coverage +0 -0
- {python_izone-1.3.7 → python_izone-1.3.8}/tests/__init__.py +0 -0
- {python_izone-1.3.7 → python_izone-1.3.8}/tests/conftest.py +0 -0
- {python_izone-1.3.7 → python_izone-1.3.8}/tests/http_fakes.py +0 -0
- {python_izone-1.3.7 → python_izone-1.3.8}/tests/power_data.py +0 -0
- {python_izone-1.3.7 → python_izone-1.3.8}/tests/resources.py +0 -0
- {python_izone-1.3.7 → python_izone-1.3.8}/tests/test_controller.py +0 -0
- {python_izone-1.3.7 → python_izone-1.3.8}/tests/test_discovery.py +0 -0
- {python_izone-1.3.7 → python_izone-1.3.8}/tests/test_fullstack.py +0 -0
- {python_izone-1.3.7 → python_izone-1.3.8}/tests/test_http.py +0 -0
- {python_izone-1.3.7 → python_izone-1.3.8}/tests/test_power.py +0 -0
- {python_izone-1.3.7 → python_izone-1.3.8}/tests/test_zone.py +0 -0
- {python_izone-1.3.7 → python_izone-1.3.8}/uv.lock +0 -0
|
@@ -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
|
|
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,
|
|
803
|
-
|
|
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
|
-
|
|
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.
|
|
22
|
-
__version_tuple__ = version_tuple = (1, 3,
|
|
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",
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_izone-1.3.7 → python_izone-1.3.8}/api_docs/AC-DOC-1401-11_iZoneEthernetInterface.pdf
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|