splight-lib 4.3.4__tar.gz → 4.3.6__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 (97) hide show
  1. {splight_lib-4.3.4 → splight_lib-4.3.6}/PKG-INFO +1 -1
  2. {splight_lib-4.3.4 → splight_lib-4.3.6}/pyproject.toml +1 -1
  3. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/models/__init__.py +2 -1
  4. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/models/base.py +5 -4
  5. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/models/component.py +2 -9
  6. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/models/data_address.py +5 -3
  7. splight_lib-4.3.6/splight_lib/models/function.py +135 -0
  8. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/models/native.py +4 -1
  9. splight_lib-4.3.4/splight_lib/models/function.py +0 -68
  10. {splight_lib-4.3.4 → splight_lib-4.3.6}/LICENSE.txt +0 -0
  11. {splight_lib-4.3.4 → splight_lib-4.3.6}/README.md +0 -0
  12. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/__init__.py +0 -0
  13. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/abstract/__init__.py +0 -0
  14. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/abstract/client.py +0 -0
  15. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/auth/__init__.py +0 -0
  16. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/auth/exceptions.py +0 -0
  17. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/auth/mac_auth.py +0 -0
  18. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/auth/token.py +0 -0
  19. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/client/__init__.py +0 -0
  20. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/client/communication/__init__.py +0 -0
  21. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/client/communication/abstract.py +0 -0
  22. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/client/communication/classmap.py +0 -0
  23. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/client/communication/exceptions.py +0 -0
  24. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/client/communication/local_client.py +0 -0
  25. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/client/communication/remote_client.py +0 -0
  26. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/client/database/__init__.py +0 -0
  27. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/client/database/abstract.py +0 -0
  28. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/client/database/builder.py +0 -0
  29. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/client/database/classmap.py +0 -0
  30. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/client/database/local_client.py +0 -0
  31. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/client/database/remote_client.py +0 -0
  32. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/client/datalake/__init__.py +0 -0
  33. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/client/datalake/abstract.py +0 -0
  34. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/client/datalake/builder.py +0 -0
  35. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/client/datalake/local_client.py +0 -0
  36. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/client/datalake/remote_client.py +0 -0
  37. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/client/exceptions.py +0 -0
  38. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/client/file_handler.py +0 -0
  39. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/client/filter.py +0 -0
  40. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/client/hub/__init__.py +0 -0
  41. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/client/hub/abstract.py +0 -0
  42. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/client/hub/client.py +0 -0
  43. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/client/tests/test_communication.py +0 -0
  44. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/client/tests/test_database.py +0 -0
  45. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/client/tests/test_datalake.py +0 -0
  46. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/client/tests/test_hub.py +0 -0
  47. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/communication/__init__.py +0 -0
  48. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/communication/event_handler.py +0 -0
  49. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/communication/tests/test_event_handler.py +0 -0
  50. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/component/__init__.py +0 -0
  51. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/component/abstract.py +0 -0
  52. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/component/exceptions.py +0 -0
  53. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/component/spec.py +0 -0
  54. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/component/tests/test_abstract.py +0 -0
  55. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/component/tests/test_spec.py +0 -0
  56. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/constants.py +0 -0
  57. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/encryption.py +0 -0
  58. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/execution.py +0 -0
  59. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/logging/__init__.py +0 -0
  60. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/logging/_internal.py +0 -0
  61. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/logging/component.py +0 -0
  62. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/logging/constants.py +0 -0
  63. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/logging/logging.py +0 -0
  64. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/logging/tests/test_logging.py +0 -0
  65. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/models/alert.py +0 -0
  66. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/models/asset.py +0 -0
  67. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/models/attribute.py +0 -0
  68. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/models/communication.py +0 -0
  69. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/models/dashboard.py +0 -0
  70. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/models/event.py +0 -0
  71. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/models/exceptions.py +0 -0
  72. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/models/file.py +0 -0
  73. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/models/generic.py +0 -0
  74. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/models/hub.py +0 -0
  75. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/models/metadata.py +0 -0
  76. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/models/pipeline.py +0 -0
  77. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/models/secret.py +0 -0
  78. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/models/tests/models.json +0 -0
  79. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/models/tests/test_component_object_instance.py +0 -0
  80. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/models/tests/test_database_model.py +0 -0
  81. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/models/tests/test_metadata.py +0 -0
  82. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/models/tests/test_models.py +0 -0
  83. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/restclient/__init__.py +0 -0
  84. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/restclient/client.py +0 -0
  85. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/restclient/exceptions.py +0 -0
  86. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/restclient/tests/test_restclient.py +0 -0
  87. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/restclient/types.py +0 -0
  88. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/settings.py +0 -0
  89. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/testing/__init__.py +0 -0
  90. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/tests/FakeProc.py +0 -0
  91. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/tests/test_encryption.py +0 -0
  92. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/tests/test_execution.py +0 -0
  93. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/utils/__init__.py +0 -0
  94. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/utils/custom_model.py +0 -0
  95. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/utils/hub.py +0 -0
  96. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/version.py +0 -0
  97. {splight_lib-4.3.4 → splight_lib-4.3.6}/splight_lib/webhook.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: splight-lib
3
- Version: 4.3.4
3
+ Version: 4.3.6
4
4
  Summary: Splight Library
5
5
  Author: Splight Dev
6
6
  Author-email: dev@splight-ae.com
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "splight-lib"
3
- version = "4.3.4"
3
+ version = "4.3.6"
4
4
  description = "Splight Library"
5
5
  authors = ["Splight Dev <dev@splight-ae.com>"]
6
6
  readme = "README.md"
@@ -18,7 +18,7 @@ from splight_lib.models.dashboard import (
18
18
  Tab,
19
19
  )
20
20
  from splight_lib.models.file import File
21
- from splight_lib.models.function import Function, FunctionItem
21
+ from splight_lib.models.function import Function, FunctionItem, QueryFilter
22
22
  from splight_lib.models.hub import HubComponent
23
23
  from splight_lib.models.metadata import Metadata
24
24
  from splight_lib.models.native import Boolean, Number, String
@@ -41,6 +41,7 @@ __all__ = [
41
41
  Filter,
42
42
  Function,
43
43
  FunctionItem,
44
+ QueryFilter,
44
45
  HubComponent,
45
46
  Metadata,
46
47
  Number,
@@ -75,8 +75,8 @@ class SplightDatalakeBaseModel(BaseModel):
75
75
  timestamp: datetime = Field(
76
76
  default_factory=lambda: datetime.now(timezone.utc)
77
77
  )
78
- instance_id: Optional[str] = None
79
- instance_type: Optional[str] = None
78
+ instance_id: str = ""
79
+ instance_type: str = ""
80
80
  _collection_name: ClassVar[str] = "DatalakeModel"
81
81
  _dl_client: AbstractDatalakeClient = PrivateAttr()
82
82
 
@@ -119,9 +119,10 @@ class SplightDatalakeBaseModel(BaseModel):
119
119
 
120
120
  def save(self):
121
121
  dl_client = self.__get_datalake_client()
122
+ instance_dict = json.loads(self.model_dump_json())
122
123
  dl_client.save(
123
124
  collection=self._collection_name,
124
- instances=json.loads(self.json()),
125
+ instances=instance_dict,
125
126
  )
126
127
 
127
128
  async def async_save(self):
@@ -129,7 +130,7 @@ class SplightDatalakeBaseModel(BaseModel):
129
130
 
130
131
  await dl_client.async_save(
131
132
  collection=self._collection_name,
132
- instances=json.loads(self.json()),
133
+ instances=json.loads(self.model_dump_json()),
133
134
  )
134
135
 
135
136
  @classmethod
@@ -89,15 +89,8 @@ class DataAddress(Parameter):
89
89
  return value
90
90
 
91
91
 
92
- class DataAddressValue(BaseModel):
93
- asset: str
94
- attribute: str
95
-
96
- model_config = ConfigDict(extra="ignore")
97
-
98
-
99
92
  class InputDataAddress(DataAddress):
100
- value: Optional[Union[List[DataAddressValue], DataAddressValue]] = None
93
+ value: Optional[Union[List[DLDataAddress], DLDataAddress]] = None
101
94
 
102
95
 
103
96
  class OutputParameter(BaseModel):
@@ -283,7 +276,7 @@ def get_field_value(field: Union[InputParameter, List[InputParameter]]):
283
276
  value = field.value.copy()
284
277
  value = value if multiple else [value]
285
278
  for item in value:
286
- item.update({"type": field.value_type})
279
+ item.type = field.value_type
287
280
 
288
281
  value = [model_class.model_validate(item) for item in value]
289
282
  value = value[0] if not multiple else value
@@ -1,7 +1,7 @@
1
- from typing import List
1
+ from typing import List, Optional
2
2
 
3
3
  import pandas as pd
4
- from pydantic import BaseModel
4
+ from pydantic import BaseModel, ConfigDict
5
5
 
6
6
  from splight_lib.models.native import Boolean, NativeOutput, Number, String
7
7
 
@@ -9,7 +9,7 @@ from splight_lib.models.native import Boolean, NativeOutput, Number, String
9
9
  class DataAddresses(BaseModel):
10
10
  asset: str
11
11
  attribute: str
12
- type: str
12
+ type: Optional[str] = None
13
13
 
14
14
  _type_map = {
15
15
  "Number": Number,
@@ -17,6 +17,8 @@ class DataAddresses(BaseModel):
17
17
  "Boolean": Boolean,
18
18
  }
19
19
 
20
+ model_config = ConfigDict(extra="ignore")
21
+
20
22
  def get(self, **params) -> List["NativeOutput"]:
21
23
  params["asset"] = self.asset
22
24
  params["attribute"] = self.attribute
@@ -0,0 +1,135 @@
1
+ import json
2
+ import re
3
+ from enum import auto
4
+ from typing import List, Literal, Optional
5
+
6
+ from pydantic import (
7
+ BaseModel,
8
+ Field,
9
+ PositiveInt,
10
+ ValidationError,
11
+ model_validator,
12
+ )
13
+ from strenum import LowercaseStrEnum, UppercaseStrEnum
14
+ from typing_extensions import TypedDict
15
+
16
+ from splight_lib.constants import DESCRIPTION_MAX_LENGTH
17
+ from splight_lib.models.base import SplightDatabaseBaseModel
18
+
19
+
20
+ class FunctionItemType(UppercaseStrEnum):
21
+ EXPRESSION = auto()
22
+ QUERY = auto()
23
+
24
+
25
+ class QueryFilter(TypedDict):
26
+ id: str
27
+ name: str
28
+
29
+
30
+ class GroupUnit(LowercaseStrEnum):
31
+ SECOND = auto()
32
+ MINUTE = auto()
33
+ HOUR = auto()
34
+ DAY = auto()
35
+ MONTH = auto()
36
+
37
+
38
+ class GroupCriteria(LowercaseStrEnum):
39
+ EMPTY = ""
40
+ AVG = auto()
41
+ SUM = auto()
42
+ MIN = auto()
43
+ MAX = auto()
44
+ LAST = auto()
45
+
46
+
47
+ class FunctionItem(BaseModel):
48
+ id: Optional[str] = Field(None, max_length=100)
49
+ ref_id: str
50
+ type: FunctionItemType = FunctionItemType.QUERY
51
+ expression: str = ""
52
+ query_filter_asset: Optional[QueryFilter] = None
53
+ query_filter_attribute: Optional[QueryFilter] = None
54
+ expression_plain: Optional[str] = None
55
+ query_group_unit: Optional[GroupUnit] = None
56
+ query_group_function: Optional[GroupCriteria] = None
57
+ query_sort_field: Optional[str] = None
58
+ query_sort_direction: Optional[int] = None
59
+ query_plain: Optional[str] = None
60
+
61
+ @model_validator(mode="after")
62
+ def validate_expression(self):
63
+ if self.expression:
64
+ if self.type != FunctionItemType.EXPRESSION:
65
+ raise ValidationError(
66
+ "type must be EXPRESSION if a expression is passed."
67
+ )
68
+ self.expression_plain = (
69
+ self._get_expression_plain()
70
+ if self.expression_plain is None
71
+ else self.expression_plain
72
+ )
73
+ return self
74
+
75
+ @model_validator(mode="after")
76
+ def validate_query(self):
77
+ if self.query_filter_asset is not None:
78
+ if self.type != FunctionItemType.QUERY:
79
+ raise ValidationError(
80
+ "type must be QUERY if a query_filter_asset is passed."
81
+ )
82
+ self.query_plain = (
83
+ self._get_query_plain()
84
+ if self.query_plain is None
85
+ else self.query_plain
86
+ )
87
+ return self
88
+
89
+ def _get_expression_plain(self):
90
+ pattern = r"\$\w+"
91
+ args = re.findall(pattern, self.expression)
92
+ str_args = ", ".join(args)
93
+ body = f"function ({str_args}) {{ return {self.expression} }}"
94
+ expression_plain = {
95
+ "$function": {"body": body, "args": args, "lang": "js"}
96
+ }
97
+ return json.dumps(expression_plain)
98
+
99
+ def _get_query_plain(self):
100
+ query_plain = [
101
+ {
102
+ "$match": {
103
+ "asset": self.query_filter_asset["id"],
104
+ "attribute": self.query_filter_attribute["id"],
105
+ }
106
+ }
107
+ ]
108
+ return json.dumps(query_plain)
109
+
110
+
111
+ class Function(SplightDatabaseBaseModel):
112
+ id: Optional[str] = Field(None, max_length=100)
113
+ name: str
114
+ description: Optional[str] = Field(
115
+ default=None, max_length=DESCRIPTION_MAX_LENGTH
116
+ )
117
+
118
+ active: bool = True
119
+ time_window: int = 5 * 60
120
+ function_items: List[FunctionItem] = []
121
+
122
+ type: Literal["cron", "rate"]
123
+ target_variable: str
124
+ target_asset: Optional[QueryFilter] = None
125
+ target_attribute: Optional[QueryFilter] = None
126
+
127
+ cron_minutes: Optional[str] = None
128
+ cron_hours: Optional[str] = None
129
+ cron_dom: Optional[str] = None
130
+ cron_month: Optional[str] = None
131
+ cron_dow: Optional[str] = None
132
+ cron_year: Optional[str] = None
133
+
134
+ rate_value: Optional[PositiveInt] = None
135
+ rate_unit: Optional[Literal["day", "hour", "minute"]] = None
@@ -1,4 +1,4 @@
1
- from typing import ClassVar, Dict, List, Optional, Union
1
+ from typing import ClassVar, Dict, List, Literal, Optional, Union
2
2
 
3
3
  import pandas as pd
4
4
  from pydantic import field_validator
@@ -42,14 +42,17 @@ class NativeOutput(SplightDatalakeBaseModel):
42
42
 
43
43
  class Number(NativeOutput):
44
44
  value: float
45
+ output_format: Literal["Number"] = "Number"
45
46
  _output_format: ClassVar[str] = "Number"
46
47
 
47
48
 
48
49
  class String(NativeOutput):
49
50
  value: str
51
+ output_format: Literal["String"] = "String"
50
52
  _output_format: ClassVar[str] = "String"
51
53
 
52
54
 
53
55
  class Boolean(NativeOutput):
54
56
  value: bool
57
+ output_format: Literal["Boolean"] = "Boolean"
55
58
  _output_format: ClassVar[str] = "Boolean"
@@ -1,68 +0,0 @@
1
- from enum import auto
2
- from typing import List, Optional
3
-
4
- from pydantic import BaseModel, Field
5
- from strenum import LowercaseStrEnum, UppercaseStrEnum
6
- from typing_extensions import TypedDict
7
-
8
- from splight_lib.constants import DESCRIPTION_MAX_LENGTH
9
- from splight_lib.models.base import SplightDatabaseBaseModel
10
-
11
-
12
- class FunctionItemType(UppercaseStrEnum):
13
- EXPRESSION = auto()
14
- QUERY = auto()
15
-
16
-
17
- class QueryFilter(TypedDict):
18
- id: str
19
- name: str
20
-
21
-
22
- class GroupUnit(LowercaseStrEnum):
23
- SECOND = auto()
24
- MINUTE = auto()
25
- HOUR = auto()
26
- DAY = auto()
27
- MONTH = auto()
28
-
29
-
30
- class GroupCriteria(LowercaseStrEnum):
31
- EMPTY = ""
32
- AVG = auto()
33
- SUM = auto()
34
- MIN = auto()
35
- MAX = auto()
36
- LAST = auto()
37
-
38
-
39
- class FunctionItem(BaseModel):
40
- id: Optional[str] = Field(None, max_length=100)
41
- ref_id: str
42
- type: FunctionItemType = FunctionItemType.QUERY
43
- expression: str = ""
44
- query_filter_asset: Optional[QueryFilter] = None
45
- expression_plain: Optional[str] = None
46
- expression_plain: Optional[str] = None
47
- query_group_unint: Optional[GroupUnit] = None
48
- query_group_function: Optional[GroupCriteria] = None
49
- query_sort_field: Optional[str] = None
50
- query_sort_direction: Optional[int] = None
51
- query_plain: Optional[str] = None
52
-
53
-
54
- class Function(SplightDatabaseBaseModel):
55
- id: Optional[str] = Field(None, max_length=100)
56
- name: str
57
- description: Optional[str] = Field(
58
- default=None, max_length=DESCRIPTION_MAX_LENGTH
59
- )
60
-
61
- active: bool = True
62
- frequency: int = 60
63
- time_window: int = 5 * 60
64
- function_items: List[FunctionItem] = []
65
-
66
- target_variable: str
67
- target_asset: Optional[str] = Field(None, alias="target_asset_id")
68
- target_attribute: Optional[str] = Field(None, alias="target_attribute_id")
File without changes
File without changes