splight-lib 4.6.2__tar.gz → 4.6.4__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 (107) hide show
  1. {splight_lib-4.6.2 → splight_lib-4.6.4}/PKG-INFO +2 -1
  2. {splight_lib-4.6.2 → splight_lib-4.6.4}/pyproject.toml +2 -1
  3. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/component/abstract.py +21 -2
  4. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/execution/engine.py +21 -8
  5. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/models/file.py +30 -20
  6. {splight_lib-4.6.2 → splight_lib-4.6.4}/LICENSE.txt +0 -0
  7. {splight_lib-4.6.2 → splight_lib-4.6.4}/README.md +0 -0
  8. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/__init__.py +0 -0
  9. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/abstract/__init__.py +0 -0
  10. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/abstract/client.py +0 -0
  11. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/auth/__init__.py +0 -0
  12. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/auth/exceptions.py +0 -0
  13. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/auth/mac_auth.py +0 -0
  14. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/auth/token.py +0 -0
  15. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/client/__init__.py +0 -0
  16. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/client/communication/__init__.py +0 -0
  17. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/client/communication/abstract.py +0 -0
  18. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/client/communication/classmap.py +0 -0
  19. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/client/communication/exceptions.py +0 -0
  20. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/client/communication/local_client.py +0 -0
  21. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/client/communication/remote_client.py +0 -0
  22. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/client/database/__init__.py +0 -0
  23. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/client/database/abstract.py +0 -0
  24. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/client/database/builder.py +0 -0
  25. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/client/database/classmap.py +0 -0
  26. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/client/database/local_client.py +0 -0
  27. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/client/database/remote_client.py +0 -0
  28. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/client/datalake/__init__.py +0 -0
  29. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/client/datalake/abstract.py +0 -0
  30. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/client/datalake/buffer.py +0 -0
  31. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/client/datalake/builder.py +0 -0
  32. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/client/datalake/exceptions.py +0 -0
  33. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/client/datalake/local_client.py +0 -0
  34. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/client/datalake/remote_client.py +0 -0
  35. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/client/exceptions.py +0 -0
  36. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/client/file_handler.py +0 -0
  37. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/client/filter.py +0 -0
  38. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/client/hub/__init__.py +0 -0
  39. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/client/hub/abstract.py +0 -0
  40. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/client/hub/client.py +0 -0
  41. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/client/tests/test_communication.py +0 -0
  42. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/client/tests/test_database.py +0 -0
  43. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/client/tests/test_datalake.py +0 -0
  44. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/client/tests/test_hub.py +0 -0
  45. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/communication/__init__.py +0 -0
  46. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/communication/event_handler.py +0 -0
  47. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/communication/tests/test_event_handler.py +0 -0
  48. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/component/__init__.py +0 -0
  49. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/component/exceptions.py +0 -0
  50. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/component/spec.py +0 -0
  51. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/component/tests/test_abstract.py +0 -0
  52. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/component/tests/test_spec.py +0 -0
  53. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/constants.py +0 -0
  54. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/encryption.py +0 -0
  55. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/execution/__init__.py +0 -0
  56. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/execution/exceptions.py +0 -0
  57. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/execution/scheduling.py +0 -0
  58. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/execution/task.py +0 -0
  59. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/execution/tests/test_execution.py +0 -0
  60. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/execution/tests/test_scheduling.py +0 -0
  61. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/execution/trigger.py +0 -0
  62. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/logging/__init__.py +0 -0
  63. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/logging/_internal.py +0 -0
  64. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/logging/component.py +0 -0
  65. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/logging/constants.py +0 -0
  66. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/logging/logging.py +0 -0
  67. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/logging/tests/test_logging.py +0 -0
  68. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/models/__init__.py +0 -0
  69. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/models/alert.py +0 -0
  70. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/models/asset.py +0 -0
  71. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/models/attribute.py +0 -0
  72. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/models/base.py +0 -0
  73. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/models/communication.py +0 -0
  74. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/models/component.py +0 -0
  75. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/models/dashboard.py +0 -0
  76. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/models/data_address.py +0 -0
  77. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/models/event.py +0 -0
  78. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/models/exceptions.py +0 -0
  79. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/models/function.py +0 -0
  80. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/models/generic.py +0 -0
  81. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/models/hub.py +0 -0
  82. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/models/metadata.py +0 -0
  83. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/models/native.py +0 -0
  84. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/models/pipeline.py +0 -0
  85. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/models/secret.py +0 -0
  86. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/models/tests/models.json +0 -0
  87. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/models/tests/test_component_object_instance.py +0 -0
  88. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/models/tests/test_database_model.py +0 -0
  89. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/models/tests/test_metadata.py +0 -0
  90. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/models/tests/test_models.py +0 -0
  91. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/restclient/__init__.py +0 -0
  92. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/restclient/client.py +0 -0
  93. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/restclient/exceptions.py +0 -0
  94. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/restclient/tests/test_restclient.py +0 -0
  95. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/restclient/types.py +0 -0
  96. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/settings.py +0 -0
  97. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/stringcase.py +0 -0
  98. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/testing/__init__.py +0 -0
  99. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/tests/FakeProc.py +0 -0
  100. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/tests/asset_geometries.json +0 -0
  101. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/tests/test_api_contracts.py +0 -0
  102. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/tests/test_encryption.py +0 -0
  103. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/utils/__init__.py +0 -0
  104. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/utils/custom_model.py +0 -0
  105. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/utils/hub.py +0 -0
  106. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/version.py +0 -0
  107. {splight_lib-4.6.2 → splight_lib-4.6.4}/splight_lib/webhook.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: splight-lib
3
- Version: 4.6.2
3
+ Version: 4.6.4
4
4
  Summary: Splight Library
5
5
  Author: Splight Dev
6
6
  Author-email: dev@splight-ae.com
@@ -34,6 +34,7 @@ Requires-Dist: requests (>=2.26.0)
34
34
  Requires-Dist: retry (==0.9.2)
35
35
  Requires-Dist: simplejson (==3.17.6)
36
36
  Requires-Dist: strenum (==0.4.9)
37
+ Requires-Dist: typer (==0.9.0)
37
38
  Requires-Dist: typing-extensions (>=4.6.1,<5.0.0)
38
39
  Description-Content-Type: text/markdown
39
40
 
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "splight-lib"
3
- version = "4.6.2"
3
+ version = "4.6.4"
4
4
  description = "Splight Library"
5
5
  authors = ["Splight Dev <dev@splight-ae.com>"]
6
6
  readme = "README.md"
@@ -32,6 +32,7 @@ typing-extensions = "^4.6.1"
32
32
  pydantic-settings = "2.0.3"
33
33
  email-validator = "^2.1.0.post1"
34
34
  apscheduler = "3.10.4"
35
+ typer = "0.9.0"
35
36
 
36
37
  [tool.poetry.group.dev.dependencies]
37
38
  black = "23.3.0"
@@ -8,6 +8,7 @@ from time import sleep
8
8
  from typing import Callable, Dict, Optional, Type
9
9
 
10
10
  from pydantic import BaseModel
11
+ from pydantic_core import ValidationError
11
12
 
12
13
  from splight_lib.component.spec import Spec
13
14
  from splight_lib.execution.engine import EngineStatus, ExecutionEngine
@@ -80,6 +81,26 @@ class SplightBaseComponent(ABC):
80
81
  daemon=False,
81
82
  )
82
83
 
84
+ self._spec = None
85
+ self._input = None
86
+ self._output = None
87
+ self._custom_types = None
88
+ self._routines = None
89
+ try:
90
+ self._setup_component(component_id)
91
+ except ValidationError as exc:
92
+ logger.debug(
93
+ "There was an error validating the component configuration"
94
+ )
95
+ logger.exception(exc, tags=LogTags.COMPONENT)
96
+ self.stop()
97
+ except Exception as exc:
98
+ logger.exception(exc, tags=LogTags.COMPONENT)
99
+ self.stop()
100
+
101
+ self.start = self._wrap_start(self.start)
102
+
103
+ def _setup_component(self, component_id: str):
83
104
  self._spec = self._load_spec()
84
105
  self._input = self._spec.component_input(component_id)
85
106
  self._output = self._spec.get_output_models(component_id)
@@ -99,8 +120,6 @@ class SplightBaseComponent(ABC):
99
120
  self._custom_types = self._get_custom_type_model(component_objects)
100
121
  self._routines = self._get_routine_model(routine_objects)
101
122
 
102
- self.start = self._wrap_start(self.start)
103
-
104
123
  @property
105
124
  def input(self) -> BaseModel:
106
125
  return self._input
@@ -1,4 +1,4 @@
1
- from enum import Enum, auto
1
+ from enum import auto
2
2
  from typing import Set, Tuple
3
3
 
4
4
  import pytz
@@ -25,16 +25,21 @@ class ExecutionEngine:
25
25
  self._logger.info(
26
26
  "Execution client initialized.", tags=LogTags.RUNTIME
27
27
  )
28
- self._blocking_sch = BlockingScheduler(timezone=pytz.UTC)
28
+ self._blocking_sch = BlockingScheduler(
29
+ job_defaults={"misfire_grace_time": None},
30
+ timezone=pytz.UTC,
31
+ )
29
32
  self._background_sch = BackgroundScheduler(
30
- timezone=pytz.UTC, daemon=True
33
+ job_defaults={"misfire_grace_time": None},
34
+ timezone=pytz.UTC,
35
+ daemon=True,
31
36
  )
32
37
  self._critical_jobs: Set[str] = set()
33
38
  self._blocking_sch.add_listener(
34
- self._task_fail_callbak, EVENT_JOB_ERROR
39
+ self._task_fail_callback, EVENT_JOB_ERROR
35
40
  )
36
41
  self._background_sch.add_listener(
37
- self._task_fail_callbak, EVENT_JOB_ERROR
42
+ self._task_fail_callback, EVENT_JOB_ERROR
38
43
  )
39
44
  self._running = True
40
45
  self._state = EngineStatus.INITIALIZED
@@ -75,6 +80,7 @@ class ExecutionEngine:
75
80
  task: BaseTask,
76
81
  in_background: bool = True,
77
82
  exit_on_fail: bool = False,
83
+ max_instances: int = 1,
78
84
  ):
79
85
  """Adds new task to the corresponding scheduler.
80
86
 
@@ -88,16 +94,23 @@ class ExecutionEngine:
88
94
  exit_on_fail: bool
89
95
  Used to stop the engine if the task execution failed. This
90
96
  parameter is usefull to declare critical tasks.
97
+ max_instances: int = 1
98
+ Maximum number of concurrently running instances allowed for this
99
+ job
91
100
  """
92
101
  if in_background:
93
- job = self._background_sch.add_job(**task.as_job())
102
+ job = self._background_sch.add_job(
103
+ **task.as_job(), max_instances=max_instances
104
+ )
94
105
  else:
95
- job = self._blocking_sch.add_job(**task.as_job())
106
+ job = self._blocking_sch.add_job(
107
+ **task.as_job(), max_instances=max_instances
108
+ )
96
109
  if exit_on_fail:
97
110
  self._critical_jobs.add(job.id)
98
111
  self._logger.info(f"Job {job.id} added", tags=LogTags.RUNTIME)
99
112
 
100
- def _task_fail_callbak(self, event: JobExecutionEvent):
113
+ def _task_fail_callback(self, event: JobExecutionEvent):
101
114
  if event.job_id in self._critical_jobs:
102
115
  self._logger.error(
103
116
  "An error ocurred in job execution. Stopping engine"
@@ -13,7 +13,8 @@ from splight_lib.models.base import SplightDatabaseBaseModel
13
13
  class File(SplightDatabaseBaseModel):
14
14
  id: Optional[str] = None
15
15
  assets: List[Asset] = []
16
- file: str
16
+ file: Optional[str] = None
17
+ name: Optional[str] = None
17
18
  description: Optional[str] = Field(
18
19
  default=None, max_length=DESCRIPTION_MAX_LENGTH
19
20
  )
@@ -24,28 +25,24 @@ class File(SplightDatabaseBaseModel):
24
25
 
25
26
  @model_validator(mode="after")
26
27
  def validate_file(self):
27
- self.file = self.file.replace("/", os.sep)
28
- self.file = self.file.replace("\\", os.sep)
29
-
30
- # Compute the checksum if missing
31
- if self.checksum is None:
32
- hasher = hashlib.md5()
33
- with open(self.file, "rb") as file:
34
- # Read in chunks of 8KiB for large files
35
- while chunk := file.read(8192):
36
- hasher.update(chunk)
37
- self.checksum = hasher.hexdigest()
28
+ if self.file:
29
+ self.file = self.file.replace("/", os.sep)
30
+ self.file = self.file.replace("\\", os.sep)
38
31
 
32
+ # Compute the checksum if missing
33
+ if self.checksum is None:
34
+ hasher = hashlib.md5()
35
+ with open(self.file, "rb") as file:
36
+ # Read in chunks of 8KiB for large files
37
+ while chunk := file.read(8192):
38
+ hasher.update(chunk)
39
+ self.checksum = hasher.hexdigest()
39
40
  return self
40
41
 
41
42
  @field_validator("metadata", mode="before")
42
43
  def validate_metadata(cls, v):
43
44
  return json.loads(v) if isinstance(v, str) else v
44
45
 
45
- @property
46
- def name(self):
47
- return self.file.split(os.sep)[-1]
48
-
49
46
  def download(self):
50
47
  file = self._db_client.download(
51
48
  resource_name=self.__class__.__name__,
@@ -55,12 +52,25 @@ class File(SplightDatabaseBaseModel):
55
52
 
56
53
  def model_dump(self, *args, **kwargs):
57
54
  res = super().model_dump(*args, **kwargs)
58
- res["metadata"] = json.dumps(self.metadata)
55
+ if self.metadata:
56
+ res["metadata"] = json.dumps(self.metadata)
59
57
  return res
60
58
 
61
59
  def model_dump_json(self, *args, **kwargs):
62
- prev_metadata = self.metadata
63
- self.metadata = json.dumps(self.metadata)
64
60
  res = super().model_dump_json(*args, **kwargs)
65
- self.metadata = prev_metadata
61
+ if self.metadata:
62
+ prev_metadata = self.metadata
63
+ self.metadata = json.dumps(self.metadata)
64
+ self.metadata = prev_metadata
66
65
  return res
66
+
67
+ def save(self):
68
+ saved = self._db_client.save(
69
+ self.__class__.__name__, self.model_dump(exclude_none=True)
70
+ )
71
+ if not self.id:
72
+ self.id = saved["id"]
73
+ self.name = saved["name"]
74
+ self.content_type = saved["content_type"]
75
+ self.checksum = saved["checksum"]
76
+ self.url = saved["url"]
File without changes
File without changes