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.
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/PKG-INFO +1 -1
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/pyproject.toml +1 -1
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/database/classmap.py +1 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/datalake/v4/remote_client.py +2 -3
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/__init__.py +17 -3
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/__init__.py +23 -5
- splight_lib-5.23.0.dev1/splight_lib/models/_v4/datalake.py +209 -0
- splight_lib-5.23.0.dev1/splight_lib/models/_v4/datalake_base.py +141 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/native.py +62 -3
- splight_lib-5.23.0.dev1/splight_lib/models/_v4/solution.py +30 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/uv.lock +1 -1
- splight_lib-5.22.5.dev100/splight_lib/models/_v4/datalake.py +0 -168
- splight_lib-5.22.5.dev100/splight_lib/models/_v4/datalake_base.py +0 -114
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/.github/workflows/code-style.yaml +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/.github/workflows/developer.yaml +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/.github/workflows/pre-release.yaml +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/.github/workflows/release.yaml +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/.github/workflows/scripts/check_dev_version.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/.github/workflows/scripts/check_master_version.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/.github/workflows/scripts/check_pypi_version.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/.github/workflows/scripts/check_release_version.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/.github/workflows/scripts/check_version_uploaded.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/.github/workflows/scripts/cleanup_pypi.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/.github/workflows/scripts/requirements.txt +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/.gitignore +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/.pre-commit-config.yaml +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/DOCS.md +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/LICENSE.txt +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/Makefile +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/README.md +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/__init__.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/abstract/__init__.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/abstract/client.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/auth/__init__.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/auth/token.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/__init__.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/database/__init__.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/database/abstract.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/database/builder.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/database/remote_client.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/datalake/__init__.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/datalake/builder.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/datalake/common/__init__.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/datalake/common/abstract.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/datalake/common/buffer.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/datalake/v3/__init__.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/datalake/v3/builder.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/datalake/v3/classmap.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/datalake/v3/constants.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/datalake/v3/exceptions.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/datalake/v3/remote_client.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/datalake/v4/__init__.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/datalake/v4/builder.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/datalake/v4/exceptions.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/exceptions.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/hub/__init__.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/hub/abstract.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/hub/client.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/tests/test_database.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/tests/test_datalake.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/component/__init__.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/component/abstract.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/component/exceptions.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/component/spec.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/component/tests/test_spec.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/config.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/conftest.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/constants.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/encryption.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/execution/__init__.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/execution/engine.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/execution/exceptions.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/execution/scheduling.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/execution/task.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/execution/tests/test_execution.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/execution/tests/test_scheduling.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/execution/trigger.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/logging/__init__.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/logging/_internal.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/logging/component.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/logging/constants.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/logging/logging.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/logging/tests/test_logging.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/__init__.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/actions.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/alert.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/asset.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/attribute.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/bus.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/component.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/dashboard.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/data_address.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/datalake.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/datalake_base.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/exceptions.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/external_grid.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/file.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/function.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/generator.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/generic.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/grid.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/hub.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/hub_server.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/inverter.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/line.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/metadata.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/native.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/secret.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/segment.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/server.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/slack_generator.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/slack_line.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/tag.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/tests/models.json +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/tests/test_component_object_instance.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/tests/test_database_model.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/tests/test_metadata.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/tests/test_models.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/three_winding_transformer.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/transformer.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v3/variable_types.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/asset.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/attribute.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/base.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/battery.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/bus.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/component.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/data_address.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/exceptions.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/external_grid.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/file.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/generator.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/generic.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/grid.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/hub.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/hub_server.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/line.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/load.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/metadata.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/secret.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/segment.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/server.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/slack_line.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/tag.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/transformer.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/_v4/variable_types.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/models/database.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/restclient/__init__.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/restclient/client.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/restclient/exceptions.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/restclient/tests/test_restclient.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/restclient/types.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/server/__init__.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/server/exceptions.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/server/server.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/settings.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/testing/__init__.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/tests/FakeProc.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/tests/asset_geometries.json +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/tests/test_api_contracts.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/utils/__init__.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/utils/custom_model.py +0 -0
- {splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/version.py +0 -0
{splight_lib-5.22.5.dev100 → splight_lib-5.23.0.dev1}/splight_lib/client/database/classmap.py
RENAMED
|
@@ -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
|
|
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
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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
|
|
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().
|
|
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().
|
|
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().
|
|
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] = []
|