splight-lib 4.0.0.dev4__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.dev4 → splight-lib-4.0.0.dev6}/PKG-INFO +1 -1
  2. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/setup.py +1 -1
  3. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/component/abstract.py +25 -43
  4. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/execution.py +39 -11
  5. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/models/component.py +14 -1
  6. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib.egg-info/PKG-INFO +1 -1
  7. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/LICENSE.txt +0 -0
  8. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/README.md +0 -0
  9. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/pyproject.toml +0 -0
  10. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/setup.cfg +0 -0
  11. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/__init__.py +0 -0
  12. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/abstract/__init__.py +0 -0
  13. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/abstract/client.py +0 -0
  14. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/auth/__init__.py +0 -0
  15. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/auth/exceptions.py +0 -0
  16. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/auth/mac_auth.py +0 -0
  17. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/auth/token.py +0 -0
  18. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/client/__init__.py +0 -0
  19. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/client/communication/__init__.py +0 -0
  20. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/client/communication/abstract.py +0 -0
  21. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/client/communication/classmap.py +0 -0
  22. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/client/communication/exceptions.py +0 -0
  23. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/client/communication/local_client.py +0 -0
  24. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/client/communication/remote_client.py +0 -0
  25. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/client/database/__init__.py +0 -0
  26. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/client/database/abstract.py +0 -0
  27. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/client/database/builder.py +0 -0
  28. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/client/database/classmap.py +0 -0
  29. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/client/database/local_client.py +0 -0
  30. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/client/database/remote_client.py +0 -0
  31. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/client/datalake/__init__.py +0 -0
  32. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/client/datalake/abstract.py +0 -0
  33. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/client/datalake/builder.py +0 -0
  34. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/client/datalake/local_client.py +0 -0
  35. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/client/datalake/remote_client.py +0 -0
  36. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/client/exceptions.py +0 -0
  37. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/client/file_handler.py +0 -0
  38. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/client/filter.py +0 -0
  39. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/client/hub/__init__.py +0 -0
  40. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/client/hub/abstract.py +0 -0
  41. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/client/hub/client.py +0 -0
  42. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/communication/__init__.py +0 -0
  43. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/communication/event_handler.py +0 -0
  44. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/component/__init__.py +0 -0
  45. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/component/exceptions.py +0 -0
  46. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/component/spec.py +0 -0
  47. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/constants.py +0 -0
  48. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/encryption.py +0 -0
  49. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/logging/__init__.py +0 -0
  50. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/logging/_internal.py +0 -0
  51. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/logging/component.py +0 -0
  52. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/logging/constants.py +0 -0
  53. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/logging/logging.py +0 -0
  54. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/models/__init__.py +0 -0
  55. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/models/alert.py +0 -0
  56. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/models/asset.py +0 -0
  57. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/models/attribute.py +0 -0
  58. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/models/base.py +0 -0
  59. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/models/communication.py +0 -0
  60. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/models/dashboard.py +0 -0
  61. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/models/data_address.py +0 -0
  62. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/models/event.py +0 -0
  63. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/models/exceptions.py +0 -0
  64. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/models/file.py +0 -0
  65. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/models/hub.py +0 -0
  66. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/models/native.py +0 -0
  67. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/models/pipeline.py +0 -0
  68. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/models/query.py +0 -0
  69. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/models/secret.py +0 -0
  70. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/models/setpoint.py +0 -0
  71. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/restclient/__init__.py +0 -0
  72. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/restclient/client.py +0 -0
  73. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/restclient/exceptions.py +0 -0
  74. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/restclient/types.py +0 -0
  75. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/settings.py +0 -0
  76. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/testing/__init__.py +0 -0
  77. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/utils/__init__.py +0 -0
  78. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/utils/custom_model.py +0 -0
  79. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/utils/hub.py +0 -0
  80. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/version.py +0 -0
  81. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib/webhook.py +0 -0
  82. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib.egg-info/SOURCES.txt +0 -0
  83. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib.egg-info/dependency_links.txt +0 -0
  84. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib.egg-info/not-zip-safe +0 -0
  85. {splight-lib-4.0.0.dev4 → splight-lib-4.0.0.dev6}/splight_lib.egg-info/requires.txt +0 -0
  86. {splight-lib-4.0.0.dev4 → 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.dev4
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.dev4",
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):
@@ -113,8 +108,6 @@ class SplightBaseComponent:
113
108
  ):
114
109
  self._component_id = component_id
115
110
 
116
- if not settings.LOCAL_ENVIRONMENT:
117
- self._check_duplicated_component()
118
111
  # TODO: Change to use builder patter
119
112
  self._comm_client = RemoteCommunicationClient(
120
113
  url=settings.SPLIGHT_PLATFORM_API_HOST,
@@ -123,9 +116,9 @@ class SplightBaseComponent:
123
116
  instance_id=component_id,
124
117
  )
125
118
  self._execution_engine = ExecutionClient()
126
- health_check = HealthCheckProcessor(self._execution_engine)
119
+ self._health_check = HealthCheckProcessor(self._execution_engine)
127
120
  self._health_check_thread = Thread(
128
- target=health_check.start, args=(), daemon=False
121
+ target=self._health_check.start, args=(), daemon=False
129
122
  )
130
123
  # We can't add the healthcheck thread into the execution engine
131
124
  # because that thread should stop if any of the registered threads
@@ -186,6 +179,12 @@ class SplightBaseComponent:
186
179
  def execution_engine(self) -> ExecutionClient:
187
180
  return self._execution_engine
188
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
+
189
188
  def _get_custom_type_model(
190
189
  self, component_object: Dict[str, Type[ComponentObjectInstance]]
191
190
  ) -> BaseModel:
@@ -301,37 +300,20 @@ class SplightBaseComponent:
301
300
  ),
302
301
  )
303
302
 
304
- @retry(REQUEST_EXCEPTIONS, tries=3, delay=2, jitter=1)
305
- def _check_duplicated_component(self):
306
- """
307
- Validates that there are no other connections to communication client
308
- """
309
- token = SplightAuthToken(
310
- access_key=settings.SPLIGHT_ACCESS_ID,
311
- secret_key=settings.SPLIGHT_SECRET_KEY,
312
- )
313
- rest_client = SplightRestClient()
314
- rest_client.update_headers(token.header)
315
- base_url = furl(settings.SPLIGHT_PLATFORM_API_HOST)
316
- base_path = "v2/engine/component/components"
317
- api_url = base_url / f"{base_path}/{self._component_id}/connections/"
318
- response = rest_client.get(api_url)
319
- if response.status_code == 200:
320
- connections = response.json()["subscription_count"]
321
- if int(connections) > 0:
322
- raise DuplicatedComponentException(self._component_id)
323
- else:
324
- raise Exception(
325
- (
326
- "Error checking if component is already running. "
327
- f"Status: {response.status_code}"
328
- )
329
- )
330
-
331
303
  def start(self):
332
- 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()
333
312
 
334
313
  def stop(self):
335
- self._execution_engine.stop(self._health_check_thread)
336
314
  self._execution_engine.terminate_all()
337
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
@@ -5,7 +5,14 @@ from datetime import datetime
5
5
  from enum import auto
6
6
  from typing import Any, ClassVar, Dict, List, Optional, Type, Union
7
7
 
8
- from pydantic import AnyUrl, BaseModel, Field, PrivateAttr, create_model
8
+ from pydantic import (
9
+ AnyUrl,
10
+ BaseModel,
11
+ Field,
12
+ PrivateAttr,
13
+ create_model,
14
+ validator,
15
+ )
9
16
  from strenum import LowercaseStrEnum, PascalCaseStrEnum
10
17
 
11
18
  from splight_lib.models.asset import Asset
@@ -67,6 +74,12 @@ class DataAddress(Parameter):
67
74
  type: str = Field("DataAddress", const=True)
68
75
  value_type: str = "Number"
69
76
 
77
+ @validator("type", pre=True)
78
+ def check_wrong_name(cls, value: str) -> str:
79
+ if value == "DataAdress":
80
+ value = "DataAddress"
81
+ return value
82
+
70
83
 
71
84
  class InputDataAddress(DataAddress):
72
85
  value: Optional[Union[List[Dict[str, str]], Dict[str, str]]]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: splight-lib
3
- Version: 4.0.0.dev4
3
+ Version: 4.0.0.dev6
4
4
  Summary: Library for public use. Splight
5
5
  Home-page: UNKNOWN
6
6
  Author: Splight