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