splight-lib 5.22.5.dev100__tar.gz → 5.23.0.dev0__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 (162) hide show
  1. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/PKG-INFO +1 -1
  2. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/pyproject.toml +1 -1
  3. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/client/datalake/v4/remote_client.py +2 -3
  4. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/__init__.py +3 -3
  5. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v4/__init__.py +19 -5
  6. splight_lib-5.23.0.dev0/splight_lib/models/_v4/datalake.py +209 -0
  7. splight_lib-5.23.0.dev0/splight_lib/models/_v4/datalake_base.py +141 -0
  8. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v4/native.py +62 -3
  9. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/uv.lock +1 -1
  10. splight_lib-5.22.5.dev100/splight_lib/models/_v4/datalake.py +0 -168
  11. splight_lib-5.22.5.dev100/splight_lib/models/_v4/datalake_base.py +0 -114
  12. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/.github/workflows/code-style.yaml +0 -0
  13. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/.github/workflows/developer.yaml +0 -0
  14. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/.github/workflows/pre-release.yaml +0 -0
  15. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/.github/workflows/release.yaml +0 -0
  16. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/.github/workflows/scripts/check_dev_version.py +0 -0
  17. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/.github/workflows/scripts/check_master_version.py +0 -0
  18. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/.github/workflows/scripts/check_pypi_version.py +0 -0
  19. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/.github/workflows/scripts/check_release_version.py +0 -0
  20. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/.github/workflows/scripts/check_version_uploaded.py +0 -0
  21. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/.github/workflows/scripts/cleanup_pypi.py +0 -0
  22. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/.github/workflows/scripts/requirements.txt +0 -0
  23. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/.gitignore +0 -0
  24. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/.pre-commit-config.yaml +0 -0
  25. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/DOCS.md +0 -0
  26. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/LICENSE.txt +0 -0
  27. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/Makefile +0 -0
  28. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/README.md +0 -0
  29. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/__init__.py +0 -0
  30. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/abstract/__init__.py +0 -0
  31. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/abstract/client.py +0 -0
  32. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/auth/__init__.py +0 -0
  33. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/auth/token.py +0 -0
  34. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/client/__init__.py +0 -0
  35. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/client/database/__init__.py +0 -0
  36. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/client/database/abstract.py +0 -0
  37. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/client/database/builder.py +0 -0
  38. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/client/database/classmap.py +0 -0
  39. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/client/database/remote_client.py +0 -0
  40. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/client/datalake/__init__.py +0 -0
  41. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/client/datalake/builder.py +0 -0
  42. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/client/datalake/common/__init__.py +0 -0
  43. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/client/datalake/common/abstract.py +0 -0
  44. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/client/datalake/common/buffer.py +0 -0
  45. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/client/datalake/v3/__init__.py +0 -0
  46. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/client/datalake/v3/builder.py +0 -0
  47. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/client/datalake/v3/classmap.py +0 -0
  48. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/client/datalake/v3/constants.py +0 -0
  49. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/client/datalake/v3/exceptions.py +0 -0
  50. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/client/datalake/v3/remote_client.py +0 -0
  51. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/client/datalake/v4/__init__.py +0 -0
  52. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/client/datalake/v4/builder.py +0 -0
  53. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/client/datalake/v4/exceptions.py +0 -0
  54. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/client/exceptions.py +0 -0
  55. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/client/hub/__init__.py +0 -0
  56. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/client/hub/abstract.py +0 -0
  57. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/client/hub/client.py +0 -0
  58. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/client/tests/test_database.py +0 -0
  59. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/client/tests/test_datalake.py +0 -0
  60. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/component/__init__.py +0 -0
  61. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/component/abstract.py +0 -0
  62. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/component/exceptions.py +0 -0
  63. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/component/spec.py +0 -0
  64. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/component/tests/test_spec.py +0 -0
  65. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/config.py +0 -0
  66. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/conftest.py +0 -0
  67. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/constants.py +0 -0
  68. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/encryption.py +0 -0
  69. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/execution/__init__.py +0 -0
  70. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/execution/engine.py +0 -0
  71. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/execution/exceptions.py +0 -0
  72. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/execution/scheduling.py +0 -0
  73. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/execution/task.py +0 -0
  74. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/execution/tests/test_execution.py +0 -0
  75. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/execution/tests/test_scheduling.py +0 -0
  76. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/execution/trigger.py +0 -0
  77. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/logging/__init__.py +0 -0
  78. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/logging/_internal.py +0 -0
  79. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/logging/component.py +0 -0
  80. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/logging/constants.py +0 -0
  81. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/logging/logging.py +0 -0
  82. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/logging/tests/test_logging.py +0 -0
  83. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v3/__init__.py +0 -0
  84. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v3/actions.py +0 -0
  85. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v3/alert.py +0 -0
  86. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v3/asset.py +0 -0
  87. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v3/attribute.py +0 -0
  88. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v3/bus.py +0 -0
  89. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v3/component.py +0 -0
  90. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v3/dashboard.py +0 -0
  91. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v3/data_address.py +0 -0
  92. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v3/datalake.py +0 -0
  93. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v3/datalake_base.py +0 -0
  94. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v3/exceptions.py +0 -0
  95. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v3/external_grid.py +0 -0
  96. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v3/file.py +0 -0
  97. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v3/function.py +0 -0
  98. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v3/generator.py +0 -0
  99. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v3/generic.py +0 -0
  100. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v3/grid.py +0 -0
  101. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v3/hub.py +0 -0
  102. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v3/hub_server.py +0 -0
  103. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v3/inverter.py +0 -0
  104. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v3/line.py +0 -0
  105. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v3/metadata.py +0 -0
  106. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v3/native.py +0 -0
  107. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v3/secret.py +0 -0
  108. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v3/segment.py +0 -0
  109. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v3/server.py +0 -0
  110. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v3/slack_generator.py +0 -0
  111. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v3/slack_line.py +0 -0
  112. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v3/tag.py +0 -0
  113. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v3/tests/models.json +0 -0
  114. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v3/tests/test_component_object_instance.py +0 -0
  115. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v3/tests/test_database_model.py +0 -0
  116. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v3/tests/test_metadata.py +0 -0
  117. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v3/tests/test_models.py +0 -0
  118. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v3/three_winding_transformer.py +0 -0
  119. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v3/transformer.py +0 -0
  120. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v3/variable_types.py +0 -0
  121. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v4/asset.py +0 -0
  122. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v4/attribute.py +0 -0
  123. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v4/base.py +0 -0
  124. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v4/battery.py +0 -0
  125. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v4/bus.py +0 -0
  126. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v4/component.py +0 -0
  127. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v4/data_address.py +0 -0
  128. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v4/exceptions.py +0 -0
  129. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v4/external_grid.py +0 -0
  130. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v4/file.py +0 -0
  131. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v4/generator.py +0 -0
  132. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v4/generic.py +0 -0
  133. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v4/grid.py +0 -0
  134. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v4/hub.py +0 -0
  135. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v4/hub_server.py +0 -0
  136. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v4/line.py +0 -0
  137. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v4/load.py +0 -0
  138. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v4/metadata.py +0 -0
  139. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v4/secret.py +0 -0
  140. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v4/segment.py +0 -0
  141. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v4/server.py +0 -0
  142. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v4/slack_line.py +0 -0
  143. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v4/tag.py +0 -0
  144. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v4/transformer.py +0 -0
  145. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/_v4/variable_types.py +0 -0
  146. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/models/database.py +0 -0
  147. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/restclient/__init__.py +0 -0
  148. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/restclient/client.py +0 -0
  149. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/restclient/exceptions.py +0 -0
  150. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/restclient/tests/test_restclient.py +0 -0
  151. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/restclient/types.py +0 -0
  152. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/server/__init__.py +0 -0
  153. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/server/exceptions.py +0 -0
  154. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/server/server.py +0 -0
  155. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/settings.py +0 -0
  156. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/testing/__init__.py +0 -0
  157. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/tests/FakeProc.py +0 -0
  158. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/tests/asset_geometries.json +0 -0
  159. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/tests/test_api_contracts.py +0 -0
  160. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/utils/__init__.py +0 -0
  161. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/utils/custom_model.py +0 -0
  162. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev0}/splight_lib/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: splight-lib
3
- Version: 5.22.5.dev100
3
+ Version: 5.23.0.dev0
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.22.5.dev100"
3
+ version = "5.23.0dev0"
4
4
  description = "Splight Python Library"
5
5
  authors = [
6
6
  {name = "Splight Dev",email = "dev@splight.com"}
@@ -26,7 +26,6 @@ class SyncRemoteDatalakeClient(AbstractDatalakeClient):
26
26
  def __init__(
27
27
  self,
28
28
  base_url: str,
29
- resource: str,
30
29
  access_id: str,
31
30
  secret_key: str,
32
31
  api_version: SplightAPIVersion = SplightAPIVersion.V4,
@@ -35,7 +34,6 @@ class SyncRemoteDatalakeClient(AbstractDatalakeClient):
35
34
  ):
36
35
  super().__init__()
37
36
  self._base_url = furl(base_url)
38
- self.resource = resource
39
37
  token = SplightAuthToken(
40
38
  access_key=access_id,
41
39
  secret_key=secret_key,
@@ -86,7 +84,8 @@ class SyncRemoteDatalakeClient(AbstractDatalakeClient):
86
84
 
87
85
  @property
88
86
  def prefix(self) -> str:
89
- return f"v4/data/{self.resource}"
87
+ return "v3/data/"
88
+ # return f"v4/data/{self.resource}"
90
89
 
91
90
 
92
91
  class BufferedAsyncRemoteDatalakeClient(SyncRemoteDatalakeClient):
@@ -169,7 +169,7 @@ elif api_version == SplightAPIVersion.V4:
169
169
  AssetKind,
170
170
  AssetRelationship,
171
171
  Attribute,
172
- AttributeDocument,
172
+ # AttributeDocument,
173
173
  AttributeType,
174
174
  Battery,
175
175
  Boolean,
@@ -196,8 +196,8 @@ elif api_version == SplightAPIVersion.V4:
196
196
  Output,
197
197
  Parameter,
198
198
  PrivacyPolicy,
199
- Query,
200
- Records,
199
+ # Query,
200
+ # Records,
201
201
  ResourceSummary,
202
202
  Routine,
203
203
  RoutineEvaluation,
@@ -28,10 +28,15 @@ from splight_lib.models._v4.component import (
28
28
  )
29
29
  from splight_lib.models._v4.data_address import DataAddresses as DataAddress
30
30
  from splight_lib.models._v4.datalake import (
31
- AttributeDocument,
32
- Query,
33
- Records,
34
- SolutionOutputDocument,
31
+ DataRecords,
32
+ DataRequest,
33
+ PipelineStep,
34
+ Trace,
35
+ TraceType,
36
+ # AttributeDocument,
37
+ # Query,
38
+ # Records,
39
+ # SolutionOutputDocument,
35
40
  )
36
41
  from splight_lib.models._v4.datalake_base import SplightDatalakeBaseModel
37
42
  from splight_lib.models._v4.external_grid import ExternalGrid
@@ -43,7 +48,12 @@ from splight_lib.models._v4.hub_server import HubServer
43
48
  from splight_lib.models._v4.line import Line
44
49
  from splight_lib.models._v4.load import Load
45
50
  from splight_lib.models._v4.metadata import Metadata
46
- from splight_lib.models._v4.native import Boolean, Number, String
51
+ from splight_lib.models._v4.native import (
52
+ Boolean,
53
+ Number,
54
+ SolutionOutputDocument,
55
+ String,
56
+ )
47
57
  from splight_lib.models._v4.secret import Secret
48
58
  from splight_lib.models._v4.segment import Segment
49
59
  from splight_lib.models._v4.server import Server
@@ -113,4 +123,8 @@ __all__ = [
113
123
  "Segment",
114
124
  "SlackLine",
115
125
  "Transformer",
126
+ "SolutionOutputDocument",
127
+ "DataRequest",
128
+ "DataRecords",
129
+ "TraceType",
116
130
  ]
@@ -0,0 +1,209 @@
1
+ from datetime import datetime
2
+ from enum import Enum
3
+ from hashlib import sha256
4
+ from typing import Annotated, Any, Generator, Generic, Literal, TypeVar
5
+
6
+ from pydantic import BaseModel, ConfigDict, Field, PrivateAttr
7
+ from typing_extensions import Self
8
+
9
+ from splight_lib.client.datalake import DatalakeClientBuilder
10
+ from splight_lib.client.datalake.common.abstract import AbstractDatalakeClient
11
+ from splight_lib.client.datalake.v3.constants import StepName
12
+ from splight_lib.models._v3.asset import Asset
13
+ from splight_lib.models._v3.attribute import Attribute
14
+ from splight_lib.models._v3.exceptions import TraceAlreadyExistsError
15
+ from splight_lib.settings import (
16
+ SplightAPIVersion,
17
+ datalake_settings,
18
+ workspace_settings,
19
+ )
20
+
21
+ MAX_NUM_TRACES = 500
22
+ T = TypeVar("T")
23
+
24
+
25
+ def hash(string: str) -> str:
26
+ return sha256(string.encode("utf-8")).hexdigest()
27
+
28
+
29
+ def get_datalake_client() -> AbstractDatalakeClient:
30
+ return DatalakeClientBuilder.build(
31
+ version=SplightAPIVersion.V4,
32
+ dl_client_type=datalake_settings.DL_CLIENT_TYPE,
33
+ parameters={
34
+ "base_url": workspace_settings.SPLIGHT_PLATFORM_API_HOST,
35
+ "access_id": workspace_settings.SPLIGHT_ACCESS_ID,
36
+ "secret_key": workspace_settings.SPLIGHT_SECRET_KEY,
37
+ "api_version": SplightAPIVersion.V4,
38
+ "buffer_size": datalake_settings.DL_BUFFER_SIZE,
39
+ "buffer_timeout": datalake_settings.DL_BUFFER_TIMEOUT,
40
+ },
41
+ )
42
+
43
+
44
+ class TraceType(str, Enum):
45
+ QUERY = "QUERY"
46
+ EXPRESSION = "EXPRESSION"
47
+ METADATA = "METADATA"
48
+
49
+ @classmethod
50
+ def choices(cls):
51
+ return tuple((i.name, i.value) for i in cls)
52
+
53
+
54
+ class PipelineStep(BaseModel):
55
+ name: StepName
56
+ operation: str | int | dict[str, Any]
57
+
58
+ @classmethod
59
+ def from_dict(cls, step_dict: dict[str, Any]) -> Self:
60
+ (name, operation), *aux = step_dict.items()
61
+ return cls(name=name.lstrip("$"), operation=operation)
62
+
63
+ def to_step(self) -> dict[str, dict[str, Any]]:
64
+ return {f"${self.name.value}": self.operation}
65
+
66
+
67
+ class Trace(BaseModel):
68
+ model_config = ConfigDict(use_enum_values=True)
69
+ ref_id: str
70
+ type: TraceType = TraceType.QUERY
71
+ expression: dict | None = None
72
+ # TODO: Review if it should be list[PipelineStep]
73
+ pipeline: list[dict] = []
74
+ address: Annotated[dict, Field(exclude=True)]
75
+
76
+ @classmethod
77
+ def from_address(
78
+ cls, asset: str | Asset, attribute: str | Attribute
79
+ ) -> Self:
80
+ asset_id = asset.id if isinstance(asset, Asset) else asset
81
+ attribute_id = (
82
+ attribute.id if isinstance(attribute, Attribute) else attribute
83
+ )
84
+ return cls(
85
+ ref_id=hash(f"{asset_id}_{attribute_id}"),
86
+ type=TraceType.QUERY,
87
+ pipeline=[
88
+ PipelineStep(
89
+ name=StepName.MATCH,
90
+ operation={"asset": asset_id, "attribute": attribute_id},
91
+ ).to_step()
92
+ ],
93
+ address={"asset": asset_id, "attribute": attribute_id},
94
+ )
95
+
96
+ @classmethod
97
+ def from_so_filter(cls, asset: str, solution: str, output: str) -> Self:
98
+ return cls(
99
+ ref_id=hash(f"{asset}_{solution}_{output}"),
100
+ type=TraceType.QUERY,
101
+ pipeline=[
102
+ PipelineStep(
103
+ name=StepName.MATCH,
104
+ operation={
105
+ "asset": asset,
106
+ "solution": solution,
107
+ "output": output,
108
+ },
109
+ ).to_step()
110
+ ],
111
+ address={"asset": asset, "solution": solution, "output": output},
112
+ )
113
+
114
+ def add_step(self, step: PipelineStep) -> None:
115
+ self.pipeline.append(step.to_step())
116
+
117
+
118
+ class DataRequest(Generic[T], BaseModel):
119
+ model_config = ConfigDict(arbitrary_types_allowed=True)
120
+ collection: str = "default"
121
+ sort_field: str = "timestamp"
122
+ sort_direction: Literal[-1, 1] = -1
123
+ limit: Annotated[int, Field(ge=1, le=10000)] = 10000
124
+ max_time_ms: Annotated[int, Field(ge=1, le=10000)] = 10000
125
+ from_timestamp: datetime | None = None
126
+ to_timestamp: datetime | None = None
127
+ traces: list[Trace] = []
128
+
129
+ _dl_client: AbstractDatalakeClient = PrivateAttr()
130
+ _traces_ref: dict[str, dict] = {}
131
+
132
+ def add_trace(self, trace: Trace) -> None:
133
+ if trace.ref_id in self._traces_ref:
134
+ raise TraceAlreadyExistsError(trace.ref_id)
135
+ self.traces.append(trace)
136
+ self._traces_ref.update({trace.ref_id: trace.address})
137
+
138
+ def as_pipeline(self) -> list[dict[str, Any]]:
139
+ return [step.to_step() for step in self.pipeline]
140
+
141
+ def apply(self) -> list[T]:
142
+ dl_client = get_datalake_client()
143
+ request = self.model_dump(mode="json")
144
+ traces = request.pop("traces")
145
+ data = []
146
+ for batch in chunk_list(traces, MAX_NUM_TRACES):
147
+ request["traces"] = batch
148
+ response = dl_client.get(request)
149
+ data.extend(self._parse_respose(response["results"]))
150
+ return data
151
+
152
+ async def async_apply(self) -> list[T]:
153
+ dl_client = get_datalake_client()
154
+ request = self.model_dump(mode="json")
155
+ traces = request.pop("traces")
156
+ data = []
157
+ for batch in chunk_list(traces, MAX_NUM_TRACES):
158
+ request["traces"] = batch
159
+ response = await dl_client.async_get(request)
160
+ data.extend(self._parse_respose(response["results"]))
161
+ return data
162
+
163
+ def _parse_respose(self, response: dict) -> list[T]:
164
+ model_class = self.__orig_class__.__args__[0]
165
+ data = []
166
+ for item in response:
167
+ timestamp = item.pop("timestamp")
168
+ values = [
169
+ model_class(
170
+ timestamp=timestamp, value=value, **self._traces_ref[key]
171
+ )
172
+ for key, value in item.items()
173
+ if value is not None
174
+ ]
175
+ data.extend(values)
176
+ return data
177
+
178
+
179
+ class DataRecords(BaseModel):
180
+ collection: str = "default"
181
+ records: list[dict[str, Any]] = []
182
+
183
+ def apply(self) -> None:
184
+ dl_client = get_datalake_client()
185
+ dl_client.save(self.model_dump(mode="json"))
186
+
187
+ async def async_apply(self) -> None:
188
+ dl_client = get_datalake_client()
189
+ await dl_client.async_save(self.model_dump(mode="json"))
190
+
191
+
192
+ def chunk_list(
193
+ datas: list[Any], chunksize: int
194
+ ) -> Generator[list[Any], None, None]:
195
+ """Split list into chunks
196
+
197
+ Parameters
198
+ ----------
199
+ datas : list[Any]
200
+ the list of data
201
+ chunksize : int
202
+ the size of chunk
203
+
204
+ Returns
205
+ -------
206
+ Generator with the chunks
207
+ """
208
+ for i in range(0, len(datas), chunksize):
209
+ yield datas[i : i + chunksize]
@@ -0,0 +1,141 @@
1
+ from datetime import datetime, timezone
2
+ from typing import Any, ClassVar, Dict, TypeVar
3
+
4
+ import pandas as pd
5
+ from pydantic import BaseModel, ConfigDict, Field
6
+ from typing_extensions import Self
7
+
8
+ from splight_lib.models._v4.datalake import (
9
+ DataRecords,
10
+ DataRequest,
11
+ PipelineStep,
12
+ Trace,
13
+ )
14
+
15
+
16
+ class SplightDatalakeBaseModel(BaseModel):
17
+ timestamp: datetime = Field(
18
+ default_factory=lambda: datetime.now(timezone.utc)
19
+ )
20
+ _collection_name: ClassVar[str] = "DatalakeModel"
21
+ _model_type: ClassVar[str] = ...
22
+
23
+ model_config = ConfigDict(extra="ignore")
24
+
25
+ @classmethod
26
+ def _get(
27
+ cls,
28
+ filters: dict[str, str],
29
+ extra_pipeline: list[dict[str, Any]] = [],
30
+ **params: dict,
31
+ ) -> list[Self]:
32
+ request = _to_data_request(
33
+ cls,
34
+ filters,
35
+ extra_pipeline,
36
+ **params,
37
+ )
38
+ return request.apply()
39
+
40
+ @classmethod
41
+ async def _async_get(
42
+ cls,
43
+ filters: dict[str, str],
44
+ extra_pipeline: list[dict[str, Any]] = [],
45
+ **params: dict,
46
+ ) -> list[Self]:
47
+ request = _to_data_request(cls, filters, extra_pipeline, **params)
48
+ instances = await request.async_apply()
49
+ return instances
50
+
51
+ @classmethod
52
+ def _get_dataframe(
53
+ cls,
54
+ filters: dict[str, str],
55
+ extra_pipeline: list[dict[str, Any]] = [],
56
+ **params: dict,
57
+ ) -> pd.DataFrame:
58
+ request = _to_data_request(
59
+ cls,
60
+ filters,
61
+ extra_pipeline,
62
+ **params,
63
+ )
64
+ instances = request.apply()
65
+ df = pd.DataFrame([instance.model_dump() for instance in instances])
66
+ if not df.empty:
67
+ df.index = df["timestamp"]
68
+ df.drop(columns="timestamp", inplace=True)
69
+ return df
70
+
71
+ def save(self) -> None:
72
+ records = self._to_record()
73
+ records.apply()
74
+
75
+ async def async_save(self) -> None:
76
+ records = self._to_record()
77
+ await records.async_apply()
78
+
79
+ @classmethod
80
+ def save_dataframe(cls, df: pd.DataFrame):
81
+ df = _fix_dataframe_timestamp(df)
82
+ instances = df.to_dict("records")
83
+ records = DataRecords(
84
+ collection=cls._collection_name,
85
+ records=instances,
86
+ )
87
+ records.apply()
88
+
89
+ def dict(self, *args, **kwargs) -> Dict:
90
+ d = super().model_dump(*args, **kwargs)
91
+ return {
92
+ k: v["id"] if isinstance(v, dict) and "id" in v.keys() else v
93
+ for k, v in d.items()
94
+ }
95
+
96
+ def _to_record(self) -> DataRecords:
97
+ return DataRecords(
98
+ collection=self._collection_name,
99
+ records=[self.model_dump(mode="json")],
100
+ )
101
+
102
+
103
+ def _to_data_request(
104
+ model_class: TypeVar("T"),
105
+ filters: dict[str, str],
106
+ extra_pipeline: list[dict[str, Any]] = [],
107
+ **params: Dict,
108
+ ) -> DataRequest:
109
+ if not isinstance(extra_pipeline, list):
110
+ raise ValueError("extra_pipeline must be a list of dicts")
111
+ model_type = model_class._model_type
112
+ collection = (
113
+ "default" if model_type == "attribute_document" else "solutions"
114
+ )
115
+ request = DataRequest[model_class](
116
+ collection=collection,
117
+ from_timestamp=params.get("from_timestamp"),
118
+ to_timestamp=params.get("to_timestamp"),
119
+ )
120
+
121
+ if model_type == "attribute_document":
122
+ trace = Trace.from_address(**filters)
123
+ elif model_type == "solution_output_document":
124
+ trace = Trace.from_so_filter(**filters)
125
+ for step in extra_pipeline:
126
+ trace.add_step(PipelineStep.from_dict(step))
127
+
128
+ request.add_trace(trace)
129
+ return request
130
+
131
+
132
+ def _fix_dataframe_timestamp(df: pd.DataFrame) -> pd.DataFrame:
133
+ if df["timestamp"][0].tz is None:
134
+ df["timestamp"] = df["timestamp"].apply(
135
+ lambda x: x.tz_localize(tz="UTC").strftime("%Y-%m-%dT%H:%M:%S.%fZ")
136
+ )
137
+ else:
138
+ df["timestamp"] = df["timestamp"].apply(
139
+ lambda x: x.tz_convert(tz="UTC").strftime("%Y-%m-%dT%H:%M:%S.%fZ")
140
+ )
141
+ return df
@@ -14,7 +14,9 @@ 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
18
  _output_format: ClassVar[str] = "default"
19
+ _model_type: ClassVar[str] = "attribute_document"
18
20
 
19
21
  @field_validator("output_format", mode="before")
20
22
  def set_output_format(cls, v) -> str:
@@ -24,19 +26,23 @@ class NativeOutput(SplightDatalakeBaseModel):
24
26
  def get(
25
27
  cls, asset: str | Asset, attribute: str | Attribute, **params: dict
26
28
  ) -> list[Self]:
27
- return super().get(asset, attribute, **params)
29
+ return super()._get({"asset": asset, "attribute": attribute}, **params)
28
30
 
29
31
  @classmethod
30
32
  async def async_get(
31
33
  cls, asset: str | Asset, attribute: str | Attribute, **params: dict
32
34
  ) -> list[Self]:
33
- return await super().async_get(asset, attribute, **params)
35
+ return await super()._async_get(
36
+ {"asset": asset, "attribute": attribute}, **params
37
+ )
34
38
 
35
39
  @classmethod
36
40
  def get_dataframe(
37
41
  cls, asset: str | Asset, attribute: str | Attribute, **params: dict
38
42
  ) -> pd.DataFrame:
39
- df = super().get_dataframe(asset, attribute, **params)
43
+ df = super()._get_dataframe(
44
+ {"asset": asset, "attribute": attribute}, **params
45
+ )
40
46
  df["output_format"] = cls._output_format
41
47
  return df
42
48
 
@@ -77,3 +83,56 @@ class Boolean(NativeOutput):
77
83
  value: bool
78
84
  output_format: Literal["Boolean"] = "Boolean"
79
85
  _output_format: ClassVar[str] = "Boolean"
86
+
87
+
88
+ class SolutionOutputDocument(SplightDatalakeBaseModel):
89
+ asset: str | Asset
90
+ solution: str
91
+ output: str
92
+ value: bool | int | float | str
93
+
94
+ _collection_name: ClassVar[Literal["solutions"]] = "solutions"
95
+ _model_type: ClassVar[str] = "solution_output_document"
96
+
97
+ @classmethod
98
+ def get(
99
+ cls, solution: str, output: str, asset: str, **params: dict
100
+ ) -> list[Self]:
101
+ filters = {"solution": solution, "output": output, "asset": asset}
102
+ return super()._get(filters, **params)
103
+
104
+ @classmethod
105
+ async def async_get(
106
+ cls, solution: str, output: str, asset: str, **params: dict
107
+ ) -> list[Self]:
108
+ filters = {"solution": solution, "output": output, "asset": asset}
109
+ return await super()._async_get(filters, **params)
110
+
111
+ @classmethod
112
+ def get_dataframe(
113
+ cls, solution: str, output: str, asset: str, **params: dict
114
+ ) -> pd.DataFrame:
115
+ filters = {"solution": solution, "output": output, "asset": asset}
116
+ return super()._get_dataframe(filters, **params)
117
+
118
+ @classmethod
119
+ def latest(
120
+ cls,
121
+ solution: str,
122
+ output: str,
123
+ asset: str,
124
+ expiration: timedelta | None = None,
125
+ ) -> Self:
126
+ from_timestamp = None
127
+ if expiration:
128
+ from_timestamp = datetime.now(timezone.utc) - expiration
129
+ result = cls.get(
130
+ solution=solution,
131
+ output=output,
132
+ asset=asset,
133
+ from_timestamp=from_timestamp,
134
+ limit=1,
135
+ )
136
+ if result:
137
+ return result[0]
138
+ return None
@@ -1748,7 +1748,7 @@ wheels = [
1748
1748
 
1749
1749
  [[package]]
1750
1750
  name = "splight-lib"
1751
- version = "5.22.5"
1751
+ version = "5.23.0rc0"
1752
1752
  source = { editable = "." }
1753
1753
  dependencies = [
1754
1754
  { name = "apscheduler" },