splight-lib 4.0.0.dev5__tar.gz → 4.0.0.dev6__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 (86) hide show
  1. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/PKG-INFO +1 -1
  2. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/setup.py +1 -1
  3. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/component/abstract.py +25 -14
  4. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/execution.py +39 -11
  5. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib.egg-info/PKG-INFO +1 -1
  6. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/LICENSE.txt +0 -0
  7. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/README.md +0 -0
  8. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/pyproject.toml +0 -0
  9. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/setup.cfg +0 -0
  10. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/__init__.py +0 -0
  11. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/abstract/__init__.py +0 -0
  12. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/abstract/client.py +0 -0
  13. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/auth/__init__.py +0 -0
  14. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/auth/exceptions.py +0 -0
  15. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/auth/mac_auth.py +0 -0
  16. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/auth/token.py +0 -0
  17. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/__init__.py +0 -0
  18. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/communication/__init__.py +0 -0
  19. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/communication/abstract.py +0 -0
  20. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/communication/classmap.py +0 -0
  21. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/communication/exceptions.py +0 -0
  22. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/communication/local_client.py +0 -0
  23. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/communication/remote_client.py +0 -0
  24. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/database/__init__.py +0 -0
  25. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/database/abstract.py +0 -0
  26. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/database/builder.py +0 -0
  27. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/database/classmap.py +0 -0
  28. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/database/local_client.py +0 -0
  29. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/database/remote_client.py +0 -0
  30. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/datalake/__init__.py +0 -0
  31. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/datalake/abstract.py +0 -0
  32. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/datalake/builder.py +0 -0
  33. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/datalake/local_client.py +0 -0
  34. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/datalake/remote_client.py +0 -0
  35. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/exceptions.py +0 -0
  36. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/file_handler.py +0 -0
  37. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/filter.py +0 -0
  38. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/hub/__init__.py +0 -0
  39. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/hub/abstract.py +0 -0
  40. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/hub/client.py +0 -0
  41. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/communication/__init__.py +0 -0
  42. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/communication/event_handler.py +0 -0
  43. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/component/__init__.py +0 -0
  44. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/component/exceptions.py +0 -0
  45. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/component/spec.py +0 -0
  46. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/constants.py +0 -0
  47. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/encryption.py +0 -0
  48. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/logging/__init__.py +0 -0
  49. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/logging/_internal.py +0 -0
  50. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/logging/component.py +0 -0
  51. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/logging/constants.py +0 -0
  52. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/logging/logging.py +0 -0
  53. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/models/__init__.py +0 -0
  54. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/models/alert.py +0 -0
  55. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/models/asset.py +0 -0
  56. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/models/attribute.py +0 -0
  57. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/models/base.py +0 -0
  58. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/models/communication.py +0 -0
  59. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/models/component.py +0 -0
  60. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/models/dashboard.py +0 -0
  61. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/models/data_address.py +0 -0
  62. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/models/event.py +0 -0
  63. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/models/exceptions.py +0 -0
  64. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/models/file.py +0 -0
  65. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/models/hub.py +0 -0
  66. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/models/native.py +0 -0
  67. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/models/pipeline.py +0 -0
  68. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/models/query.py +0 -0
  69. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/models/secret.py +0 -0
  70. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/models/setpoint.py +0 -0
  71. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/restclient/__init__.py +0 -0
  72. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/restclient/client.py +0 -0
  73. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/restclient/exceptions.py +0 -0
  74. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/restclient/types.py +0 -0
  75. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/settings.py +0 -0
  76. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/testing/__init__.py +0 -0
  77. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/utils/__init__.py +0 -0
  78. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/utils/custom_model.py +0 -0
  79. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/utils/hub.py +0 -0
  80. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/version.py +0 -0
  81. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/webhook.py +0 -0
  82. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib.egg-info/SOURCES.txt +0 -0
  83. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib.egg-info/dependency_links.txt +0 -0
  84. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib.egg-info/not-zip-safe +0 -0
  85. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib.egg-info/requires.txt +0 -0
  86. {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: splight-lib
3
- Version: 4.0.0.dev5
3
+ Version: 4.0.0.dev6
4
4
  Summary: Library for public use. Splight
5
5
  Home-page: UNKNOWN
6
6
  Author: Splight
@@ -14,7 +14,7 @@ test_requires = [
14
14
 
15
15
  setup(
16
16
  name="splight-lib",
17
- version="4.0.0.dev5",
17
+ version="4.0.0.dev6",
18
18
  author="Splight",
19
19
  author_email="factory@splight-ae.com",
20
20
  packages=find_packages(),
@@ -1,16 +1,13 @@
1
+ from abc import abstractmethod
1
2
  import os
2
3
  import sys
3
- import traceback
4
4
  from functools import partial
5
5
  from tempfile import NamedTemporaryFile
6
6
  from time import sleep
7
7
  from typing import Dict, List, Optional, Type
8
8
 
9
- from furl import furl
10
9
  from pydantic import BaseModel, create_model
11
- from retry import retry
12
10
 
13
- from splight_lib.auth import SplightAuthToken
14
11
  from splight_lib.client.communication import RemoteCommunicationClient
15
12
  from splight_lib.communication.event_handler import (
16
13
  command_event_handler,
@@ -18,7 +15,6 @@ from splight_lib.communication.event_handler import (
18
15
  setpoint_event_handler,
19
16
  )
20
17
  from splight_lib.component.exceptions import (
21
- DuplicatedComponentException,
22
18
  InvalidBidingObject,
23
19
  MissingBindingCallback,
24
20
  MissingCommandCallback,
@@ -44,7 +40,6 @@ from splight_lib.models.setpoint import SetPoint
44
40
  from splight_lib.restclient import (
45
41
  ConnectError,
46
42
  HTTPError,
47
- SplightRestClient,
48
43
  Timeout,
49
44
  )
50
45
  from splight_lib.settings import settings
@@ -83,16 +78,16 @@ class HealthCheckProcessor:
83
78
  if not is_alive:
84
79
  exc = self._engine.get_last_exception()
85
80
  self._log_exception(exc)
86
- self._logger.error(
87
- "Healthcheck task failed.", tags=LogTags.RUNTIME
81
+ self._logger.info(
82
+ "Healthcheck finished", tags=LogTags.RUNTIME
88
83
  )
89
84
  self._health_file.close()
90
- self._logger.error(
85
+ self._logger.info(
91
86
  "Healthcheck file removed: %s",
92
87
  self._health_file,
93
88
  tags=LogTags.RUNTIME,
94
89
  )
95
- sys.exit(1)
90
+ break
96
91
  sleep(self._HEALTHCHECK_INTERVAL)
97
92
 
98
93
  def stop(self):
@@ -121,9 +116,9 @@ class SplightBaseComponent:
121
116
  instance_id=component_id,
122
117
  )
123
118
  self._execution_engine = ExecutionClient()
124
- health_check = HealthCheckProcessor(self._execution_engine)
119
+ self._health_check = HealthCheckProcessor(self._execution_engine)
125
120
  self._health_check_thread = Thread(
126
- target=health_check.start, args=(), daemon=False
121
+ target=self._health_check.start, args=(), daemon=False
127
122
  )
128
123
  # We can't add the healthcheck thread into the execution engine
129
124
  # because that thread should stop if any of the registered threads
@@ -184,6 +179,12 @@ class SplightBaseComponent:
184
179
  def execution_engine(self) -> ExecutionClient:
185
180
  return self._execution_engine
186
181
 
182
+ def _register_exit(self):
183
+ if self._execution_engine.get_last_exception():
184
+ sys.exit(1)
185
+ else:
186
+ sys.exit(0)
187
+
187
188
  def _get_custom_type_model(
188
189
  self, component_object: Dict[str, Type[ComponentObjectInstance]]
189
190
  ) -> BaseModel:
@@ -300,9 +301,19 @@ class SplightBaseComponent:
300
301
  )
301
302
 
302
303
  def start(self):
303
- raise NotImplementedError()
304
+ self.run_component()
305
+
306
+ # The following it for waiting for all threads to finish
307
+ for thread in self._execution_engine.threads:
308
+ thread.join()
309
+
310
+ self._health_check_thread.join()
311
+ self._register_exit()
304
312
 
305
313
  def stop(self):
306
- self._execution_engine.stop(self._health_check_thread)
307
314
  self._execution_engine.terminate_all()
308
315
  sys.exit(1)
316
+
317
+ @abstractmethod
318
+ def run_component(self) -> None:
319
+ raise NotImplementedError()
@@ -294,21 +294,38 @@ class ExecutionClient(AbstractClient):
294
294
  self._register_exit_functions()
295
295
  super(ExecutionClient, self).__init__(*args, **kwargs)
296
296
  logger.info("Execution client initialized.", tags=LogTags.RUNTIME)
297
+ self._exc = None
298
+ self._thread_exc = None
297
299
 
298
300
  def _register_exit_functions(self) -> None:
299
301
  excepthook = sys.excepthook
302
+ thread_exchook = threading.excepthook
300
303
 
301
304
  def wrap_excepthook(type, value, traceback):
305
+ self._exc = (type, value, traceback)
302
306
  self.terminate_all()
303
307
  excepthook(type, value, traceback)
304
308
 
305
- atexit.register(self.terminate_all)
309
+ def wrap_thread_excepthook(args):
310
+ self._thread_exc = (
311
+ args.exc_type,
312
+ args.exc_value,
313
+ args.exc_traceback,
314
+ )
315
+ self.terminate_all()
316
+ thread_exchook(args)
317
+
318
+ # atexit.register(self.terminate_all)
306
319
  sys.excepthook = wrap_excepthook
320
+ threading.excepthook = wrap_thread_excepthook
307
321
 
308
322
  def __del__(self) -> None:
309
323
  self.terminate_all()
310
324
 
311
325
  def terminate_all(self) -> None:
326
+ if hasattr(self, "_scheduler"):
327
+ self._scheduler.stop()
328
+
312
329
  for p in self.processes:
313
330
  p.terminate()
314
331
 
@@ -360,15 +377,19 @@ class ExecutionClient(AbstractClient):
360
377
  # not using the execution client explicitly and is doing some
361
378
  # processing directly in the main thread so the healtcheck should
362
379
  # say the component is healthy.
363
- main_thread = threading.main_thread()
380
+ # main_thread = threading.main_thread()
381
+ # threads_status = [
382
+ # p.is_alive() or p.exit_ok() for p in self.processes + self.threads
383
+ # ]
364
384
  threads_status = [
365
- p.is_alive() or p.exit_ok() for p in self.processes + self.threads
385
+ p.is_alive() for p in self.processes + self.threads
366
386
  ]
367
- return (
368
- main_thread.is_alive() or all(threads_status)
369
- if threads_status
370
- else main_thread.is_alive()
371
- )
387
+ return all(threads_status)
388
+ # (
389
+ # main_thread.is_alive() or all(threads_status)
390
+ # if threads_status
391
+ # else main_thread.is_alive()
392
+ # )
372
393
 
373
394
  def healthcheck(self) -> Tuple[bool, ComponentStatus]:
374
395
  """Check if the component is alive and return the status.
@@ -395,7 +416,14 @@ class ExecutionClient(AbstractClient):
395
416
  It assumes that there is only one thread that crashed
396
417
  Also, only works for the thread not the processes.
397
418
  """
398
- broken_thread = [x.exc for x in self.threads if x.exc]
399
- if broken_thread:
400
- return broken_thread[0]
419
+ # broken_thread = [x.exc for x in self.threads if x.exc]
420
+ if self._exc:
421
+ return self._exc[1]
422
+ if self._thread_exc:
423
+ return self._thread_exc[1]
424
+ # if broken_thread:
425
+ # print("THREAD EXC")
426
+ # print(self._thread_exc)
427
+ # print()
428
+ # return broken_thread[0]
401
429
  return None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: splight-lib
3
- Version: 4.0.0.dev5
3
+ Version: 4.0.0.dev6
4
4
  Summary: Library for public use. Splight
5
5
  Home-page: UNKNOWN
6
6
  Author: Splight