splight-lib 4.3.7__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.7 → splight_lib-4.3.8}/PKG-INFO +1 -1
  2. {splight_lib-4.3.7 → splight_lib-4.3.8}/pyproject.toml +1 -1
  3. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/models/function.py +78 -16
  4. {splight_lib-4.3.7 → splight_lib-4.3.8}/LICENSE.txt +0 -0
  5. {splight_lib-4.3.7 → splight_lib-4.3.8}/README.md +0 -0
  6. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/__init__.py +0 -0
  7. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/abstract/__init__.py +0 -0
  8. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/abstract/client.py +0 -0
  9. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/auth/__init__.py +0 -0
  10. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/auth/exceptions.py +0 -0
  11. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/auth/mac_auth.py +0 -0
  12. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/auth/token.py +0 -0
  13. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/client/__init__.py +0 -0
  14. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/client/communication/__init__.py +0 -0
  15. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/client/communication/abstract.py +0 -0
  16. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/client/communication/classmap.py +0 -0
  17. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/client/communication/exceptions.py +0 -0
  18. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/client/communication/local_client.py +0 -0
  19. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/client/communication/remote_client.py +0 -0
  20. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/client/database/__init__.py +0 -0
  21. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/client/database/abstract.py +0 -0
  22. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/client/database/builder.py +0 -0
  23. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/client/database/classmap.py +0 -0
  24. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/client/database/local_client.py +0 -0
  25. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/client/database/remote_client.py +0 -0
  26. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/client/datalake/__init__.py +0 -0
  27. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/client/datalake/abstract.py +0 -0
  28. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/client/datalake/builder.py +0 -0
  29. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/client/datalake/local_client.py +0 -0
  30. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/client/datalake/remote_client.py +0 -0
  31. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/client/exceptions.py +0 -0
  32. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/client/file_handler.py +0 -0
  33. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/client/filter.py +0 -0
  34. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/client/hub/__init__.py +0 -0
  35. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/client/hub/abstract.py +0 -0
  36. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/client/hub/client.py +0 -0
  37. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/client/tests/test_communication.py +0 -0
  38. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/client/tests/test_database.py +0 -0
  39. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/client/tests/test_datalake.py +0 -0
  40. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/client/tests/test_hub.py +0 -0
  41. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/communication/__init__.py +0 -0
  42. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/communication/event_handler.py +0 -0
  43. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/communication/tests/test_event_handler.py +0 -0
  44. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/component/__init__.py +0 -0
  45. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/component/abstract.py +0 -0
  46. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/component/exceptions.py +0 -0
  47. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/component/spec.py +0 -0
  48. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/component/tests/test_abstract.py +0 -0
  49. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/component/tests/test_spec.py +0 -0
  50. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/constants.py +0 -0
  51. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/encryption.py +0 -0
  52. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/execution.py +0 -0
  53. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/logging/__init__.py +0 -0
  54. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/logging/_internal.py +0 -0
  55. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/logging/component.py +0 -0
  56. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/logging/constants.py +0 -0
  57. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/logging/logging.py +0 -0
  58. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/logging/tests/test_logging.py +0 -0
  59. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/models/__init__.py +0 -0
  60. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/models/alert.py +0 -0
  61. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/models/asset.py +0 -0
  62. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/models/attribute.py +0 -0
  63. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/models/base.py +0 -0
  64. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/models/communication.py +0 -0
  65. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/models/component.py +0 -0
  66. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/models/dashboard.py +0 -0
  67. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/models/data_address.py +0 -0
  68. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/models/event.py +0 -0
  69. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/models/exceptions.py +0 -0
  70. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/models/file.py +0 -0
  71. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/models/generic.py +0 -0
  72. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/models/hub.py +0 -0
  73. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/models/metadata.py +0 -0
  74. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/models/native.py +0 -0
  75. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/models/pipeline.py +0 -0
  76. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/models/secret.py +0 -0
  77. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/models/tests/models.json +0 -0
  78. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/models/tests/test_component_object_instance.py +0 -0
  79. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/models/tests/test_database_model.py +0 -0
  80. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/models/tests/test_metadata.py +0 -0
  81. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/models/tests/test_models.py +0 -0
  82. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/restclient/__init__.py +0 -0
  83. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/restclient/client.py +0 -0
  84. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/restclient/exceptions.py +0 -0
  85. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/restclient/tests/test_restclient.py +0 -0
  86. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/restclient/types.py +0 -0
  87. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/settings.py +0 -0
  88. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/testing/__init__.py +0 -0
  89. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/tests/FakeProc.py +0 -0
  90. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/tests/test_encryption.py +0 -0
  91. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/tests/test_execution.py +0 -0
  92. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/utils/__init__.py +0 -0
  93. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/utils/custom_model.py +0 -0
  94. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/utils/hub.py +0 -0
  95. {splight_lib-4.3.7 → splight_lib-4.3.8}/splight_lib/version.py +0 -0
  96. {splight_lib-4.3.7 → 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.7
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.7"
3
+ version = "4.3.8"
4
4
  description = "Splight Library"
5
5
  authors = ["Splight Dev <dev@splight-ae.com>"]
6
6
  readme = "README.md"
@@ -46,25 +46,35 @@ class GroupCriteria(LowercaseStrEnum):
46
46
 
47
47
 
48
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
+
49
52
  id: Optional[str] = Field(None, max_length=100)
53
+
50
54
  ref_id: str
51
55
  type: FunctionItemType = FunctionItemType.QUERY
56
+
52
57
  expression: str = ""
58
+ expression_plain: str = ""
59
+
53
60
  query_filter_asset: Optional[QueryFilter] = None
54
61
  query_filter_attribute: Optional[QueryFilter] = None
55
- expression_plain: Optional[str] = None
56
- query_group_unit: Optional[GroupUnit] = None
57
- query_group_function: Optional[GroupCriteria] = None
58
- query_sort_field: Optional[str] = None
59
- 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'
60
70
  query_plain: Optional[str] = None
61
71
 
62
72
  @model_validator(mode="after")
63
73
  def validate_expression(self):
64
- if self.expression:
65
- if self.type != FunctionItemType.EXPRESSION:
74
+ if self.type == FunctionItemType.EXPRESSION:
75
+ if self.expression is None:
66
76
  raise ValidationError(
67
- "type must be EXPRESSION if a expression is passed."
77
+ f"Parameter 'expression' is required for expression type function items"
68
78
  )
69
79
  self.expression_plain = (
70
80
  self._get_expression_plain()
@@ -75,11 +85,12 @@ class FunctionItem(BaseModel):
75
85
 
76
86
  @model_validator(mode="after")
77
87
  def validate_query(self):
78
- if self.query_filter_asset is not None:
79
- if self.type != FunctionItemType.QUERY:
80
- raise ValidationError(
81
- "type must be QUERY if a query_filter_asset is passed."
82
- )
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
+ )
83
94
  self.query_plain = (
84
95
  self._get_query_plain()
85
96
  if self.query_plain is None
@@ -104,8 +115,35 @@ class FunctionItem(BaseModel):
104
115
  "asset": self.query_filter_asset["id"],
105
116
  "attribute": self.query_filter_attribute["id"],
106
117
  }
107
- }
118
+ },
108
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
+ )
109
147
  return json.dumps(query_plain)
110
148
 
111
149
 
@@ -122,8 +160,8 @@ class Function(SplightDatabaseBaseModel):
122
160
 
123
161
  type: Literal["cron", "rate"]
124
162
  target_variable: str
125
- target_asset: Optional[QueryFilter] = None
126
- target_attribute: Optional[QueryFilter] = None
163
+ target_asset: QueryFilter # NOTE: optional in API
164
+ target_attribute: QueryFilter # NOTE: optional in API
127
165
 
128
166
  cron_minutes: Optional[str] = None
129
167
  cron_hours: Optional[str] = None
@@ -134,3 +172,27 @@ class Function(SplightDatabaseBaseModel):
134
172
 
135
173
  rate_value: Optional[PositiveInt] = None
136
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