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.
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/PKG-INFO +1 -1
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/pyproject.toml +1 -1
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/datalake/common/abstract.py +1 -1
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/datalake/v4/builder.py +20 -1
- splight_lib-5.24.0.dev1/splight_lib/client/datalake/v4/exceptions.py +4 -0
- splight_lib-5.24.0.dev1/splight_lib/client/datalake/v4/generic.py +31 -0
- splight_lib-5.24.0.dev1/splight_lib/client/datalake/v4/models.py +78 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/datalake/v4/remote_client.py +24 -18
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/__init__.py +0 -12
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/component.py +1 -1
- splight_lib-5.24.0.dev1/splight_lib/models/_v4/datalake_base.py +131 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/exceptions.py +0 -6
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/native.py +8 -8
- splight_lib-5.23.3/splight_lib/client/datalake/v4/exceptions.py +0 -12
- splight_lib-5.23.3/splight_lib/models/_v4/datalake.py +0 -209
- splight_lib-5.23.3/splight_lib/models/_v4/datalake_base.py +0 -141
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/.github/workflows/code-style.yaml +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/.github/workflows/developer.yaml +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/.github/workflows/pre-release.yaml +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/.github/workflows/release.yaml +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/.github/workflows/scripts/check_dev_version.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/.github/workflows/scripts/check_master_version.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/.github/workflows/scripts/check_pypi_version.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/.github/workflows/scripts/check_release_version.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/.github/workflows/scripts/check_version_uploaded.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/.github/workflows/scripts/cleanup_pypi.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/.github/workflows/scripts/requirements.txt +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/.gitignore +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/.pre-commit-config.yaml +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/DOCS.md +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/LICENSE.txt +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/Makefile +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/README.md +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/__init__.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/abstract/__init__.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/abstract/client.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/auth/__init__.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/auth/token.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/__init__.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/database/__init__.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/database/abstract.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/database/builder.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/database/classmap.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/database/remote_client.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/datalake/__init__.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/datalake/builder.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/datalake/common/__init__.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/datalake/common/buffer.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/datalake/v3/__init__.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/datalake/v3/builder.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/datalake/v3/classmap.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/datalake/v3/constants.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/datalake/v3/exceptions.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/datalake/v3/remote_client.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/datalake/v4/__init__.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/exceptions.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/hub/__init__.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/hub/abstract.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/hub/client.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/tests/test_database.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/tests/test_datalake.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/component/__init__.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/component/abstract.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/component/exceptions.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/component/spec.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/component/tests/test_spec.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/config.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/conftest.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/constants.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/encryption.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/execution/__init__.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/execution/engine.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/execution/exceptions.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/execution/scheduling.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/execution/task.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/execution/tests/test_execution.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/execution/tests/test_scheduling.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/execution/trigger.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/logging/__init__.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/logging/_internal.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/logging/component.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/logging/constants.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/logging/logging.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/logging/tests/test_logging.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/__init__.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/__init__.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/actions.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/alert.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/asset.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/attribute.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/bus.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/component.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/dashboard.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/data_address.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/datalake.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/datalake_base.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/exceptions.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/external_grid.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/file.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/function.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/generator.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/generic.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/grid.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/hub.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/hub_server.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/inverter.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/line.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/metadata.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/native.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/secret.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/segment.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/server.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/slack_generator.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/slack_line.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/tag.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/tests/models.json +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/tests/test_component_object_instance.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/tests/test_database_model.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/tests/test_metadata.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/tests/test_models.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/three_winding_transformer.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/transformer.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v3/variable_types.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/asset.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/attribute.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/base.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/battery.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/bus.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/data_address.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/external_grid.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/file.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/generator.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/generic.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/grid.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/hub.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/hub_server.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/line.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/load.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/metadata.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/secret.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/segment.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/server.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/slack_line.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/solution.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/tag.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/transformer.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/_v4/variable_types.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/models/database.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/restclient/__init__.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/restclient/client.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/restclient/exceptions.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/restclient/tests/test_restclient.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/restclient/types.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/server/__init__.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/server/exceptions.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/server/server.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/settings.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/testing/__init__.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/tests/FakeProc.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/tests/asset_geometries.json +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/tests/test_api_contracts.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/utils/__init__.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/utils/custom_model.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/version.py +0 -0
- {splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/uv.lock +0 -0
|
@@ -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
|
|
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,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]
|
{splight_lib-5.23.3 → splight_lib-5.24.0.dev1}/splight_lib/client/datalake/v4/remote_client.py
RENAMED
|
@@ -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:
|
|
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:
|
|
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
|
-
|
|
145
|
-
buffer = self._data_buffers[
|
|
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(
|
|
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
|
|
160
|
-
self._flush_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,
|
|
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(
|
|
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(
|
|
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
|
-
"
|
|
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
|
-
|
|
245
|
+
schema_name = records["schema_name"]
|
|
242
246
|
records = records["records"]
|
|
243
|
-
buffer = self._data_buffers[
|
|
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(
|
|
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(
|
|
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
|
-
"
|
|
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
|
]
|
|
@@ -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
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|