splight-lib 5.22.5.dev100__tar.gz → 5.23.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.22.5.dev100 → splight_lib-5.23.0.dev1}/PKG-INFO +1 -1
  2. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/pyproject.toml +1 -1
  3. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/database/classmap.py +1 -0
  4. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/datalake/v4/remote_client.py +2 -3
  5. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/__init__.py +17 -3
  6. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/__init__.py +23 -5
  7. splight_lib-5.23.0.dev1/splight_lib/models/_v4/datalake.py +209 -0
  8. splight_lib-5.23.0.dev1/splight_lib/models/_v4/datalake_base.py +141 -0
  9. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/native.py +62 -3
  10. splight_lib-5.23.0.dev1/splight_lib/models/_v4/solution.py +30 -0
  11. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/uv.lock +1 -1
  12. splight_lib-5.22.5.dev100/splight_lib/models/_v4/datalake.py +0 -168
  13. splight_lib-5.22.5.dev100/splight_lib/models/_v4/datalake_base.py +0 -114
  14. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/.github/workflows/code-style.yaml +0 -0
  15. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/.github/workflows/developer.yaml +0 -0
  16. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/.github/workflows/pre-release.yaml +0 -0
  17. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/.github/workflows/release.yaml +0 -0
  18. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/.github/workflows/scripts/check_dev_version.py +0 -0
  19. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/.github/workflows/scripts/check_master_version.py +0 -0
  20. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/.github/workflows/scripts/check_pypi_version.py +0 -0
  21. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/.github/workflows/scripts/check_release_version.py +0 -0
  22. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/.github/workflows/scripts/check_version_uploaded.py +0 -0
  23. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/.github/workflows/scripts/cleanup_pypi.py +0 -0
  24. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/.github/workflows/scripts/requirements.txt +0 -0
  25. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/.gitignore +0 -0
  26. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/.pre-commit-config.yaml +0 -0
  27. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/DOCS.md +0 -0
  28. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/LICENSE.txt +0 -0
  29. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/Makefile +0 -0
  30. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/README.md +0 -0
  31. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/__init__.py +0 -0
  32. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/abstract/__init__.py +0 -0
  33. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/abstract/client.py +0 -0
  34. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/auth/__init__.py +0 -0
  35. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/auth/token.py +0 -0
  36. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/__init__.py +0 -0
  37. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/database/__init__.py +0 -0
  38. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/database/abstract.py +0 -0
  39. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/database/builder.py +0 -0
  40. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/database/remote_client.py +0 -0
  41. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/datalake/__init__.py +0 -0
  42. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/datalake/builder.py +0 -0
  43. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/datalake/common/__init__.py +0 -0
  44. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/datalake/common/abstract.py +0 -0
  45. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/datalake/common/buffer.py +0 -0
  46. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/datalake/v3/__init__.py +0 -0
  47. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/datalake/v3/builder.py +0 -0
  48. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/datalake/v3/classmap.py +0 -0
  49. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/datalake/v3/constants.py +0 -0
  50. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/datalake/v3/exceptions.py +0 -0
  51. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/datalake/v3/remote_client.py +0 -0
  52. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/datalake/v4/__init__.py +0 -0
  53. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/datalake/v4/builder.py +0 -0
  54. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/datalake/v4/exceptions.py +0 -0
  55. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/exceptions.py +0 -0
  56. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/hub/__init__.py +0 -0
  57. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/hub/abstract.py +0 -0
  58. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/hub/client.py +0 -0
  59. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/tests/test_database.py +0 -0
  60. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/tests/test_datalake.py +0 -0
  61. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/component/__init__.py +0 -0
  62. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/component/abstract.py +0 -0
  63. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/component/exceptions.py +0 -0
  64. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/component/spec.py +0 -0
  65. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/component/tests/test_spec.py +0 -0
  66. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/config.py +0 -0
  67. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/conftest.py +0 -0
  68. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/constants.py +0 -0
  69. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/encryption.py +0 -0
  70. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/execution/__init__.py +0 -0
  71. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/execution/engine.py +0 -0
  72. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/execution/exceptions.py +0 -0
  73. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/execution/scheduling.py +0 -0
  74. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/execution/task.py +0 -0
  75. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/execution/tests/test_execution.py +0 -0
  76. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/execution/tests/test_scheduling.py +0 -0
  77. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/execution/trigger.py +0 -0
  78. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/logging/__init__.py +0 -0
  79. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/logging/_internal.py +0 -0
  80. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/logging/component.py +0 -0
  81. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/logging/constants.py +0 -0
  82. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/logging/logging.py +0 -0
  83. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/logging/tests/test_logging.py +0 -0
  84. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/__init__.py +0 -0
  85. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/actions.py +0 -0
  86. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/alert.py +0 -0
  87. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/asset.py +0 -0
  88. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/attribute.py +0 -0
  89. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/bus.py +0 -0
  90. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/component.py +0 -0
  91. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/dashboard.py +0 -0
  92. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/data_address.py +0 -0
  93. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/datalake.py +0 -0
  94. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/datalake_base.py +0 -0
  95. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/exceptions.py +0 -0
  96. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/external_grid.py +0 -0
  97. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/file.py +0 -0
  98. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/function.py +0 -0
  99. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/generator.py +0 -0
  100. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/generic.py +0 -0
  101. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/grid.py +0 -0
  102. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/hub.py +0 -0
  103. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/hub_server.py +0 -0
  104. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/inverter.py +0 -0
  105. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/line.py +0 -0
  106. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/metadata.py +0 -0
  107. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/native.py +0 -0
  108. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/secret.py +0 -0
  109. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/segment.py +0 -0
  110. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/server.py +0 -0
  111. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/slack_generator.py +0 -0
  112. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/slack_line.py +0 -0
  113. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/tag.py +0 -0
  114. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/tests/models.json +0 -0
  115. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/tests/test_component_object_instance.py +0 -0
  116. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/tests/test_database_model.py +0 -0
  117. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/tests/test_metadata.py +0 -0
  118. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/tests/test_models.py +0 -0
  119. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/three_winding_transformer.py +0 -0
  120. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/transformer.py +0 -0
  121. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/variable_types.py +0 -0
  122. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/asset.py +0 -0
  123. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/attribute.py +0 -0
  124. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/base.py +0 -0
  125. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/battery.py +0 -0
  126. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/bus.py +0 -0
  127. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/component.py +0 -0
  128. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/data_address.py +0 -0
  129. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/exceptions.py +0 -0
  130. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/external_grid.py +0 -0
  131. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/file.py +0 -0
  132. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/generator.py +0 -0
  133. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/generic.py +0 -0
  134. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/grid.py +0 -0
  135. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/hub.py +0 -0
  136. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/hub_server.py +0 -0
  137. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/line.py +0 -0
  138. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/load.py +0 -0
  139. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/metadata.py +0 -0
  140. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/secret.py +0 -0
  141. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/segment.py +0 -0
  142. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/server.py +0 -0
  143. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/slack_line.py +0 -0
  144. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/tag.py +0 -0
  145. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/transformer.py +0 -0
  146. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/variable_types.py +0 -0
  147. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/database.py +0 -0
  148. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/restclient/__init__.py +0 -0
  149. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/restclient/client.py +0 -0
  150. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/restclient/exceptions.py +0 -0
  151. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/restclient/tests/test_restclient.py +0 -0
  152. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/restclient/types.py +0 -0
  153. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/server/__init__.py +0 -0
  154. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/server/exceptions.py +0 -0
  155. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/server/server.py +0 -0
  156. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/settings.py +0 -0
  157. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/testing/__init__.py +0 -0
  158. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/tests/FakeProc.py +0 -0
  159. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/tests/asset_geometries.json +0 -0
  160. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/tests/test_api_contracts.py +0 -0
  161. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/utils/__init__.py +0 -0
  162. {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/utils/custom_model.py +0 -0
  163. {splight_lib-5.22.5.dev100 → splight_lib-5.23.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.22.5.dev100
3
+ Version: 5.23.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.22.5.dev100"
3
+ version = "5.23.0dev1"
4
4
  description = "Splight Python Library"
5
5
  authors = [
6
6
  {name = "Splight Dev",email = "dev@splight.com"}
@@ -48,6 +48,7 @@ MODEL_NAME_MAP = {
48
48
  "server": f"{ENGINE_PREFIX}/server/servers/",
49
49
  "slackgenerator": f"{ENGINE_PREFIX}/asset/slack-generators/",
50
50
  "slackline": f"{ENGINE_PREFIX}/asset/slack-lines/",
51
+ "solution": f"{ENGINE_PREFIX}/solution/solutions/",
51
52
  "tab": f"{ENGINE_PREFIX}/dashboard/tabs/",
52
53
  "threewindingtransformer": f"{ENGINE_PREFIX}/asset/three-winding-transformers/",
53
54
  "transformer": f"{ENGINE_PREFIX}/asset/transformers/",
@@ -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,6 @@ elif api_version == SplightAPIVersion.V4:
169
169
  AssetKind,
170
170
  AssetRelationship,
171
171
  Attribute,
172
- AttributeDocument,
173
172
  AttributeType,
174
173
  Battery,
175
174
  Boolean,
@@ -180,6 +179,8 @@ elif api_version == SplightAPIVersion.V4:
180
179
  ComponentType,
181
180
  CustomType,
182
181
  DataAddress,
182
+ DataRecords,
183
+ DataRequest,
183
184
  Endpoint,
184
185
  ExternalGrid,
185
186
  File,
@@ -195,9 +196,8 @@ elif api_version == SplightAPIVersion.V4:
195
196
  Number,
196
197
  Output,
197
198
  Parameter,
199
+ PipelineStep,
198
200
  PrivacyPolicy,
199
- Query,
200
- Records,
201
201
  ResourceSummary,
202
202
  Routine,
203
203
  RoutineEvaluation,
@@ -207,10 +207,15 @@ elif api_version == SplightAPIVersion.V4:
207
207
  Segment,
208
208
  Server,
209
209
  SlackLine,
210
+ Solution,
211
+ SolutionConfiguration,
212
+ SolutionOutput,
210
213
  SolutionOutputDocument,
211
214
  SplightDatalakeBaseModel,
212
215
  String,
213
216
  Tag,
217
+ Trace,
218
+ TraceType,
214
219
  Transformer,
215
220
  ValueType,
216
221
  get_field_value,
@@ -268,6 +273,15 @@ elif api_version == SplightAPIVersion.V4:
268
273
  "SlackLine",
269
274
  "Transformer",
270
275
  "SplightDatabaseBaseModel",
276
+ "Solution",
277
+ "SolutionOutput",
278
+ "SolutionConfiguration",
279
+ "DataRecords",
280
+ "DataRequest",
281
+ "PipelineStep",
282
+ "Trace",
283
+ "TraceType",
284
+ "SolutionOutputDocument",
271
285
  ]
272
286
  else:
273
287
  raise ImportError(f"No models available for API version: '{api_version}'.")
@@ -28,10 +28,11 @@ 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,
35
36
  )
36
37
  from splight_lib.models._v4.datalake_base import SplightDatalakeBaseModel
37
38
  from splight_lib.models._v4.external_grid import ExternalGrid
@@ -43,11 +44,21 @@ from splight_lib.models._v4.hub_server import HubServer
43
44
  from splight_lib.models._v4.line import Line
44
45
  from splight_lib.models._v4.load import Load
45
46
  from splight_lib.models._v4.metadata import Metadata
46
- from splight_lib.models._v4.native import Boolean, Number, String
47
+ from splight_lib.models._v4.native import (
48
+ Boolean,
49
+ Number,
50
+ SolutionOutputDocument,
51
+ String,
52
+ )
47
53
  from splight_lib.models._v4.secret import Secret
48
54
  from splight_lib.models._v4.segment import Segment
49
55
  from splight_lib.models._v4.server import Server
50
56
  from splight_lib.models._v4.slack_line import SlackLine
57
+ from splight_lib.models._v4.solution import (
58
+ Solution,
59
+ SolutionConfiguration,
60
+ SolutionOutput,
61
+ )
51
62
  from splight_lib.models._v4.tag import Tag
52
63
  from splight_lib.models._v4.transformer import Transformer
53
64
 
@@ -113,4 +124,11 @@ __all__ = [
113
124
  "Segment",
114
125
  "SlackLine",
115
126
  "Transformer",
127
+ "SolutionOutputDocument",
128
+ "SolutionOutput",
129
+ "Solution",
130
+ "SolutionConfiguration",
131
+ "DataRequest",
132
+ "DataRecords",
133
+ "TraceType",
116
134
  ]
@@ -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
@@ -0,0 +1,30 @@
1
+ from pydantic import BaseModel
2
+
3
+ from splight_lib.models._v4.base import ResourceSummary, ValueType
4
+ from splight_lib.models.database import SplightDatabaseBaseModel
5
+
6
+
7
+ class SolutionOutput(BaseModel):
8
+ id: str | None = None
9
+ name: str
10
+ type: ValueType
11
+ unit: str | None = None
12
+
13
+
14
+ class SolutionConfiguration(BaseModel):
15
+ id: str | None = None
16
+ name: str
17
+ type: ValueType
18
+ unit: str | None = None
19
+ value: str | float | bool | None = None
20
+
21
+
22
+ class Solution(SplightDatabaseBaseModel):
23
+ id: str | None = None
24
+ name: str
25
+ description: str | None = None
26
+ type: str
27
+ tags: list[str] = []
28
+ asset: ResourceSummary
29
+ outputs: list[SolutionOutput] = []
30
+ configurations: list[SolutionConfiguration] = []
@@ -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" },