uiprotect 7.5.1__tar.gz → 7.5.3__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.

Potentially problematic release.


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

Files changed (38) hide show
  1. {uiprotect-7.5.1 → uiprotect-7.5.3}/PKG-INFO +1 -1
  2. {uiprotect-7.5.1 → uiprotect-7.5.3}/pyproject.toml +3 -3
  3. {uiprotect-7.5.1 → uiprotect-7.5.3}/src/uiprotect/data/base.py +8 -9
  4. {uiprotect-7.5.1 → uiprotect-7.5.3}/src/uiprotect/data/devices.py +15 -12
  5. {uiprotect-7.5.1 → uiprotect-7.5.3}/src/uiprotect/data/nvr.py +6 -4
  6. {uiprotect-7.5.1 → uiprotect-7.5.3}/src/uiprotect/data/types.py +1 -1
  7. {uiprotect-7.5.1 → uiprotect-7.5.3}/src/uiprotect/utils.py +1 -1
  8. {uiprotect-7.5.1 → uiprotect-7.5.3}/LICENSE +0 -0
  9. {uiprotect-7.5.1 → uiprotect-7.5.3}/README.md +0 -0
  10. {uiprotect-7.5.1 → uiprotect-7.5.3}/src/uiprotect/__init__.py +0 -0
  11. {uiprotect-7.5.1 → uiprotect-7.5.3}/src/uiprotect/__main__.py +0 -0
  12. {uiprotect-7.5.1 → uiprotect-7.5.3}/src/uiprotect/_compat.py +0 -0
  13. {uiprotect-7.5.1 → uiprotect-7.5.3}/src/uiprotect/api.py +0 -0
  14. {uiprotect-7.5.1 → uiprotect-7.5.3}/src/uiprotect/cli/__init__.py +0 -0
  15. {uiprotect-7.5.1 → uiprotect-7.5.3}/src/uiprotect/cli/aiports.py +0 -0
  16. {uiprotect-7.5.1 → uiprotect-7.5.3}/src/uiprotect/cli/backup.py +0 -0
  17. {uiprotect-7.5.1 → uiprotect-7.5.3}/src/uiprotect/cli/base.py +0 -0
  18. {uiprotect-7.5.1 → uiprotect-7.5.3}/src/uiprotect/cli/cameras.py +0 -0
  19. {uiprotect-7.5.1 → uiprotect-7.5.3}/src/uiprotect/cli/chimes.py +0 -0
  20. {uiprotect-7.5.1 → uiprotect-7.5.3}/src/uiprotect/cli/doorlocks.py +0 -0
  21. {uiprotect-7.5.1 → uiprotect-7.5.3}/src/uiprotect/cli/events.py +0 -0
  22. {uiprotect-7.5.1 → uiprotect-7.5.3}/src/uiprotect/cli/lights.py +0 -0
  23. {uiprotect-7.5.1 → uiprotect-7.5.3}/src/uiprotect/cli/liveviews.py +0 -0
  24. {uiprotect-7.5.1 → uiprotect-7.5.3}/src/uiprotect/cli/nvr.py +0 -0
  25. {uiprotect-7.5.1 → uiprotect-7.5.3}/src/uiprotect/cli/sensors.py +0 -0
  26. {uiprotect-7.5.1 → uiprotect-7.5.3}/src/uiprotect/cli/viewers.py +0 -0
  27. {uiprotect-7.5.1 → uiprotect-7.5.3}/src/uiprotect/data/__init__.py +0 -0
  28. {uiprotect-7.5.1 → uiprotect-7.5.3}/src/uiprotect/data/bootstrap.py +0 -0
  29. {uiprotect-7.5.1 → uiprotect-7.5.3}/src/uiprotect/data/convert.py +0 -0
  30. {uiprotect-7.5.1 → uiprotect-7.5.3}/src/uiprotect/data/user.py +0 -0
  31. {uiprotect-7.5.1 → uiprotect-7.5.3}/src/uiprotect/data/websocket.py +0 -0
  32. {uiprotect-7.5.1 → uiprotect-7.5.3}/src/uiprotect/exceptions.py +0 -0
  33. {uiprotect-7.5.1 → uiprotect-7.5.3}/src/uiprotect/py.typed +0 -0
  34. {uiprotect-7.5.1 → uiprotect-7.5.3}/src/uiprotect/release_cache.json +0 -0
  35. {uiprotect-7.5.1 → uiprotect-7.5.3}/src/uiprotect/stream.py +0 -0
  36. {uiprotect-7.5.1 → uiprotect-7.5.3}/src/uiprotect/test_util/__init__.py +0 -0
  37. {uiprotect-7.5.1 → uiprotect-7.5.3}/src/uiprotect/test_util/anonymize.py +0 -0
  38. {uiprotect-7.5.1 → uiprotect-7.5.3}/src/uiprotect/websocket.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: uiprotect
3
- Version: 7.5.1
3
+ Version: 7.5.3
4
4
  Summary: Python API for Unifi Protect (Unofficial)
5
5
  Author: UI Protect Maintainers
6
6
  Author-email: ui@koston.org
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "uiprotect"
3
- version = "7.5.1"
3
+ version = "7.5.3"
4
4
  description = "Python API for Unifi Protect (Unofficial)"
5
5
  authors = ["UI Protect Maintainers <ui@koston.org>"]
6
6
  readme = "README.md"
@@ -54,7 +54,7 @@ pytest = ">=7,<9"
54
54
  pytest-cov = ">=3,<7"
55
55
  aiosqlite = ">=0.20.0"
56
56
  asttokens = ">=2.4.1,<4.0.0"
57
- pytest-asyncio = ">=0.23.7,<0.26.0"
57
+ pytest-asyncio = ">=0.23.7,<0.27.0"
58
58
  pytest-benchmark = ">=4,<6"
59
59
  pytest-sugar = "^1.0.0"
60
60
  pytest-timeout = "^2.3.1"
@@ -77,7 +77,7 @@ mkdocs-material-extensions = "^1.3.1"
77
77
  pymdown-extensions = "^10.8.1"
78
78
  mkdocs-git-revision-date-localized-plugin = "^1.2.6"
79
79
  mkdocs-include-markdown-plugin = ">=6.1.1,<8.0.0"
80
- mkdocstrings = ">=0.25.1,<0.29.0"
80
+ mkdocstrings = ">=0.25.1,<0.30.0"
81
81
  mkdocstrings-python = "^1.10.3"
82
82
 
83
83
  [tool.semantic_release]
@@ -8,7 +8,7 @@ from collections.abc import Callable
8
8
  from datetime import datetime, timedelta
9
9
  from functools import cache
10
10
  from ipaddress import IPv4Address
11
- from typing import TYPE_CHECKING, Any, NamedTuple, TypeVar
11
+ from typing import TYPE_CHECKING, Any, NamedTuple
12
12
  from uuid import UUID
13
13
 
14
14
  from convertertools import pop_dict_set_if_none, pop_dict_tuple
@@ -53,7 +53,6 @@ if TYPE_CHECKING:
53
53
  from ..data.user import User
54
54
 
55
55
 
56
- ProtectObject = TypeVar("ProtectObject", bound="ProtectBaseObject")
57
56
  RECENT_EVENT_MAX = timedelta(seconds=30)
58
57
  EVENT_PING_INTERVAL = timedelta(seconds=3)
59
58
  EVENT_PING_INTERVAL_SECONDS = EVENT_PING_INTERVAL.total_seconds()
@@ -478,7 +477,7 @@ class ProtectBaseObject(BaseModel):
478
477
 
479
478
  return new_data
480
479
 
481
- def update_from_dict(cls: ProtectObject, data: dict[str, Any]) -> ProtectObject:
480
+ def update_from_dict(self, data: dict[str, Any]) -> Self:
482
481
  """
483
482
  Updates current object from a cleaned UFP JSON dict.
484
483
 
@@ -492,15 +491,15 @@ class ProtectBaseObject(BaseModel):
492
491
  has_unifi_lists,
493
492
  unifi_dicts,
494
493
  has_unifi_dicts,
495
- ) = cls._get_protect_model()
496
- api = cls._api
497
- _fields = cls.model_fields
494
+ ) = self._get_protect_model()
495
+ api = self._api
496
+ _fields = self.__class__.model_fields
498
497
  unifi_obj: ProtectBaseObject | None
499
498
  value: Any
500
499
 
501
500
  for key, item in data.items():
502
501
  if has_unifi_objs and key in unifi_objs and isinstance(item, dict):
503
- if (unifi_obj := getattr(cls, key)) is not None:
502
+ if (unifi_obj := getattr(self, key)) is not None:
504
503
  value = unifi_obj.update_from_dict(item)
505
504
  else:
506
505
  value = unifi_objs[key](**item, api=api)
@@ -514,9 +513,9 @@ class ProtectBaseObject(BaseModel):
514
513
  else:
515
514
  value = convert_unifi_data(item, _fields[key])
516
515
 
517
- setattr(cls, key, value)
516
+ setattr(self, key, value)
518
517
 
519
- return cls
518
+ return self
520
519
 
521
520
  def dict_with_excludes(self) -> dict[str, Any]:
522
521
  """Returns a dict of the current object without any UFP objects converted to dicts."""
@@ -587,19 +587,22 @@ class VideoStats(ProtectBaseObject):
587
587
  @classmethod
588
588
  @cache
589
589
  def unifi_dict_conversions(cls) -> dict[str, object | Callable[[Any], Any]]:
590
- return {
591
- key: convert_to_datetime
592
- for key in (
593
- "recordingStart",
594
- "recordingEnd",
595
- "recordingStartLQ",
596
- "recordingEndLQ",
597
- "timelapseStart",
598
- "timelapseEnd",
599
- "timelapseStartLQ",
600
- "timelapseEndLQ",
590
+ return (
591
+ dict.fromkeys(
592
+ (
593
+ "recordingStart",
594
+ "recordingEnd",
595
+ "recordingStartLQ",
596
+ "recordingEndLQ",
597
+ "timelapseStart",
598
+ "timelapseEnd",
599
+ "timelapseStartLQ",
600
+ "timelapseEndLQ",
601
+ ),
602
+ convert_to_datetime,
601
603
  )
602
- } | super().unifi_dict_conversions()
604
+ | super().unifi_dict_conversions()
605
+ )
603
606
 
604
607
 
605
608
  class StorageStats(ProtectBaseObject):
@@ -321,10 +321,12 @@ class Event(ProtectModelWithId):
321
321
  @classmethod
322
322
  @cache
323
323
  def unifi_dict_conversions(cls) -> dict[str, object | Callable[[Any], Any]]:
324
- return {
325
- key: convert_to_datetime
326
- for key in ("start", "end", "timestamp", "deletedAt")
327
- } | super().unifi_dict_conversions()
324
+ return (
325
+ dict.fromkeys(
326
+ ("start", "end", "timestamp", "deletedAt"), convert_to_datetime
327
+ )
328
+ | super().unifi_dict_conversions()
329
+ )
328
330
 
329
331
  def unifi_dict(
330
332
  self,
@@ -679,7 +679,7 @@ RepeatTimes = Annotated[int, Field(ge=1, le=6)]
679
679
  class PTZPositionDegree(BaseModel):
680
680
  pan: float
681
681
  tilt: float
682
- zoom: int
682
+ zoom: float
683
683
 
684
684
 
685
685
  class PTZPositionSteps(BaseModel):
@@ -154,7 +154,7 @@ def to_ms(duration: timedelta | None) -> int | None:
154
154
  if duration is None:
155
155
  return None
156
156
 
157
- return int(round(duration.total_seconds() * 1000))
157
+ return round(duration.total_seconds() * 1000)
158
158
 
159
159
 
160
160
  def utc_now() -> datetime:
File without changes
File without changes