systembridgeconnector 5.0.0.dev0__tar.gz → 5.0.0.dev2__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.
- {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/PKG-INFO +4 -3
- {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/systembridgeconnector/_version.py +1 -1
- systembridgeconnector-5.0.0.dev2/systembridgeconnector/const.py +124 -0
- {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/systembridgeconnector/version.py +3 -3
- {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/systembridgeconnector/websocket_client.py +136 -130
- {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/systembridgeconnector.egg-info/PKG-INFO +4 -3
- {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/systembridgeconnector.egg-info/SOURCES.txt +0 -1
- {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/systembridgeconnector.egg-info/requires.txt +2 -1
- {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/tests/test_websocket_client.py +28 -41
- systembridgeconnector-5.0.0.dev0/systembridgeconnector/const.py +0 -107
- systembridgeconnector-5.0.0.dev0/tests/test_const.py +0 -23
- {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/LICENSE +0 -0
- {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/README.md +0 -0
- {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/pyproject.toml +0 -0
- {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/setup.cfg +0 -0
- {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/setup.py +0 -0
- {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/systembridgeconnector/__init__.py +0 -0
- {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/systembridgeconnector/base.py +0 -0
- {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/systembridgeconnector/exceptions.py +0 -0
- {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/systembridgeconnector/http_client.py +0 -0
- {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/systembridgeconnector.egg-info/dependency_links.txt +0 -0
- {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/systembridgeconnector.egg-info/top_level.txt +0 -0
- {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/tests/test__version.py +0 -0
- {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/tests/test_base.py +0 -0
- {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/tests/test_exceptions.py +0 -0
- {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/tests/test_http_client.py +0 -0
- {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/tests/test_version.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: systembridgeconnector
|
|
3
|
-
Version: 5.0.0.
|
|
3
|
+
Version: 5.0.0.dev2
|
|
4
4
|
Summary: System Bridge Connector
|
|
5
5
|
Home-page: https://github.com/timmo001/system-bridge-connector
|
|
6
6
|
Author: Aidan Timson (Timmo)
|
|
@@ -10,10 +10,11 @@ Keywords: system-bridge
|
|
|
10
10
|
Requires-Python: >=3.11
|
|
11
11
|
Description-Content-Type: text/markdown
|
|
12
12
|
License-File: LICENSE
|
|
13
|
-
Requires-Dist: aiohttp>=3.9.0b0; python_version >= "3.12"
|
|
14
13
|
Requires-Dist: aiohttp>=3.8.5; python_version < "3.12"
|
|
14
|
+
Requires-Dist: aiohttp>=3.9.0b0; python_version >= "3.12"
|
|
15
15
|
Requires-Dist: incremental>=22.10.0
|
|
16
|
-
Requires-Dist:
|
|
16
|
+
Requires-Dist: packaging>=24.0
|
|
17
|
+
Requires-Dist: systembridgemodels>=4.1.0
|
|
17
18
|
|
|
18
19
|
# System Bridge - Connector
|
|
19
20
|
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"""Constants."""
|
|
2
|
+
|
|
3
|
+
from enum import StrEnum
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class QueryParameter(StrEnum):
|
|
7
|
+
"""Query Parameter."""
|
|
8
|
+
|
|
9
|
+
ALBUM = "album"
|
|
10
|
+
API_PORT = "apiPort"
|
|
11
|
+
ARTIST = "artist"
|
|
12
|
+
AUTOPLAY = "autoplay"
|
|
13
|
+
BASE = "base"
|
|
14
|
+
FILENAME = "filename"
|
|
15
|
+
PATH = "path"
|
|
16
|
+
TITLE = "title"
|
|
17
|
+
TOKEN = "token"
|
|
18
|
+
URL = "url"
|
|
19
|
+
VOLUME = "volume"
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class EventKey(StrEnum):
|
|
23
|
+
"""Event Key."""
|
|
24
|
+
|
|
25
|
+
APP_ICON = "app_icon"
|
|
26
|
+
APP_NAME = "app_name"
|
|
27
|
+
BASE = "base"
|
|
28
|
+
DATA = "data"
|
|
29
|
+
DIRECTORIES = "directories"
|
|
30
|
+
EVENT = "event"
|
|
31
|
+
FILE = "file"
|
|
32
|
+
FILENAME = "filename"
|
|
33
|
+
FILES = "files"
|
|
34
|
+
ID = "id"
|
|
35
|
+
KEY = "key"
|
|
36
|
+
MESSAGE = "message"
|
|
37
|
+
MODULE = "module"
|
|
38
|
+
MODULES = "modules"
|
|
39
|
+
PATH = "path"
|
|
40
|
+
SETTING = "setting"
|
|
41
|
+
SUBTYPE = "subtype"
|
|
42
|
+
TEXT = "text"
|
|
43
|
+
TIMEOUT = "timeout"
|
|
44
|
+
TITLE = "title"
|
|
45
|
+
TOKEN = "token"
|
|
46
|
+
TYPE = "type"
|
|
47
|
+
URL = "url"
|
|
48
|
+
VALUE = "value"
|
|
49
|
+
VERSION = "version"
|
|
50
|
+
VERSIONS = "versions"
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class EventType(StrEnum):
|
|
54
|
+
"""Event Type."""
|
|
55
|
+
|
|
56
|
+
APPLICATION_UPDATE = "APPLICATION_UPDATE"
|
|
57
|
+
APPLICATION_UPDATING = "APPLICATION_UPDATING"
|
|
58
|
+
DATA_GET = "DATA_GET"
|
|
59
|
+
DATA_LISTENER_REGISTERED = "DATA_LISTENER_REGISTERED"
|
|
60
|
+
DATA_LISTENER_UNREGISTERED = "DATA_LISTENER_UNREGISTERED"
|
|
61
|
+
DATA_UPDATE = "DATA_UPDATE"
|
|
62
|
+
DIRECTORIES = "DIRECTORIES"
|
|
63
|
+
ERROR = "ERROR"
|
|
64
|
+
EXIT_APPLICATION = "EXIT_APPLICATION"
|
|
65
|
+
FILE = "FILE"
|
|
66
|
+
FILES = "FILES"
|
|
67
|
+
GET_DATA = "GET_DATA"
|
|
68
|
+
GET_DIRECTORIES = "GET_DIRECTORIES"
|
|
69
|
+
GET_FILE = "GET_FILE"
|
|
70
|
+
GET_FILES = "GET_FILES"
|
|
71
|
+
GET_SETTINGS = "GET_SETTINGS"
|
|
72
|
+
KEYBOARD_KEY_PRESSED = "KEYBOARD_KEY_PRESSED"
|
|
73
|
+
KEYBOARD_KEYPRESS = "KEYBOARD_KEYPRESS"
|
|
74
|
+
KEYBOARD_TEXT = "KEYBOARD_TEXT"
|
|
75
|
+
KEYBOARD_TEXT_SENT = "KEYBOARD_TEXT_SENT"
|
|
76
|
+
MEDIA_CONTROL = "MEDIA_CONTROL"
|
|
77
|
+
NOTIFICATION = "NOTIFICATION"
|
|
78
|
+
NOTIFICATION_SENT = "NOTIFICATION_SENT"
|
|
79
|
+
OPEN = "OPEN"
|
|
80
|
+
OPENED = "OPENED"
|
|
81
|
+
POWER_HIBERNATE = "POWER_HIBERNATE"
|
|
82
|
+
POWER_HIBERNATING = "POWER_HIBERNATING"
|
|
83
|
+
POWER_LOCK = "POWER_LOCK"
|
|
84
|
+
POWER_LOCKING = "POWER_LOCKING"
|
|
85
|
+
POWER_LOGGINGOUT = "POWER_LOGGINGOUT"
|
|
86
|
+
POWER_LOGOUT = "POWER_LOGOUT"
|
|
87
|
+
POWER_RESTART = "POWER_RESTART"
|
|
88
|
+
POWER_RESTARTING = "POWER_RESTARTING"
|
|
89
|
+
POWER_SHUTDOWN = "POWER_SHUTDOWN"
|
|
90
|
+
POWER_SHUTTINGDOWN = "POWER_SHUTTINGDOWN"
|
|
91
|
+
POWER_SLEEP = "POWER_SLEEP"
|
|
92
|
+
POWER_SLEEPING = "POWER_SLEEPING"
|
|
93
|
+
REGISTER_DATA_LISTENER = "REGISTER_DATA_LISTENER"
|
|
94
|
+
SETTINGS_UPDATED = "SETTINGS_UPDATED"
|
|
95
|
+
SETTINGS_RESULT = "SETTINGS_RESULT"
|
|
96
|
+
UNREGISTER_DATA_LISTENER = "UNREGISTER_DATA_LISTENER"
|
|
97
|
+
UPDATE_SETTINGS = "UPDATE_SETTINGS"
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
class EventSubType(StrEnum):
|
|
101
|
+
"""Event SubType."""
|
|
102
|
+
|
|
103
|
+
BAD_TOKEN = "BAD_TOKEN"
|
|
104
|
+
BAD_DIRECTORY = "BAD_DIRECTORY"
|
|
105
|
+
BAD_FILE = "BAD_FILE"
|
|
106
|
+
BAD_JSON = "BAD_JSON"
|
|
107
|
+
BAD_KEY = "MISSING_KEY"
|
|
108
|
+
BAD_PATH = "BAD_PATH"
|
|
109
|
+
BAD_REQUEST = "BAD_REQUEST"
|
|
110
|
+
INVALID_ACTION = "INVALID_ACTION"
|
|
111
|
+
LISTENER_ALREADY_REGISTERED = "LISTENER_ALREADY_REGISTERED"
|
|
112
|
+
LISTENER_NOT_REGISTERED = "LISTENER_NOT_REGISTERED"
|
|
113
|
+
MISSING_ACTION = "MISSING_ACTION"
|
|
114
|
+
MISSING_TOKEN = "MISSING_TOKEN"
|
|
115
|
+
MISSING_BASE = "MISSING_BASE"
|
|
116
|
+
MISSING_KEY = "MISSING_KEY"
|
|
117
|
+
MISSING_MODULES = "MISSING_MODULES"
|
|
118
|
+
MISSING_PATH = "MISSING_PATH"
|
|
119
|
+
MISSING_PATH_URL = "MISSING_PATH_URL"
|
|
120
|
+
MISSING_SETTING = "MISSING_SETTING"
|
|
121
|
+
MISSING_TEXT = "MISSING_TEXT"
|
|
122
|
+
MISSING_TITLE = "MISSING_TITLE"
|
|
123
|
+
MISSING_VALUE = "MISSING_VALUE"
|
|
124
|
+
UNKNOWN_EVENT = "UNKNOWN_EVENT"
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
from aiohttp import ClientSession
|
|
6
|
-
from
|
|
6
|
+
from packaging.version import parse
|
|
7
7
|
|
|
8
8
|
from systembridgemodels.modules.system import System
|
|
9
9
|
|
|
@@ -39,7 +39,7 @@ class Version(Base):
|
|
|
39
39
|
await self.check_version_2() is None
|
|
40
40
|
and (version := await self.check_version()) is not None
|
|
41
41
|
):
|
|
42
|
-
return
|
|
42
|
+
return parse(version) >= parse(SUPPORTED_VERSION)
|
|
43
43
|
return False
|
|
44
44
|
|
|
45
45
|
async def check_version_2(self) -> str | None:
|
|
@@ -72,7 +72,7 @@ class Version(Base):
|
|
|
72
72
|
if (
|
|
73
73
|
system
|
|
74
74
|
and system.version is not None
|
|
75
|
-
and
|
|
75
|
+
and parse(system.version) >= parse("3.0.0")
|
|
76
76
|
):
|
|
77
77
|
return system.version
|
|
78
78
|
except ConnectionErrorException as exception:
|
|
@@ -11,7 +11,7 @@ from uuid import uuid4
|
|
|
11
11
|
|
|
12
12
|
import aiohttp
|
|
13
13
|
|
|
14
|
-
from systembridgemodels.const import MODEL_MAP,
|
|
14
|
+
from systembridgemodels.const import MODEL_MAP, Model
|
|
15
15
|
from systembridgemodels.keyboard_key import KeyboardKey
|
|
16
16
|
from systembridgemodels.keyboard_text import KeyboardText
|
|
17
17
|
from systembridgemodels.media_control import MediaControl
|
|
@@ -28,51 +28,7 @@ from systembridgemodels.response import Response
|
|
|
28
28
|
from systembridgemodels.update import Update
|
|
29
29
|
|
|
30
30
|
from .base import Base
|
|
31
|
-
from .const import
|
|
32
|
-
EVENT_DATA,
|
|
33
|
-
EVENT_ID,
|
|
34
|
-
EVENT_MESSAGE,
|
|
35
|
-
EVENT_MODULE,
|
|
36
|
-
EVENT_SUBTYPE,
|
|
37
|
-
EVENT_TYPE,
|
|
38
|
-
SUBTYPE_BAD_TOKEN,
|
|
39
|
-
SUBTYPE_LISTENER_ALREADY_REGISTERED,
|
|
40
|
-
TYPE_APPLICATION_UPDATE,
|
|
41
|
-
TYPE_DATA_GET,
|
|
42
|
-
TYPE_DATA_LISTENER_REGISTERED,
|
|
43
|
-
TYPE_DATA_UPDATE,
|
|
44
|
-
TYPE_DIRECTORIES,
|
|
45
|
-
TYPE_ERROR,
|
|
46
|
-
TYPE_EXIT_APPLICATION,
|
|
47
|
-
TYPE_FILE,
|
|
48
|
-
TYPE_FILES,
|
|
49
|
-
TYPE_GET_DATA,
|
|
50
|
-
TYPE_GET_DIRECTORIES,
|
|
51
|
-
TYPE_GET_FILE,
|
|
52
|
-
TYPE_GET_FILES,
|
|
53
|
-
TYPE_KEYBOARD_KEY_PRESSED,
|
|
54
|
-
TYPE_KEYBOARD_KEYPRESS,
|
|
55
|
-
TYPE_KEYBOARD_TEXT,
|
|
56
|
-
TYPE_KEYBOARD_TEXT_SENT,
|
|
57
|
-
TYPE_MEDIA_CONTROL,
|
|
58
|
-
TYPE_NOTIFICATION,
|
|
59
|
-
TYPE_NOTIFICATION_SENT,
|
|
60
|
-
TYPE_OPEN,
|
|
61
|
-
TYPE_OPENED,
|
|
62
|
-
TYPE_POWER_HIBERNATE,
|
|
63
|
-
TYPE_POWER_HIBERNATING,
|
|
64
|
-
TYPE_POWER_LOCK,
|
|
65
|
-
TYPE_POWER_LOCKING,
|
|
66
|
-
TYPE_POWER_LOGGINGOUT,
|
|
67
|
-
TYPE_POWER_LOGOUT,
|
|
68
|
-
TYPE_POWER_RESTART,
|
|
69
|
-
TYPE_POWER_RESTARTING,
|
|
70
|
-
TYPE_POWER_SHUTDOWN,
|
|
71
|
-
TYPE_POWER_SHUTTINGDOWN,
|
|
72
|
-
TYPE_POWER_SLEEP,
|
|
73
|
-
TYPE_POWER_SLEEPING,
|
|
74
|
-
TYPE_REGISTER_DATA_LISTENER,
|
|
75
|
-
)
|
|
31
|
+
from .const import EventKey, EventSubType, EventType
|
|
76
32
|
from .exceptions import (
|
|
77
33
|
AuthenticationException,
|
|
78
34
|
BadMessageException,
|
|
@@ -151,7 +107,7 @@ class WebSocketClient(Base):
|
|
|
151
107
|
self._logger.error("Timeout waiting for future: %s", request.id)
|
|
152
108
|
return Response(
|
|
153
109
|
id=request.id,
|
|
154
|
-
type=
|
|
110
|
+
type=EventType.ERROR,
|
|
155
111
|
subtype="TIMEOUT",
|
|
156
112
|
message="Timeout waiting for response",
|
|
157
113
|
data={},
|
|
@@ -209,7 +165,7 @@ class WebSocketClient(Base):
|
|
|
209
165
|
"""Update application."""
|
|
210
166
|
self._logger.info("Updating application")
|
|
211
167
|
return await self._send_message(
|
|
212
|
-
|
|
168
|
+
EventType.APPLICATION_UPDATE,
|
|
213
169
|
request_id,
|
|
214
170
|
asdict(model),
|
|
215
171
|
wait_for_response=False,
|
|
@@ -222,7 +178,7 @@ class WebSocketClient(Base):
|
|
|
222
178
|
"""Exit backend."""
|
|
223
179
|
self._logger.info("Exiting backend")
|
|
224
180
|
return await self._send_message(
|
|
225
|
-
|
|
181
|
+
EventType.EXIT_APPLICATION,
|
|
226
182
|
request_id,
|
|
227
183
|
{},
|
|
228
184
|
wait_for_response=False,
|
|
@@ -247,17 +203,20 @@ class WebSocketClient(Base):
|
|
|
247
203
|
self._logger.debug("Set new data for: %s", module_name)
|
|
248
204
|
setattr(modules_data, module_name, module)
|
|
249
205
|
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
206
|
+
listener_task = asyncio.create_task(
|
|
207
|
+
self.listen(
|
|
208
|
+
callback=handle_module,
|
|
209
|
+
accept_other_types=False,
|
|
210
|
+
),
|
|
211
|
+
name="Get data WebSocket Listener",
|
|
253
212
|
)
|
|
254
213
|
|
|
255
214
|
await self._send_message(
|
|
256
|
-
|
|
215
|
+
EventType.GET_DATA,
|
|
257
216
|
request_id,
|
|
258
217
|
asdict(model),
|
|
259
218
|
wait_for_response=True,
|
|
260
|
-
response_type=
|
|
219
|
+
response_type=EventType.DATA_GET,
|
|
261
220
|
)
|
|
262
221
|
|
|
263
222
|
# Wait for all data modules to be set
|
|
@@ -272,6 +231,10 @@ class WebSocketClient(Base):
|
|
|
272
231
|
raise DataMissingException(
|
|
273
232
|
f"Timeout waiting for data after {timeout} seconds"
|
|
274
233
|
) from exception
|
|
234
|
+
finally:
|
|
235
|
+
self._logger.debug("Cancelling listener task")
|
|
236
|
+
if not listener_task.done():
|
|
237
|
+
listener_task.cancel()
|
|
275
238
|
|
|
276
239
|
return modules_data
|
|
277
240
|
|
|
@@ -282,11 +245,11 @@ class WebSocketClient(Base):
|
|
|
282
245
|
"""Get directories."""
|
|
283
246
|
self._logger.info("Getting directories..")
|
|
284
247
|
response = await self._send_message(
|
|
285
|
-
|
|
248
|
+
EventType.GET_DIRECTORIES,
|
|
286
249
|
request_id,
|
|
287
250
|
{},
|
|
288
251
|
wait_for_response=True,
|
|
289
|
-
response_type=
|
|
252
|
+
response_type=EventType.DIRECTORIES,
|
|
290
253
|
)
|
|
291
254
|
|
|
292
255
|
return (
|
|
@@ -303,11 +266,11 @@ class WebSocketClient(Base):
|
|
|
303
266
|
"""Get files."""
|
|
304
267
|
self._logger.info("Getting files: %s", model)
|
|
305
268
|
response = await self._send_message(
|
|
306
|
-
|
|
269
|
+
EventType.GET_FILES,
|
|
307
270
|
request_id,
|
|
308
271
|
asdict(model),
|
|
309
272
|
wait_for_response=True,
|
|
310
|
-
response_type=
|
|
273
|
+
response_type=EventType.FILES,
|
|
311
274
|
)
|
|
312
275
|
|
|
313
276
|
return (
|
|
@@ -330,11 +293,11 @@ class WebSocketClient(Base):
|
|
|
330
293
|
"""Get files."""
|
|
331
294
|
self._logger.info("Getting file: %s", model)
|
|
332
295
|
response = await self._send_message(
|
|
333
|
-
|
|
296
|
+
EventType.GET_FILE,
|
|
334
297
|
request_id,
|
|
335
298
|
asdict(model),
|
|
336
299
|
wait_for_response=True,
|
|
337
|
-
response_type=
|
|
300
|
+
response_type=EventType.FILE,
|
|
338
301
|
)
|
|
339
302
|
|
|
340
303
|
return (
|
|
@@ -351,11 +314,11 @@ class WebSocketClient(Base):
|
|
|
351
314
|
"""Register data listener."""
|
|
352
315
|
self._logger.info("Registering data listener: %s", model)
|
|
353
316
|
return await self._send_message(
|
|
354
|
-
|
|
317
|
+
EventType.REGISTER_DATA_LISTENER,
|
|
355
318
|
request_id,
|
|
356
319
|
asdict(model),
|
|
357
320
|
wait_for_response=True,
|
|
358
|
-
response_type=
|
|
321
|
+
response_type=EventType.DATA_LISTENER_REGISTERED,
|
|
359
322
|
)
|
|
360
323
|
|
|
361
324
|
async def keyboard_keypress(
|
|
@@ -366,11 +329,11 @@ class WebSocketClient(Base):
|
|
|
366
329
|
"""Keyboard keypress."""
|
|
367
330
|
self._logger.info("Press key: %s", model)
|
|
368
331
|
return await self._send_message(
|
|
369
|
-
|
|
332
|
+
EventType.KEYBOARD_KEYPRESS,
|
|
370
333
|
request_id,
|
|
371
334
|
asdict(model),
|
|
372
335
|
wait_for_response=True,
|
|
373
|
-
response_type=
|
|
336
|
+
response_type=EventType.KEYBOARD_KEY_PRESSED,
|
|
374
337
|
)
|
|
375
338
|
|
|
376
339
|
async def keyboard_text(
|
|
@@ -381,11 +344,11 @@ class WebSocketClient(Base):
|
|
|
381
344
|
"""Keyboard keypress."""
|
|
382
345
|
self._logger.info("Enter text: %s", model)
|
|
383
346
|
return await self._send_message(
|
|
384
|
-
|
|
347
|
+
EventType.KEYBOARD_TEXT,
|
|
385
348
|
request_id,
|
|
386
349
|
asdict(model),
|
|
387
350
|
wait_for_response=True,
|
|
388
|
-
response_type=
|
|
351
|
+
response_type=EventType.KEYBOARD_TEXT_SENT,
|
|
389
352
|
)
|
|
390
353
|
|
|
391
354
|
async def media_control(
|
|
@@ -396,7 +359,7 @@ class WebSocketClient(Base):
|
|
|
396
359
|
"""Media control."""
|
|
397
360
|
self._logger.info("Media control: %s", model)
|
|
398
361
|
return await self._send_message(
|
|
399
|
-
|
|
362
|
+
EventType.MEDIA_CONTROL,
|
|
400
363
|
request_id,
|
|
401
364
|
asdict(model),
|
|
402
365
|
wait_for_response=False,
|
|
@@ -410,11 +373,11 @@ class WebSocketClient(Base):
|
|
|
410
373
|
"""Send notification."""
|
|
411
374
|
self._logger.info("Send notification: %s", model)
|
|
412
375
|
return await self._send_message(
|
|
413
|
-
|
|
376
|
+
EventType.NOTIFICATION,
|
|
414
377
|
request_id,
|
|
415
378
|
asdict(model),
|
|
416
379
|
wait_for_response=True,
|
|
417
|
-
response_type=
|
|
380
|
+
response_type=EventType.NOTIFICATION_SENT,
|
|
418
381
|
)
|
|
419
382
|
|
|
420
383
|
async def open_path(
|
|
@@ -425,11 +388,11 @@ class WebSocketClient(Base):
|
|
|
425
388
|
"""Open path."""
|
|
426
389
|
self._logger.info("Opening path: %s", model)
|
|
427
390
|
return await self._send_message(
|
|
428
|
-
|
|
391
|
+
EventType.OPEN,
|
|
429
392
|
request_id,
|
|
430
393
|
asdict(model),
|
|
431
394
|
wait_for_response=True,
|
|
432
|
-
response_type=
|
|
395
|
+
response_type=EventType.OPENED,
|
|
433
396
|
)
|
|
434
397
|
|
|
435
398
|
async def open_url(
|
|
@@ -440,11 +403,11 @@ class WebSocketClient(Base):
|
|
|
440
403
|
"""Open url."""
|
|
441
404
|
self._logger.info("Opening URL: %s", model)
|
|
442
405
|
return await self._send_message(
|
|
443
|
-
|
|
406
|
+
EventType.OPEN,
|
|
444
407
|
request_id,
|
|
445
408
|
asdict(model),
|
|
446
409
|
wait_for_response=True,
|
|
447
|
-
response_type=
|
|
410
|
+
response_type=EventType.OPENED,
|
|
448
411
|
)
|
|
449
412
|
|
|
450
413
|
async def power_sleep(
|
|
@@ -454,11 +417,11 @@ class WebSocketClient(Base):
|
|
|
454
417
|
"""Power sleep."""
|
|
455
418
|
self._logger.info("Power sleep")
|
|
456
419
|
return await self._send_message(
|
|
457
|
-
|
|
420
|
+
EventType.POWER_SLEEP,
|
|
458
421
|
request_id,
|
|
459
422
|
{},
|
|
460
423
|
wait_for_response=True,
|
|
461
|
-
response_type=
|
|
424
|
+
response_type=EventType.POWER_SLEEPING,
|
|
462
425
|
)
|
|
463
426
|
|
|
464
427
|
async def power_hibernate(
|
|
@@ -468,11 +431,11 @@ class WebSocketClient(Base):
|
|
|
468
431
|
"""Power hibernate."""
|
|
469
432
|
self._logger.info("Power hibernate")
|
|
470
433
|
return await self._send_message(
|
|
471
|
-
|
|
434
|
+
EventType.POWER_HIBERNATE,
|
|
472
435
|
request_id,
|
|
473
436
|
{},
|
|
474
437
|
wait_for_response=True,
|
|
475
|
-
response_type=
|
|
438
|
+
response_type=EventType.POWER_HIBERNATING,
|
|
476
439
|
)
|
|
477
440
|
|
|
478
441
|
async def power_restart(
|
|
@@ -482,11 +445,11 @@ class WebSocketClient(Base):
|
|
|
482
445
|
"""Power restart."""
|
|
483
446
|
self._logger.info("Power restart")
|
|
484
447
|
return await self._send_message(
|
|
485
|
-
|
|
448
|
+
EventType.POWER_RESTART,
|
|
486
449
|
request_id,
|
|
487
450
|
{},
|
|
488
451
|
wait_for_response=True,
|
|
489
|
-
response_type=
|
|
452
|
+
response_type=EventType.POWER_RESTARTING,
|
|
490
453
|
)
|
|
491
454
|
|
|
492
455
|
async def power_shutdown(
|
|
@@ -496,11 +459,11 @@ class WebSocketClient(Base):
|
|
|
496
459
|
"""Power shutdown."""
|
|
497
460
|
self._logger.info("Power shutdown")
|
|
498
461
|
return await self._send_message(
|
|
499
|
-
|
|
462
|
+
EventType.POWER_SHUTDOWN,
|
|
500
463
|
request_id,
|
|
501
464
|
{},
|
|
502
465
|
wait_for_response=True,
|
|
503
|
-
response_type=
|
|
466
|
+
response_type=EventType.POWER_SHUTTINGDOWN,
|
|
504
467
|
)
|
|
505
468
|
|
|
506
469
|
async def power_lock(
|
|
@@ -510,11 +473,11 @@ class WebSocketClient(Base):
|
|
|
510
473
|
"""Power lock."""
|
|
511
474
|
self._logger.info("Power lock")
|
|
512
475
|
return await self._send_message(
|
|
513
|
-
|
|
476
|
+
EventType.POWER_LOCK,
|
|
514
477
|
request_id,
|
|
515
478
|
{},
|
|
516
479
|
wait_for_response=True,
|
|
517
|
-
response_type=
|
|
480
|
+
response_type=EventType.POWER_LOCKING,
|
|
518
481
|
)
|
|
519
482
|
|
|
520
483
|
async def power_logout(
|
|
@@ -524,115 +487,158 @@ class WebSocketClient(Base):
|
|
|
524
487
|
"""Power logout."""
|
|
525
488
|
self._logger.info("Power logout")
|
|
526
489
|
return await self._send_message(
|
|
527
|
-
|
|
490
|
+
EventType.POWER_LOGOUT,
|
|
528
491
|
request_id,
|
|
529
492
|
{},
|
|
530
493
|
wait_for_response=True,
|
|
531
|
-
response_type=
|
|
494
|
+
response_type=EventType.POWER_LOGGINGOUT,
|
|
532
495
|
)
|
|
533
496
|
|
|
534
497
|
async def listen(
|
|
535
498
|
self,
|
|
536
499
|
callback: Callable[[str, Any], Awaitable[None]] | None = None,
|
|
537
500
|
accept_other_types: bool = False,
|
|
501
|
+
name: str = "WebSocket Client",
|
|
538
502
|
) -> None:
|
|
539
503
|
"""Listen for messages and map to modules."""
|
|
540
504
|
|
|
541
505
|
async def _callback_message(message: dict) -> None:
|
|
542
506
|
"""Message Callback."""
|
|
543
|
-
self._logger.debug("New message: %s", message[
|
|
507
|
+
self._logger.debug("[%s] New message: %s", name, message[EventKey.TYPE])
|
|
544
508
|
|
|
545
509
|
if (
|
|
546
|
-
message.get(
|
|
547
|
-
and (response_tuple := self._responses.get(message[
|
|
510
|
+
message.get(EventKey.ID) is not None
|
|
511
|
+
and (response_tuple := self._responses.get(message[EventKey.ID]))
|
|
548
512
|
is not None
|
|
549
513
|
):
|
|
550
514
|
future, response_type = response_tuple
|
|
551
|
-
if
|
|
515
|
+
if (
|
|
516
|
+
response_type is not None
|
|
517
|
+
and response_type == message[EventKey.TYPE]
|
|
518
|
+
):
|
|
552
519
|
response = Response(**message)
|
|
553
520
|
|
|
554
521
|
if (
|
|
555
|
-
response.type ==
|
|
522
|
+
response.type == EventType.DATA_UPDATE
|
|
556
523
|
and response.module is not None
|
|
557
|
-
and message[
|
|
524
|
+
and message[EventKey.DATA] is not None
|
|
558
525
|
):
|
|
559
526
|
# Find model from module
|
|
560
|
-
|
|
561
|
-
if
|
|
527
|
+
model_cls = MODEL_MAP.get(message[EventKey.MODULE])
|
|
528
|
+
if model_cls is None:
|
|
562
529
|
self._logger.warning(
|
|
563
|
-
"Unknown model: %s", message[
|
|
530
|
+
"[%s] Unknown model: %s", name, message[EventKey.MODULE]
|
|
564
531
|
)
|
|
565
532
|
else:
|
|
566
533
|
self._logger.debug(
|
|
567
|
-
"Mapping data to model: %s",
|
|
534
|
+
"[%s] Mapping data to model: %s",
|
|
535
|
+
name,
|
|
536
|
+
model_cls.__name__,
|
|
568
537
|
)
|
|
569
|
-
if isinstance(message[
|
|
538
|
+
if isinstance(message[EventKey.DATA], list):
|
|
570
539
|
response.data = [
|
|
571
|
-
|
|
540
|
+
model_cls(**data) for data in message[EventKey.DATA]
|
|
572
541
|
]
|
|
573
542
|
else:
|
|
574
|
-
response.data =
|
|
543
|
+
response.data = model_cls(**message[EventKey.DATA])
|
|
575
544
|
|
|
576
|
-
self._logger.info("Response: %s", response)
|
|
545
|
+
self._logger.info("[%s] Response: %s", name, response)
|
|
577
546
|
|
|
578
547
|
try:
|
|
579
548
|
future.set_result(response)
|
|
580
549
|
except asyncio.InvalidStateError:
|
|
581
550
|
self._logger.debug(
|
|
582
|
-
"Future already set for response ID: %s",
|
|
583
|
-
|
|
551
|
+
"[%s] Future already set for response ID: %s",
|
|
552
|
+
name,
|
|
553
|
+
message[EventKey.ID],
|
|
584
554
|
)
|
|
585
555
|
|
|
586
|
-
if message[
|
|
587
|
-
if
|
|
588
|
-
|
|
556
|
+
if message[EventKey.TYPE] == EventType.ERROR:
|
|
557
|
+
if (
|
|
558
|
+
message[EventKey.SUBTYPE]
|
|
559
|
+
== EventSubType.LISTENER_ALREADY_REGISTERED
|
|
560
|
+
):
|
|
561
|
+
self._logger.debug(
|
|
562
|
+
"[%s]: %s",
|
|
563
|
+
name,
|
|
564
|
+
message,
|
|
565
|
+
)
|
|
589
566
|
elif (
|
|
590
|
-
message[
|
|
591
|
-
or message[
|
|
567
|
+
message[EventKey.SUBTYPE] == EventSubType.BAD_TOKEN
|
|
568
|
+
or message[EventKey.SUBTYPE] == "BAD_API_KEY"
|
|
592
569
|
):
|
|
593
|
-
self._logger.error(
|
|
594
|
-
|
|
570
|
+
self._logger.error(
|
|
571
|
+
"[%s]: %s",
|
|
572
|
+
name,
|
|
573
|
+
message,
|
|
574
|
+
)
|
|
575
|
+
raise AuthenticationException(message[EventKey.MESSAGE])
|
|
595
576
|
else:
|
|
596
|
-
self._logger.warning(
|
|
577
|
+
self._logger.warning(
|
|
578
|
+
"[%s]: %s",
|
|
579
|
+
name,
|
|
580
|
+
message,
|
|
581
|
+
)
|
|
597
582
|
elif (
|
|
598
|
-
message[
|
|
599
|
-
and message[
|
|
583
|
+
message[EventKey.TYPE] == EventType.DATA_UPDATE
|
|
584
|
+
and message[EventKey.DATA] is not None
|
|
600
585
|
):
|
|
601
586
|
self._logger.debug(
|
|
602
|
-
"New data for: %s\n%s",
|
|
587
|
+
"[%s] New data for: %s\n%s",
|
|
588
|
+
name,
|
|
589
|
+
message[EventKey.MODULE],
|
|
590
|
+
message[EventKey.DATA],
|
|
603
591
|
)
|
|
604
|
-
|
|
605
|
-
if
|
|
606
|
-
self._logger.warning(
|
|
592
|
+
model_cls = MODEL_MAP.get(message[EventKey.MODULE])
|
|
593
|
+
if model_cls is None:
|
|
594
|
+
self._logger.warning(
|
|
595
|
+
"[%s] Unknown model: %s",
|
|
596
|
+
name,
|
|
597
|
+
message[EventKey.MODULE],
|
|
598
|
+
)
|
|
607
599
|
elif callback is not None:
|
|
608
600
|
await callback(
|
|
609
|
-
message[
|
|
610
|
-
[
|
|
611
|
-
if isinstance(message[
|
|
612
|
-
else
|
|
601
|
+
message[EventKey.MODULE],
|
|
602
|
+
[model_cls(**data) for data in message[EventKey.DATA]]
|
|
603
|
+
if isinstance(message[EventKey.DATA], list)
|
|
604
|
+
else model_cls(**message[EventKey.DATA]),
|
|
613
605
|
)
|
|
614
606
|
else:
|
|
615
|
-
self._logger.debug(
|
|
607
|
+
self._logger.debug(
|
|
608
|
+
"[%s] Other message: %s",
|
|
609
|
+
name,
|
|
610
|
+
message[EventKey.TYPE],
|
|
611
|
+
)
|
|
616
612
|
if accept_other_types:
|
|
617
|
-
|
|
618
|
-
|
|
613
|
+
model_cls = MODEL_MAP.get(
|
|
614
|
+
message[EventKey.TYPE],
|
|
615
|
+
Model.RESPONSE,
|
|
616
|
+
)
|
|
617
|
+
if model_cls is not None and callback is not None:
|
|
619
618
|
await callback(
|
|
620
|
-
message[
|
|
621
|
-
|
|
619
|
+
message[EventKey.TYPE],
|
|
620
|
+
model_cls(**message),
|
|
622
621
|
)
|
|
623
622
|
|
|
624
|
-
await self.listen_for_messages(
|
|
623
|
+
await self.listen_for_messages(
|
|
624
|
+
callback=_callback_message,
|
|
625
|
+
name=name,
|
|
626
|
+
)
|
|
625
627
|
|
|
626
628
|
async def listen_for_messages(
|
|
627
629
|
self,
|
|
628
630
|
callback: Callable[[dict[Any, Any]], Awaitable[None]],
|
|
631
|
+
name: str = "WebSocket Client",
|
|
629
632
|
) -> None:
|
|
630
633
|
"""Listen for messages."""
|
|
631
634
|
|
|
632
635
|
if not self.connected:
|
|
633
636
|
raise ConnectionClosedException("Connection is closed")
|
|
634
637
|
|
|
635
|
-
self._logger.info(
|
|
638
|
+
self._logger.info(
|
|
639
|
+
"[%s] Listen for messages",
|
|
640
|
+
name,
|
|
641
|
+
)
|
|
636
642
|
if self._websocket is not None:
|
|
637
643
|
while not self._websocket.closed:
|
|
638
644
|
message = await self.receive_message()
|
|
@@ -662,11 +668,11 @@ class WebSocketClient(Base):
|
|
|
662
668
|
if message.type == aiohttp.WSMsgType.TEXT:
|
|
663
669
|
message_json = message.json()
|
|
664
670
|
|
|
665
|
-
if message_json[
|
|
666
|
-
message_json[
|
|
667
|
-
or message_json[
|
|
671
|
+
if message_json[EventKey.TYPE] == EventType.ERROR and (
|
|
672
|
+
message_json[EventKey.SUBTYPE] == EventSubType.BAD_TOKEN
|
|
673
|
+
or message_json[EventKey.SUBTYPE] == "BAD_API_KEY"
|
|
668
674
|
):
|
|
669
|
-
raise AuthenticationException(message_json[
|
|
675
|
+
raise AuthenticationException(message_json[EventKey.MESSAGE])
|
|
670
676
|
|
|
671
677
|
return message_json
|
|
672
678
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: systembridgeconnector
|
|
3
|
-
Version: 5.0.0.
|
|
3
|
+
Version: 5.0.0.dev2
|
|
4
4
|
Summary: System Bridge Connector
|
|
5
5
|
Home-page: https://github.com/timmo001/system-bridge-connector
|
|
6
6
|
Author: Aidan Timson (Timmo)
|
|
@@ -10,10 +10,11 @@ Keywords: system-bridge
|
|
|
10
10
|
Requires-Python: >=3.11
|
|
11
11
|
Description-Content-Type: text/markdown
|
|
12
12
|
License-File: LICENSE
|
|
13
|
-
Requires-Dist: aiohttp>=3.9.0b0; python_version >= "3.12"
|
|
14
13
|
Requires-Dist: aiohttp>=3.8.5; python_version < "3.12"
|
|
14
|
+
Requires-Dist: aiohttp>=3.9.0b0; python_version >= "3.12"
|
|
15
15
|
Requires-Dist: incremental>=22.10.0
|
|
16
|
-
Requires-Dist:
|
|
16
|
+
Requires-Dist: packaging>=24.0
|
|
17
|
+
Requires-Dist: systembridgemodels>=4.1.0
|
|
17
18
|
|
|
18
19
|
# System Bridge - Connector
|
|
19
20
|
|
{systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/tests/test_websocket_client.py
RENAMED
|
@@ -8,36 +8,23 @@ import aiohttp
|
|
|
8
8
|
import pytest
|
|
9
9
|
from syrupy.assertion import SnapshotAssertion
|
|
10
10
|
|
|
11
|
-
from systembridgeconnector.const import
|
|
12
|
-
EVENT_MODULES,
|
|
13
|
-
TYPE_DATA_GET,
|
|
14
|
-
TYPE_DATA_LISTENER_REGISTERED,
|
|
15
|
-
TYPE_DIRECTORIES,
|
|
16
|
-
TYPE_FILE,
|
|
17
|
-
TYPE_FILES,
|
|
18
|
-
TYPE_KEYBOARD_KEY_PRESSED,
|
|
19
|
-
TYPE_KEYBOARD_TEXT_SENT,
|
|
20
|
-
TYPE_NOTIFICATION_SENT,
|
|
21
|
-
TYPE_OPENED,
|
|
22
|
-
TYPE_POWER_HIBERNATING,
|
|
23
|
-
TYPE_POWER_LOCKING,
|
|
24
|
-
TYPE_POWER_LOGGINGOUT,
|
|
25
|
-
TYPE_POWER_RESTARTING,
|
|
26
|
-
TYPE_POWER_SHUTTINGDOWN,
|
|
27
|
-
TYPE_POWER_SLEEPING,
|
|
28
|
-
)
|
|
11
|
+
from systembridgeconnector.const import EventKey, EventType
|
|
29
12
|
from systembridgeconnector.exceptions import (
|
|
30
13
|
ConnectionClosedException,
|
|
31
14
|
ConnectionErrorException,
|
|
32
15
|
)
|
|
33
16
|
from systembridgeconnector.websocket_client import WebSocketClient
|
|
34
|
-
from systembridgemodels.const import MODEL_SYSTEM
|
|
35
17
|
from systembridgemodels.keyboard_key import KeyboardKey
|
|
36
18
|
from systembridgemodels.keyboard_text import KeyboardText
|
|
37
19
|
from systembridgemodels.media_control import MediaControl
|
|
38
20
|
from systembridgemodels.media_get_file import MediaGetFile
|
|
39
21
|
from systembridgemodels.media_get_files import MediaGetFiles
|
|
40
|
-
from systembridgemodels.modules import
|
|
22
|
+
from systembridgemodels.modules import (
|
|
23
|
+
GetData,
|
|
24
|
+
Module,
|
|
25
|
+
ModulesData,
|
|
26
|
+
RegisterDataListener,
|
|
27
|
+
)
|
|
41
28
|
from systembridgemodels.notification import Notification
|
|
42
29
|
from systembridgemodels.open_path import OpenPath
|
|
43
30
|
from systembridgemodels.open_url import OpenUrl
|
|
@@ -129,7 +116,7 @@ async def test_timeout(
|
|
|
129
116
|
):
|
|
130
117
|
response = await websocket_client.get_data(
|
|
131
118
|
GetData(
|
|
132
|
-
modules=[
|
|
119
|
+
modules=[Module.SYSTEM],
|
|
133
120
|
),
|
|
134
121
|
request_id=REQUEST_ID,
|
|
135
122
|
)
|
|
@@ -194,14 +181,14 @@ async def test_get_data(
|
|
|
194
181
|
ws_client,
|
|
195
182
|
Response(
|
|
196
183
|
id=REQUEST_ID,
|
|
197
|
-
type=
|
|
198
|
-
data={
|
|
184
|
+
type=EventType.DATA_GET,
|
|
185
|
+
data={EventKey.MODULES: [Module.SYSTEM]},
|
|
199
186
|
),
|
|
200
187
|
)
|
|
201
188
|
assert websocket_client.connected is True
|
|
202
189
|
response = await websocket_client.get_data(
|
|
203
190
|
GetData(
|
|
204
|
-
modules=[
|
|
191
|
+
modules=[Module.SYSTEM],
|
|
205
192
|
),
|
|
206
193
|
request_id=REQUEST_ID,
|
|
207
194
|
)
|
|
@@ -220,7 +207,7 @@ async def test_get_directories(
|
|
|
220
207
|
ws_client,
|
|
221
208
|
Response(
|
|
222
209
|
id=REQUEST_ID,
|
|
223
|
-
type=
|
|
210
|
+
type=EventType.DIRECTORIES,
|
|
224
211
|
data=[{"key": "documents", "path": "/documents"}],
|
|
225
212
|
),
|
|
226
213
|
)
|
|
@@ -243,7 +230,7 @@ async def test_get_files(
|
|
|
243
230
|
ws_client,
|
|
244
231
|
Response(
|
|
245
232
|
id=REQUEST_ID,
|
|
246
|
-
type=
|
|
233
|
+
type=EventType.FILES,
|
|
247
234
|
data={
|
|
248
235
|
"files": [
|
|
249
236
|
{
|
|
@@ -287,7 +274,7 @@ async def test_get_file(
|
|
|
287
274
|
ws_client,
|
|
288
275
|
Response(
|
|
289
276
|
id=REQUEST_ID,
|
|
290
|
-
type=
|
|
277
|
+
type=EventType.FILE,
|
|
291
278
|
data={
|
|
292
279
|
"name": "test",
|
|
293
280
|
"path": "path/to",
|
|
@@ -326,14 +313,14 @@ async def test_register_data_listener(
|
|
|
326
313
|
ws_client,
|
|
327
314
|
Response(
|
|
328
315
|
id=REQUEST_ID,
|
|
329
|
-
type=
|
|
330
|
-
data={
|
|
316
|
+
type=EventType.DATA_LISTENER_REGISTERED,
|
|
317
|
+
data={EventKey.MODULES: [Module.SYSTEM]},
|
|
331
318
|
),
|
|
332
319
|
)
|
|
333
320
|
assert websocket_client.connected is True
|
|
334
321
|
response = await websocket_client.register_data_listener(
|
|
335
322
|
RegisterDataListener(
|
|
336
|
-
modules=[
|
|
323
|
+
modules=[Module.SYSTEM],
|
|
337
324
|
),
|
|
338
325
|
request_id=REQUEST_ID,
|
|
339
326
|
)
|
|
@@ -352,7 +339,7 @@ async def test_keyboard_keypress(
|
|
|
352
339
|
ws_client,
|
|
353
340
|
Response(
|
|
354
341
|
id=REQUEST_ID,
|
|
355
|
-
type=
|
|
342
|
+
type=EventType.KEYBOARD_KEY_PRESSED,
|
|
356
343
|
data={"key": "a"},
|
|
357
344
|
),
|
|
358
345
|
)
|
|
@@ -378,7 +365,7 @@ async def test_keyboard_text(
|
|
|
378
365
|
ws_client,
|
|
379
366
|
Response(
|
|
380
367
|
id=REQUEST_ID,
|
|
381
|
-
type=
|
|
368
|
+
type=EventType.KEYBOARD_TEXT_SENT,
|
|
382
369
|
data={"text": "test"},
|
|
383
370
|
),
|
|
384
371
|
)
|
|
@@ -430,7 +417,7 @@ async def test_send_notification(
|
|
|
430
417
|
ws_client,
|
|
431
418
|
Response(
|
|
432
419
|
id=REQUEST_ID,
|
|
433
|
-
type=
|
|
420
|
+
type=EventType.NOTIFICATION_SENT,
|
|
434
421
|
data={"title": "test", "message": "test"},
|
|
435
422
|
),
|
|
436
423
|
)
|
|
@@ -457,7 +444,7 @@ async def test_open_path(
|
|
|
457
444
|
ws_client,
|
|
458
445
|
Response(
|
|
459
446
|
id=REQUEST_ID,
|
|
460
|
-
type=
|
|
447
|
+
type=EventType.OPENED,
|
|
461
448
|
data={"path": "test"},
|
|
462
449
|
),
|
|
463
450
|
)
|
|
@@ -483,7 +470,7 @@ async def test_open_url(
|
|
|
483
470
|
ws_client,
|
|
484
471
|
Response(
|
|
485
472
|
id=REQUEST_ID,
|
|
486
|
-
type=
|
|
473
|
+
type=EventType.OPENED,
|
|
487
474
|
data={"url": "test"},
|
|
488
475
|
),
|
|
489
476
|
)
|
|
@@ -509,7 +496,7 @@ async def test_power_sleep(
|
|
|
509
496
|
ws_client,
|
|
510
497
|
Response(
|
|
511
498
|
id=REQUEST_ID,
|
|
512
|
-
type=
|
|
499
|
+
type=EventType.POWER_SLEEPING,
|
|
513
500
|
data={},
|
|
514
501
|
),
|
|
515
502
|
)
|
|
@@ -532,7 +519,7 @@ async def test_power_hibernate(
|
|
|
532
519
|
ws_client,
|
|
533
520
|
Response(
|
|
534
521
|
id=REQUEST_ID,
|
|
535
|
-
type=
|
|
522
|
+
type=EventType.POWER_HIBERNATING,
|
|
536
523
|
data={},
|
|
537
524
|
),
|
|
538
525
|
)
|
|
@@ -555,7 +542,7 @@ async def test_power_restart(
|
|
|
555
542
|
ws_client,
|
|
556
543
|
Response(
|
|
557
544
|
id=REQUEST_ID,
|
|
558
|
-
type=
|
|
545
|
+
type=EventType.POWER_RESTARTING,
|
|
559
546
|
data={},
|
|
560
547
|
),
|
|
561
548
|
)
|
|
@@ -578,7 +565,7 @@ async def test_power_shutdown(
|
|
|
578
565
|
ws_client,
|
|
579
566
|
Response(
|
|
580
567
|
id=REQUEST_ID,
|
|
581
|
-
type=
|
|
568
|
+
type=EventType.POWER_SHUTTINGDOWN,
|
|
582
569
|
data={},
|
|
583
570
|
),
|
|
584
571
|
)
|
|
@@ -601,7 +588,7 @@ async def test_power_lock(
|
|
|
601
588
|
ws_client,
|
|
602
589
|
Response(
|
|
603
590
|
id=REQUEST_ID,
|
|
604
|
-
type=
|
|
591
|
+
type=EventType.POWER_LOCKING,
|
|
605
592
|
data={},
|
|
606
593
|
),
|
|
607
594
|
)
|
|
@@ -624,7 +611,7 @@ async def test_power_logout(
|
|
|
624
611
|
ws_client,
|
|
625
612
|
Response(
|
|
626
613
|
id=REQUEST_ID,
|
|
627
|
-
type=
|
|
614
|
+
type=EventType.POWER_LOGGINGOUT,
|
|
628
615
|
data={},
|
|
629
616
|
),
|
|
630
617
|
)
|
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
"""Constants."""
|
|
2
|
-
# Query Parameters
|
|
3
|
-
QUERY_ALBUM = "album"
|
|
4
|
-
QUERY_API_PORT = "apiPort"
|
|
5
|
-
QUERY_ARTIST = "artist"
|
|
6
|
-
QUERY_AUTOPLAY = "autoplay"
|
|
7
|
-
QUERY_BASE = "base"
|
|
8
|
-
QUERY_FILENAME = "filename"
|
|
9
|
-
QUERY_PATH = "path"
|
|
10
|
-
QUERY_TITLE = "title"
|
|
11
|
-
QUERY_TOKEN = "token"
|
|
12
|
-
QUERY_URL = "url"
|
|
13
|
-
QUERY_VOLUME = "volume"
|
|
14
|
-
|
|
15
|
-
# Event Keys
|
|
16
|
-
EVENT_APP_ICON = "app_icon"
|
|
17
|
-
EVENT_APP_NAME = "app_name"
|
|
18
|
-
EVENT_BASE = "base"
|
|
19
|
-
EVENT_DATA = "data"
|
|
20
|
-
EVENT_DIRECTORIES = "directories"
|
|
21
|
-
EVENT_EVENT = "event"
|
|
22
|
-
EVENT_FILE = "file"
|
|
23
|
-
EVENT_FILENAME = "filename"
|
|
24
|
-
EVENT_FILES = "files"
|
|
25
|
-
EVENT_ID = "id"
|
|
26
|
-
EVENT_KEY = "key"
|
|
27
|
-
EVENT_MESSAGE = "message"
|
|
28
|
-
EVENT_MODULE = "module"
|
|
29
|
-
EVENT_MODULES = "modules"
|
|
30
|
-
EVENT_PATH = "path"
|
|
31
|
-
EVENT_SETTING = "setting"
|
|
32
|
-
EVENT_SUBTYPE = "subtype"
|
|
33
|
-
EVENT_TEXT = "text"
|
|
34
|
-
EVENT_TIMEOUT = "timeout"
|
|
35
|
-
EVENT_TITLE = "title"
|
|
36
|
-
EVENT_TOKEN = "token"
|
|
37
|
-
EVENT_TYPE = "type"
|
|
38
|
-
EVENT_URL = "url"
|
|
39
|
-
EVENT_VALUE = "value"
|
|
40
|
-
EVENT_VERSION = "version"
|
|
41
|
-
EVENT_VERSIONS = "versions"
|
|
42
|
-
|
|
43
|
-
# Event Types
|
|
44
|
-
SUBTYPE_BAD_TOKEN = "BAD_TOKEN"
|
|
45
|
-
SUBTYPE_BAD_DIRECTORY = "BAD_DIRECTORY"
|
|
46
|
-
SUBTYPE_BAD_FILE = "BAD_FILE"
|
|
47
|
-
SUBTYPE_BAD_JSON = "BAD_JSON"
|
|
48
|
-
SUBTYPE_BAD_KEY = "MISSING_KEY"
|
|
49
|
-
SUBTYPE_BAD_PATH = "BAD_PATH"
|
|
50
|
-
SUBTYPE_BAD_REQUEST = "BAD_REQUEST"
|
|
51
|
-
SUBTYPE_INVALID_ACTION = "INVALID_ACTION"
|
|
52
|
-
SUBTYPE_LISTENER_ALREADY_REGISTERED = "LISTENER_ALREADY_REGISTERED"
|
|
53
|
-
SUBTYPE_LISTENER_NOT_REGISTERED = "LISTENER_NOT_REGISTERED"
|
|
54
|
-
SUBTYPE_MISSING_ACTION = "MISSING_ACTION"
|
|
55
|
-
SUBTYPE_MISSING_TOKEN = "MISSING_TOKEN"
|
|
56
|
-
SUBTYPE_MISSING_BASE = "MISSING_BASE"
|
|
57
|
-
SUBTYPE_MISSING_KEY = "MISSING_KEY"
|
|
58
|
-
SUBTYPE_MISSING_MODULES = "MISSING_MODULES"
|
|
59
|
-
SUBTYPE_MISSING_PATH = "MISSING_PATH"
|
|
60
|
-
SUBTYPE_MISSING_PATH_URL = "MISSING_PATH_URL"
|
|
61
|
-
SUBTYPE_MISSING_SETTING = "MISSING_SETTING"
|
|
62
|
-
SUBTYPE_MISSING_TEXT = "MISSING_TEXT"
|
|
63
|
-
SUBTYPE_MISSING_TITLE = "MISSING_TITLE"
|
|
64
|
-
SUBTYPE_MISSING_VALUE = "MISSING_VALUE"
|
|
65
|
-
SUBTYPE_UNKNOWN_EVENT = "UNKNOWN_EVENT"
|
|
66
|
-
TYPE_APPLICATION_UPDATE = "APPLICATION_UPDATE"
|
|
67
|
-
TYPE_APPLICATION_UPDATING = "APPLICATION_UPDATING"
|
|
68
|
-
TYPE_DATA_GET = "DATA_GET"
|
|
69
|
-
TYPE_DATA_LISTENER_REGISTERED = "DATA_LISTENER_REGISTERED"
|
|
70
|
-
TYPE_DATA_LISTENER_UNREGISTERED = "DATA_LISTENER_UNREGISTERED"
|
|
71
|
-
TYPE_DATA_UPDATE = "DATA_UPDATE"
|
|
72
|
-
TYPE_DIRECTORIES = "DIRECTORIES"
|
|
73
|
-
TYPE_ERROR = "ERROR"
|
|
74
|
-
TYPE_EXIT_APPLICATION = "EXIT_APPLICATION"
|
|
75
|
-
TYPE_FILE = "FILE"
|
|
76
|
-
TYPE_FILES = "FILES"
|
|
77
|
-
TYPE_GET_DATA = "GET_DATA"
|
|
78
|
-
TYPE_GET_DIRECTORIES = "GET_DIRECTORIES"
|
|
79
|
-
TYPE_GET_FILE = "GET_FILE"
|
|
80
|
-
TYPE_GET_FILES = "GET_FILES"
|
|
81
|
-
TYPE_GET_SETTINGS = "GET_SETTINGS"
|
|
82
|
-
TYPE_KEYBOARD_KEY_PRESSED = "KEYBOARD_KEY_PRESSED"
|
|
83
|
-
TYPE_KEYBOARD_KEYPRESS = "KEYBOARD_KEYPRESS"
|
|
84
|
-
TYPE_KEYBOARD_TEXT = "KEYBOARD_TEXT"
|
|
85
|
-
TYPE_KEYBOARD_TEXT_SENT = "KEYBOARD_TEXT_SENT"
|
|
86
|
-
TYPE_MEDIA_CONTROL = "MEDIA_CONTROL"
|
|
87
|
-
TYPE_NOTIFICATION = "NOTIFICATION"
|
|
88
|
-
TYPE_NOTIFICATION_SENT = "NOTIFICATION_SENT"
|
|
89
|
-
TYPE_OPEN = "OPEN"
|
|
90
|
-
TYPE_OPENED = "OPENED"
|
|
91
|
-
TYPE_POWER_HIBERNATE = "POWER_HIBERNATE"
|
|
92
|
-
TYPE_POWER_HIBERNATING = "POWER_HIBERNATING"
|
|
93
|
-
TYPE_POWER_LOCK = "POWER_LOCK"
|
|
94
|
-
TYPE_POWER_LOCKING = "POWER_LOCKING"
|
|
95
|
-
TYPE_POWER_LOGGINGOUT = "POWER_LOGGINGOUT"
|
|
96
|
-
TYPE_POWER_LOGOUT = "POWER_LOGOUT"
|
|
97
|
-
TYPE_POWER_RESTART = "POWER_RESTART"
|
|
98
|
-
TYPE_POWER_RESTARTING = "POWER_RESTARTING"
|
|
99
|
-
TYPE_POWER_SHUTDOWN = "POWER_SHUTDOWN"
|
|
100
|
-
TYPE_POWER_SHUTTINGDOWN = "POWER_SHUTTINGDOWN"
|
|
101
|
-
TYPE_POWER_SLEEP = "POWER_SLEEP"
|
|
102
|
-
TYPE_POWER_SLEEPING = "POWER_SLEEPING"
|
|
103
|
-
TYPE_REGISTER_DATA_LISTENER = "REGISTER_DATA_LISTENER"
|
|
104
|
-
TYPE_SETTINGS_UPDATED = "SETTINGS_UPDATED"
|
|
105
|
-
TYPE_SETTINGS_RESULT = "SETTINGS_RESULT"
|
|
106
|
-
TYPE_UNREGISTER_DATA_LISTENER = "UNREGISTER_DATA_LISTENER"
|
|
107
|
-
TYPE_UPDATE_SETTINGS = "UPDATE_SETTINGS"
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
"""Test the const module."""
|
|
2
|
-
|
|
3
|
-
from systembridgeconnector.const import (
|
|
4
|
-
EVENT_BASE,
|
|
5
|
-
EVENT_DATA,
|
|
6
|
-
SUBTYPE_BAD_TOKEN,
|
|
7
|
-
TYPE_DATA_GET,
|
|
8
|
-
TYPE_DATA_LISTENER_REGISTERED,
|
|
9
|
-
TYPE_DATA_LISTENER_UNREGISTERED,
|
|
10
|
-
TYPE_ERROR,
|
|
11
|
-
)
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
def test_const():
|
|
15
|
-
"""Test the const module."""
|
|
16
|
-
assert EVENT_BASE == "base"
|
|
17
|
-
assert EVENT_DATA == "data"
|
|
18
|
-
assert SUBTYPE_BAD_TOKEN == "BAD_TOKEN"
|
|
19
|
-
assert TYPE_DATA_GET == "DATA_GET"
|
|
20
|
-
assert TYPE_DATA_LISTENER_REGISTERED == "DATA_LISTENER_REGISTERED"
|
|
21
|
-
assert TYPE_DATA_LISTENER_UNREGISTERED == "DATA_LISTENER_UNREGISTERED"
|
|
22
|
-
assert TYPE_ERROR == "ERROR"
|
|
23
|
-
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/systembridgeconnector/base.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/tests/test__version.py
RENAMED
|
File without changes
|
|
File without changes
|
{systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/tests/test_exceptions.py
RENAMED
|
File without changes
|
{systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/tests/test_http_client.py
RENAMED
|
File without changes
|
|
File without changes
|