uiprotect 0.10.1__py3-none-any.whl → 0.11.0__py3-none-any.whl

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.

Potentially problematic release.


This version of uiprotect might be problematic. Click here for more details.

@@ -41,7 +41,6 @@ from .types import EventType, FixSizeOrderedDict, ModelType
41
41
  from .user import Group, User
42
42
  from .websocket import (
43
43
  WSAction,
44
- WSJSONPacketFrame,
45
44
  WSPacket,
46
45
  WSSubscriptionMessage,
47
46
  )
@@ -169,6 +168,10 @@ class ProtectDeviceRef(ProtectBaseObject):
169
168
  id: str
170
169
 
171
170
 
171
+ _ModelType_NVR_value = ModelType.NVR.value
172
+ _ModelType_Event_value = ModelType.EVENT.value
173
+
174
+
172
175
  class Bootstrap(ProtectBaseObject):
173
176
  auth_user_id: str
174
177
  access_key: str
@@ -536,51 +539,40 @@ class Bootstrap(ProtectBaseObject):
536
539
  models: set[ModelType] | None = None,
537
540
  ignore_stats: bool = False,
538
541
  ) -> WSSubscriptionMessage | None:
539
- if models is None:
540
- models = set()
541
-
542
- if not isinstance(packet.action_frame, WSJSONPacketFrame):
543
- _LOGGER.debug(
544
- "Unexpected action frame format: %s",
545
- packet.action_frame.payload_format,
546
- )
547
-
548
- if not isinstance(packet.data_frame, WSJSONPacketFrame):
549
- _LOGGER.debug(
550
- "Unexpected data frame format: %s",
551
- packet.data_frame.payload_format,
552
- )
553
-
542
+ """Process a WS packet."""
554
543
  action, data = self._get_frame_data(packet)
555
- if action["newUpdateId"] is not None:
556
- self.last_update_id = action["newUpdateId"]
544
+ new_update_id: str = action["newUpdateId"]
545
+ if new_update_id is not None:
546
+ self.last_update_id = new_update_id
557
547
 
558
- if action["modelKey"] not in ModelType.values_set():
559
- _LOGGER.debug("Unknown model type: %s", action["modelKey"])
548
+ model_key: str = action["modelKey"]
549
+ if model_key not in ModelType.values_set():
550
+ _LOGGER.debug("Unknown model type: %s", model_key)
560
551
  self._create_stat(packet, None, True)
561
552
  return None
562
553
 
563
- if len(models) > 0 and ModelType(action["modelKey"]) not in models:
554
+ if models and ModelType(model_key) not in models:
564
555
  self._create_stat(packet, None, True)
565
556
  return None
566
557
 
567
- if action["action"] == "remove":
558
+ action_action: str = action["action"]
559
+ if action_action == "remove":
568
560
  return self._process_remove_packet(packet, data)
569
561
 
570
- if data is None or len(data) == 0:
562
+ if not data:
571
563
  self._create_stat(packet, None, True)
572
564
  return None
573
565
 
574
566
  try:
575
- if action["action"] == "add":
567
+ if action_action == "add":
576
568
  return self._process_add_packet(packet, data)
577
-
578
- if action["action"] == "update":
579
- if action["modelKey"] == ModelType.NVR.value:
569
+ if action_action == "update":
570
+ if model_key == _ModelType_NVR_value:
580
571
  return self._process_nvr_update(packet, data, ignore_stats)
572
+
581
573
  if (
582
- action["modelKey"] in ModelType.bootstrap_models_set()
583
- or action["modelKey"] == ModelType.EVENT.value
574
+ model_key in ModelType.bootstrap_models_set()
575
+ or model_key == _ModelType_Event_value
584
576
  ):
585
577
  return self._process_device_update(
586
578
  packet,
@@ -588,13 +580,12 @@ class Bootstrap(ProtectBaseObject):
588
580
  data,
589
581
  ignore_stats,
590
582
  )
591
- _LOGGER.debug(
592
- "Unexpected bootstrap model type deviceadoptedfor update: %s",
593
- action["modelKey"],
594
- )
595
583
  except (ValidationError, ValueError) as err:
596
584
  self._handle_ws_error(action, err)
597
585
 
586
+ _LOGGER.debug(
587
+ "Unexpected bootstrap model type deviceadoptedfor update: %s", model_key
588
+ )
598
589
  self._create_stat(packet, None, True)
599
590
  return None
600
591
 
@@ -7,6 +7,7 @@ import enum
7
7
  import struct
8
8
  import zlib
9
9
  from dataclasses import dataclass
10
+ from functools import cache, cached_property
10
11
  from typing import TYPE_CHECKING, Any
11
12
 
12
13
  import orjson
@@ -62,6 +63,7 @@ class BaseWSPacketFrame:
62
63
  raise NotImplementedError
63
64
 
64
65
  @staticmethod
66
+ @cache
65
67
  def klass_from_format(format_raw: int) -> type[BaseWSPacketFrame]:
66
68
  payload_format = ProtectWSPayloadFormat(format_raw)
67
69
 
@@ -174,13 +176,15 @@ class WSJSONPacketFrame(BaseWSPacketFrame):
174
176
 
175
177
 
176
178
  class WSPacket:
179
+ """Class to handle a unifi protect websocket packet."""
180
+
177
181
  _raw: bytes
178
182
  _raw_encoded: str | None = None
179
183
 
180
184
  _action_frame: BaseWSPacketFrame | None = None
181
185
  _data_frame: BaseWSPacketFrame | None = None
182
186
 
183
- def __init__(self, data: bytes):
187
+ def __init__(self, data: bytes) -> None:
184
188
  self._raw = data
185
189
 
186
190
  def decode(self) -> None:
@@ -190,7 +194,7 @@ class WSPacket:
190
194
  self._action_frame.length,
191
195
  )
192
196
 
193
- @property
197
+ @cached_property
194
198
  def action_frame(self) -> BaseWSPacketFrame:
195
199
  if self._action_frame is None:
196
200
  self.decode()
@@ -200,7 +204,7 @@ class WSPacket:
200
204
 
201
205
  return self._action_frame
202
206
 
203
- @property
207
+ @cached_property
204
208
  def data_frame(self) -> BaseWSPacketFrame:
205
209
  if self._data_frame is None:
206
210
  self.decode()
@@ -220,6 +224,8 @@ class WSPacket:
220
224
  self._action_frame = None
221
225
  self._data_frame = None
222
226
  self._raw_encoded = None
227
+ self.__dict__.pop("data_frame", None)
228
+ self.__dict__.pop("action_frame", None)
223
229
 
224
230
  @property
225
231
  def raw_base64(self) -> str:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: uiprotect
3
- Version: 0.10.1
3
+ Version: 0.11.0
4
4
  Summary: Python API for Unifi Protect (Unofficial)
5
5
  Home-page: https://github.com/uilibs/uiprotect
6
6
  License: MIT
@@ -15,13 +15,13 @@ uiprotect/cli/sensors.py,sha256=fQtcDJCVxs4VbAqcavgBy2ABiVxAW3GXtna6_XFBp2k,8153
15
15
  uiprotect/cli/viewers.py,sha256=2cyrp104ffIvgT0wYGIO0G35QMkEbFe7fSVqLwDXQYQ,2171
16
16
  uiprotect/data/__init__.py,sha256=OcfuJl2qXfHcj_mdnrHhzZ5tEIZrw8auziX5IE7dn-I,2938
17
17
  uiprotect/data/base.py,sha256=ex-UC9CJUtzxMFqtYokSiXM8pNHVBqCzq7r8WrEf1Mw,37178
18
- uiprotect/data/bootstrap.py,sha256=TzrwRfI4Jt0zDx_tKxGS6AM3xRixB8iHOVY7CgeM7Qg,21952
18
+ uiprotect/data/bootstrap.py,sha256=e84W72zg6MZCgaYEunr6CCvd5b7Hb-GDSDEvfEGEt0Y,21556
19
19
  uiprotect/data/convert.py,sha256=rOQplUMIdTMD2SbAx_iI9BNPDscnhDvyRVLEMDhtADg,2047
20
20
  uiprotect/data/devices.py,sha256=LHVBT8ihMAZen7gIlQNbiYxukRrBpi_TNKNmV_5R6Xc,111705
21
21
  uiprotect/data/nvr.py,sha256=OJso6oewA_jY7ovKbD2U2Onp1GqheT5bCW0F6dC53DQ,47570
22
22
  uiprotect/data/types.py,sha256=6Z5ZqWTbH4Igy0l4QJShqQZ_zvrJKD0G-hZLjoBNP-U,16193
23
23
  uiprotect/data/user.py,sha256=yBnUQ3qpHL745hLhR41WjWv_Yx51RlmfHapgvK0KSgM,7067
24
- uiprotect/data/websocket.py,sha256=lkdobRh5SPu7YzLHyhZVe7qlh5W3L8LKzS63Md-4DOk,6048
24
+ uiprotect/data/websocket.py,sha256=WZJVA7EfYuKYMv-9jmvGgMWXKzE9ES25SKv1NQ2eHjc,6281
25
25
  uiprotect/exceptions.py,sha256=kgn0cRM6lTtgLza09SDa3ZiX6ue1QqHCOogQ4qu6KTQ,965
26
26
  uiprotect/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
27
  uiprotect/release_cache.json,sha256=NamnSFy78hOWY0DPO87J9ELFCAN6NnVquv8gQO75ZG4,386
@@ -30,8 +30,8 @@ uiprotect/test_util/__init__.py,sha256=d2g7afa0LSdixQ0kjEDYwafDFME_UlW2LzxpamZ2B
30
30
  uiprotect/test_util/anonymize.py,sha256=f-8ijU-_y9r-uAbhIPn0f0I6hzJpAkvJzc8UpWihObI,8478
31
31
  uiprotect/utils.py,sha256=kXEr1xEoPAwUYuVPd6QoVnTf8MQwzQXQQ4JLyJsiRfY,18219
32
32
  uiprotect/websocket.py,sha256=iMTdchymaCgVHsmY1bRbxkcymqt6WQircIHYNxCu178,7289
33
- uiprotect-0.10.1.dist-info/LICENSE,sha256=INx18jhdbVXMEiiBANeKEbrbz57ckgzxk5uutmmcxGk,1111
34
- uiprotect-0.10.1.dist-info/METADATA,sha256=XM-hvlQWsrZSuAVzlVtridjkbMY2Bh18YmSfrNhwiKc,10985
35
- uiprotect-0.10.1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
36
- uiprotect-0.10.1.dist-info/entry_points.txt,sha256=J78AUTPrTTxgI3s7SVgrmGqDP7piX2wuuEORzhDdVRA,47
37
- uiprotect-0.10.1.dist-info/RECORD,,
33
+ uiprotect-0.11.0.dist-info/LICENSE,sha256=INx18jhdbVXMEiiBANeKEbrbz57ckgzxk5uutmmcxGk,1111
34
+ uiprotect-0.11.0.dist-info/METADATA,sha256=xyc8Jqihak81Xrqx9GhCDmIdJLGT-1CMsTfUDXVWskw,10985
35
+ uiprotect-0.11.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
36
+ uiprotect-0.11.0.dist-info/entry_points.txt,sha256=J78AUTPrTTxgI3s7SVgrmGqDP7piX2wuuEORzhDdVRA,47
37
+ uiprotect-0.11.0.dist-info/RECORD,,