axis 57__tar.gz → 59__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 (111) hide show
  1. axis-59/PKG-INFO +24 -0
  2. {axis-57 → axis-59}/axis/__main__.py +1 -1
  3. {axis-57 → axis-59}/axis/device.py +4 -4
  4. {axis-57/axis/vapix → axis-59/axis}/interfaces/api_handler.py +2 -2
  5. axis-57/axis/event_stream.py → axis-59/axis/interfaces/event_manager.py +3 -8
  6. {axis-57/axis/vapix → axis-59/axis}/interfaces/parameters/param_cgi.py +1 -1
  7. {axis-57/axis/vapix → axis-59/axis/interfaces}/vapix.py +24 -24
  8. {axis-57/axis/vapix → axis-59/axis}/models/event_instance.py +1 -1
  9. {axis-57/axis/vapix → axis-59/axis}/models/parameters/image.py +6 -6
  10. axis-59/axis.egg-info/PKG-INFO +24 -0
  11. axis-59/axis.egg-info/SOURCES.txt +103 -0
  12. {axis-57 → axis-59}/axis.egg-info/requires.txt +3 -3
  13. {axis-57 → axis-59}/pyproject.toml +5 -4
  14. {axis-57 → axis-59}/tests/test_api_discovery.py +2 -2
  15. {axis-57 → axis-59}/tests/test_api_handler.py +1 -1
  16. {axis-57 → axis-59}/tests/test_basic_device_info.py +1 -1
  17. {axis-57 → axis-59}/tests/test_configuration.py +1 -1
  18. {axis-57 → axis-59}/tests/test_event_instances.py +2 -2
  19. {axis-57 → axis-59}/tests/test_event_stream.py +1 -1
  20. {axis-57 → axis-59}/tests/test_light_control.py +2 -2
  21. {axis-57 → axis-59}/tests/test_mqtt.py +2 -2
  22. {axis-57 → axis-59}/tests/test_pir_sensor_configuration.py +2 -2
  23. {axis-57 → axis-59}/tests/test_port_cgi.py +2 -2
  24. {axis-57 → axis-59}/tests/test_port_management.py +2 -2
  25. {axis-57 → axis-59}/tests/test_ptz.py +2 -2
  26. {axis-57 → axis-59}/tests/test_pwdgrp_cgi.py +2 -2
  27. {axis-57 → axis-59}/tests/test_rtsp.py +4 -2
  28. {axis-57 → axis-59}/tests/test_stream_profiles.py +1 -1
  29. {axis-57 → axis-59}/tests/test_user_groups.py +2 -2
  30. {axis-57 → axis-59}/tests/test_vapix.py +7 -7
  31. {axis-57 → axis-59}/tests/test_view_areas.py +1 -1
  32. axis-57/PKG-INFO +0 -45
  33. axis-57/axis/vapix/__init__.py +0 -1
  34. axis-57/axis/vapix/models/__init__.py +0 -1
  35. axis-57/axis.egg-info/PKG-INFO +0 -45
  36. axis-57/axis.egg-info/SOURCES.txt +0 -106
  37. axis-57/setup.py +0 -25
  38. {axis-57 → axis-59}/LICENSE +0 -0
  39. {axis-57 → axis-59}/README.md +0 -0
  40. {axis-57 → axis-59}/axis/__init__.py +0 -0
  41. {axis-57 → axis-59}/axis/errors.py +0 -0
  42. {axis-57/axis/vapix → axis-59/axis}/interfaces/__init__.py +0 -0
  43. {axis-57/axis/vapix → axis-59/axis}/interfaces/api_discovery.py +0 -0
  44. {axis-57/axis/vapix → axis-59/axis}/interfaces/applications/__init__.py +0 -0
  45. {axis-57/axis/vapix → axis-59/axis}/interfaces/applications/application_handler.py +0 -0
  46. {axis-57/axis/vapix → axis-59/axis}/interfaces/applications/applications.py +0 -0
  47. {axis-57/axis/vapix → axis-59/axis}/interfaces/applications/fence_guard.py +0 -0
  48. {axis-57/axis/vapix → axis-59/axis}/interfaces/applications/loitering_guard.py +0 -0
  49. {axis-57/axis/vapix → axis-59/axis}/interfaces/applications/motion_guard.py +0 -0
  50. {axis-57/axis/vapix → axis-59/axis}/interfaces/applications/object_analytics.py +0 -0
  51. {axis-57/axis/vapix → axis-59/axis}/interfaces/applications/vmd4.py +0 -0
  52. {axis-57/axis/vapix → axis-59/axis}/interfaces/basic_device_info.py +0 -0
  53. {axis-57/axis/vapix → axis-59/axis}/interfaces/event_instances.py +0 -0
  54. {axis-57/axis/vapix → axis-59/axis}/interfaces/light_control.py +0 -0
  55. {axis-57/axis/vapix → axis-59/axis}/interfaces/mqtt.py +0 -0
  56. {axis-57/axis/vapix → axis-59/axis}/interfaces/parameters/__init__.py +0 -0
  57. {axis-57/axis/vapix → axis-59/axis}/interfaces/parameters/brand.py +0 -0
  58. {axis-57/axis/vapix → axis-59/axis}/interfaces/parameters/image.py +0 -0
  59. {axis-57/axis/vapix → axis-59/axis}/interfaces/parameters/io_port.py +0 -0
  60. {axis-57/axis/vapix → axis-59/axis}/interfaces/parameters/param_handler.py +0 -0
  61. {axis-57/axis/vapix → axis-59/axis}/interfaces/parameters/properties.py +0 -0
  62. {axis-57/axis/vapix → axis-59/axis}/interfaces/parameters/ptz.py +0 -0
  63. {axis-57/axis/vapix → axis-59/axis}/interfaces/parameters/stream_profile.py +0 -0
  64. {axis-57/axis/vapix → axis-59/axis}/interfaces/pir_sensor_configuration.py +0 -0
  65. {axis-57/axis/vapix → axis-59/axis}/interfaces/port_cgi.py +0 -0
  66. {axis-57/axis/vapix → axis-59/axis}/interfaces/port_management.py +0 -0
  67. {axis-57/axis/vapix → axis-59/axis}/interfaces/ptz.py +0 -0
  68. {axis-57/axis/vapix → axis-59/axis}/interfaces/pwdgrp_cgi.py +0 -0
  69. {axis-57/axis/vapix → axis-59/axis}/interfaces/stream_profiles.py +0 -0
  70. {axis-57/axis/vapix → axis-59/axis}/interfaces/user_groups.py +0 -0
  71. {axis-57/axis/vapix → axis-59/axis}/interfaces/view_areas.py +0 -0
  72. {axis-57 → axis-59}/axis/models/__init__.py +0 -0
  73. {axis-57/axis/vapix → axis-59/axis}/models/api.py +0 -0
  74. {axis-57/axis/vapix → axis-59/axis}/models/api_discovery.py +0 -0
  75. {axis-57/axis/vapix → axis-59/axis}/models/applications/__init__.py +0 -0
  76. {axis-57/axis/vapix → axis-59/axis}/models/applications/application.py +0 -0
  77. {axis-57/axis/vapix → axis-59/axis}/models/applications/fence_guard.py +0 -0
  78. {axis-57/axis/vapix → axis-59/axis}/models/applications/loitering_guard.py +0 -0
  79. {axis-57/axis/vapix → axis-59/axis}/models/applications/motion_guard.py +0 -0
  80. {axis-57/axis/vapix → axis-59/axis}/models/applications/object_analytics.py +0 -0
  81. {axis-57/axis/vapix → axis-59/axis}/models/applications/vmd4.py +0 -0
  82. {axis-57/axis/vapix → axis-59/axis}/models/basic_device_info.py +0 -0
  83. {axis-57/axis → axis-59/axis/models}/configuration.py +0 -0
  84. {axis-57 → axis-59}/axis/models/event.py +0 -0
  85. {axis-57/axis/vapix → axis-59/axis}/models/light_control.py +0 -0
  86. {axis-57/axis/vapix → axis-59/axis}/models/mqtt.py +0 -0
  87. {axis-57/axis/vapix → axis-59/axis}/models/parameters/__init__.py +0 -0
  88. {axis-57/axis/vapix → axis-59/axis}/models/parameters/brand.py +0 -0
  89. {axis-57/axis/vapix → axis-59/axis}/models/parameters/io_port.py +0 -0
  90. {axis-57/axis/vapix → axis-59/axis}/models/parameters/param_cgi.py +0 -0
  91. {axis-57/axis/vapix → axis-59/axis}/models/parameters/properties.py +0 -0
  92. {axis-57/axis/vapix → axis-59/axis}/models/parameters/ptz.py +0 -0
  93. {axis-57/axis/vapix → axis-59/axis}/models/parameters/stream_profile.py +0 -0
  94. {axis-57/axis/vapix → axis-59/axis}/models/pir_sensor_configuration.py +0 -0
  95. {axis-57/axis/vapix → axis-59/axis}/models/port_cgi.py +0 -0
  96. {axis-57/axis/vapix → axis-59/axis}/models/port_management.py +0 -0
  97. {axis-57/axis/vapix → axis-59/axis}/models/ptz_cgi.py +0 -0
  98. {axis-57/axis/vapix → axis-59/axis}/models/pwdgrp_cgi.py +0 -0
  99. {axis-57/axis/vapix → axis-59/axis}/models/stream_profile.py +0 -0
  100. {axis-57/axis/vapix → axis-59/axis}/models/user_group.py +0 -0
  101. {axis-57/axis/vapix → axis-59/axis}/models/view_area.py +0 -0
  102. {axis-57 → axis-59}/axis/py.typed +0 -0
  103. {axis-57 → axis-59}/axis/rtsp.py +0 -0
  104. {axis-57 → axis-59}/axis/stream_manager.py +0 -0
  105. {axis-57 → axis-59}/axis.egg-info/dependency_links.txt +0 -0
  106. {axis-57 → axis-59}/axis.egg-info/entry_points.txt +0 -0
  107. {axis-57 → axis-59}/axis.egg-info/top_level.txt +0 -0
  108. {axis-57 → axis-59}/setup.cfg +0 -0
  109. {axis-57 → axis-59}/tests/test_device.py +0 -0
  110. {axis-57 → axis-59}/tests/test_event.py +0 -0
  111. {axis-57 → axis-59}/tests/test_stream_manager.py +0 -0
axis-59/PKG-INFO ADDED
@@ -0,0 +1,24 @@
1
+ Metadata-Version: 2.1
2
+ Name: axis
3
+ Version: 59
4
+ Summary: A Python library for communicating with devices from Axis Communications
5
+ Author-email: Robert Svensson <Kane610@users.noreply.github.com>
6
+ License: MIT
7
+ Project-URL: Source Code, https://github.com/Kane610/axis
8
+ Project-URL: Bug Reports, https://github.com/Kane610/axis/issues
9
+ Project-URL: Forum, https://community.home-assistant.io/t/axis-camera-component/
10
+ Keywords: axis,vapix,homeassistant
11
+ Classifier: Development Status :: 5 - Production/Stable
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Operating System :: OS Independent
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Topic :: Home Automation
17
+ Requires-Python: >=3.11.0
18
+ Description-Content-Type: text/markdown
19
+ Provides-Extra: requirements
20
+ Provides-Extra: requirements_test
21
+ Provides-Extra: requirements_dev
22
+ License-File: LICENSE
23
+
24
+ Python project to set up a connection towards Axis Communications devices and to subscribe to specific events on the metadatastream.
@@ -22,7 +22,7 @@ async def axis_device(
22
22
  """Create a Axis device."""
23
23
  session = AsyncClient(verify=False)
24
24
  device = axis.device.AxisDevice(
25
- axis.configuration.Configuration(
25
+ axis.models.configuration.Configuration(
26
26
  session, host, port=port, username=username, password=password
27
27
  )
28
28
  )
@@ -1,9 +1,9 @@
1
1
  """Python library to enable Axis devices to integrate with Home Assistant."""
2
2
 
3
- from .configuration import Configuration
4
- from .event_stream import EventManager
3
+ from .interfaces.event_manager import EventManager
4
+ from .interfaces.vapix import Vapix
5
+ from .models.configuration import Configuration
5
6
  from .stream_manager import StreamManager
6
- from .vapix.vapix import Vapix
7
7
 
8
8
 
9
9
  class AxisDevice:
@@ -14,7 +14,7 @@ class AxisDevice:
14
14
  self.config = configuration
15
15
  self.vapix = Vapix(self)
16
16
  self.stream = StreamManager(self)
17
- self.event = EventManager(self)
17
+ self.event = EventManager()
18
18
 
19
19
  def enable_events(self) -> None:
20
20
  """Enable events for stream."""
@@ -11,11 +11,11 @@ from collections.abc import (
11
11
  )
12
12
  from typing import TYPE_CHECKING, Generic, final
13
13
 
14
- from ...errors import Forbidden, PathNotFound, Unauthorized
14
+ from ..errors import Forbidden, PathNotFound, Unauthorized
15
15
 
16
16
  if TYPE_CHECKING:
17
17
  from ..models.api_discovery import ApiId
18
- from ..vapix import Vapix
18
+ from .vapix import Vapix
19
19
 
20
20
  from ..models.api import ApiItemT
21
21
 
@@ -2,13 +2,9 @@
2
2
 
3
3
  from collections.abc import Callable
4
4
  import logging
5
- from typing import TYPE_CHECKING, Any
6
-
7
- from .models.event import Event, EventOperation, EventTopic
8
-
9
- if TYPE_CHECKING:
10
- from .device import AxisDevice
5
+ from typing import Any
11
6
 
7
+ from ..models.event import Event, EventOperation, EventTopic
12
8
 
13
9
  SubscriptionCallback = Callable[[Event], None]
14
10
  SubscriptionType = tuple[
@@ -30,9 +26,8 @@ LOGGER = logging.getLogger(__name__)
30
26
  class EventManager:
31
27
  """Initialize new events and update states of existing events."""
32
28
 
33
- def __init__(self, device: "AxisDevice") -> None:
29
+ def __init__(self) -> None:
34
30
  """Ready information about events."""
35
- self.device = device
36
31
  self._known_topics: set[str] = set()
37
32
  self._subscribers: dict[str, list[SubscriptionType]] = {ID_FILTER_ALL: []}
38
33
 
@@ -14,7 +14,7 @@ from .ptz import PtzParameterHandler
14
14
  from .stream_profile import StreamProfileParameterHandler
15
15
 
16
16
  if TYPE_CHECKING:
17
- from ...vapix import Vapix
17
+ from ..vapix import Vapix
18
18
 
19
19
 
20
20
  class Params(ApiHandler[Any]):
@@ -7,36 +7,36 @@ from typing import TYPE_CHECKING, Any
7
7
  import httpx
8
8
 
9
9
  from ..errors import RequestError, raise_error
10
- from .interfaces.api_discovery import ApiDiscoveryHandler
11
- from .interfaces.api_handler import ApiHandler
12
- from .interfaces.applications import (
10
+ from ..models.api import ApiRequest
11
+ from ..models.pwdgrp_cgi import SecondaryGroup
12
+ from ..models.stream_profile import StreamProfile
13
+ from .api_discovery import ApiDiscoveryHandler
14
+ from .api_handler import ApiHandler
15
+ from .applications import (
13
16
  ApplicationsHandler,
14
17
  )
15
- from .interfaces.applications.fence_guard import FenceGuardHandler
16
- from .interfaces.applications.loitering_guard import (
18
+ from .applications.fence_guard import FenceGuardHandler
19
+ from .applications.loitering_guard import (
17
20
  LoiteringGuardHandler,
18
21
  )
19
- from .interfaces.applications.motion_guard import MotionGuardHandler
20
- from .interfaces.applications.object_analytics import (
22
+ from .applications.motion_guard import MotionGuardHandler
23
+ from .applications.object_analytics import (
21
24
  ObjectAnalyticsHandler,
22
25
  )
23
- from .interfaces.applications.vmd4 import Vmd4Handler
24
- from .interfaces.basic_device_info import BasicDeviceInfoHandler
25
- from .interfaces.event_instances import EventInstanceHandler
26
- from .interfaces.light_control import LightHandler
27
- from .interfaces.mqtt import MqttClientHandler
28
- from .interfaces.parameters.param_cgi import Params
29
- from .interfaces.pir_sensor_configuration import PirSensorConfigurationHandler
30
- from .interfaces.port_cgi import Ports
31
- from .interfaces.port_management import IoPortManagement
32
- from .interfaces.ptz import PtzControl
33
- from .interfaces.pwdgrp_cgi import Users
34
- from .interfaces.stream_profiles import StreamProfilesHandler
35
- from .interfaces.user_groups import UserGroups
36
- from .interfaces.view_areas import ViewAreaHandler
37
- from .models.api import ApiRequest
38
- from .models.pwdgrp_cgi import SecondaryGroup
39
- from .models.stream_profile import StreamProfile
26
+ from .applications.vmd4 import Vmd4Handler
27
+ from .basic_device_info import BasicDeviceInfoHandler
28
+ from .event_instances import EventInstanceHandler
29
+ from .light_control import LightHandler
30
+ from .mqtt import MqttClientHandler
31
+ from .parameters.param_cgi import Params
32
+ from .pir_sensor_configuration import PirSensorConfigurationHandler
33
+ from .port_cgi import Ports
34
+ from .port_management import IoPortManagement
35
+ from .ptz import PtzControl
36
+ from .pwdgrp_cgi import Users
37
+ from .stream_profiles import StreamProfilesHandler
38
+ from .user_groups import UserGroups
39
+ from .view_areas import ViewAreaHandler
40
40
 
41
41
  if TYPE_CHECKING:
42
42
  from ..device import AxisDevice
@@ -5,8 +5,8 @@ from typing import Any, Self
5
5
 
6
6
  import xmltodict
7
7
 
8
- from ...models.event import traverse
9
8
  from .api import ApiItem, ApiRequest, ApiResponse
9
+ from .event import traverse
10
10
 
11
11
  EVENT_INSTANCE = (
12
12
  "http://www.w3.org/2003/05/soap-envelope:Envelope",
@@ -110,7 +110,7 @@ class ImageParamT(TypedDict):
110
110
  Name: str
111
111
  Source: str
112
112
  Appearance: ImageAppearanceParamT
113
- MPEG: ImageMpegParamT
113
+ MPEG: NotRequired[ImageMpegParamT]
114
114
  Overlay: NotRequired[ImageOverlayParamT]
115
115
  RateControl: NotRequired[ImageRateControlParamT]
116
116
  SizeControl: NotRequired[ImageSizeControlParamT]
@@ -125,9 +125,9 @@ class ImageParam(ParamItem):
125
125
 
126
126
  enabled: str
127
127
  name: str
128
- source: str
128
+ source: str | None
129
129
  appearance: ImageAppearanceParamT
130
- mpeg: ImageMpegParamT
130
+ mpeg: ImageMpegParamT | None
131
131
  overlay: ImageOverlayParamT | None
132
132
  rate_control: ImageRateControlParamT | None
133
133
  size_control: ImageSizeControlParamT | None
@@ -141,11 +141,11 @@ class ImageParam(ParamItem):
141
141
  id, raw = data
142
142
  return cls(
143
143
  id=id,
144
- enabled=raw["Enabled"],
144
+ enabled=raw.get("Enabled", "yes"),
145
145
  name=raw["Name"],
146
- source=raw["Source"],
146
+ source=raw.get("Source"),
147
147
  appearance=raw["Appearance"],
148
- mpeg=raw["MPEG"],
148
+ mpeg=raw.get("MPEG"),
149
149
  overlay=raw.get("Overlay"),
150
150
  rate_control=raw.get("RateControl"),
151
151
  size_control=raw.get("SizeControl"),
@@ -0,0 +1,24 @@
1
+ Metadata-Version: 2.1
2
+ Name: axis
3
+ Version: 59
4
+ Summary: A Python library for communicating with devices from Axis Communications
5
+ Author-email: Robert Svensson <Kane610@users.noreply.github.com>
6
+ License: MIT
7
+ Project-URL: Source Code, https://github.com/Kane610/axis
8
+ Project-URL: Bug Reports, https://github.com/Kane610/axis/issues
9
+ Project-URL: Forum, https://community.home-assistant.io/t/axis-camera-component/
10
+ Keywords: axis,vapix,homeassistant
11
+ Classifier: Development Status :: 5 - Production/Stable
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Operating System :: OS Independent
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Topic :: Home Automation
17
+ Requires-Python: >=3.11.0
18
+ Description-Content-Type: text/markdown
19
+ Provides-Extra: requirements
20
+ Provides-Extra: requirements_test
21
+ Provides-Extra: requirements_dev
22
+ License-File: LICENSE
23
+
24
+ Python project to set up a connection towards Axis Communications devices and to subscribe to specific events on the metadatastream.
@@ -0,0 +1,103 @@
1
+ LICENSE
2
+ README.md
3
+ pyproject.toml
4
+ axis/__init__.py
5
+ axis/__main__.py
6
+ axis/device.py
7
+ axis/errors.py
8
+ axis/py.typed
9
+ axis/rtsp.py
10
+ axis/stream_manager.py
11
+ axis.egg-info/PKG-INFO
12
+ axis.egg-info/SOURCES.txt
13
+ axis.egg-info/dependency_links.txt
14
+ axis.egg-info/entry_points.txt
15
+ axis.egg-info/requires.txt
16
+ axis.egg-info/top_level.txt
17
+ axis/interfaces/__init__.py
18
+ axis/interfaces/api_discovery.py
19
+ axis/interfaces/api_handler.py
20
+ axis/interfaces/basic_device_info.py
21
+ axis/interfaces/event_instances.py
22
+ axis/interfaces/event_manager.py
23
+ axis/interfaces/light_control.py
24
+ axis/interfaces/mqtt.py
25
+ axis/interfaces/pir_sensor_configuration.py
26
+ axis/interfaces/port_cgi.py
27
+ axis/interfaces/port_management.py
28
+ axis/interfaces/ptz.py
29
+ axis/interfaces/pwdgrp_cgi.py
30
+ axis/interfaces/stream_profiles.py
31
+ axis/interfaces/user_groups.py
32
+ axis/interfaces/vapix.py
33
+ axis/interfaces/view_areas.py
34
+ axis/interfaces/applications/__init__.py
35
+ axis/interfaces/applications/application_handler.py
36
+ axis/interfaces/applications/applications.py
37
+ axis/interfaces/applications/fence_guard.py
38
+ axis/interfaces/applications/loitering_guard.py
39
+ axis/interfaces/applications/motion_guard.py
40
+ axis/interfaces/applications/object_analytics.py
41
+ axis/interfaces/applications/vmd4.py
42
+ axis/interfaces/parameters/__init__.py
43
+ axis/interfaces/parameters/brand.py
44
+ axis/interfaces/parameters/image.py
45
+ axis/interfaces/parameters/io_port.py
46
+ axis/interfaces/parameters/param_cgi.py
47
+ axis/interfaces/parameters/param_handler.py
48
+ axis/interfaces/parameters/properties.py
49
+ axis/interfaces/parameters/ptz.py
50
+ axis/interfaces/parameters/stream_profile.py
51
+ axis/models/__init__.py
52
+ axis/models/api.py
53
+ axis/models/api_discovery.py
54
+ axis/models/basic_device_info.py
55
+ axis/models/configuration.py
56
+ axis/models/event.py
57
+ axis/models/event_instance.py
58
+ axis/models/light_control.py
59
+ axis/models/mqtt.py
60
+ axis/models/pir_sensor_configuration.py
61
+ axis/models/port_cgi.py
62
+ axis/models/port_management.py
63
+ axis/models/ptz_cgi.py
64
+ axis/models/pwdgrp_cgi.py
65
+ axis/models/stream_profile.py
66
+ axis/models/user_group.py
67
+ axis/models/view_area.py
68
+ axis/models/applications/__init__.py
69
+ axis/models/applications/application.py
70
+ axis/models/applications/fence_guard.py
71
+ axis/models/applications/loitering_guard.py
72
+ axis/models/applications/motion_guard.py
73
+ axis/models/applications/object_analytics.py
74
+ axis/models/applications/vmd4.py
75
+ axis/models/parameters/__init__.py
76
+ axis/models/parameters/brand.py
77
+ axis/models/parameters/image.py
78
+ axis/models/parameters/io_port.py
79
+ axis/models/parameters/param_cgi.py
80
+ axis/models/parameters/properties.py
81
+ axis/models/parameters/ptz.py
82
+ axis/models/parameters/stream_profile.py
83
+ tests/test_api_discovery.py
84
+ tests/test_api_handler.py
85
+ tests/test_basic_device_info.py
86
+ tests/test_configuration.py
87
+ tests/test_device.py
88
+ tests/test_event.py
89
+ tests/test_event_instances.py
90
+ tests/test_event_stream.py
91
+ tests/test_light_control.py
92
+ tests/test_mqtt.py
93
+ tests/test_pir_sensor_configuration.py
94
+ tests/test_port_cgi.py
95
+ tests/test_port_management.py
96
+ tests/test_ptz.py
97
+ tests/test_pwdgrp_cgi.py
98
+ tests/test_rtsp.py
99
+ tests/test_stream_manager.py
100
+ tests/test_stream_profiles.py
101
+ tests/test_user_groups.py
102
+ tests/test_vapix.py
103
+ tests/test_view_areas.py
@@ -10,15 +10,15 @@ packaging==24.0
10
10
  xmltodict==0.13.0
11
11
 
12
12
  [requirements_dev]
13
- pre-commit==3.6.2
13
+ pre-commit==3.7.0
14
14
 
15
15
  [requirements_test]
16
16
  mypy==1.9.0
17
17
  pytest==8.1.1
18
18
  pytest-aiohttp==1.0.5
19
19
  pytest-asyncio==0.23.6
20
- pytest-cov==4.1.0
20
+ pytest-cov==5.0.0
21
21
  respx==0.21.0
22
- ruff==0.3.3
22
+ ruff==0.3.4
23
23
  types-orjson==3.6.2
24
24
  types-xmltodict==v0.13.0.3
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "axis"
7
- version = "57"
7
+ version = "59"
8
8
  license = {text = "MIT"}
9
9
  description = "A Python library for communicating with devices from Axis Communications"
10
10
  readme = "README.md"
@@ -38,14 +38,14 @@ requirements_test = [
38
38
  "pytest==8.1.1",
39
39
  "pytest-aiohttp==1.0.5",
40
40
  "pytest-asyncio==0.23.6",
41
- "pytest-cov==4.1.0",
41
+ "pytest-cov==5.0.0",
42
42
  "respx==0.21.0",
43
- "ruff==0.3.3",
43
+ "ruff==0.3.4",
44
44
  "types-orjson==3.6.2",
45
45
  "types-xmltodict==v0.13.0.3",
46
46
  ]
47
47
  requirements_dev = [
48
- "pre-commit==3.6.2"
48
+ "pre-commit==3.7.0"
49
49
  ]
50
50
 
51
51
  [project.urls]
@@ -123,6 +123,7 @@ lint.select = [
123
123
  "PIE", # flake8-pie
124
124
  "PL", # pylint
125
125
  "PERF", # Perflint
126
+ "PT", # pytest
126
127
  "RSE", # flake8-raise
127
128
  "RUF005", # Consider iterable unpacking instead of concatenation
128
129
  "RUF006", # Store a reference to the return value of asyncio.create_task
@@ -8,8 +8,8 @@ import json
8
8
  import pytest
9
9
 
10
10
  from axis.device import AxisDevice
11
- from axis.vapix.interfaces.api_discovery import ApiDiscoveryHandler
12
- from axis.vapix.models.api_discovery import ApiId, ApiStatus
11
+ from axis.interfaces.api_discovery import ApiDiscoveryHandler
12
+ from axis.models.api_discovery import ApiId, ApiStatus
13
13
 
14
14
 
15
15
  @pytest.fixture
@@ -4,7 +4,7 @@ from unittest.mock import Mock
4
4
 
5
5
  import pytest
6
6
 
7
- from axis.vapix.interfaces.api_handler import SubscriptionHandler
7
+ from axis.interfaces.api_handler import SubscriptionHandler
8
8
 
9
9
 
10
10
  @pytest.fixture
@@ -9,7 +9,7 @@ from unittest.mock import MagicMock
9
9
  import pytest
10
10
 
11
11
  from axis.device import AxisDevice
12
- from axis.vapix.interfaces.basic_device_info import BasicDeviceInfoHandler
12
+ from axis.interfaces.basic_device_info import BasicDeviceInfoHandler
13
13
 
14
14
 
15
15
  @pytest.fixture
@@ -5,7 +5,7 @@ pytest --cov-report term-missing --cov=axis.configuration tests/test_configurati
5
5
 
6
6
  from httpx import AsyncClient
7
7
 
8
- from axis.configuration import Configuration
8
+ from axis.models.configuration import Configuration
9
9
 
10
10
 
11
11
  def test_configuration():
@@ -5,8 +5,8 @@ pytest --cov-report term-missing --cov=axis.event_instances tests/test_event_ins
5
5
 
6
6
  import pytest
7
7
 
8
- from axis.vapix.interfaces.event_instances import EventInstanceHandler
9
- from axis.vapix.models.event_instance import get_events
8
+ from axis.interfaces.event_instances import EventInstanceHandler
9
+ from axis.models.event_instance import get_events
10
10
 
11
11
  from .event_fixtures import (
12
12
  EVENT_INSTANCE_PIR_SENSOR,
@@ -8,7 +8,7 @@ from unittest.mock import Mock
8
8
  import pytest
9
9
 
10
10
  from axis.device import AxisDevice
11
- from axis.event_stream import EventManager
11
+ from axis.interfaces.event_manager import EventManager
12
12
  from axis.models.event import Event, EventGroup, EventOperation, EventTopic
13
13
 
14
14
  from .event_fixtures import (
@@ -8,8 +8,8 @@ import json
8
8
  import pytest
9
9
 
10
10
  from axis.device import AxisDevice
11
- from axis.vapix.interfaces.light_control import LightHandler
12
- from axis.vapix.models.api_discovery import Api
11
+ from axis.interfaces.light_control import LightHandler
12
+ from axis.models.api_discovery import Api
13
13
 
14
14
 
15
15
  @pytest.fixture
@@ -9,8 +9,8 @@ from unittest.mock import MagicMock
9
9
  import pytest
10
10
 
11
11
  from axis.device import AxisDevice
12
- from axis.vapix.interfaces.mqtt import MqttClientHandler, mqtt_json_to_event
13
- from axis.vapix.models.mqtt import ClientConfig, Message, Server, ServerProtocol, Ssl
12
+ from axis.interfaces.mqtt import MqttClientHandler, mqtt_json_to_event
13
+ from axis.models.mqtt import ClientConfig, Message, Server, ServerProtocol, Ssl
14
14
 
15
15
 
16
16
  @pytest.fixture
@@ -1,6 +1,6 @@
1
1
  """Test Axis PIR sensor configuration API.
2
2
 
3
- pytest --cov-report term-missing --cov=axis.vapix.interfaces.pir_sensor_configuration tests/test_pir_sensor_configuration.py
3
+ pytest --cov-report term-missing --cov=axis.interfaces.pir_sensor_configuration tests/test_pir_sensor_configuration.py
4
4
  """
5
5
 
6
6
  import json
@@ -9,7 +9,7 @@ from unittest.mock import MagicMock
9
9
  import pytest
10
10
 
11
11
  from axis.device import AxisDevice
12
- from axis.vapix.interfaces.pir_sensor_configuration import PirSensorConfigurationHandler
12
+ from axis.interfaces.pir_sensor_configuration import PirSensorConfigurationHandler
13
13
 
14
14
 
15
15
  @pytest.fixture
@@ -5,8 +5,8 @@ pytest --cov-report term-missing --cov=axis.port_cgi tests/test_port_cgi.py
5
5
 
6
6
  import pytest
7
7
 
8
- from axis.vapix.interfaces.port_cgi import Ports
9
- from axis.vapix.models.parameters.io_port import PortAction, PortDirection
8
+ from axis.interfaces.port_cgi import Ports
9
+ from axis.models.parameters.io_port import PortAction, PortDirection
10
10
 
11
11
  from .conftest import HOST
12
12
 
@@ -7,8 +7,8 @@ import json
7
7
 
8
8
  import pytest
9
9
 
10
- from axis.vapix.interfaces.port_management import IoPortManagement
11
- from axis.vapix.models.port_management import PortConfiguration, Sequence
10
+ from axis.interfaces.port_management import IoPortManagement
11
+ from axis.models.port_management import PortConfiguration, Sequence
12
12
 
13
13
 
14
14
  @pytest.fixture
@@ -5,8 +5,8 @@ from urllib.parse import urlencode
5
5
  import pytest
6
6
 
7
7
  from axis.device import AxisDevice
8
- from axis.vapix.interfaces.ptz import PtzControl
9
- from axis.vapix.models.ptz_cgi import PtzMove, PtzQuery, PtzRotation, PtzState
8
+ from axis.interfaces.ptz import PtzControl
9
+ from axis.models.ptz_cgi import PtzMove, PtzQuery, PtzRotation, PtzState
10
10
 
11
11
  from .parameters.test_ptz import PTZ_RESPONSE
12
12
 
@@ -4,8 +4,8 @@ import urllib
4
4
 
5
5
  import pytest
6
6
 
7
- from axis.vapix.interfaces.pwdgrp_cgi import Users
8
- from axis.vapix.models.pwdgrp_cgi import SecondaryGroup, User
7
+ from axis.interfaces.pwdgrp_cgi import Users
8
+ from axis.models.pwdgrp_cgi import SecondaryGroup, User
9
9
 
10
10
 
11
11
  @pytest.fixture
@@ -584,8 +584,10 @@ def test_session_state_method(rtsp_client):
584
584
  assert session.state == State.STOPPED
585
585
 
586
586
  with patch.object(session, "sequence", 6), pytest.raises(IndexError):
587
- _ = session.method # B018 lint
588
- _ = session.state # B018 lint
587
+ _ = session.method
588
+
589
+ with patch.object(session, "sequence", 6), pytest.raises(IndexError):
590
+ _ = session.state
589
591
 
590
592
 
591
593
  def test_session_update_status_codes(rtsp_client):
@@ -6,7 +6,7 @@ from unittest.mock import MagicMock
6
6
  import pytest
7
7
 
8
8
  from axis.device import AxisDevice
9
- from axis.vapix.interfaces.stream_profiles import StreamProfilesHandler
9
+ from axis.interfaces.stream_profiles import StreamProfilesHandler
10
10
 
11
11
 
12
12
  @pytest.fixture
@@ -5,8 +5,8 @@ pytest --cov-report term-missing --cov=axis.user_groups tests/test_user_groups.p
5
5
 
6
6
  import pytest
7
7
 
8
- from axis.vapix.interfaces.user_groups import UserGroups
9
- from axis.vapix.models.pwdgrp_cgi import SecondaryGroup
8
+ from axis.interfaces.user_groups import UserGroups
9
+ from axis.models.pwdgrp_cgi import SecondaryGroup
10
10
 
11
11
 
12
12
  @pytest.fixture
@@ -14,10 +14,10 @@ from axis.errors import (
14
14
  RequestError,
15
15
  Unauthorized,
16
16
  )
17
- from axis.vapix.models.applications.application import ApplicationStatus
18
- from axis.vapix.models.pwdgrp_cgi import SecondaryGroup
19
- from axis.vapix.models.stream_profile import StreamProfile
20
- from axis.vapix.vapix import Vapix
17
+ from axis.interfaces.vapix import Vapix
18
+ from axis.models.applications.application import ApplicationStatus
19
+ from axis.models.pwdgrp_cgi import SecondaryGroup
20
+ from axis.models.stream_profile import StreamProfile
21
21
 
22
22
  from .applications.test_applications import (
23
23
  LIST_APPLICATIONS_RESPONSE as APPLICATIONS_RESPONSE,
@@ -438,12 +438,12 @@ async def test_not_loading_user_groups_makes_access_rights_unknown(vapix: Vapix)
438
438
 
439
439
  @pytest.mark.parametrize(
440
440
  ("code", "error"),
441
- (
441
+ [
442
442
  (401, Unauthorized),
443
443
  (403, Forbidden),
444
444
  (404, PathNotFound),
445
445
  (405, MethodNotAllowed),
446
- ),
446
+ ],
447
447
  )
448
448
  async def test_request_raises(respx_mock, vapix: Vapix, code, error):
449
449
  """Verify that a HTTP error raises the appropriate exception."""
@@ -454,7 +454,7 @@ async def test_request_raises(respx_mock, vapix: Vapix, code, error):
454
454
 
455
455
 
456
456
  @pytest.mark.parametrize(
457
- "side_effect", (httpx.TimeoutException, httpx.TransportError, httpx.RequestError)
457
+ "side_effect", [httpx.TimeoutException, httpx.TransportError, httpx.RequestError]
458
458
  )
459
459
  async def test_request_side_effects(respx_mock, vapix: Vapix, side_effect):
460
460
  """Test request side effects."""
@@ -9,7 +9,7 @@ from unittest.mock import MagicMock
9
9
  import pytest
10
10
 
11
11
  from axis.device import AxisDevice
12
- from axis.vapix.interfaces.view_areas import Geometry, ViewAreaHandler
12
+ from axis.interfaces.view_areas import Geometry, ViewAreaHandler
13
13
 
14
14
 
15
15
  @pytest.fixture
axis-57/PKG-INFO DELETED
@@ -1,45 +0,0 @@
1
- Metadata-Version: 2.1
2
- Name: axis
3
- Version: 57
4
- Summary: A Python library for communicating with devices from Axis Communications
5
- Home-page: https://github.com/Kane610/axis
6
- Download-URL: https://github.com/Kane610/axis/archive/v57.tar.gz
7
- Author: Robert Svensson
8
- Author-email: Robert Svensson <Kane610@users.noreply.github.com>
9
- License: MIT
10
- Project-URL: Source Code, https://github.com/Kane610/axis
11
- Project-URL: Bug Reports, https://github.com/Kane610/axis/issues
12
- Project-URL: Forum, https://community.home-assistant.io/t/axis-camera-component/
13
- Keywords: axis,vapix,homeassistant
14
- Classifier: Development Status :: 5 - Production/Stable
15
- Classifier: Intended Audience :: Developers
16
- Classifier: License :: OSI Approved :: MIT License
17
- Classifier: Operating System :: OS Independent
18
- Classifier: Programming Language :: Python :: 3.11
19
- Classifier: Topic :: Home Automation
20
- Requires-Python: >=3.11
21
- Description-Content-Type: text/markdown
22
- License-File: LICENSE
23
- Requires-Dist: httpx>=0.26
24
- Requires-Dist: orjson>3.9
25
- Requires-Dist: packaging>23
26
- Requires-Dist: xmltodict>=0.13.0
27
- Provides-Extra: requirements
28
- Requires-Dist: httpx==0.27.0; extra == "requirements"
29
- Requires-Dist: orjson==3.9.15; extra == "requirements"
30
- Requires-Dist: packaging==24.0; extra == "requirements"
31
- Requires-Dist: xmltodict==0.13.0; extra == "requirements"
32
- Provides-Extra: requirements-test
33
- Requires-Dist: mypy==1.9.0; extra == "requirements-test"
34
- Requires-Dist: pytest==8.1.1; extra == "requirements-test"
35
- Requires-Dist: pytest-aiohttp==1.0.5; extra == "requirements-test"
36
- Requires-Dist: pytest-asyncio==0.23.6; extra == "requirements-test"
37
- Requires-Dist: pytest-cov==4.1.0; extra == "requirements-test"
38
- Requires-Dist: respx==0.21.0; extra == "requirements-test"
39
- Requires-Dist: ruff==0.3.3; extra == "requirements-test"
40
- Requires-Dist: types-orjson==3.6.2; extra == "requirements-test"
41
- Requires-Dist: types-xmltodict==v0.13.0.3; extra == "requirements-test"
42
- Provides-Extra: requirements-dev
43
- Requires-Dist: pre-commit==3.6.2; extra == "requirements-dev"
44
-
45
- Python project to set up a connection towards Axis Communications devices and to subscribe to specific events on the metadatastream.
@@ -1 +0,0 @@
1
- """Vapix module."""
@@ -1 +0,0 @@
1
- """Data models."""
@@ -1,45 +0,0 @@
1
- Metadata-Version: 2.1
2
- Name: axis
3
- Version: 57
4
- Summary: A Python library for communicating with devices from Axis Communications
5
- Home-page: https://github.com/Kane610/axis
6
- Download-URL: https://github.com/Kane610/axis/archive/v57.tar.gz
7
- Author: Robert Svensson
8
- Author-email: Robert Svensson <Kane610@users.noreply.github.com>
9
- License: MIT
10
- Project-URL: Source Code, https://github.com/Kane610/axis
11
- Project-URL: Bug Reports, https://github.com/Kane610/axis/issues
12
- Project-URL: Forum, https://community.home-assistant.io/t/axis-camera-component/
13
- Keywords: axis,vapix,homeassistant
14
- Classifier: Development Status :: 5 - Production/Stable
15
- Classifier: Intended Audience :: Developers
16
- Classifier: License :: OSI Approved :: MIT License
17
- Classifier: Operating System :: OS Independent
18
- Classifier: Programming Language :: Python :: 3.11
19
- Classifier: Topic :: Home Automation
20
- Requires-Python: >=3.11
21
- Description-Content-Type: text/markdown
22
- License-File: LICENSE
23
- Requires-Dist: httpx>=0.26
24
- Requires-Dist: orjson>3.9
25
- Requires-Dist: packaging>23
26
- Requires-Dist: xmltodict>=0.13.0
27
- Provides-Extra: requirements
28
- Requires-Dist: httpx==0.27.0; extra == "requirements"
29
- Requires-Dist: orjson==3.9.15; extra == "requirements"
30
- Requires-Dist: packaging==24.0; extra == "requirements"
31
- Requires-Dist: xmltodict==0.13.0; extra == "requirements"
32
- Provides-Extra: requirements-test
33
- Requires-Dist: mypy==1.9.0; extra == "requirements-test"
34
- Requires-Dist: pytest==8.1.1; extra == "requirements-test"
35
- Requires-Dist: pytest-aiohttp==1.0.5; extra == "requirements-test"
36
- Requires-Dist: pytest-asyncio==0.23.6; extra == "requirements-test"
37
- Requires-Dist: pytest-cov==4.1.0; extra == "requirements-test"
38
- Requires-Dist: respx==0.21.0; extra == "requirements-test"
39
- Requires-Dist: ruff==0.3.3; extra == "requirements-test"
40
- Requires-Dist: types-orjson==3.6.2; extra == "requirements-test"
41
- Requires-Dist: types-xmltodict==v0.13.0.3; extra == "requirements-test"
42
- Provides-Extra: requirements-dev
43
- Requires-Dist: pre-commit==3.6.2; extra == "requirements-dev"
44
-
45
- Python project to set up a connection towards Axis Communications devices and to subscribe to specific events on the metadatastream.
@@ -1,106 +0,0 @@
1
- LICENSE
2
- README.md
3
- pyproject.toml
4
- setup.py
5
- axis/__init__.py
6
- axis/__main__.py
7
- axis/configuration.py
8
- axis/device.py
9
- axis/errors.py
10
- axis/event_stream.py
11
- axis/py.typed
12
- axis/rtsp.py
13
- axis/stream_manager.py
14
- axis.egg-info/PKG-INFO
15
- axis.egg-info/SOURCES.txt
16
- axis.egg-info/dependency_links.txt
17
- axis.egg-info/entry_points.txt
18
- axis.egg-info/requires.txt
19
- axis.egg-info/top_level.txt
20
- axis/models/__init__.py
21
- axis/models/event.py
22
- axis/vapix/__init__.py
23
- axis/vapix/vapix.py
24
- axis/vapix/interfaces/__init__.py
25
- axis/vapix/interfaces/api_discovery.py
26
- axis/vapix/interfaces/api_handler.py
27
- axis/vapix/interfaces/basic_device_info.py
28
- axis/vapix/interfaces/event_instances.py
29
- axis/vapix/interfaces/light_control.py
30
- axis/vapix/interfaces/mqtt.py
31
- axis/vapix/interfaces/pir_sensor_configuration.py
32
- axis/vapix/interfaces/port_cgi.py
33
- axis/vapix/interfaces/port_management.py
34
- axis/vapix/interfaces/ptz.py
35
- axis/vapix/interfaces/pwdgrp_cgi.py
36
- axis/vapix/interfaces/stream_profiles.py
37
- axis/vapix/interfaces/user_groups.py
38
- axis/vapix/interfaces/view_areas.py
39
- axis/vapix/interfaces/applications/__init__.py
40
- axis/vapix/interfaces/applications/application_handler.py
41
- axis/vapix/interfaces/applications/applications.py
42
- axis/vapix/interfaces/applications/fence_guard.py
43
- axis/vapix/interfaces/applications/loitering_guard.py
44
- axis/vapix/interfaces/applications/motion_guard.py
45
- axis/vapix/interfaces/applications/object_analytics.py
46
- axis/vapix/interfaces/applications/vmd4.py
47
- axis/vapix/interfaces/parameters/__init__.py
48
- axis/vapix/interfaces/parameters/brand.py
49
- axis/vapix/interfaces/parameters/image.py
50
- axis/vapix/interfaces/parameters/io_port.py
51
- axis/vapix/interfaces/parameters/param_cgi.py
52
- axis/vapix/interfaces/parameters/param_handler.py
53
- axis/vapix/interfaces/parameters/properties.py
54
- axis/vapix/interfaces/parameters/ptz.py
55
- axis/vapix/interfaces/parameters/stream_profile.py
56
- axis/vapix/models/__init__.py
57
- axis/vapix/models/api.py
58
- axis/vapix/models/api_discovery.py
59
- axis/vapix/models/basic_device_info.py
60
- axis/vapix/models/event_instance.py
61
- axis/vapix/models/light_control.py
62
- axis/vapix/models/mqtt.py
63
- axis/vapix/models/pir_sensor_configuration.py
64
- axis/vapix/models/port_cgi.py
65
- axis/vapix/models/port_management.py
66
- axis/vapix/models/ptz_cgi.py
67
- axis/vapix/models/pwdgrp_cgi.py
68
- axis/vapix/models/stream_profile.py
69
- axis/vapix/models/user_group.py
70
- axis/vapix/models/view_area.py
71
- axis/vapix/models/applications/__init__.py
72
- axis/vapix/models/applications/application.py
73
- axis/vapix/models/applications/fence_guard.py
74
- axis/vapix/models/applications/loitering_guard.py
75
- axis/vapix/models/applications/motion_guard.py
76
- axis/vapix/models/applications/object_analytics.py
77
- axis/vapix/models/applications/vmd4.py
78
- axis/vapix/models/parameters/__init__.py
79
- axis/vapix/models/parameters/brand.py
80
- axis/vapix/models/parameters/image.py
81
- axis/vapix/models/parameters/io_port.py
82
- axis/vapix/models/parameters/param_cgi.py
83
- axis/vapix/models/parameters/properties.py
84
- axis/vapix/models/parameters/ptz.py
85
- axis/vapix/models/parameters/stream_profile.py
86
- tests/test_api_discovery.py
87
- tests/test_api_handler.py
88
- tests/test_basic_device_info.py
89
- tests/test_configuration.py
90
- tests/test_device.py
91
- tests/test_event.py
92
- tests/test_event_instances.py
93
- tests/test_event_stream.py
94
- tests/test_light_control.py
95
- tests/test_mqtt.py
96
- tests/test_pir_sensor_configuration.py
97
- tests/test_port_cgi.py
98
- tests/test_port_management.py
99
- tests/test_ptz.py
100
- tests/test_pwdgrp_cgi.py
101
- tests/test_rtsp.py
102
- tests/test_stream_manager.py
103
- tests/test_stream_profiles.py
104
- tests/test_user_groups.py
105
- tests/test_vapix.py
106
- tests/test_view_areas.py
axis-57/setup.py DELETED
@@ -1,25 +0,0 @@
1
- """Setup for Axis."""
2
-
3
- from setuptools import find_packages, setup
4
-
5
- MIN_PY_VERSION = "3.11"
6
- PACKAGES = find_packages(exclude=["tests", "tests.*"])
7
- VERSION = "57"
8
-
9
- setup(
10
- name="axis",
11
- packages=PACKAGES,
12
- package_data={"axis": ["py.typed"]},
13
- version=VERSION,
14
- description="A Python library for communicating with devices from Axis Communications",
15
- author="Robert Svensson",
16
- author_email="Kane610@users.noreply.github.com",
17
- license="MIT",
18
- url="https://github.com/Kane610/axis",
19
- download_url=f"https://github.com/Kane610/axis/archive/v{VERSION}.tar.gz",
20
- install_requires=["async_timeout", "attrs", "httpx", "packaging", "xmltodict"],
21
- tests_require=["pytest", "pytest-asyncio", "respx"],
22
- keywords=["axis", "vapix", "onvif", "event stream", "homeassistant"],
23
- classifiers=["Natural Language :: English", "Programming Language :: Python :: 3"],
24
- python_requires=f">={MIN_PY_VERSION}",
25
- )
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