splight-lib 4.3.6__tar.gz → 4.3.8__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 (96) hide show
  1. {splight_lib-4.3.6 → splight_lib-4.3.8}/PKG-INFO +1 -1
  2. {splight_lib-4.3.6 → splight_lib-4.3.8}/pyproject.toml +1 -1
  3. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/models/function.py +79 -16
  4. {splight_lib-4.3.6 → splight_lib-4.3.8}/LICENSE.txt +0 -0
  5. {splight_lib-4.3.6 → splight_lib-4.3.8}/README.md +0 -0
  6. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/__init__.py +0 -0
  7. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/abstract/__init__.py +0 -0
  8. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/abstract/client.py +0 -0
  9. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/auth/__init__.py +0 -0
  10. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/auth/exceptions.py +0 -0
  11. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/auth/mac_auth.py +0 -0
  12. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/auth/token.py +0 -0
  13. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/client/__init__.py +0 -0
  14. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/client/communication/__init__.py +0 -0
  15. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/client/communication/abstract.py +0 -0
  16. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/client/communication/classmap.py +0 -0
  17. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/client/communication/exceptions.py +0 -0
  18. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/client/communication/local_client.py +0 -0
  19. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/client/communication/remote_client.py +0 -0
  20. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/client/database/__init__.py +0 -0
  21. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/client/database/abstract.py +0 -0
  22. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/client/database/builder.py +0 -0
  23. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/client/database/classmap.py +0 -0
  24. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/client/database/local_client.py +0 -0
  25. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/client/database/remote_client.py +0 -0
  26. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/client/datalake/__init__.py +0 -0
  27. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/client/datalake/abstract.py +0 -0
  28. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/client/datalake/builder.py +0 -0
  29. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/client/datalake/local_client.py +0 -0
  30. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/client/datalake/remote_client.py +0 -0
  31. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/client/exceptions.py +0 -0
  32. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/client/file_handler.py +0 -0
  33. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/client/filter.py +0 -0
  34. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/client/hub/__init__.py +0 -0
  35. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/client/hub/abstract.py +0 -0
  36. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/client/hub/client.py +0 -0
  37. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/client/tests/test_communication.py +0 -0
  38. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/client/tests/test_database.py +0 -0
  39. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/client/tests/test_datalake.py +0 -0
  40. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/client/tests/test_hub.py +0 -0
  41. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/communication/__init__.py +0 -0
  42. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/communication/event_handler.py +0 -0
  43. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/communication/tests/test_event_handler.py +0 -0
  44. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/component/__init__.py +0 -0
  45. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/component/abstract.py +0 -0
  46. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/component/exceptions.py +0 -0
  47. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/component/spec.py +0 -0
  48. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/component/tests/test_abstract.py +0 -0
  49. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/component/tests/test_spec.py +0 -0
  50. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/constants.py +0 -0
  51. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/encryption.py +0 -0
  52. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/execution.py +0 -0
  53. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/logging/__init__.py +0 -0
  54. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/logging/_internal.py +0 -0
  55. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/logging/component.py +0 -0
  56. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/logging/constants.py +0 -0
  57. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/logging/logging.py +0 -0
  58. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/logging/tests/test_logging.py +0 -0
  59. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/models/__init__.py +0 -0
  60. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/models/alert.py +0 -0
  61. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/models/asset.py +0 -0
  62. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/models/attribute.py +0 -0
  63. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/models/base.py +0 -0
  64. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/models/communication.py +0 -0
  65. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/models/component.py +0 -0
  66. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/models/dashboard.py +0 -0
  67. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/models/data_address.py +0 -0
  68. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/models/event.py +0 -0
  69. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/models/exceptions.py +0 -0
  70. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/models/file.py +0 -0
  71. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/models/generic.py +0 -0
  72. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/models/hub.py +0 -0
  73. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/models/metadata.py +0 -0
  74. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/models/native.py +0 -0
  75. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/models/pipeline.py +0 -0
  76. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/models/secret.py +0 -0
  77. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/models/tests/models.json +0 -0
  78. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/models/tests/test_component_object_instance.py +0 -0
  79. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/models/tests/test_database_model.py +0 -0
  80. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/models/tests/test_metadata.py +0 -0
  81. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/models/tests/test_models.py +0 -0
  82. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/restclient/__init__.py +0 -0
  83. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/restclient/client.py +0 -0
  84. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/restclient/exceptions.py +0 -0
  85. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/restclient/tests/test_restclient.py +0 -0
  86. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/restclient/types.py +0 -0
  87. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/settings.py +0 -0
  88. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/testing/__init__.py +0 -0
  89. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/tests/FakeProc.py +0 -0
  90. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/tests/test_encryption.py +0 -0
  91. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/tests/test_execution.py +0 -0
  92. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/utils/__init__.py +0 -0
  93. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/utils/custom_model.py +0 -0
  94. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/utils/hub.py +0 -0
  95. {splight_lib-4.3.6 → splight_lib-4.3.8}/splight_lib/version.py +0 -0
  96. {splight_lib-4.3.6 → splight_lib-4.3.8}/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.6
3
+ Version: 4.3.8
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.6"
3
+ version = "4.3.8"
4
4
  description = "Splight Library"
5
5
  authors = ["Splight Dev <dev@splight-ae.com>"]
6
6
  readme = "README.md"
@@ -28,6 +28,7 @@ class QueryFilter(TypedDict):
28
28
 
29
29
 
30
30
  class GroupUnit(LowercaseStrEnum):
31
+ EMPTY = ""
31
32
  SECOND = auto()
32
33
  MINUTE = auto()
33
34
  HOUR = auto()
@@ -45,25 +46,35 @@ class GroupCriteria(LowercaseStrEnum):
45
46
 
46
47
 
47
48
  class FunctionItem(BaseModel):
49
+ # NOTE: the defaults are inconsistent because
50
+ # we never made a clear contract between the lib, api and frontend
51
+
48
52
  id: Optional[str] = Field(None, max_length=100)
53
+
49
54
  ref_id: str
50
55
  type: FunctionItemType = FunctionItemType.QUERY
56
+
51
57
  expression: str = ""
58
+ expression_plain: str = ""
59
+
52
60
  query_filter_asset: Optional[QueryFilter] = None
53
61
  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
62
+
63
+ query_group_function: GroupCriteria = GroupCriteria.EMPTY
64
+ query_group_unit: GroupUnit = GroupUnit.EMPTY
65
+
66
+ query_sort_field: str = ""
67
+ query_sort_direction: int = -1
68
+
69
+ # NOTE: why is this None as default but not "" like 'expression_plain'
59
70
  query_plain: Optional[str] = None
60
71
 
61
72
  @model_validator(mode="after")
62
73
  def validate_expression(self):
63
- if self.expression:
64
- if self.type != FunctionItemType.EXPRESSION:
74
+ if self.type == FunctionItemType.EXPRESSION:
75
+ if self.expression is None:
65
76
  raise ValidationError(
66
- "type must be EXPRESSION if a expression is passed."
77
+ f"Parameter 'expression' is required for expression type function items"
67
78
  )
68
79
  self.expression_plain = (
69
80
  self._get_expression_plain()
@@ -74,11 +85,12 @@ class FunctionItem(BaseModel):
74
85
 
75
86
  @model_validator(mode="after")
76
87
  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
- )
88
+ if self.type == FunctionItemType.QUERY:
89
+ for attr in [self.query_filter_asset, self.query_filter_attribute]:
90
+ if attr is None:
91
+ raise ValidationError(
92
+ f"Parameter '{attr}' is required for query type functions items"
93
+ )
82
94
  self.query_plain = (
83
95
  self._get_query_plain()
84
96
  if self.query_plain is None
@@ -103,8 +115,35 @@ class FunctionItem(BaseModel):
103
115
  "asset": self.query_filter_asset["id"],
104
116
  "attribute": self.query_filter_attribute["id"],
105
117
  }
106
- }
118
+ },
107
119
  ]
120
+ # NOTE: The frontend only sets the rest of the query
121
+ # if both group_unit and group_function are set
122
+ if self.query_group_unit and self.query_group_function:
123
+ query_plain.extend(
124
+ [
125
+ {
126
+ "$addFields": {
127
+ "timestamp": {
128
+ "$dateTrunc": {
129
+ "date": "$timestamp",
130
+ "unit": self.query_group_unit,
131
+ "binSize": 1,
132
+ }
133
+ }
134
+ }
135
+ },
136
+ {
137
+ "$group": {
138
+ "_id": "$timestamp",
139
+ "value": {
140
+ f"${self.query_group_function}": "$value"
141
+ },
142
+ "timestamp": {"$last": "$timestamp"},
143
+ }
144
+ },
145
+ ]
146
+ )
108
147
  return json.dumps(query_plain)
109
148
 
110
149
 
@@ -121,8 +160,8 @@ class Function(SplightDatabaseBaseModel):
121
160
 
122
161
  type: Literal["cron", "rate"]
123
162
  target_variable: str
124
- target_asset: Optional[QueryFilter] = None
125
- target_attribute: Optional[QueryFilter] = None
163
+ target_asset: QueryFilter # NOTE: optional in API
164
+ target_attribute: QueryFilter # NOTE: optional in API
126
165
 
127
166
  cron_minutes: Optional[str] = None
128
167
  cron_hours: Optional[str] = None
@@ -133,3 +172,27 @@ class Function(SplightDatabaseBaseModel):
133
172
 
134
173
  rate_value: Optional[PositiveInt] = None
135
174
  rate_unit: Optional[Literal["day", "hour", "minute"]] = None
175
+
176
+ @model_validator(mode="after")
177
+ def validate_type(self):
178
+ if self.type == "cron":
179
+ for attr in [
180
+ self.cron_year,
181
+ self.cron_month,
182
+ self.cron_hours,
183
+ self.cron_minutes,
184
+ self.cron_dow,
185
+ self.cron_dom,
186
+ ]:
187
+ if attr is None:
188
+ raise ValidationError(
189
+ f"Parameter {attr} is required for '{self.type}' type functions"
190
+ )
191
+ if self.type == "rate":
192
+ for attr in [self.rate_value, self.rate_unit]:
193
+ if attr is None:
194
+ raise ValidationError(
195
+ f"Parameter {attr} is required for '{self.type}' type functions"
196
+ )
197
+
198
+ return self
File without changes
File without changes