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.
Files changed (27) hide show
  1. {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/PKG-INFO +4 -3
  2. {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/systembridgeconnector/_version.py +1 -1
  3. systembridgeconnector-5.0.0.dev2/systembridgeconnector/const.py +124 -0
  4. {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/systembridgeconnector/version.py +3 -3
  5. {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/systembridgeconnector/websocket_client.py +136 -130
  6. {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/systembridgeconnector.egg-info/PKG-INFO +4 -3
  7. {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/systembridgeconnector.egg-info/SOURCES.txt +0 -1
  8. {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/systembridgeconnector.egg-info/requires.txt +2 -1
  9. {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/tests/test_websocket_client.py +28 -41
  10. systembridgeconnector-5.0.0.dev0/systembridgeconnector/const.py +0 -107
  11. systembridgeconnector-5.0.0.dev0/tests/test_const.py +0 -23
  12. {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/LICENSE +0 -0
  13. {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/README.md +0 -0
  14. {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/pyproject.toml +0 -0
  15. {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/setup.cfg +0 -0
  16. {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/setup.py +0 -0
  17. {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/systembridgeconnector/__init__.py +0 -0
  18. {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/systembridgeconnector/base.py +0 -0
  19. {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/systembridgeconnector/exceptions.py +0 -0
  20. {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/systembridgeconnector/http_client.py +0 -0
  21. {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/systembridgeconnector.egg-info/dependency_links.txt +0 -0
  22. {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/systembridgeconnector.egg-info/top_level.txt +0 -0
  23. {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/tests/test__version.py +0 -0
  24. {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/tests/test_base.py +0 -0
  25. {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/tests/test_exceptions.py +0 -0
  26. {systembridgeconnector-5.0.0.dev0 → systembridgeconnector-5.0.0.dev2}/tests/test_http_client.py +0 -0
  27. {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.dev0
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: systembridgemodels>=4.0.4
16
+ Requires-Dist: packaging>=24.0
17
+ Requires-Dist: systembridgemodels>=4.1.0
17
18
 
18
19
  # System Bridge - Connector
19
20
 
@@ -7,5 +7,5 @@ Provides systembridgeconnector version information.
7
7
 
8
8
  from incremental import Version
9
9
 
10
- __version__ = Version("systembridgeconnector", 5, 0, 0, dev=0)
10
+ __version__ = Version("systembridgeconnector", 5, 0, 0, dev=2)
11
11
  __all__ = ["__version__"]
@@ -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 pkg_resources import parse_version
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 parse_version(version) >= parse_version(SUPPORTED_VERSION)
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 parse_version(system.version) >= parse_version("3.0.0")
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, MODEL_RESPONSE
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=TYPE_ERROR,
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
- TYPE_APPLICATION_UPDATE,
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
- TYPE_EXIT_APPLICATION,
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
- await self.listen(
251
- callback=handle_module,
252
- accept_other_types=False,
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
- TYPE_GET_DATA,
215
+ EventType.GET_DATA,
257
216
  request_id,
258
217
  asdict(model),
259
218
  wait_for_response=True,
260
- response_type=TYPE_DATA_GET,
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
- TYPE_GET_DIRECTORIES,
248
+ EventType.GET_DIRECTORIES,
286
249
  request_id,
287
250
  {},
288
251
  wait_for_response=True,
289
- response_type=TYPE_DIRECTORIES,
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
- TYPE_GET_FILES,
269
+ EventType.GET_FILES,
307
270
  request_id,
308
271
  asdict(model),
309
272
  wait_for_response=True,
310
- response_type=TYPE_FILES,
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
- TYPE_GET_FILE,
296
+ EventType.GET_FILE,
334
297
  request_id,
335
298
  asdict(model),
336
299
  wait_for_response=True,
337
- response_type=TYPE_FILE,
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
- TYPE_REGISTER_DATA_LISTENER,
317
+ EventType.REGISTER_DATA_LISTENER,
355
318
  request_id,
356
319
  asdict(model),
357
320
  wait_for_response=True,
358
- response_type=TYPE_DATA_LISTENER_REGISTERED,
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
- TYPE_KEYBOARD_KEYPRESS,
332
+ EventType.KEYBOARD_KEYPRESS,
370
333
  request_id,
371
334
  asdict(model),
372
335
  wait_for_response=True,
373
- response_type=TYPE_KEYBOARD_KEY_PRESSED,
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
- TYPE_KEYBOARD_TEXT,
347
+ EventType.KEYBOARD_TEXT,
385
348
  request_id,
386
349
  asdict(model),
387
350
  wait_for_response=True,
388
- response_type=TYPE_KEYBOARD_TEXT_SENT,
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
- TYPE_MEDIA_CONTROL,
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
- TYPE_NOTIFICATION,
376
+ EventType.NOTIFICATION,
414
377
  request_id,
415
378
  asdict(model),
416
379
  wait_for_response=True,
417
- response_type=TYPE_NOTIFICATION_SENT,
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
- TYPE_OPEN,
391
+ EventType.OPEN,
429
392
  request_id,
430
393
  asdict(model),
431
394
  wait_for_response=True,
432
- response_type=TYPE_OPENED,
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
- TYPE_OPEN,
406
+ EventType.OPEN,
444
407
  request_id,
445
408
  asdict(model),
446
409
  wait_for_response=True,
447
- response_type=TYPE_OPENED,
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
- TYPE_POWER_SLEEP,
420
+ EventType.POWER_SLEEP,
458
421
  request_id,
459
422
  {},
460
423
  wait_for_response=True,
461
- response_type=TYPE_POWER_SLEEPING,
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
- TYPE_POWER_HIBERNATE,
434
+ EventType.POWER_HIBERNATE,
472
435
  request_id,
473
436
  {},
474
437
  wait_for_response=True,
475
- response_type=TYPE_POWER_HIBERNATING,
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
- TYPE_POWER_RESTART,
448
+ EventType.POWER_RESTART,
486
449
  request_id,
487
450
  {},
488
451
  wait_for_response=True,
489
- response_type=TYPE_POWER_RESTARTING,
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
- TYPE_POWER_SHUTDOWN,
462
+ EventType.POWER_SHUTDOWN,
500
463
  request_id,
501
464
  {},
502
465
  wait_for_response=True,
503
- response_type=TYPE_POWER_SHUTTINGDOWN,
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
- TYPE_POWER_LOCK,
476
+ EventType.POWER_LOCK,
514
477
  request_id,
515
478
  {},
516
479
  wait_for_response=True,
517
- response_type=TYPE_POWER_LOCKING,
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
- TYPE_POWER_LOGOUT,
490
+ EventType.POWER_LOGOUT,
528
491
  request_id,
529
492
  {},
530
493
  wait_for_response=True,
531
- response_type=TYPE_POWER_LOGGINGOUT,
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[EVENT_TYPE])
507
+ self._logger.debug("[%s] New message: %s", name, message[EventKey.TYPE])
544
508
 
545
509
  if (
546
- message.get(EVENT_ID) is not None
547
- and (response_tuple := self._responses.get(message[EVENT_ID]))
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 response_type is not None and response_type == message[EVENT_TYPE]:
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 == TYPE_DATA_UPDATE
522
+ response.type == EventType.DATA_UPDATE
556
523
  and response.module is not None
557
- and message[EVENT_DATA] is not None
524
+ and message[EventKey.DATA] is not None
558
525
  ):
559
526
  # Find model from module
560
- model = MODEL_MAP.get(message[EVENT_MODULE])
561
- if model is None:
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[EVENT_MODULE]
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", model.__name__
534
+ "[%s] Mapping data to model: %s",
535
+ name,
536
+ model_cls.__name__,
568
537
  )
569
- if isinstance(message[EVENT_DATA], list):
538
+ if isinstance(message[EventKey.DATA], list):
570
539
  response.data = [
571
- model(**data) for data in message[EVENT_DATA]
540
+ model_cls(**data) for data in message[EventKey.DATA]
572
541
  ]
573
542
  else:
574
- response.data = model(**message[EVENT_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
- message[EVENT_ID],
551
+ "[%s] Future already set for response ID: %s",
552
+ name,
553
+ message[EventKey.ID],
584
554
  )
585
555
 
586
- if message[EVENT_TYPE] == TYPE_ERROR:
587
- if message[EVENT_SUBTYPE] == SUBTYPE_LISTENER_ALREADY_REGISTERED:
588
- self._logger.debug(message)
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[EVENT_SUBTYPE] == SUBTYPE_BAD_TOKEN
591
- or message[EVENT_SUBTYPE] == "BAD_API_KEY"
567
+ message[EventKey.SUBTYPE] == EventSubType.BAD_TOKEN
568
+ or message[EventKey.SUBTYPE] == "BAD_API_KEY"
592
569
  ):
593
- self._logger.error(message)
594
- raise AuthenticationException(message[EVENT_MESSAGE])
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("Error message: %s", message)
577
+ self._logger.warning(
578
+ "[%s]: %s",
579
+ name,
580
+ message,
581
+ )
597
582
  elif (
598
- message[EVENT_TYPE] == TYPE_DATA_UPDATE
599
- and message[EVENT_DATA] is not None
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", message[EVENT_MODULE], message[EVENT_DATA]
587
+ "[%s] New data for: %s\n%s",
588
+ name,
589
+ message[EventKey.MODULE],
590
+ message[EventKey.DATA],
603
591
  )
604
- model = MODEL_MAP.get(message[EVENT_MODULE])
605
- if model is None:
606
- self._logger.warning("Unknown model: %s", message[EVENT_MODULE])
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[EVENT_MODULE],
610
- [model(**data) for data in message[EVENT_DATA]]
611
- if isinstance(message[EVENT_DATA], list)
612
- else model(**message[EVENT_DATA]),
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("Other message: %s", message[EVENT_TYPE])
607
+ self._logger.debug(
608
+ "[%s] Other message: %s",
609
+ name,
610
+ message[EventKey.TYPE],
611
+ )
616
612
  if accept_other_types:
617
- model = MODEL_MAP.get(EVENT_TYPE, MODEL_MAP[MODEL_RESPONSE])
618
- if model is not None and callback is not None:
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[EVENT_TYPE],
621
- model(**message),
619
+ message[EventKey.TYPE],
620
+ model_cls(**message),
622
621
  )
623
622
 
624
- await self.listen_for_messages(callback=_callback_message)
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("Listen for messages")
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[EVENT_TYPE] == TYPE_ERROR and (
666
- message_json[EVENT_SUBTYPE] == SUBTYPE_BAD_TOKEN
667
- or message_json[EVENT_SUBTYPE] == "BAD_API_KEY"
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[EVENT_MESSAGE])
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.dev0
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: systembridgemodels>=4.0.4
16
+ Requires-Dist: packaging>=24.0
17
+ Requires-Dist: systembridgemodels>=4.1.0
17
18
 
18
19
  # System Bridge - Connector
19
20
 
@@ -17,7 +17,6 @@ systembridgeconnector.egg-info/requires.txt
17
17
  systembridgeconnector.egg-info/top_level.txt
18
18
  tests/test__version.py
19
19
  tests/test_base.py
20
- tests/test_const.py
21
20
  tests/test_exceptions.py
22
21
  tests/test_http_client.py
23
22
  tests/test_version.py
@@ -1,5 +1,6 @@
1
1
  incremental>=22.10.0
2
- systembridgemodels>=4.0.4
2
+ packaging>=24.0
3
+ systembridgemodels>=4.1.0
3
4
 
4
5
  [:python_version < "3.12"]
5
6
  aiohttp>=3.8.5
@@ -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 GetData, ModulesData, RegisterDataListener
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=[MODEL_SYSTEM],
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=TYPE_DATA_GET,
198
- data={EVENT_MODULES: [MODEL_SYSTEM]},
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=[MODEL_SYSTEM],
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=TYPE_DIRECTORIES,
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=TYPE_FILES,
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=TYPE_FILE,
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=TYPE_DATA_LISTENER_REGISTERED,
330
- data={EVENT_MODULES: [MODEL_SYSTEM]},
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=[MODEL_SYSTEM],
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=TYPE_KEYBOARD_KEY_PRESSED,
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=TYPE_KEYBOARD_TEXT_SENT,
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=TYPE_NOTIFICATION_SENT,
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=TYPE_OPENED,
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=TYPE_OPENED,
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=TYPE_POWER_SLEEPING,
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=TYPE_POWER_HIBERNATING,
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=TYPE_POWER_RESTARTING,
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=TYPE_POWER_SHUTTINGDOWN,
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=TYPE_POWER_LOCKING,
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=TYPE_POWER_LOGGINGOUT,
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
-