splight-lib 5.23.3__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 (165) hide show
  1. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/PKG-INFO +1 -1
  2. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/pyproject.toml +1 -1
  3. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/datalake/common/abstract.py +1 -1
  4. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/datalake/v4/builder.py +20 -1
  5. splight_lib-5.24.0.dev1/splight_lib/client/datalake/v4/exceptions.py +4 -0
  6. splight_lib-5.24.0.dev1/splight_lib/client/datalake/v4/generic.py +31 -0
  7. splight_lib-5.24.0.dev1/splight_lib/client/datalake/v4/models.py +78 -0
  8. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/datalake/v4/remote_client.py +24 -18
  9. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/__init__.py +0 -12
  10. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/component.py +1 -1
  11. splight_lib-5.24.0.dev1/splight_lib/models/_v4/datalake_base.py +131 -0
  12. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/exceptions.py +0 -6
  13. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/native.py +8 -8
  14. splight_lib-5.23.3/splight_lib/client/datalake/v4/exceptions.py +0 -12
  15. splight_lib-5.23.3/splight_lib/models/_v4/datalake.py +0 -209
  16. splight_lib-5.23.3/splight_lib/models/_v4/datalake_base.py +0 -141
  17. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/.github/workflows/code-style.yaml +0 -0
  18. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/.github/workflows/developer.yaml +0 -0
  19. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/.github/workflows/pre-release.yaml +0 -0
  20. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/.github/workflows/release.yaml +0 -0
  21. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/.github/workflows/scripts/check_dev_version.py +0 -0
  22. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/.github/workflows/scripts/check_master_version.py +0 -0
  23. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/.github/workflows/scripts/check_pypi_version.py +0 -0
  24. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/.github/workflows/scripts/check_release_version.py +0 -0
  25. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/.github/workflows/scripts/check_version_uploaded.py +0 -0
  26. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/.github/workflows/scripts/cleanup_pypi.py +0 -0
  27. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/.github/workflows/scripts/requirements.txt +0 -0
  28. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/.gitignore +0 -0
  29. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/.pre-commit-config.yaml +0 -0
  30. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/DOCS.md +0 -0
  31. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/LICENSE.txt +0 -0
  32. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/Makefile +0 -0
  33. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/README.md +0 -0
  34. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/__init__.py +0 -0
  35. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/abstract/__init__.py +0 -0
  36. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/abstract/client.py +0 -0
  37. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/auth/__init__.py +0 -0
  38. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/auth/token.py +0 -0
  39. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/__init__.py +0 -0
  40. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/database/__init__.py +0 -0
  41. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/database/abstract.py +0 -0
  42. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/database/builder.py +0 -0
  43. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/database/classmap.py +0 -0
  44. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/database/remote_client.py +0 -0
  45. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/datalake/__init__.py +0 -0
  46. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/datalake/builder.py +0 -0
  47. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/datalake/common/__init__.py +0 -0
  48. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/datalake/common/buffer.py +0 -0
  49. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/datalake/v3/__init__.py +0 -0
  50. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/datalake/v3/builder.py +0 -0
  51. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/datalake/v3/classmap.py +0 -0
  52. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/datalake/v3/constants.py +0 -0
  53. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/datalake/v3/exceptions.py +0 -0
  54. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/datalake/v3/remote_client.py +0 -0
  55. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/datalake/v4/__init__.py +0 -0
  56. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/exceptions.py +0 -0
  57. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/hub/__init__.py +0 -0
  58. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/hub/abstract.py +0 -0
  59. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/hub/client.py +0 -0
  60. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/tests/test_database.py +0 -0
  61. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/tests/test_datalake.py +0 -0
  62. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/component/__init__.py +0 -0
  63. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/component/abstract.py +0 -0
  64. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/component/exceptions.py +0 -0
  65. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/component/spec.py +0 -0
  66. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/component/tests/test_spec.py +0 -0
  67. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/config.py +0 -0
  68. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/conftest.py +0 -0
  69. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/constants.py +0 -0
  70. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/encryption.py +0 -0
  71. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/execution/__init__.py +0 -0
  72. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/execution/engine.py +0 -0
  73. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/execution/exceptions.py +0 -0
  74. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/execution/scheduling.py +0 -0
  75. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/execution/task.py +0 -0
  76. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/execution/tests/test_execution.py +0 -0
  77. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/execution/tests/test_scheduling.py +0 -0
  78. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/execution/trigger.py +0 -0
  79. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/logging/__init__.py +0 -0
  80. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/logging/_internal.py +0 -0
  81. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/logging/component.py +0 -0
  82. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/logging/constants.py +0 -0
  83. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/logging/logging.py +0 -0
  84. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/logging/tests/test_logging.py +0 -0
  85. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/__init__.py +0 -0
  86. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/__init__.py +0 -0
  87. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/actions.py +0 -0
  88. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/alert.py +0 -0
  89. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/asset.py +0 -0
  90. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/attribute.py +0 -0
  91. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/bus.py +0 -0
  92. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/component.py +0 -0
  93. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/dashboard.py +0 -0
  94. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/data_address.py +0 -0
  95. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/datalake.py +0 -0
  96. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/datalake_base.py +0 -0
  97. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/exceptions.py +0 -0
  98. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/external_grid.py +0 -0
  99. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/file.py +0 -0
  100. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/function.py +0 -0
  101. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/generator.py +0 -0
  102. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/generic.py +0 -0
  103. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/grid.py +0 -0
  104. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/hub.py +0 -0
  105. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/hub_server.py +0 -0
  106. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/inverter.py +0 -0
  107. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/line.py +0 -0
  108. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/metadata.py +0 -0
  109. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/native.py +0 -0
  110. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/secret.py +0 -0
  111. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/segment.py +0 -0
  112. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/server.py +0 -0
  113. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/slack_generator.py +0 -0
  114. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/slack_line.py +0 -0
  115. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/tag.py +0 -0
  116. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/tests/models.json +0 -0
  117. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/tests/test_component_object_instance.py +0 -0
  118. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/tests/test_database_model.py +0 -0
  119. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/tests/test_metadata.py +0 -0
  120. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/tests/test_models.py +0 -0
  121. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/three_winding_transformer.py +0 -0
  122. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/transformer.py +0 -0
  123. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/variable_types.py +0 -0
  124. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/asset.py +0 -0
  125. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/attribute.py +0 -0
  126. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/base.py +0 -0
  127. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/battery.py +0 -0
  128. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/bus.py +0 -0
  129. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/data_address.py +0 -0
  130. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/external_grid.py +0 -0
  131. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/file.py +0 -0
  132. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/generator.py +0 -0
  133. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/generic.py +0 -0
  134. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/grid.py +0 -0
  135. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/hub.py +0 -0
  136. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/hub_server.py +0 -0
  137. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/line.py +0 -0
  138. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/load.py +0 -0
  139. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/metadata.py +0 -0
  140. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/secret.py +0 -0
  141. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/segment.py +0 -0
  142. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/server.py +0 -0
  143. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/slack_line.py +0 -0
  144. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/solution.py +0 -0
  145. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/tag.py +0 -0
  146. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/transformer.py +0 -0
  147. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/variable_types.py +0 -0
  148. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/database.py +0 -0
  149. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/restclient/__init__.py +0 -0
  150. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/restclient/client.py +0 -0
  151. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/restclient/exceptions.py +0 -0
  152. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/restclient/tests/test_restclient.py +0 -0
  153. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/restclient/types.py +0 -0
  154. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/server/__init__.py +0 -0
  155. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/server/exceptions.py +0 -0
  156. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/server/server.py +0 -0
  157. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/settings.py +0 -0
  158. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/testing/__init__.py +0 -0
  159. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/tests/FakeProc.py +0 -0
  160. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/tests/asset_geometries.json +0 -0
  161. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/tests/test_api_contracts.py +0 -0
  162. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/utils/__init__.py +0 -0
  163. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/utils/custom_model.py +0 -0
  164. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/version.py +0 -0
  165. {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: splight-lib
3
- Version: 5.23.3
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.23.3"
3
+ version = "5.24.0.dev1"
4
4
  description = "Splight Python Library"
5
5
  authors = [
6
6
  {name = "Splight Dev",email = "dev@splight.com"}
@@ -5,7 +5,7 @@ from splight_lib.abstract.client import AbstractRemoteClient, QuerySet
5
5
 
6
6
 
7
7
  class Records(TypedDict):
8
- collection: str
8
+ schema_name: str
9
9
  records: list[dict[str, Any]]
10
10
 
11
11
 
@@ -6,7 +6,12 @@ from splight_lib.client.datalake.v4.remote_client import (
6
6
  BufferedSyncRemoteDataClient,
7
7
  SyncRemoteDatalakeClient,
8
8
  )
9
- from splight_lib.settings import DatalakeClientType
9
+ from splight_lib.settings import (
10
+ DatalakeClientType,
11
+ SplightAPIVersion,
12
+ datalake_settings,
13
+ workspace_settings,
14
+ )
10
15
 
11
16
  DL_CLIENT_TYPE_MAP = {
12
17
  DatalakeClientType.BUFFERED_ASYNC: BufferedAsyncRemoteDatalakeClient,
@@ -22,3 +27,17 @@ class DatalakeClientBuilder:
22
27
  parameters: dict[str, Any] = {},
23
28
  ) -> AbstractDatalakeClient:
24
29
  return DL_CLIENT_TYPE_MAP[dl_client_type](**parameters)
30
+
31
+
32
+ def get_datalake_client() -> AbstractDatalakeClient:
33
+ return DatalakeClientBuilder.build(
34
+ dl_client_type=datalake_settings.DL_CLIENT_TYPE,
35
+ parameters={
36
+ "base_url": workspace_settings.SPLIGHT_PLATFORM_API_HOST,
37
+ "access_id": workspace_settings.SPLIGHT_ACCESS_ID,
38
+ "secret_key": workspace_settings.SPLIGHT_SECRET_KEY,
39
+ "api_version": SplightAPIVersion.V4,
40
+ "buffer_size": datalake_settings.DL_BUFFER_SIZE,
41
+ "buffer_timeout": datalake_settings.DL_BUFFER_TIMEOUT,
42
+ },
43
+ )
@@ -0,0 +1,4 @@
1
+ class DatalakeRequestError(Exception):
2
+ def __init__(self, status_code: int, message: str):
3
+ self._msg = f"Request failed with status code {status_code}: {message}"
4
+ super().__init__(self._msg)
@@ -0,0 +1,31 @@
1
+ from datetime import datetime
2
+ from enum import Enum
3
+ from typing import TypeAlias
4
+
5
+ Timestamp: TypeAlias = datetime
6
+ Value: TypeAlias = float | bool | str | int
7
+
8
+
9
+ class AggregationFunction(str, Enum):
10
+ SUM = "sum"
11
+ AVG = "avg"
12
+ MIN = "min"
13
+ MAX = "max"
14
+ COUNT = "count"
15
+
16
+
17
+ class TimeUnit(str, Enum):
18
+ SECOND = "second"
19
+ MINUTE = "minute"
20
+ HOUR = "hour"
21
+ DAY = "day"
22
+
23
+
24
+ class TransitionSchemaName(str, Enum):
25
+ DEFAULT = "default"
26
+ SOLUTIONS = "solutions"
27
+
28
+
29
+ class TransitionSort(int, Enum):
30
+ ASC = 1
31
+ DESC = -1
@@ -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]
@@ -12,6 +12,9 @@ from splight_lib.client.datalake.common.abstract import (
12
12
  )
13
13
  from splight_lib.client.datalake.common.buffer import DatalakeDocumentBuffer
14
14
  from splight_lib.client.datalake.v4.exceptions import DatalakeRequestError
15
+ from splight_lib.client.datalake.v4.models import (
16
+ DataReadRequest,
17
+ )
15
18
  from splight_lib.client.exceptions import SPLIGHT_REQUEST_EXCEPTIONS
16
19
  from splight_lib.logging._internal import LogTags, get_splight_logger
17
20
  from splight_lib.restclient import SplightRestClient
@@ -67,7 +70,7 @@ class SyncRemoteDatalakeClient(AbstractDatalakeClient):
67
70
  return records["records"]
68
71
 
69
72
  @retry(EXCEPTIONS, tries=3, delay=2, jitter=1)
70
- def _get(self, request: dict) -> list[dict]:
73
+ def _get(self, request: DataReadRequest) -> list[dict]:
71
74
  url = self._base_url / f"{self.prefix}/read/"
72
75
  response = self._restclient.post(url, json=request)
73
76
  if response.is_error:
@@ -75,7 +78,7 @@ class SyncRemoteDatalakeClient(AbstractDatalakeClient):
75
78
  return response.json()
76
79
 
77
80
  @retry(EXCEPTIONS, tries=3, delay=2, jitter=1)
78
- async def _async_get(self, request: dict) -> list[dict]:
81
+ async def _async_get(self, request: DataReadRequest) -> list[dict]:
79
82
  url = self._base_url / f"{self.prefix}/read/"
80
83
  response = await self._restclient.async_post(url, json=request)
81
84
  if response.is_error:
@@ -84,8 +87,7 @@ class SyncRemoteDatalakeClient(AbstractDatalakeClient):
84
87
 
85
88
  @property
86
89
  def prefix(self) -> str:
87
- return "v4/data"
88
- # return f"v4/data/{self.resource}"
90
+ return "v4/data/transition"
89
91
 
90
92
 
91
93
  class BufferedAsyncRemoteDatalakeClient(SyncRemoteDatalakeClient):
@@ -141,27 +143,27 @@ class BufferedAsyncRemoteDatalakeClient(SyncRemoteDatalakeClient):
141
143
  def save(self, records: dict) -> list[dict]:
142
144
  logger.debug("Saving documents in datalake", tags=LogTags.DATALAKE)
143
145
  instances = records["records"]
144
- collection = records["collection"]
145
- buffer = self._data_buffers[collection]
146
+ schema_name = records["schema_name"]
147
+ buffer = self._data_buffers[schema_name]
146
148
  with self._lock:
147
149
  if buffer.should_flush():
148
150
  logger.debug(
149
151
  "Flushing datalake buffer with %s elements",
150
152
  len(buffer.data),
151
153
  )
152
- self._send_documents(collection, buffer.data)
154
+ self._send_documents(schema_name, buffer.data)
153
155
  buffer.reset()
154
156
  buffer.add_documents(instances)
155
157
  return instances
156
158
 
157
159
  def _flusher(self):
158
160
  while True:
159
- for collection, buffer in self._data_buffers.items():
160
- self._flush_buffer(collection, buffer)
161
+ for schema_name, buffer in self._data_buffers.items():
162
+ self._flush_buffer(schema_name, buffer)
161
163
  sleep(0.5)
162
164
 
163
165
  def _flush_buffer(
164
- self, collection: str, buffer: DatalakeDocumentBuffer
166
+ self, schema_name: str, buffer: DatalakeDocumentBuffer
165
167
  ) -> None:
166
168
  with self._lock:
167
169
  if buffer.should_flush():
@@ -170,16 +172,18 @@ class BufferedAsyncRemoteDatalakeClient(SyncRemoteDatalakeClient):
170
172
  "Flushing datalake buffer with %s elements",
171
173
  len(buffer.data),
172
174
  )
173
- self._send_documents(collection, buffer.data)
175
+ self._send_documents(schema_name, buffer.data)
174
176
  buffer.reset()
175
177
  except Exception:
176
178
  logger.error("Unable to save documents", exc_info=True)
177
179
 
178
180
  @retry(EXCEPTIONS, tries=3, delay=2, jitter=1)
179
- def _send_documents(self, collection: str, docs: list[dict]) -> list[dict]:
181
+ def _send_documents(
182
+ self, schema_name: str, docs: list[dict]
183
+ ) -> list[dict]:
180
184
  url = self._base_url / f"{self.prefix}/write/"
181
185
  data = {
182
- "collection": collection,
186
+ "schema_name": schema_name,
183
187
  "records": docs,
184
188
  }
185
189
  response = self._restclient.post(url, json=data)
@@ -238,9 +242,9 @@ class BufferedSyncRemoteDataClient(SyncRemoteDatalakeClient):
238
242
 
239
243
  def save(self, records: Records) -> list[dict]:
240
244
  logger.debug("Saving documents in datalake", tags=LogTags.DATALAKE)
241
- collection = records["collection"]
245
+ schema_name = records["schema_name"]
242
246
  records = records["records"]
243
- buffer = self._data_buffers[collection]
247
+ buffer = self._data_buffers[schema_name]
244
248
  with self._lock:
245
249
  buffer.add_documents(records)
246
250
  if buffer.should_flush():
@@ -249,15 +253,17 @@ class BufferedSyncRemoteDataClient(SyncRemoteDatalakeClient):
249
253
  len(buffer.data),
250
254
  tags=LogTags.DATALAKE,
251
255
  )
252
- self._send_documents(collection, buffer.data)
256
+ self._send_documents(schema_name, buffer.data)
253
257
  buffer.reset()
254
258
  return records
255
259
 
256
260
  @retry(EXCEPTIONS, tries=3, delay=2, jitter=1)
257
- def _send_documents(self, collection: str, docs: list[dict]) -> list[dict]:
261
+ def _send_documents(
262
+ self, schema_name: str, docs: list[dict]
263
+ ) -> list[dict]:
258
264
  url = self._base_url / f"{self.prefix}/write/"
259
265
  data = {
260
- "collection": collection,
266
+ "schema_name": schema_name,
261
267
  "records": docs,
262
268
  }
263
269
  response = self._restclient.post(url, json=data)
@@ -27,13 +27,6 @@ from splight_lib.models._v4.component import (
27
27
  get_field_value,
28
28
  )
29
29
  from splight_lib.models._v4.data_address import DataAddresses as DataAddress
30
- from splight_lib.models._v4.datalake import (
31
- DataRecords,
32
- DataRequest,
33
- PipelineStep,
34
- Trace,
35
- TraceType,
36
- )
37
30
  from splight_lib.models._v4.datalake_base import SplightDatalakeBaseModel
38
31
  from splight_lib.models._v4.external_grid import ExternalGrid
39
32
  from splight_lib.models._v4.file import File
@@ -97,8 +90,6 @@ __all__ = [
97
90
  "SolutionOutputDocument",
98
91
  "DataAddress",
99
92
  "InputDataAddress",
100
- "PipelineStep",
101
- "Trace",
102
93
  "File",
103
94
  "HubComponent",
104
95
  "HubServer",
@@ -128,7 +119,4 @@ __all__ = [
128
119
  "SolutionOutput",
129
120
  "Solution",
130
121
  "SolutionConfiguration",
131
- "DataRequest",
132
- "DataRecords",
133
- "TraceType",
134
122
  ]
@@ -152,7 +152,7 @@ class ComponentObject(SplightObject):
152
152
 
153
153
 
154
154
  class RoutineEvaluation(SplightDatalakeBaseModel):
155
- _collection_name = "routineEvaluations"
155
+ _schema_name = "routineEvaluations"
156
156
 
157
157
  routine: str
158
158
  status: RoutineStatus
@@ -0,0 +1,131 @@
1
+ from datetime import datetime, timezone
2
+ from typing import ClassVar, Dict
3
+
4
+ import pandas as pd
5
+ from pydantic import BaseModel, ConfigDict, Field
6
+ from typing_extensions import Self
7
+
8
+ from splight_lib.client.datalake.v4.builder import get_datalake_client
9
+ from splight_lib.client.datalake.v4.models import (
10
+ DataReadRequest,
11
+ DataWriteRequest,
12
+ DefaultKeys,
13
+ SolutionKeys,
14
+ )
15
+
16
+
17
+ class SplightDatalakeBaseModel(BaseModel):
18
+ timestamp: datetime = Field(
19
+ default_factory=lambda: datetime.now(timezone.utc)
20
+ )
21
+ _schema_name: ClassVar[str] = "DatalakeModel"
22
+
23
+ model_config = ConfigDict(extra="ignore")
24
+
25
+ @classmethod
26
+ def _get(
27
+ cls,
28
+ key_entries: list[dict[str, str]],
29
+ **params: dict,
30
+ ) -> list[Self]:
31
+ request = cls.__to_read_request(
32
+ key_entries,
33
+ **params,
34
+ )
35
+ dl_client = get_datalake_client()
36
+ request = request.model_dump(mode="json")
37
+ response = dl_client.get(request)
38
+ return response["results"]
39
+
40
+ @classmethod
41
+ async def _async_get(
42
+ cls,
43
+ key_entries: list[dict[str, str]],
44
+ **params: dict,
45
+ ) -> list[Self]:
46
+ request = cls.__to_read_request(
47
+ key_entries,
48
+ **params,
49
+ )
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"]
54
+
55
+ @classmethod
56
+ def _get_dataframe(
57
+ cls,
58
+ key_entries: list[dict[str, str]],
59
+ **params: dict,
60
+ ) -> pd.DataFrame:
61
+ request = cls.__to_read_request(
62
+ key_entries,
63
+ **params,
64
+ )
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"])
69
+ if not df.empty:
70
+ df.index = df["timestamp"]
71
+ df.drop(columns="timestamp", inplace=True)
72
+ return df
73
+
74
+ @classmethod
75
+ def __to_read_request(
76
+ cls,
77
+ key_entries: list[dict[str, str]],
78
+ **params: dict,
79
+ ) -> DataReadRequest:
80
+ _schema_name = cls._schema_name
81
+ schema = DefaultKeys if _schema_name == "default" else SolutionKeys
82
+ return DataReadRequest(
83
+ keys=schema.load(entries=key_entries),
84
+ **params,
85
+ )
86
+
87
+ def save(self) -> None:
88
+ dl_client = get_datalake_client()
89
+ record = self.__to_write_request()
90
+ dl_client.save(record.model_dump(mode="json"))
91
+
92
+ async def async_save(self) -> None:
93
+ dl_client = get_datalake_client()
94
+ record = self.__to_write_request()
95
+ await dl_client.async_save(record.model_dump(mode="json"))
96
+
97
+ @classmethod
98
+ def save_dataframe(cls, df: pd.DataFrame):
99
+ df = _fix_dataframe_timestamp(df)
100
+ instances = df.to_dict("records")
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"))
107
+
108
+ def dict(self, *args, **kwargs) -> Dict:
109
+ d = super().model_dump(*args, **kwargs)
110
+ return {
111
+ k: v["id"] if isinstance(v, dict) and "id" in v.keys() else v
112
+ for k, v in d.items()
113
+ }
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
+
121
+
122
+ def _fix_dataframe_timestamp(df: pd.DataFrame) -> pd.DataFrame:
123
+ if df["timestamp"][0].tz is None:
124
+ df["timestamp"] = df["timestamp"].apply(
125
+ lambda x: x.tz_localize(tz="UTC").strftime("%Y-%m-%dT%H:%M:%S.%fZ")
126
+ )
127
+ else:
128
+ df["timestamp"] = df["timestamp"].apply(
129
+ lambda x: x.tz_convert(tz="UTC").strftime("%Y-%m-%dT%H:%M:%S.%fZ")
130
+ )
131
+ return df
@@ -72,11 +72,5 @@ class InvalidServerConfigType(Exception):
72
72
  super().__init__(msg)
73
73
 
74
74
 
75
- class TraceAlreadyExistsError(Exception):
76
- def __init__(self, ref_id: str):
77
- msg = f"Trace with ref_id {ref_id} already exists"
78
- super().__init__(msg)
79
-
80
-
81
75
  class CommandDisable(Exception):
82
76
  pass
@@ -14,9 +14,8 @@ class NativeOutput(SplightDatalakeBaseModel):
14
14
  asset: str | Asset
15
15
  attribute: str | Attribute
16
16
  output_format: str | None = None
17
- _collection_name: ClassVar[Literal["default"]] = "default"
17
+ _schema_name: ClassVar[Literal["default"]] = "default"
18
18
  _output_format: ClassVar[str] = "default"
19
- _model_type: ClassVar[str] = "attribute_document"
20
19
 
21
20
  @field_validator("output_format", mode="before")
22
21
  def set_output_format(cls, v) -> str:
@@ -26,14 +25,16 @@ class NativeOutput(SplightDatalakeBaseModel):
26
25
  def get(
27
26
  cls, asset: str | Asset, attribute: str | Attribute, **params: dict
28
27
  ) -> list[Self]:
29
- return super()._get({"asset": asset, "attribute": attribute}, **params)
28
+ return super()._get(
29
+ [{"asset": asset, "attribute": attribute}], **params
30
+ )
30
31
 
31
32
  @classmethod
32
33
  async def async_get(
33
34
  cls, asset: str | Asset, attribute: str | Attribute, **params: dict
34
35
  ) -> list[Self]:
35
36
  return await super()._async_get(
36
- {"asset": asset, "attribute": attribute}, **params
37
+ [{"asset": asset, "attribute": attribute}], **params
37
38
  )
38
39
 
39
40
  @classmethod
@@ -41,7 +42,7 @@ class NativeOutput(SplightDatalakeBaseModel):
41
42
  cls, asset: str | Asset, attribute: str | Attribute, **params: dict
42
43
  ) -> pd.DataFrame:
43
44
  df = super()._get_dataframe(
44
- {"asset": asset, "attribute": attribute}, **params
45
+ [{"asset": asset, "attribute": attribute}], **params
45
46
  )
46
47
  df["output_format"] = cls._output_format
47
48
  return df
@@ -59,7 +60,7 @@ class NativeOutput(SplightDatalakeBaseModel):
59
60
  result = cls.get(
60
61
  asset=asset,
61
62
  attribute=attribute,
62
- from_timestamp=from_timestamp,
63
+ start=from_timestamp,
63
64
  limit=1,
64
65
  )
65
66
  if result:
@@ -91,8 +92,7 @@ class SolutionOutputDocument(SplightDatalakeBaseModel):
91
92
  output: str
92
93
  value: bool | int | float | str
93
94
 
94
- _collection_name: ClassVar[Literal["solutions"]] = "solutions"
95
- _model_type: ClassVar[str] = "solution_output_document"
95
+ _schema_name: ClassVar[Literal["solutions"]] = "solutions"
96
96
 
97
97
  @classmethod
98
98
  def get(
@@ -1,12 +0,0 @@
1
- class DatalakeRequestError(Exception):
2
- def __init__(self, status_code: int, message: str):
3
- self._msg = f"Request failed with status code {status_code}: {message}"
4
- super().__init__(self._msg)
5
-
6
-
7
- class InvalidCollectionName(Exception):
8
- def __init__(self, collection: str):
9
- self._msg = f"Collection {collection} is not a valid collection"
10
-
11
- def __str__(self) -> str:
12
- return self._msg