splight-lib 5.24.0__tar.gz → 5.24.0.dev1__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 (163) hide show
  1. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/PKG-INFO +1 -1
  2. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/pyproject.toml +1 -1
  3. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/client/datalake/common/abstract.py +8 -2
  4. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/client/datalake/v3/remote_client.py +12 -6
  5. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/client/datalake/v4/generic.py +1 -4
  6. splight_lib-5.24.0.dev1/splight_lib/client/datalake/v4/models.py +78 -0
  7. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/client/datalake/v4/remote_client.py +30 -27
  8. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/__init__.py +13 -20
  9. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/__init__.py +2 -22
  10. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/component.py +32 -0
  11. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/datalake_base.py +32 -30
  12. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/native.py +15 -17
  13. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/restclient/client.py +4 -3
  14. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/uv.lock +2 -2
  15. splight_lib-5.24.0/splight_lib/models/_v4/datalake.py +0 -133
  16. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/.github/workflows/code-style.yaml +0 -0
  17. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/.github/workflows/developer.yaml +0 -0
  18. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/.github/workflows/pre-release.yaml +0 -0
  19. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/.github/workflows/release.yaml +0 -0
  20. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/.github/workflows/scripts/check_dev_version.py +0 -0
  21. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/.github/workflows/scripts/check_master_version.py +0 -0
  22. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/.github/workflows/scripts/check_pypi_version.py +0 -0
  23. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/.github/workflows/scripts/check_release_version.py +0 -0
  24. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/.github/workflows/scripts/check_version_uploaded.py +0 -0
  25. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/.github/workflows/scripts/cleanup_pypi.py +0 -0
  26. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/.github/workflows/scripts/requirements.txt +0 -0
  27. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/.gitignore +0 -0
  28. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/.pre-commit-config.yaml +0 -0
  29. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/DOCS.md +0 -0
  30. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/LICENSE.txt +0 -0
  31. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/Makefile +0 -0
  32. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/README.md +0 -0
  33. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/__init__.py +0 -0
  34. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/abstract/__init__.py +0 -0
  35. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/abstract/client.py +0 -0
  36. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/auth/__init__.py +0 -0
  37. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/auth/token.py +0 -0
  38. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/client/__init__.py +0 -0
  39. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/client/database/__init__.py +0 -0
  40. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/client/database/abstract.py +0 -0
  41. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/client/database/builder.py +0 -0
  42. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/client/database/classmap.py +0 -0
  43. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/client/database/remote_client.py +0 -0
  44. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/client/datalake/__init__.py +0 -0
  45. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/client/datalake/builder.py +0 -0
  46. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/client/datalake/common/__init__.py +0 -0
  47. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/client/datalake/common/buffer.py +0 -0
  48. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/client/datalake/v3/__init__.py +0 -0
  49. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/client/datalake/v3/builder.py +0 -0
  50. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/client/datalake/v3/classmap.py +0 -0
  51. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/client/datalake/v3/constants.py +0 -0
  52. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/client/datalake/v3/exceptions.py +0 -0
  53. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/client/datalake/v4/__init__.py +0 -0
  54. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/client/datalake/v4/builder.py +0 -0
  55. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/client/datalake/v4/exceptions.py +0 -0
  56. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/client/exceptions.py +0 -0
  57. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/client/hub/__init__.py +0 -0
  58. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/client/hub/abstract.py +0 -0
  59. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/client/hub/client.py +0 -0
  60. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/client/tests/test_database.py +0 -0
  61. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/client/tests/test_datalake.py +0 -0
  62. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/component/__init__.py +0 -0
  63. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/component/abstract.py +0 -0
  64. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/component/exceptions.py +0 -0
  65. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/component/spec.py +0 -0
  66. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/component/tests/test_spec.py +0 -0
  67. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/config.py +0 -0
  68. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/conftest.py +0 -0
  69. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/constants.py +0 -0
  70. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/encryption.py +0 -0
  71. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/execution/__init__.py +0 -0
  72. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/execution/engine.py +0 -0
  73. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/execution/exceptions.py +0 -0
  74. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/execution/scheduling.py +0 -0
  75. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/execution/task.py +0 -0
  76. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/execution/tests/test_execution.py +0 -0
  77. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/execution/tests/test_scheduling.py +0 -0
  78. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/execution/trigger.py +0 -0
  79. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/logging/__init__.py +0 -0
  80. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/logging/_internal.py +0 -0
  81. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/logging/component.py +0 -0
  82. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/logging/constants.py +0 -0
  83. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/logging/logging.py +0 -0
  84. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/logging/tests/test_logging.py +0 -0
  85. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/__init__.py +0 -0
  86. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/actions.py +0 -0
  87. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/alert.py +0 -0
  88. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/asset.py +0 -0
  89. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/attribute.py +0 -0
  90. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/bus.py +0 -0
  91. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/component.py +0 -0
  92. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/dashboard.py +0 -0
  93. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/data_address.py +0 -0
  94. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/datalake.py +0 -0
  95. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/datalake_base.py +0 -0
  96. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/exceptions.py +0 -0
  97. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/external_grid.py +0 -0
  98. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/file.py +0 -0
  99. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/function.py +0 -0
  100. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/generator.py +0 -0
  101. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/generic.py +0 -0
  102. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/grid.py +0 -0
  103. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/hub.py +0 -0
  104. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/hub_server.py +0 -0
  105. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/inverter.py +0 -0
  106. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/line.py +0 -0
  107. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/metadata.py +0 -0
  108. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/native.py +0 -0
  109. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/secret.py +0 -0
  110. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/segment.py +0 -0
  111. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/server.py +0 -0
  112. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/slack_generator.py +0 -0
  113. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/slack_line.py +0 -0
  114. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/tag.py +0 -0
  115. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/tests/models.json +0 -0
  116. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/tests/test_component_object_instance.py +0 -0
  117. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/tests/test_database_model.py +0 -0
  118. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/tests/test_metadata.py +0 -0
  119. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/tests/test_models.py +0 -0
  120. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/three_winding_transformer.py +0 -0
  121. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/transformer.py +0 -0
  122. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/variable_types.py +0 -0
  123. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/asset.py +0 -0
  124. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/attribute.py +0 -0
  125. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/base.py +0 -0
  126. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/battery.py +0 -0
  127. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/bus.py +0 -0
  128. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/data_address.py +0 -0
  129. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/exceptions.py +0 -0
  130. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/external_grid.py +0 -0
  131. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/file.py +0 -0
  132. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/generator.py +0 -0
  133. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/generic.py +0 -0
  134. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/grid.py +0 -0
  135. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/hub.py +0 -0
  136. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/hub_server.py +0 -0
  137. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/line.py +0 -0
  138. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/load.py +0 -0
  139. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/metadata.py +0 -0
  140. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/secret.py +0 -0
  141. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/segment.py +0 -0
  142. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/server.py +0 -0
  143. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/slack_line.py +0 -0
  144. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/solution.py +0 -0
  145. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/tag.py +0 -0
  146. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/transformer.py +0 -0
  147. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/variable_types.py +0 -0
  148. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/models/database.py +0 -0
  149. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/restclient/__init__.py +0 -0
  150. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/restclient/exceptions.py +0 -0
  151. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/restclient/tests/test_restclient.py +0 -0
  152. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/restclient/types.py +0 -0
  153. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/server/__init__.py +0 -0
  154. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/server/exceptions.py +0 -0
  155. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/server/server.py +0 -0
  156. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/settings.py +0 -0
  157. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/testing/__init__.py +0 -0
  158. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/tests/FakeProc.py +0 -0
  159. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/tests/asset_geometries.json +0 -0
  160. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/tests/test_api_contracts.py +0 -0
  161. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/utils/__init__.py +0 -0
  162. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/utils/custom_model.py +0 -0
  163. {splight_lib-5.24.0 → splight_lib-5.24.0.dev1}/splight_lib/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: splight-lib
3
- Version: 5.24.0
3
+ Version: 5.24.0.dev1
4
4
  Summary: Splight Python Library
5
5
  Author-email: Splight Dev <dev@splight.com>
6
6
  License-File: LICENSE.txt
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "splight-lib"
3
- version = "5.24.0"
3
+ version = "5.24.0.dev1"
4
4
  description = "Splight Python Library"
5
5
  authors = [
6
6
  {name = "Splight Dev",email = "dev@splight.com"}
@@ -1,8 +1,14 @@
1
1
  from abc import abstractmethod
2
+ from typing import Any, TypedDict
2
3
 
3
4
  from splight_lib.abstract.client import AbstractRemoteClient, QuerySet
4
5
 
5
6
 
7
+ class Records(TypedDict):
8
+ schema_name: str
9
+ records: list[dict[str, Any]]
10
+
11
+
6
12
  # TODO: Fix this class after delete QuerySet
7
13
  class AbstractDatalakeClient(AbstractRemoteClient):
8
14
  def get(self, *args, **kwargs) -> QuerySet:
@@ -16,11 +22,11 @@ class AbstractDatalakeClient(AbstractRemoteClient):
16
22
  return await self._async_get(*args, **kwargs)
17
23
 
18
24
  @abstractmethod
19
- def save(self, records: dict) -> list[dict]:
25
+ def save(self, records: Records) -> list[dict]:
20
26
  pass
21
27
 
22
28
  @abstractmethod
23
- async def async_save(self, records: dict) -> list[dict]:
29
+ async def async_save(self, records: Records) -> list[dict]:
24
30
  pass
25
31
 
26
32
  @abstractmethod
@@ -2,10 +2,14 @@ from threading import Lock, Thread
2
2
  from time import sleep
3
3
 
4
4
  from furl import furl
5
+ from httpx import HTTPTransport
5
6
  from retry import retry
6
7
 
7
8
  from splight_lib.auth import SplightAuthToken
8
- from splight_lib.client.datalake.common.abstract import AbstractDatalakeClient
9
+ from splight_lib.client.datalake.common.abstract import (
10
+ AbstractDatalakeClient,
11
+ Records,
12
+ )
9
13
  from splight_lib.client.datalake.common.buffer import DatalakeDocumentBuffer
10
14
  from splight_lib.client.datalake.v3.classmap import COLLECTION_PREFIXS_MAP
11
15
  from splight_lib.client.datalake.v3.exceptions import DatalakeRequestError
@@ -38,14 +42,16 @@ class SyncRemoteDatalakeClient(AbstractDatalakeClient):
38
42
  self._api_version = "v3"
39
43
  self._default_path = "data"
40
44
 
41
- self._restclient = SplightRestClient()
45
+ self._restclient = SplightRestClient(
46
+ transport=HTTPTransport(retries=3)
47
+ )
42
48
  self._restclient.update_headers(token.header)
43
49
  logger.debug(
44
50
  "Remote datalake client initialized.", tags=LogTags.DATALAKE
45
51
  )
46
52
 
47
53
  @retry(EXCEPTIONS, tries=3, delay=2, jitter=1)
48
- def save(self, records: dict) -> list[dict]:
54
+ def save(self, records: Records) -> list[dict]:
49
55
  prefix = self._get_prefix(records["collection"])
50
56
  url = self._base_url / f"{prefix}/write/"
51
57
  response = self._restclient.post(url, json=records)
@@ -56,7 +62,7 @@ class SyncRemoteDatalakeClient(AbstractDatalakeClient):
56
62
  @retry(EXCEPTIONS, tries=3, delay=2, jitter=1)
57
63
  async def async_save(
58
64
  self,
59
- records: dict,
65
+ records: Records,
60
66
  ) -> list[dict]:
61
67
  # POST /data/write
62
68
  prefix = self._get_prefix(records["collection"])
@@ -138,7 +144,7 @@ class BufferedAsyncRemoteDatalakeClient(SyncRemoteDatalakeClient):
138
144
  tags=LogTags.DATALAKE,
139
145
  )
140
146
 
141
- def save(self, records: dict) -> list[dict]:
147
+ def save(self, records: Records) -> list[dict]:
142
148
  logger.debug("Saving documents in datalake", tags=LogTags.DATALAKE)
143
149
  collection = records["collection"]
144
150
  instances = records["records"]
@@ -237,7 +243,7 @@ class BufferedSyncRemoteDataClient(SyncRemoteDatalakeClient):
237
243
  tags=LogTags.DATALAKE,
238
244
  )
239
245
 
240
- def save(self, records: dict) -> list[dict]:
246
+ def save(self, records: Records) -> list[dict]:
241
247
  logger.debug("Saving documents in datalake", tags=LogTags.DATALAKE)
242
248
  collection = records["collection"]
243
249
  buffer = self._data_buffers[collection]
@@ -3,9 +3,7 @@ from enum import Enum
3
3
  from typing import TypeAlias
4
4
 
5
5
  Timestamp: TypeAlias = datetime
6
- # Order in types is important. When parsing if float is first,
7
- # bools will be interpreted as floats (1.0, 0.0) instead of bools.
8
- Value: TypeAlias = bool | str | float
6
+ Value: TypeAlias = float | bool | str | int
9
7
 
10
8
 
11
9
  class AggregationFunction(str, Enum):
@@ -14,7 +12,6 @@ class AggregationFunction(str, Enum):
14
12
  MIN = "min"
15
13
  MAX = "max"
16
14
  COUNT = "count"
17
- LAST = "last"
18
15
 
19
16
 
20
17
  class TimeUnit(str, Enum):
@@ -0,0 +1,78 @@
1
+ from typing import Annotated, Literal, Optional
2
+
3
+ from pydantic import BaseModel, Field
4
+
5
+ from splight_lib.client.datalake.v4.generic import (
6
+ AggregationFunction,
7
+ Timestamp,
8
+ TimeUnit,
9
+ TransitionSchemaName,
10
+ TransitionSort,
11
+ Value,
12
+ )
13
+
14
+
15
+ class DefaultEntryKey(BaseModel):
16
+ asset: str
17
+ attribute: str
18
+
19
+
20
+ class DefaultKeys(BaseModel):
21
+ schema_name: Literal[TransitionSchemaName.DEFAULT]
22
+ entries: list[DefaultEntryKey]
23
+
24
+ @classmethod
25
+ def load(cls, entries: list) -> "DefaultKeys":
26
+ return cls(
27
+ schema_name=TransitionSchemaName.DEFAULT,
28
+ entries=entries,
29
+ )
30
+
31
+
32
+ class SolutionEntryKey(BaseModel):
33
+ solution: str
34
+ asset: str
35
+ output: str
36
+
37
+
38
+ class SolutionKeys(BaseModel):
39
+ schema_name: Literal[TransitionSchemaName.SOLUTIONS]
40
+ entries: list[SolutionEntryKey]
41
+
42
+ @classmethod
43
+ def load(cls, entries: list) -> "SolutionKeys":
44
+ return cls(
45
+ schema_name=TransitionSchemaName.SOLUTIONS,
46
+ entries=entries,
47
+ )
48
+
49
+
50
+ QueryKeys = Annotated[
51
+ DefaultKeys | SolutionKeys, Field(discriminator="schema_name")
52
+ ]
53
+
54
+
55
+ class DataReadRequest(BaseModel):
56
+ keys: QueryKeys
57
+ start: Optional[Timestamp]
58
+ end: Optional[Timestamp] = None
59
+ time_window_unit: TimeUnit = TimeUnit.SECOND
60
+ time_window_size: int = 1
61
+ aggregation: AggregationFunction = AggregationFunction.MAX
62
+ sort: TransitionSort = TransitionSort.DESC
63
+ limit: int = 1000
64
+
65
+
66
+ class DefaultRecord(DefaultEntryKey):
67
+ value: Value
68
+ timestamp: Timestamp
69
+
70
+
71
+ class SolutionRecord(SolutionEntryKey):
72
+ value: Value
73
+ timestamp: Timestamp
74
+
75
+
76
+ class DataWriteRequest(BaseModel):
77
+ schema_name: TransitionSchemaName
78
+ records: list[SolutionRecord] | list[DefaultRecord]
@@ -2,12 +2,19 @@ from threading import Lock, Thread
2
2
  from time import sleep
3
3
 
4
4
  from furl import furl
5
+ from httpx import HTTPTransport
5
6
  from retry import retry
6
7
 
7
8
  from splight_lib.auth import SplightAuthToken
8
- from splight_lib.client.datalake.common.abstract import AbstractDatalakeClient
9
+ from splight_lib.client.datalake.common.abstract import (
10
+ AbstractDatalakeClient,
11
+ Records,
12
+ )
9
13
  from splight_lib.client.datalake.common.buffer import DatalakeDocumentBuffer
10
14
  from splight_lib.client.datalake.v4.exceptions import DatalakeRequestError
15
+ from splight_lib.client.datalake.v4.models import (
16
+ DataReadRequest,
17
+ )
11
18
  from splight_lib.client.exceptions import SPLIGHT_REQUEST_EXCEPTIONS
12
19
  from splight_lib.logging._internal import LogTags, get_splight_logger
13
20
  from splight_lib.restclient import SplightRestClient
@@ -35,7 +42,9 @@ class SyncRemoteDatalakeClient(AbstractDatalakeClient):
35
42
  secret_key=secret_key,
36
43
  )
37
44
 
38
- self._restclient = SplightRestClient()
45
+ self._restclient = SplightRestClient(
46
+ transport=HTTPTransport(retries=3)
47
+ )
39
48
  self._restclient.update_headers(token.header)
40
49
  logger.debug(
41
50
  "Remote datalake client initialized.", tags=LogTags.DATALAKE
@@ -61,7 +70,7 @@ class SyncRemoteDatalakeClient(AbstractDatalakeClient):
61
70
  return records["records"]
62
71
 
63
72
  @retry(EXCEPTIONS, tries=3, delay=2, jitter=1)
64
- def _get(self, request: dict) -> list[dict]:
73
+ def _get(self, request: DataReadRequest) -> list[dict]:
65
74
  url = self._base_url / f"{self.prefix}/read/"
66
75
  response = self._restclient.post(url, json=request)
67
76
  if response.is_error:
@@ -69,7 +78,7 @@ class SyncRemoteDatalakeClient(AbstractDatalakeClient):
69
78
  return response.json()
70
79
 
71
80
  @retry(EXCEPTIONS, tries=3, delay=2, jitter=1)
72
- async def _async_get(self, request: dict) -> list[dict]:
81
+ async def _async_get(self, request: DataReadRequest) -> list[dict]:
73
82
  url = self._base_url / f"{self.prefix}/read/"
74
83
  response = await self._restclient.async_post(url, json=request)
75
84
  if response.is_error:
@@ -133,9 +142,8 @@ class BufferedAsyncRemoteDatalakeClient(SyncRemoteDatalakeClient):
133
142
 
134
143
  def save(self, records: dict) -> list[dict]:
135
144
  logger.debug("Saving documents in datalake", tags=LogTags.DATALAKE)
136
- instance = records["records"]
137
- data_points = instance["data_points"]
138
- schema_name = instance["schema_name"]
145
+ instances = records["records"]
146
+ schema_name = records["schema_name"]
139
147
  buffer = self._data_buffers[schema_name]
140
148
  with self._lock:
141
149
  if buffer.should_flush():
@@ -145,8 +153,8 @@ class BufferedAsyncRemoteDatalakeClient(SyncRemoteDatalakeClient):
145
153
  )
146
154
  self._send_documents(schema_name, buffer.data)
147
155
  buffer.reset()
148
- buffer.add_documents(data_points)
149
- return data_points
156
+ buffer.add_documents(instances)
157
+ return instances
150
158
 
151
159
  def _flusher(self):
152
160
  while True:
@@ -171,19 +179,17 @@ class BufferedAsyncRemoteDatalakeClient(SyncRemoteDatalakeClient):
171
179
 
172
180
  @retry(EXCEPTIONS, tries=3, delay=2, jitter=1)
173
181
  def _send_documents(
174
- self, schema_name: str, data_points: list[dict]
182
+ self, schema_name: str, docs: list[dict]
175
183
  ) -> list[dict]:
176
184
  url = self._base_url / f"{self.prefix}/write/"
177
185
  data = {
178
- "records": {
179
- "schema_name": schema_name,
180
- "data_points": data_points,
181
- },
186
+ "schema_name": schema_name,
187
+ "records": docs,
182
188
  }
183
189
  response = self._restclient.post(url, json=data)
184
190
  if response.is_error:
185
191
  raise DatalakeRequestError(response.status_code, response.text)
186
- return data_points
192
+ return docs
187
193
 
188
194
 
189
195
  class BufferedSyncRemoteDataClient(SyncRemoteDatalakeClient):
@@ -234,14 +240,13 @@ class BufferedSyncRemoteDataClient(SyncRemoteDatalakeClient):
234
240
  tags=LogTags.DATALAKE,
235
241
  )
236
242
 
237
- def save(self, records: dict) -> list[dict]:
243
+ def save(self, records: Records) -> list[dict]:
238
244
  logger.debug("Saving documents in datalake", tags=LogTags.DATALAKE)
239
- instance = records["records"]
240
- schema_name = instance["schema_name"]
241
- data_points = instance["data_points"]
245
+ schema_name = records["schema_name"]
246
+ records = records["records"]
242
247
  buffer = self._data_buffers[schema_name]
243
248
  with self._lock:
244
- buffer.add_documents(data_points)
249
+ buffer.add_documents(records)
245
250
  if buffer.should_flush():
246
251
  logger.debug(
247
252
  "Flushing datalake buffer with %s elements",
@@ -250,20 +255,18 @@ class BufferedSyncRemoteDataClient(SyncRemoteDatalakeClient):
250
255
  )
251
256
  self._send_documents(schema_name, buffer.data)
252
257
  buffer.reset()
253
- return data_points
258
+ return records
254
259
 
255
260
  @retry(EXCEPTIONS, tries=3, delay=2, jitter=1)
256
261
  def _send_documents(
257
- self, schema_name: str, data_points: list[dict]
262
+ self, schema_name: str, docs: list[dict]
258
263
  ) -> list[dict]:
259
264
  url = self._base_url / f"{self.prefix}/write/"
260
265
  data = {
261
- "records": {
262
- "schema_name": schema_name,
263
- "data_points": data_points,
264
- }
266
+ "schema_name": schema_name,
267
+ "records": docs,
265
268
  }
266
269
  response = self._restclient.post(url, json=data)
267
270
  if response.is_error:
268
271
  raise DatalakeRequestError(response.status_code, response.text)
269
- return data_points
272
+ return docs
@@ -179,12 +179,8 @@ elif api_version == SplightAPIVersion.V4:
179
179
  ComponentType,
180
180
  CustomType,
181
181
  DataAddress,
182
- DataReadRequest,
183
- DataWriteRequest,
184
- DefaultDataPoint,
185
- DefaultEntryKey,
186
- DefaultKeys,
187
- DefaultRecords,
182
+ DataRecords,
183
+ DataRequest,
188
184
  Endpoint,
189
185
  ExternalGrid,
190
186
  File,
@@ -200,9 +196,11 @@ elif api_version == SplightAPIVersion.V4:
200
196
  Number,
201
197
  Output,
202
198
  Parameter,
199
+ PipelineStep,
203
200
  PrivacyPolicy,
204
201
  ResourceSummary,
205
202
  Routine,
203
+ RoutineEvaluation,
206
204
  RoutineObject,
207
205
  RoutineObjectInstance,
208
206
  Secret,
@@ -211,15 +209,13 @@ elif api_version == SplightAPIVersion.V4:
211
209
  SlackLine,
212
210
  Solution,
213
211
  SolutionConfiguration,
214
- SolutionDataPoint,
215
- SolutionEntryKey,
216
- SolutionKeys,
217
212
  SolutionOutput,
218
213
  SolutionOutputDocument,
219
- SolutionRecords,
220
214
  SplightDatalakeBaseModel,
221
215
  String,
222
216
  Tag,
217
+ Trace,
218
+ TraceType,
223
219
  Transformer,
224
220
  ValueType,
225
221
  get_field_value,
@@ -227,20 +223,11 @@ elif api_version == SplightAPIVersion.V4:
227
223
 
228
224
  __all__ = [
229
225
  "Asset",
230
- "DataReadRequest",
231
- "DataWriteRequest",
232
- "DefaultEntryKey",
233
- "DefaultKeys",
234
- "DefaultRecords",
235
- "DefaultDataPoint",
236
- "SolutionEntryKey",
237
- "SolutionKeys",
238
- "SolutionRecords",
239
- "SolutionDataPoint",
240
226
  "AssetRelationship",
241
227
  "Component",
242
228
  "RoutineObjectInstance",
243
229
  "RoutineObject",
230
+ "RoutineEvaluation",
244
231
  "ComponentObject",
245
232
  "ComponentObjectInstance",
246
233
  "ComponentType",
@@ -289,6 +276,12 @@ elif api_version == SplightAPIVersion.V4:
289
276
  "Solution",
290
277
  "SolutionOutput",
291
278
  "SolutionConfiguration",
279
+ "DataRecords",
280
+ "DataRequest",
281
+ "PipelineStep",
282
+ "Trace",
283
+ "TraceType",
284
+ "SolutionOutputDocument",
292
285
  ]
293
286
  else:
294
287
  raise ImportError(f"No models available for API version: '{api_version}'.")
@@ -21,23 +21,12 @@ from splight_lib.models._v4.component import (
21
21
  Parameter,
22
22
  PrivacyPolicy,
23
23
  Routine,
24
+ RoutineEvaluation,
24
25
  RoutineObject,
25
26
  RoutineObjectInstance,
26
27
  get_field_value,
27
28
  )
28
29
  from splight_lib.models._v4.data_address import DataAddresses as DataAddress
29
- from splight_lib.models._v4.datalake import (
30
- DataReadRequest,
31
- DataWriteRequest,
32
- DefaultDataPoint,
33
- DefaultEntryKey,
34
- DefaultKeys,
35
- DefaultRecords,
36
- SolutionDataPoint,
37
- SolutionEntryKey,
38
- SolutionKeys,
39
- SolutionRecords,
40
- )
41
30
  from splight_lib.models._v4.datalake_base import SplightDatalakeBaseModel
42
31
  from splight_lib.models._v4.external_grid import ExternalGrid
43
32
  from splight_lib.models._v4.file import File
@@ -81,6 +70,7 @@ __all__ = [
81
70
  "Component",
82
71
  "RoutineObjectInstance",
83
72
  "RoutineObject",
73
+ "RoutineEvaluation",
84
74
  "ComponentObject",
85
75
  "ComponentObjectInstance",
86
76
  "ComponentType",
@@ -129,14 +119,4 @@ __all__ = [
129
119
  "SolutionOutput",
130
120
  "Solution",
131
121
  "SolutionConfiguration",
132
- "DefaultEntryKey",
133
- "DefaultKeys",
134
- "DefaultRecords",
135
- "DefaultDataPoint",
136
- "SolutionEntryKey",
137
- "SolutionKeys",
138
- "SolutionRecords",
139
- "SolutionDataPoint",
140
- "DataReadRequest",
141
- "DataWriteRequest",
142
122
  ]
@@ -16,6 +16,7 @@ from strenum import LowercaseStrEnum, PascalCaseStrEnum
16
16
  from splight_lib.models._v4.asset import Asset
17
17
  from splight_lib.models._v4.attribute import Attribute
18
18
  from splight_lib.models._v4.data_address import DataAddresses as DLDataAddress
19
+ from splight_lib.models._v4.datalake_base import SplightDatalakeBaseModel
19
20
  from splight_lib.models._v4.exceptions import InvalidObjectInstance
20
21
  from splight_lib.models._v4.file import File
21
22
  from splight_lib.models._v4.secret import Secret
@@ -150,6 +151,14 @@ class ComponentObject(SplightObject):
150
151
  data: list[InputParameter] = []
151
152
 
152
153
 
154
+ class RoutineEvaluation(SplightDatalakeBaseModel):
155
+ _schema_name = "routineEvaluations"
156
+
157
+ routine: str
158
+ status: RoutineStatus
159
+ status_text: str | None
160
+
161
+
153
162
  class RoutineObject(SplightObject):
154
163
  status: RoutineStatus = RoutineStatus.RUNNING
155
164
 
@@ -157,6 +166,29 @@ class RoutineObject(SplightObject):
157
166
  input: list[InputDataAddress] = []
158
167
  output: list[InputDataAddress] = []
159
168
 
169
+ def report_status(
170
+ self, status: RoutineStatus, status_text: str | None = None
171
+ ):
172
+ evaluation_status = RoutineEvaluation(
173
+ routine=str(self.id),
174
+ status=status,
175
+ status_text=status_text,
176
+ )
177
+ evaluation_status.save()
178
+
179
+ if self.status != status:
180
+ self.status = status
181
+ self._update_status()
182
+
183
+ def _update_status(self):
184
+ _ = self._db_client.operate(
185
+ resource_name="routine-status",
186
+ instance={
187
+ "routine": self.id,
188
+ "status": self.status,
189
+ },
190
+ )
191
+
160
192
 
161
193
  class Component(SplightDatabaseBaseModel):
162
194
  id: str | None = None
@@ -5,13 +5,12 @@ import pandas as pd
5
5
  from pydantic import BaseModel, ConfigDict, Field
6
6
  from typing_extensions import Self
7
7
 
8
- from splight_lib.models._v4.datalake import (
8
+ from splight_lib.client.datalake.v4.builder import get_datalake_client
9
+ from splight_lib.client.datalake.v4.models import (
9
10
  DataReadRequest,
10
11
  DataWriteRequest,
11
12
  DefaultKeys,
12
- DefaultRecords,
13
13
  SolutionKeys,
14
- SolutionRecords,
15
14
  )
16
15
 
17
16
 
@@ -33,7 +32,10 @@ class SplightDatalakeBaseModel(BaseModel):
33
32
  key_entries,
34
33
  **params,
35
34
  )
36
- return request.apply()
35
+ dl_client = get_datalake_client()
36
+ request = request.model_dump(mode="json")
37
+ response = dl_client.get(request)
38
+ return response["results"]
37
39
 
38
40
  @classmethod
39
41
  async def _async_get(
@@ -45,7 +47,10 @@ class SplightDatalakeBaseModel(BaseModel):
45
47
  key_entries,
46
48
  **params,
47
49
  )
48
- return await request.async_apply()
50
+ dl_client = get_datalake_client()
51
+ request = request.model_dump(mode="json")
52
+ response = await dl_client.async_get(request)
53
+ return response["results"]
49
54
 
50
55
  @classmethod
51
56
  def _get_dataframe(
@@ -57,8 +62,10 @@ class SplightDatalakeBaseModel(BaseModel):
57
62
  key_entries,
58
63
  **params,
59
64
  )
60
- results = request.apply()
61
- df = pd.DataFrame(results)
65
+ dl_client = get_datalake_client()
66
+ request = request.model_dump(mode="json")
67
+ response = dl_client.get(request)
68
+ df = pd.DataFrame(response["results"])
62
69
  if not df.empty:
63
70
  df.index = df["timestamp"]
64
71
  df.drop(columns="timestamp", inplace=True)
@@ -77,37 +84,26 @@ class SplightDatalakeBaseModel(BaseModel):
77
84
  **params,
78
85
  )
79
86
 
80
- @classmethod
81
- def __to_write_request(
82
- cls,
83
- data_points: list[dict[str, str]],
84
- ) -> DataWriteRequest:
85
- _schema_name = cls._schema_name
86
- schema = (
87
- DefaultRecords if _schema_name == "default" else SolutionRecords
88
- )
89
- return DataWriteRequest(
90
- records=schema.load(data_points=data_points),
91
- )
92
-
93
87
  def save(self) -> None:
94
- request = self.__to_write_request(
95
- data_points=[self.model_dump(mode="json")]
96
- )
97
- request.apply()
88
+ dl_client = get_datalake_client()
89
+ record = self.__to_write_request()
90
+ dl_client.save(record.model_dump(mode="json"))
98
91
 
99
92
  async def async_save(self) -> None:
100
- request = self.__to_write_request(
101
- data_points=[self.model_dump(mode="json")]
102
- )
103
- await request.async_apply()
93
+ dl_client = get_datalake_client()
94
+ record = self.__to_write_request()
95
+ await dl_client.async_save(record.model_dump(mode="json"))
104
96
 
105
97
  @classmethod
106
98
  def save_dataframe(cls, df: pd.DataFrame):
107
99
  df = _fix_dataframe_timestamp(df)
108
100
  instances = df.to_dict("records")
109
- request = cls.__to_write_request(data_points=instances)
110
- request.apply()
101
+ records = DataWriteRequest(
102
+ schema_name=cls._schema_name,
103
+ records=instances,
104
+ )
105
+ dl_client = get_datalake_client()
106
+ dl_client.save(records.model_dump(mode="json"))
111
107
 
112
108
  def dict(self, *args, **kwargs) -> Dict:
113
109
  d = super().model_dump(*args, **kwargs)
@@ -116,6 +112,12 @@ class SplightDatalakeBaseModel(BaseModel):
116
112
  for k, v in d.items()
117
113
  }
118
114
 
115
+ def __to_write_request(self) -> DataWriteRequest:
116
+ return DataWriteRequest(
117
+ schema_name=self._schema_name,
118
+ records=[self.model_dump(mode="json")],
119
+ )
120
+
119
121
 
120
122
  def _fix_dataframe_timestamp(df: pd.DataFrame) -> pd.DataFrame:
121
123
  if df["timestamp"][0].tz is None: