digitalhub 0.8.1__tar.gz → 0.9.0__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.
Potentially problematic release.
This version of digitalhub might be problematic. Click here for more details.
- {digitalhub-0.8.1 → digitalhub-0.9.0}/LICENSE.txt +1 -1
- {digitalhub-0.8.1 → digitalhub-0.9.0}/PKG-INFO +3 -3
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/__init__.py +19 -2
- digitalhub-0.9.0/digitalhub/client/_base/api_builder.py +16 -0
- digitalhub-0.9.0/digitalhub/client/_base/client.py +123 -0
- digitalhub-0.9.0/digitalhub/client/_base/key_builder.py +52 -0
- digitalhub-0.9.0/digitalhub/client/api.py +27 -0
- digitalhub-0.9.0/digitalhub/client/dhcore/api_builder.py +100 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/client/dhcore/client.py +81 -25
- digitalhub-0.9.0/digitalhub/client/dhcore/enums.py +27 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/client/dhcore/env.py +2 -2
- digitalhub-0.9.0/digitalhub/client/dhcore/key_builder.py +58 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/client/dhcore/utils.py +17 -17
- digitalhub-0.9.0/digitalhub/client/local/api_builder.py +100 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/client/local/client.py +22 -0
- digitalhub-0.9.0/digitalhub/client/local/key_builder.py +58 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/context/api.py +3 -38
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/context/builder.py +10 -23
- digitalhub-0.9.0/digitalhub/context/context.py +64 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/_base/context/entity.py +30 -22
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/_base/entity/_constructors/metadata.py +12 -1
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/_base/entity/_constructors/name.py +1 -1
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/_base/entity/_constructors/spec.py +1 -1
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/_base/entity/_constructors/status.py +3 -2
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/_base/entity/builder.py +6 -1
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/_base/entity/entity.py +32 -10
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/_base/entity/metadata.py +22 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/_base/entity/spec.py +7 -2
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/_base/executable/entity.py +8 -8
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/_base/material/entity.py +49 -17
- digitalhub-0.9.0/digitalhub/entities/_base/material/status.py +18 -0
- digitalhub-0.9.0/digitalhub/entities/_base/material/utils.py +106 -0
- digitalhub-0.9.0/digitalhub/entities/_base/project/entity.py +341 -0
- digitalhub-0.9.0/digitalhub/entities/_base/unversioned/entity.py +28 -0
- digitalhub-0.9.0/digitalhub/entities/_base/versioned/entity.py +29 -0
- digitalhub-0.9.0/digitalhub/entities/_commons/enums.py +103 -0
- digitalhub-0.9.0/digitalhub/entities/_commons/utils.py +83 -0
- digitalhub-0.9.0/digitalhub/entities/_operations/processor.py +1873 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/artifact/_base/builder.py +1 -1
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/artifact/_base/entity.py +1 -1
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/artifact/artifact/builder.py +2 -1
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/artifact/crud.py +46 -29
- digitalhub-0.9.0/digitalhub/entities/artifact/utils.py +62 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/dataitem/_base/builder.py +1 -1
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/dataitem/_base/entity.py +6 -6
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/dataitem/crud.py +50 -66
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/dataitem/dataitem/builder.py +2 -1
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/dataitem/iceberg/builder.py +2 -1
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/dataitem/table/builder.py +2 -1
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/dataitem/table/entity.py +5 -10
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/dataitem/table/models.py +4 -5
- digitalhub-0.9.0/digitalhub/entities/dataitem/utils.py +137 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/function/_base/builder.py +1 -1
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/function/_base/entity.py +6 -2
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/function/crud.py +36 -17
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/model/_base/builder.py +1 -1
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/model/_base/entity.py +1 -1
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/model/crud.py +46 -29
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/model/huggingface/builder.py +2 -1
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/model/huggingface/spec.py +4 -2
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/model/mlflow/builder.py +2 -1
- digitalhub-0.9.0/digitalhub/entities/model/mlflow/models.py +34 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/model/mlflow/spec.py +6 -1
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/model/mlflow/utils.py +4 -2
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/model/model/builder.py +2 -1
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/model/sklearn/builder.py +2 -1
- digitalhub-0.9.0/digitalhub/entities/model/utils.py +62 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/project/_base/builder.py +2 -2
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/project/_base/entity.py +82 -272
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/project/crud.py +110 -91
- digitalhub-0.9.0/digitalhub/entities/project/utils.py +35 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/run/_base/builder.py +3 -1
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/run/_base/entity.py +52 -54
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/run/_base/spec.py +15 -7
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/run/crud.py +35 -17
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/secret/_base/builder.py +2 -2
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/secret/_base/entity.py +4 -10
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/secret/crud.py +36 -21
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/task/_base/builder.py +14 -14
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/task/_base/entity.py +21 -14
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/task/_base/models.py +35 -6
- digitalhub-0.9.0/digitalhub/entities/task/_base/spec.py +90 -0
- digitalhub-0.9.0/digitalhub/entities/task/_base/utils.py +18 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/task/crud.py +35 -15
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/workflow/_base/builder.py +1 -1
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/workflow/_base/entity.py +22 -6
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/workflow/crud.py +36 -17
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/factory/utils.py +1 -1
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/readers/_base/reader.py +2 -2
- digitalhub-0.9.0/digitalhub/readers/_commons/enums.py +13 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/readers/api.py +3 -2
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/readers/factory.py +12 -6
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/readers/pandas/reader.py +20 -8
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/runtimes/_base.py +0 -7
- digitalhub-0.9.0/digitalhub/runtimes/enums.py +12 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/stores/_base/store.py +59 -11
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/stores/builder.py +5 -5
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/stores/local/store.py +43 -4
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/stores/remote/store.py +31 -5
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/stores/s3/store.py +129 -48
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/stores/sql/store.py +122 -47
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/utils/exceptions.py +6 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/utils/file_utils.py +60 -2
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/utils/generic_utils.py +45 -4
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/utils/io_utils.py +18 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/utils/s3_utils.py +17 -0
- digitalhub-0.9.0/digitalhub/utils/uri_utils.py +194 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub.egg-info/PKG-INFO +3 -3
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub.egg-info/SOURCES.txt +25 -23
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub.egg-info/requires.txt +1 -1
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub.egg-info/top_level.txt +0 -1
- {digitalhub-0.8.1 → digitalhub-0.9.0}/pyproject.toml +3 -3
- digitalhub-0.9.0/test/local/instances/test_validate.py +55 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/test/testkfp.py +4 -1
- digitalhub-0.8.1/digitalhub/client/_base/client.py +0 -56
- digitalhub-0.8.1/digitalhub/client/api.py +0 -63
- digitalhub-0.8.1/digitalhub/context/context.py +0 -136
- digitalhub-0.8.1/digitalhub/datastores/_base/datastore.py +0 -85
- digitalhub-0.8.1/digitalhub/datastores/api.py +0 -37
- digitalhub-0.8.1/digitalhub/datastores/builder.py +0 -110
- digitalhub-0.8.1/digitalhub/datastores/local/datastore.py +0 -50
- digitalhub-0.8.1/digitalhub/datastores/remote/datastore.py +0 -31
- digitalhub-0.8.1/digitalhub/datastores/s3/datastore.py +0 -46
- digitalhub-0.8.1/digitalhub/datastores/sql/datastore.py +0 -68
- digitalhub-0.8.1/digitalhub/entities/_base/api_utils.py +0 -620
- digitalhub-0.8.1/digitalhub/entities/_base/crud.py +0 -468
- digitalhub-0.8.1/digitalhub/entities/_base/material/status.py +0 -49
- digitalhub-0.8.1/digitalhub/entities/_base/unversioned/entity.py +0 -49
- digitalhub-0.8.1/digitalhub/entities/_base/versioned/entity.py +0 -53
- digitalhub-0.8.1/digitalhub/entities/function/_base/models.py +0 -118
- digitalhub-0.8.1/digitalhub/entities/model/mlflow/models.py +0 -26
- digitalhub-0.8.1/digitalhub/entities/task/_base/spec.py +0 -53
- digitalhub-0.8.1/digitalhub/entities/utils/api.py +0 -346
- digitalhub-0.8.1/digitalhub/entities/utils/entity_types.py +0 -19
- digitalhub-0.8.1/digitalhub/entities/utils/state.py +0 -31
- digitalhub-0.8.1/digitalhub/entities/utils/utils.py +0 -202
- digitalhub-0.8.1/digitalhub/stores/remote/__init__.py +0 -0
- digitalhub-0.8.1/digitalhub/stores/s3/__init__.py +0 -0
- digitalhub-0.8.1/digitalhub/stores/sql/__init__.py +0 -0
- digitalhub-0.8.1/digitalhub/utils/__init__.py +0 -0
- digitalhub-0.8.1/digitalhub/utils/uri_utils.py +0 -56
- {digitalhub-0.8.1 → digitalhub-0.9.0}/README.md +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/client/__init__.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/client/_base/__init__.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/client/builder.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/client/dhcore/__init__.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/client/dhcore/models.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/client/local/__init__.py +0 -0
- {digitalhub-0.8.1/digitalhub/context → digitalhub-0.9.0/digitalhub/entities}/__init__.py +0 -0
- {digitalhub-0.8.1/digitalhub/datastores → digitalhub-0.9.0/digitalhub/entities/_base}/__init__.py +0 -0
- {digitalhub-0.8.1/digitalhub/datastores → digitalhub-0.9.0/digitalhub/entities/_base}/_base/__init__.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/_base/_base/entity.py +0 -0
- {digitalhub-0.8.1/digitalhub/datastores/local → digitalhub-0.9.0/digitalhub/entities/_base/context}/__init__.py +0 -0
- {digitalhub-0.8.1/digitalhub/datastores/remote → digitalhub-0.9.0/digitalhub/entities/_base/entity}/__init__.py +0 -0
- {digitalhub-0.8.1/digitalhub/datastores/s3 → digitalhub-0.9.0/digitalhub/entities/_base/entity/_constructors}/__init__.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/_base/entity/_constructors/uuid.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/_base/entity/status.py +0 -0
- {digitalhub-0.8.1/digitalhub/datastores/sql → digitalhub-0.9.0/digitalhub/entities/_base/executable}/__init__.py +0 -0
- {digitalhub-0.8.1/digitalhub/entities → digitalhub-0.9.0/digitalhub/entities/_base/material}/__init__.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/_base/material/spec.py +0 -0
- {digitalhub-0.8.1/digitalhub/entities/_base → digitalhub-0.9.0/digitalhub/entities/_base/project}/__init__.py +0 -0
- {digitalhub-0.8.1/digitalhub/entities/_base/_base → digitalhub-0.9.0/digitalhub/entities/_base/runtime_entity}/__init__.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/_base/runtime_entity/builder.py +0 -0
- {digitalhub-0.8.1/digitalhub/entities/_base/context → digitalhub-0.9.0/digitalhub/entities/_base/unversioned}/__init__.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/_base/unversioned/builder.py +0 -0
- {digitalhub-0.8.1/digitalhub/entities/_base/entity → digitalhub-0.9.0/digitalhub/entities/_base/versioned}/__init__.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/_base/versioned/builder.py +0 -0
- {digitalhub-0.8.1/digitalhub/entities/_base/entity/_constructors → digitalhub-0.9.0/digitalhub/entities/_commons}/__init__.py +0 -0
- {digitalhub-0.8.1/digitalhub/entities/_base/executable → digitalhub-0.9.0/digitalhub/entities/_operations}/__init__.py +0 -0
- {digitalhub-0.8.1/digitalhub/entities/_base/material → digitalhub-0.9.0/digitalhub/entities/artifact}/__init__.py +0 -0
- {digitalhub-0.8.1/digitalhub/entities/_base/runtime_entity → digitalhub-0.9.0/digitalhub/entities/artifact/_base}/__init__.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/artifact/_base/spec.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/artifact/_base/status.py +0 -0
- {digitalhub-0.8.1/digitalhub/entities/_base/unversioned → digitalhub-0.9.0/digitalhub/entities/artifact/artifact}/__init__.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/artifact/artifact/entity.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/artifact/artifact/spec.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/artifact/artifact/status.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/builders.py +0 -0
- {digitalhub-0.8.1/digitalhub/entities/_base/versioned → digitalhub-0.9.0/digitalhub/entities/dataitem}/__init__.py +0 -0
- {digitalhub-0.8.1/digitalhub/entities/artifact → digitalhub-0.9.0/digitalhub/entities/dataitem/_base}/__init__.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/dataitem/_base/spec.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/dataitem/_base/status.py +0 -0
- {digitalhub-0.8.1/digitalhub/entities/artifact/_base → digitalhub-0.9.0/digitalhub/entities/dataitem/dataitem}/__init__.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/dataitem/dataitem/entity.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/dataitem/dataitem/spec.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/dataitem/dataitem/status.py +0 -0
- {digitalhub-0.8.1/digitalhub/entities/artifact/artifact → digitalhub-0.9.0/digitalhub/entities/dataitem/iceberg}/__init__.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/dataitem/iceberg/entity.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/dataitem/iceberg/spec.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/dataitem/iceberg/status.py +0 -0
- {digitalhub-0.8.1/digitalhub/entities/dataitem → digitalhub-0.9.0/digitalhub/entities/dataitem/table}/__init__.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/dataitem/table/spec.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/dataitem/table/status.py +0 -0
- {digitalhub-0.8.1/digitalhub/entities/dataitem/_base → digitalhub-0.9.0/digitalhub/entities/function}/__init__.py +0 -0
- {digitalhub-0.8.1/digitalhub/entities/dataitem/dataitem → digitalhub-0.9.0/digitalhub/entities/function/_base}/__init__.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/function/_base/spec.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/function/_base/status.py +0 -0
- {digitalhub-0.8.1/digitalhub/entities/dataitem/iceberg → digitalhub-0.9.0/digitalhub/entities/model}/__init__.py +0 -0
- {digitalhub-0.8.1/digitalhub/entities/dataitem/table → digitalhub-0.9.0/digitalhub/entities/model/_base}/__init__.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/model/_base/spec.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/model/_base/status.py +0 -0
- {digitalhub-0.8.1/digitalhub/entities/function → digitalhub-0.9.0/digitalhub/entities/model/huggingface}/__init__.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/model/huggingface/entity.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/model/huggingface/status.py +0 -0
- {digitalhub-0.8.1/digitalhub/entities/function/_base → digitalhub-0.9.0/digitalhub/entities/model/mlflow}/__init__.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/model/mlflow/entity.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/model/mlflow/status.py +0 -0
- {digitalhub-0.8.1/digitalhub/entities → digitalhub-0.9.0/digitalhub/entities/model}/model/__init__.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/model/model/entity.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/model/model/spec.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/model/model/status.py +0 -0
- {digitalhub-0.8.1/digitalhub/entities/model/_base → digitalhub-0.9.0/digitalhub/entities/model/sklearn}/__init__.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/model/sklearn/entity.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/model/sklearn/spec.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/model/sklearn/status.py +0 -0
- {digitalhub-0.8.1/digitalhub/entities/model/huggingface → digitalhub-0.9.0/digitalhub/entities/project}/__init__.py +0 -0
- {digitalhub-0.8.1/digitalhub/entities/model/mlflow → digitalhub-0.9.0/digitalhub/entities/project/_base}/__init__.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/project/_base/spec.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/project/_base/status.py +0 -0
- {digitalhub-0.8.1/digitalhub/entities/model/model → digitalhub-0.9.0/digitalhub/entities/run}/__init__.py +0 -0
- {digitalhub-0.8.1/digitalhub/entities/model/sklearn → digitalhub-0.9.0/digitalhub/entities/run/_base}/__init__.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/run/_base/status.py +0 -0
- {digitalhub-0.8.1/digitalhub/entities/project → digitalhub-0.9.0/digitalhub/entities/secret}/__init__.py +0 -0
- {digitalhub-0.8.1/digitalhub/entities/project → digitalhub-0.9.0/digitalhub/entities/secret}/_base/__init__.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/secret/_base/spec.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/secret/_base/status.py +0 -0
- {digitalhub-0.8.1/digitalhub/entities/run → digitalhub-0.9.0/digitalhub/entities/task}/__init__.py +0 -0
- {digitalhub-0.8.1/digitalhub/entities/run → digitalhub-0.9.0/digitalhub/entities/task}/_base/__init__.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/task/_base/status.py +0 -0
- {digitalhub-0.8.1/digitalhub/entities/secret → digitalhub-0.9.0/digitalhub/entities/workflow}/__init__.py +0 -0
- {digitalhub-0.8.1/digitalhub/entities/secret → digitalhub-0.9.0/digitalhub/entities/workflow}/_base/__init__.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/workflow/_base/spec.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/workflow/_base/status.py +0 -0
- {digitalhub-0.8.1/digitalhub/entities/task → digitalhub-0.9.0/digitalhub/factory}/__init__.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/factory/api.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/factory/factory.py +0 -0
- {digitalhub-0.8.1/digitalhub/entities/task/_base → digitalhub-0.9.0/digitalhub/readers}/__init__.py +0 -0
- {digitalhub-0.8.1/digitalhub/entities/utils → digitalhub-0.9.0/digitalhub/readers/_base}/__init__.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/readers/_base/builder.py +0 -0
- {digitalhub-0.8.1/digitalhub/entities/workflow → digitalhub-0.9.0/digitalhub/readers/_commons}/__init__.py +0 -0
- {digitalhub-0.8.1/digitalhub/entities/workflow/_base → digitalhub-0.9.0/digitalhub/readers/pandas}/__init__.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/readers/pandas/builder.py +0 -0
- {digitalhub-0.8.1/digitalhub/factory → digitalhub-0.9.0/digitalhub/runtimes}/__init__.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/runtimes/builder.py +0 -0
- {digitalhub-0.8.1/digitalhub/readers → digitalhub-0.9.0/digitalhub/stores}/__init__.py +0 -0
- {digitalhub-0.8.1/digitalhub/readers → digitalhub-0.9.0/digitalhub/stores}/_base/__init__.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/stores/api.py +0 -0
- {digitalhub-0.8.1/digitalhub/readers/pandas → digitalhub-0.9.0/digitalhub/stores/local}/__init__.py +0 -0
- {digitalhub-0.8.1/digitalhub/runtimes → digitalhub-0.9.0/digitalhub/stores/remote}/__init__.py +0 -0
- {digitalhub-0.8.1/digitalhub/stores → digitalhub-0.9.0/digitalhub/stores/s3}/__init__.py +0 -0
- {digitalhub-0.8.1/digitalhub/stores/_base → digitalhub-0.9.0/digitalhub/stores/sql}/__init__.py +0 -0
- {digitalhub-0.8.1/digitalhub/stores/local → digitalhub-0.9.0/digitalhub/utils}/__init__.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/utils/data_utils.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/utils/git_utils.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/utils/logger.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub.egg-info/dependency_links.txt +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/setup.cfg +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/test/local/CRUD/test_artifacts.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/test/local/CRUD/test_dataitems.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/test/local/CRUD/test_models.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/test/local/imports/test_imports.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/test/test_crud_functions.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/test/test_crud_runs.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/test/test_crud_tasks.py +0 -0
- {digitalhub-0.8.1 → digitalhub-0.9.0}/test/testkfp_pipeline.py +0 -0
|
@@ -186,7 +186,7 @@ APPENDIX: How to apply the Apache License to your work.
|
|
|
186
186
|
same "printed page" as the copyright notice for easier
|
|
187
187
|
identification within third-party archives.
|
|
188
188
|
|
|
189
|
-
Copyright
|
|
189
|
+
Copyright 2024 DSLab, Fondazione Bruno Kessler
|
|
190
190
|
|
|
191
191
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
192
192
|
you may not use this file except in compliance with the License.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: digitalhub
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.9.0
|
|
4
4
|
Summary: Python SDK for Digitalhub
|
|
5
5
|
Author-email: Fondazione Bruno Kessler <dslab@fbk.eu>, Matteo Martini <mmartini@fbk.eu>
|
|
6
6
|
License: Apache License
|
|
@@ -191,7 +191,7 @@ License: Apache License
|
|
|
191
191
|
same "printed page" as the copyright notice for easier
|
|
192
192
|
identification within third-party archives.
|
|
193
193
|
|
|
194
|
-
Copyright
|
|
194
|
+
Copyright 2024 DSLab, Fondazione Bruno Kessler
|
|
195
195
|
|
|
196
196
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
197
197
|
you may not use this file except in compliance with the License.
|
|
@@ -230,7 +230,7 @@ Requires-Python: >=3.9
|
|
|
230
230
|
Description-Content-Type: text/markdown
|
|
231
231
|
License-File: LICENSE.txt
|
|
232
232
|
Requires-Dist: boto3
|
|
233
|
-
Requires-Dist: pydantic
|
|
233
|
+
Requires-Dist: pydantic
|
|
234
234
|
Requires-Dist: sqlalchemy<2
|
|
235
235
|
Requires-Dist: pyarrow
|
|
236
236
|
Requires-Dist: numpy<2
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
__version__ = "0.9.0b0"
|
|
1
2
|
from digitalhub.entities.artifact.crud import (
|
|
2
3
|
delete_artifact,
|
|
3
4
|
get_artifact,
|
|
4
5
|
get_artifact_versions,
|
|
5
6
|
import_artifact,
|
|
6
7
|
list_artifacts,
|
|
8
|
+
load_artifact,
|
|
7
9
|
log_artifact,
|
|
8
10
|
new_artifact,
|
|
9
11
|
update_artifact,
|
|
@@ -14,6 +16,7 @@ from digitalhub.entities.dataitem.crud import (
|
|
|
14
16
|
get_dataitem_versions,
|
|
15
17
|
import_dataitem,
|
|
16
18
|
list_dataitems,
|
|
19
|
+
load_dataitem,
|
|
17
20
|
log_dataitem,
|
|
18
21
|
new_dataitem,
|
|
19
22
|
update_dataitem,
|
|
@@ -24,6 +27,7 @@ from digitalhub.entities.function.crud import (
|
|
|
24
27
|
get_function_versions,
|
|
25
28
|
import_function,
|
|
26
29
|
list_functions,
|
|
30
|
+
load_function,
|
|
27
31
|
new_function,
|
|
28
32
|
update_function,
|
|
29
33
|
)
|
|
@@ -33,6 +37,7 @@ from digitalhub.entities.model.crud import (
|
|
|
33
37
|
get_model_versions,
|
|
34
38
|
import_model,
|
|
35
39
|
list_models,
|
|
40
|
+
load_model,
|
|
36
41
|
log_model,
|
|
37
42
|
new_model,
|
|
38
43
|
update_model,
|
|
@@ -42,27 +47,39 @@ from digitalhub.entities.project.crud import (
|
|
|
42
47
|
get_or_create_project,
|
|
43
48
|
get_project,
|
|
44
49
|
import_project,
|
|
50
|
+
list_projects,
|
|
45
51
|
load_project,
|
|
46
52
|
new_project,
|
|
53
|
+
search_entity,
|
|
47
54
|
update_project,
|
|
48
55
|
)
|
|
49
|
-
from digitalhub.entities.run.crud import delete_run, get_run, import_run, list_runs, new_run, update_run
|
|
56
|
+
from digitalhub.entities.run.crud import delete_run, get_run, import_run, list_runs, load_run, new_run, update_run
|
|
50
57
|
from digitalhub.entities.secret.crud import (
|
|
51
58
|
delete_secret,
|
|
52
59
|
get_secret,
|
|
53
60
|
get_secret_versions,
|
|
54
61
|
import_secret,
|
|
55
62
|
list_secrets,
|
|
63
|
+
load_secret,
|
|
56
64
|
new_secret,
|
|
57
65
|
update_secret,
|
|
58
66
|
)
|
|
59
|
-
from digitalhub.entities.task.crud import
|
|
67
|
+
from digitalhub.entities.task.crud import (
|
|
68
|
+
delete_task,
|
|
69
|
+
get_task,
|
|
70
|
+
import_task,
|
|
71
|
+
list_tasks,
|
|
72
|
+
load_task,
|
|
73
|
+
new_task,
|
|
74
|
+
update_task,
|
|
75
|
+
)
|
|
60
76
|
from digitalhub.entities.workflow.crud import (
|
|
61
77
|
delete_workflow,
|
|
62
78
|
get_workflow,
|
|
63
79
|
get_workflow_versions,
|
|
64
80
|
import_workflow,
|
|
65
81
|
list_workflows,
|
|
82
|
+
load_workflow,
|
|
66
83
|
new_workflow,
|
|
67
84
|
update_workflow,
|
|
68
85
|
)
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from abc import abstractmethod
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class ClientApiBuilder:
|
|
7
|
+
"""
|
|
8
|
+
This class is used to build the API for the client.
|
|
9
|
+
Depending on the client, the API is built differently.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
@abstractmethod
|
|
13
|
+
def build_api(self) -> str:
|
|
14
|
+
"""
|
|
15
|
+
Build the API for the client.
|
|
16
|
+
"""
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import typing
|
|
4
|
+
from abc import abstractmethod
|
|
5
|
+
|
|
6
|
+
if typing.TYPE_CHECKING:
|
|
7
|
+
from digitalhub.client._base.api_builder import ClientApiBuilder
|
|
8
|
+
from digitalhub.client._base.key_builder import ClientKeyBuilder
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class Client:
|
|
12
|
+
"""
|
|
13
|
+
Base Client class interface.
|
|
14
|
+
|
|
15
|
+
The client is an interface that handles the CRUD of an object during
|
|
16
|
+
a session. It manages the creation, reading, updating, deleting and
|
|
17
|
+
listing of objects and comes into two subclasses: Local and DHCore.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
def __init__(self) -> None:
|
|
21
|
+
self._api_builder: ClientApiBuilder = None
|
|
22
|
+
self._key_builder: ClientKeyBuilder = None
|
|
23
|
+
|
|
24
|
+
##############################
|
|
25
|
+
# CRUD methods
|
|
26
|
+
##############################
|
|
27
|
+
|
|
28
|
+
@abstractmethod
|
|
29
|
+
def create_object(self, api: str, obj: dict, **kwargs) -> dict:
|
|
30
|
+
"""
|
|
31
|
+
Create object method.
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
@abstractmethod
|
|
35
|
+
def read_object(self, api: str, **kwargs) -> dict:
|
|
36
|
+
"""
|
|
37
|
+
Read object method.
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
@abstractmethod
|
|
41
|
+
def update_object(self, api: str, obj: dict, **kwargs) -> dict:
|
|
42
|
+
"""
|
|
43
|
+
Update object method.
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
@abstractmethod
|
|
47
|
+
def delete_object(self, api: str, **kwargs) -> dict:
|
|
48
|
+
"""
|
|
49
|
+
Delete object method.
|
|
50
|
+
"""
|
|
51
|
+
|
|
52
|
+
@abstractmethod
|
|
53
|
+
def list_objects(self, api: str, **kwargs) -> dict:
|
|
54
|
+
"""
|
|
55
|
+
List objects method.
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
@abstractmethod
|
|
59
|
+
def list_first_object(self, api: str, **kwargs) -> dict:
|
|
60
|
+
"""
|
|
61
|
+
Read first object method.
|
|
62
|
+
"""
|
|
63
|
+
|
|
64
|
+
@abstractmethod
|
|
65
|
+
def search_objects(self, api: str, **kwargs) -> dict:
|
|
66
|
+
"""
|
|
67
|
+
Search objects method.
|
|
68
|
+
"""
|
|
69
|
+
|
|
70
|
+
##############################
|
|
71
|
+
# Build methods
|
|
72
|
+
##############################
|
|
73
|
+
|
|
74
|
+
def build_api(self, category: str, operation: str, **kwargs) -> str:
|
|
75
|
+
"""
|
|
76
|
+
Build the API for the client.
|
|
77
|
+
|
|
78
|
+
Parameters
|
|
79
|
+
----------
|
|
80
|
+
category : str
|
|
81
|
+
API category.
|
|
82
|
+
operation : str
|
|
83
|
+
API operation.
|
|
84
|
+
**kwargs : dict
|
|
85
|
+
Additional parameters.
|
|
86
|
+
|
|
87
|
+
Returns
|
|
88
|
+
-------
|
|
89
|
+
str
|
|
90
|
+
API formatted.
|
|
91
|
+
"""
|
|
92
|
+
return self._api_builder.build_api(category, operation, **kwargs)
|
|
93
|
+
|
|
94
|
+
def build_key(self, category: str, *args, **kwargs) -> str:
|
|
95
|
+
"""
|
|
96
|
+
Build the key for the client.
|
|
97
|
+
|
|
98
|
+
Parameters
|
|
99
|
+
----------
|
|
100
|
+
category : str
|
|
101
|
+
Key category.
|
|
102
|
+
*args : tuple
|
|
103
|
+
Additional arguments.
|
|
104
|
+
**kwargs : dict
|
|
105
|
+
Additional parameters.
|
|
106
|
+
|
|
107
|
+
Returns
|
|
108
|
+
-------
|
|
109
|
+
str
|
|
110
|
+
Key formatted.
|
|
111
|
+
"""
|
|
112
|
+
return self._key_builder.build_key(category, *args, **kwargs)
|
|
113
|
+
|
|
114
|
+
##############################
|
|
115
|
+
# Interface methods
|
|
116
|
+
##############################
|
|
117
|
+
|
|
118
|
+
@staticmethod
|
|
119
|
+
@abstractmethod
|
|
120
|
+
def is_local() -> bool:
|
|
121
|
+
"""
|
|
122
|
+
Flag to check if client is local.
|
|
123
|
+
"""
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from abc import abstractmethod
|
|
4
|
+
|
|
5
|
+
from digitalhub.entities._commons.enums import ApiCategories
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class ClientKeyBuilder:
|
|
9
|
+
"""
|
|
10
|
+
Class that build the key of entities.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
def build_key(self, category: str, *args, **kwargs) -> str:
|
|
14
|
+
"""
|
|
15
|
+
Build key.
|
|
16
|
+
|
|
17
|
+
Parameters
|
|
18
|
+
----------
|
|
19
|
+
category : str
|
|
20
|
+
Key category.
|
|
21
|
+
*args : tuple
|
|
22
|
+
Positional arguments.
|
|
23
|
+
**kwargs : dict
|
|
24
|
+
Keyword arguments.
|
|
25
|
+
|
|
26
|
+
Returns
|
|
27
|
+
-------
|
|
28
|
+
str
|
|
29
|
+
Key.
|
|
30
|
+
"""
|
|
31
|
+
if category == ApiCategories.BASE.value:
|
|
32
|
+
return self.base_entity_key(*args, **kwargs)
|
|
33
|
+
return self.context_entity_key(*args, **kwargs)
|
|
34
|
+
|
|
35
|
+
@abstractmethod
|
|
36
|
+
def base_entity_key(self, entity_id: str) -> str:
|
|
37
|
+
"""
|
|
38
|
+
Build for base entity key.
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
@abstractmethod
|
|
42
|
+
def context_entity_key(
|
|
43
|
+
self,
|
|
44
|
+
project: str,
|
|
45
|
+
entity_type: str,
|
|
46
|
+
entity_kind: str,
|
|
47
|
+
entity_name: str,
|
|
48
|
+
entity_id: str | None = None,
|
|
49
|
+
) -> str:
|
|
50
|
+
"""
|
|
51
|
+
Build for context entity key.
|
|
52
|
+
"""
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import typing
|
|
4
|
+
|
|
5
|
+
from digitalhub.client.builder import client_builder
|
|
6
|
+
|
|
7
|
+
if typing.TYPE_CHECKING:
|
|
8
|
+
from digitalhub.client._base.client import Client
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def get_client(local: bool = False, config: dict | None = None) -> Client:
|
|
12
|
+
"""
|
|
13
|
+
Wrapper around ClientBuilder.build.
|
|
14
|
+
|
|
15
|
+
Parameters
|
|
16
|
+
----------
|
|
17
|
+
local : bool
|
|
18
|
+
Whether to create a local client or not.
|
|
19
|
+
config : dict
|
|
20
|
+
DHCore environment configuration.
|
|
21
|
+
|
|
22
|
+
Returns
|
|
23
|
+
-------
|
|
24
|
+
Client
|
|
25
|
+
The client instance.
|
|
26
|
+
"""
|
|
27
|
+
return client_builder.build(local, config)
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from digitalhub.client._base.api_builder import ClientApiBuilder
|
|
4
|
+
from digitalhub.entities._commons.enums import ApiCategories, BackendOperations
|
|
5
|
+
from digitalhub.utils.exceptions import BackendError
|
|
6
|
+
|
|
7
|
+
API_BASE = "/api/v1"
|
|
8
|
+
API_CONTEXT = f"{API_BASE}/-"
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class ClientDHCoreApiBuilder(ClientApiBuilder):
|
|
12
|
+
"""
|
|
13
|
+
This class is used to build the API for the DHCore client.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
def build_api(self, category: str, operation: str, **kwargs) -> str:
|
|
17
|
+
"""
|
|
18
|
+
Build the API for the client.
|
|
19
|
+
|
|
20
|
+
Parameters
|
|
21
|
+
----------
|
|
22
|
+
category : str
|
|
23
|
+
API category.
|
|
24
|
+
operation : str
|
|
25
|
+
API operation.
|
|
26
|
+
**kwargs : dict
|
|
27
|
+
Additional parameters.
|
|
28
|
+
|
|
29
|
+
Returns
|
|
30
|
+
-------
|
|
31
|
+
str
|
|
32
|
+
API formatted.
|
|
33
|
+
"""
|
|
34
|
+
if category == ApiCategories.BASE.value:
|
|
35
|
+
return self.build_api_base(operation, **kwargs)
|
|
36
|
+
return self.build_api_context(operation, **kwargs)
|
|
37
|
+
|
|
38
|
+
def build_api_base(self, operation: str, **kwargs) -> str:
|
|
39
|
+
"""
|
|
40
|
+
Build the base API for the client.
|
|
41
|
+
|
|
42
|
+
Parameters
|
|
43
|
+
----------
|
|
44
|
+
operation : str
|
|
45
|
+
API operation.
|
|
46
|
+
**kwargs : dict
|
|
47
|
+
Additional parameters.
|
|
48
|
+
|
|
49
|
+
Returns
|
|
50
|
+
-------
|
|
51
|
+
str
|
|
52
|
+
API formatted.
|
|
53
|
+
"""
|
|
54
|
+
entity_type = kwargs["entity_type"] + "s"
|
|
55
|
+
if operation in (
|
|
56
|
+
BackendOperations.CREATE.value,
|
|
57
|
+
BackendOperations.LIST.value,
|
|
58
|
+
):
|
|
59
|
+
return f"{API_BASE}/{entity_type}"
|
|
60
|
+
elif operation in (
|
|
61
|
+
BackendOperations.READ.value,
|
|
62
|
+
BackendOperations.UPDATE.value,
|
|
63
|
+
BackendOperations.DELETE.value,
|
|
64
|
+
):
|
|
65
|
+
return f"{API_BASE}/{entity_type}/{kwargs['entity_name']}"
|
|
66
|
+
elif operation == BackendOperations.SHARE.value:
|
|
67
|
+
return f"{API_BASE}/{entity_type}/{kwargs['entity_name']}/share"
|
|
68
|
+
raise BackendError(f"Invalid operation '{operation}' for entity type '{entity_type}' in DHCore.")
|
|
69
|
+
|
|
70
|
+
def build_api_context(self, operation: str, **kwargs) -> str:
|
|
71
|
+
"""
|
|
72
|
+
Build the context API for the client.
|
|
73
|
+
"""
|
|
74
|
+
entity_type = kwargs["entity_type"] + "s"
|
|
75
|
+
project = kwargs["project"]
|
|
76
|
+
if operation in (
|
|
77
|
+
BackendOperations.CREATE.value,
|
|
78
|
+
BackendOperations.LIST.value,
|
|
79
|
+
):
|
|
80
|
+
return f"{API_CONTEXT}/{project}/{entity_type}"
|
|
81
|
+
elif operation in (
|
|
82
|
+
BackendOperations.READ.value,
|
|
83
|
+
BackendOperations.UPDATE.value,
|
|
84
|
+
BackendOperations.DELETE.value,
|
|
85
|
+
):
|
|
86
|
+
return f"{API_CONTEXT}/{project}/{entity_type}/{kwargs['entity_id']}"
|
|
87
|
+
elif operation == BackendOperations.LOGS.value:
|
|
88
|
+
return f"{API_CONTEXT}/{project}/{entity_type}/{kwargs['entity_id']}/logs"
|
|
89
|
+
elif operation == BackendOperations.STOP.value:
|
|
90
|
+
return f"{API_CONTEXT}/{project}/{entity_type}/{kwargs['entity_id']}/stop"
|
|
91
|
+
elif operation == BackendOperations.RESUME.value:
|
|
92
|
+
return f"{API_CONTEXT}/{project}/{entity_type}/{kwargs['entity_id']}/resume"
|
|
93
|
+
elif operation == BackendOperations.DATA.value:
|
|
94
|
+
return f"{API_CONTEXT}/{project}/{entity_type}/{kwargs['entity_id']}/data"
|
|
95
|
+
elif operation == BackendOperations.FILES.value:
|
|
96
|
+
return f"{API_CONTEXT}/{project}/{entity_type}/{kwargs['entity_id']}/files/info"
|
|
97
|
+
elif operation == BackendOperations.SEARCH.value:
|
|
98
|
+
return f"{API_CONTEXT}/{project}/solr/search/item"
|
|
99
|
+
|
|
100
|
+
raise BackendError(f"Invalid operation '{operation}' for entity type '{entity_type}' in DHCore.")
|
|
@@ -4,7 +4,6 @@ import datetime
|
|
|
4
4
|
import json
|
|
5
5
|
import os
|
|
6
6
|
import typing
|
|
7
|
-
from urllib.parse import urlparse
|
|
8
7
|
from warnings import warn
|
|
9
8
|
|
|
10
9
|
from dotenv import get_key, set_key
|
|
@@ -12,7 +11,10 @@ from requests import request
|
|
|
12
11
|
from requests.exceptions import HTTPError, JSONDecodeError, RequestException
|
|
13
12
|
|
|
14
13
|
from digitalhub.client._base.client import Client
|
|
15
|
-
from digitalhub.client.dhcore.
|
|
14
|
+
from digitalhub.client.dhcore.api_builder import ClientDHCoreApiBuilder
|
|
15
|
+
from digitalhub.client.dhcore.enums import AuthType, DhcoreEnvVar
|
|
16
|
+
from digitalhub.client.dhcore.env import ENV_FILE, FALLBACK_USER, LIB_VERSION, MAX_API_LEVEL, MIN_API_LEVEL
|
|
17
|
+
from digitalhub.client.dhcore.key_builder import ClientDHCoreKeyBuilder
|
|
16
18
|
from digitalhub.client.dhcore.models import BasicAuth, OAuth2TokenAuth
|
|
17
19
|
from digitalhub.utils.exceptions import (
|
|
18
20
|
BackendError,
|
|
@@ -23,6 +25,7 @@ from digitalhub.utils.exceptions import (
|
|
|
23
25
|
MissingSpecError,
|
|
24
26
|
UnauthorizedError,
|
|
25
27
|
)
|
|
28
|
+
from digitalhub.utils.uri_utils import has_remote_scheme
|
|
26
29
|
|
|
27
30
|
if typing.TYPE_CHECKING:
|
|
28
31
|
from requests import Response
|
|
@@ -47,6 +50,12 @@ class ClientDHCore(Client):
|
|
|
47
50
|
def __init__(self, config: dict | None = None) -> None:
|
|
48
51
|
super().__init__()
|
|
49
52
|
|
|
53
|
+
# API builder
|
|
54
|
+
self._api_builder = ClientDHCoreApiBuilder()
|
|
55
|
+
|
|
56
|
+
# Key builder
|
|
57
|
+
self._key_builder = ClientDHCoreKeyBuilder()
|
|
58
|
+
|
|
50
59
|
# Endpoints
|
|
51
60
|
self._endpoint_core: str | None = None
|
|
52
61
|
self._endpoint_issuer: str | None = None
|
|
@@ -214,6 +223,56 @@ class ClientDHCore(Client):
|
|
|
214
223
|
except IndexError:
|
|
215
224
|
raise BackendError("No object found.")
|
|
216
225
|
|
|
226
|
+
def search_objects(self, api: str, **kwargs) -> list[dict]:
|
|
227
|
+
"""
|
|
228
|
+
Search objects from DHCore.
|
|
229
|
+
|
|
230
|
+
Parameters
|
|
231
|
+
----------
|
|
232
|
+
api : str
|
|
233
|
+
Search API.
|
|
234
|
+
**kwargs : dict
|
|
235
|
+
Keyword arguments to pass to the request.
|
|
236
|
+
|
|
237
|
+
Returns
|
|
238
|
+
-------
|
|
239
|
+
list[dict]
|
|
240
|
+
Response objects.
|
|
241
|
+
"""
|
|
242
|
+
if kwargs is None:
|
|
243
|
+
kwargs = {}
|
|
244
|
+
|
|
245
|
+
if "params" not in kwargs:
|
|
246
|
+
kwargs["params"] = {}
|
|
247
|
+
|
|
248
|
+
start_page = 0
|
|
249
|
+
if "page" not in kwargs["params"]:
|
|
250
|
+
kwargs["params"]["page"] = start_page
|
|
251
|
+
|
|
252
|
+
if "size" not in kwargs["params"]:
|
|
253
|
+
kwargs["params"]["size"] = 10
|
|
254
|
+
|
|
255
|
+
# Add sorting
|
|
256
|
+
if "sort" not in kwargs["params"]:
|
|
257
|
+
kwargs["params"]["sort"] = "metadata.updated,DESC"
|
|
258
|
+
|
|
259
|
+
objects_with_highlights = []
|
|
260
|
+
while True:
|
|
261
|
+
resp = self._prepare_call("GET", api, **kwargs)
|
|
262
|
+
contents = resp["content"]
|
|
263
|
+
total_pages = resp["totalPages"]
|
|
264
|
+
if not contents or kwargs["params"]["page"] >= total_pages:
|
|
265
|
+
break
|
|
266
|
+
objects_with_highlights.extend(contents)
|
|
267
|
+
kwargs["params"]["page"] += 1
|
|
268
|
+
|
|
269
|
+
objects = []
|
|
270
|
+
for obj in objects_with_highlights:
|
|
271
|
+
obj.pop("highlights", None)
|
|
272
|
+
objects.append(obj)
|
|
273
|
+
|
|
274
|
+
return objects
|
|
275
|
+
|
|
217
276
|
##############################
|
|
218
277
|
# Call methods
|
|
219
278
|
##############################
|
|
@@ -275,9 +334,9 @@ class ClientDHCore(Client):
|
|
|
275
334
|
dict
|
|
276
335
|
Keyword arguments with the authentication parameters.
|
|
277
336
|
"""
|
|
278
|
-
if self._auth_type ==
|
|
337
|
+
if self._auth_type == AuthType.BASIC.value:
|
|
279
338
|
kwargs["auth"] = self._user, self._password
|
|
280
|
-
elif self._auth_type ==
|
|
339
|
+
elif self._auth_type == AuthType.OAUTH2.value:
|
|
281
340
|
if "headers" not in kwargs:
|
|
282
341
|
kwargs["headers"] = {}
|
|
283
342
|
kwargs["headers"]["Authorization"] = f"Bearer {self._access_token}"
|
|
@@ -465,7 +524,6 @@ class ClientDHCore(Client):
|
|
|
465
524
|
-------
|
|
466
525
|
None
|
|
467
526
|
"""
|
|
468
|
-
|
|
469
527
|
self._get_endpoints_from_env()
|
|
470
528
|
|
|
471
529
|
if config is not None:
|
|
@@ -475,21 +533,20 @@ class ClientDHCore(Client):
|
|
|
475
533
|
self._access_token = config.access_token
|
|
476
534
|
self._refresh_token = config.refresh_token
|
|
477
535
|
self._client_id = config.client_id
|
|
478
|
-
self._auth_type =
|
|
536
|
+
self._auth_type = AuthType.OAUTH2.value
|
|
479
537
|
|
|
480
538
|
elif config.get("user") is not None and config.get("password") is not None:
|
|
481
539
|
config = BasicAuth(**config)
|
|
482
540
|
self._user = config.user
|
|
483
541
|
self._password = config.password
|
|
484
|
-
self._auth_type =
|
|
542
|
+
self._auth_type = AuthType.BASIC.value
|
|
485
543
|
|
|
486
544
|
return
|
|
487
545
|
|
|
488
546
|
self._get_auth_from_env()
|
|
489
547
|
|
|
490
548
|
# Propagate access and refresh token to env file
|
|
491
|
-
|
|
492
|
-
self._write_env()
|
|
549
|
+
self._write_env()
|
|
493
550
|
|
|
494
551
|
def _get_endpoints_from_env(self) -> None:
|
|
495
552
|
"""
|
|
@@ -504,12 +561,12 @@ class ClientDHCore(Client):
|
|
|
504
561
|
Exception
|
|
505
562
|
If the endpoint of DHCore is not set in the env variables.
|
|
506
563
|
"""
|
|
507
|
-
core_endpt = os.getenv(
|
|
564
|
+
core_endpt = os.getenv(DhcoreEnvVar.ENDPOINT.value)
|
|
508
565
|
if core_endpt is None:
|
|
509
566
|
raise BackendError("Endpoint not set as environment variables.")
|
|
510
567
|
self._endpoint_core = self._sanitize_endpoint(core_endpt)
|
|
511
568
|
|
|
512
|
-
issr_endpt = os.getenv(
|
|
569
|
+
issr_endpt = os.getenv(DhcoreEnvVar.ISSUER.value)
|
|
513
570
|
if issr_endpt is not None:
|
|
514
571
|
self._endpoint_issuer = self._sanitize_endpoint(issr_endpt)
|
|
515
572
|
|
|
@@ -521,9 +578,8 @@ class ClientDHCore(Client):
|
|
|
521
578
|
-------
|
|
522
579
|
None
|
|
523
580
|
"""
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
raise BackendError("Invalid endpoint scheme.")
|
|
581
|
+
if not has_remote_scheme(endpoint):
|
|
582
|
+
raise BackendError("Invalid endpoint scheme. Must start with http:// or https://.")
|
|
527
583
|
|
|
528
584
|
endpoint = endpoint.strip()
|
|
529
585
|
return endpoint.removesuffix("/")
|
|
@@ -536,19 +592,19 @@ class ClientDHCore(Client):
|
|
|
536
592
|
-------
|
|
537
593
|
None
|
|
538
594
|
"""
|
|
539
|
-
self._user = os.getenv(
|
|
540
|
-
self._refresh_token = os.getenv(
|
|
541
|
-
self._client_id = os.getenv(
|
|
595
|
+
self._user = os.getenv(DhcoreEnvVar.USER.value, FALLBACK_USER)
|
|
596
|
+
self._refresh_token = os.getenv(DhcoreEnvVar.REFRESH_TOKEN.value)
|
|
597
|
+
self._client_id = os.getenv(DhcoreEnvVar.CLIENT_ID.value)
|
|
542
598
|
|
|
543
|
-
token = os.getenv(
|
|
599
|
+
token = os.getenv(DhcoreEnvVar.ACCESS_TOKEN.value)
|
|
544
600
|
if token is not None and token != "":
|
|
545
|
-
self._auth_type =
|
|
601
|
+
self._auth_type = AuthType.OAUTH2.value
|
|
546
602
|
self._access_token = token
|
|
547
603
|
return
|
|
548
604
|
|
|
549
|
-
password = os.getenv(
|
|
605
|
+
password = os.getenv(DhcoreEnvVar.PASSWORD.value)
|
|
550
606
|
if self._user is not None and password is not None:
|
|
551
|
-
self._auth_type =
|
|
607
|
+
self._auth_type = AuthType.BASIC.value
|
|
552
608
|
self._password = password
|
|
553
609
|
return
|
|
554
610
|
|
|
@@ -566,12 +622,12 @@ class ClientDHCore(Client):
|
|
|
566
622
|
|
|
567
623
|
# Call refresh token endpoint
|
|
568
624
|
# Try token from env
|
|
569
|
-
refresh_token = os.getenv(
|
|
625
|
+
refresh_token = os.getenv(DhcoreEnvVar.REFRESH_TOKEN.value)
|
|
570
626
|
response = self._call_refresh_token_endpoint(url, refresh_token)
|
|
571
627
|
|
|
572
628
|
# Otherwise try token from file
|
|
573
629
|
if response.status_code in (400, 401, 403):
|
|
574
|
-
refresh_token = get_key(ENV_FILE,
|
|
630
|
+
refresh_token = get_key(ENV_FILE, DhcoreEnvVar.REFRESH_TOKEN.value)
|
|
575
631
|
response = self._call_refresh_token_endpoint(url, refresh_token)
|
|
576
632
|
|
|
577
633
|
response.raise_for_status()
|
|
@@ -641,9 +697,9 @@ class ClientDHCore(Client):
|
|
|
641
697
|
"""
|
|
642
698
|
keys = {}
|
|
643
699
|
if self._access_token is not None:
|
|
644
|
-
keys[
|
|
700
|
+
keys[DhcoreEnvVar.ACCESS_TOKEN.value] = self._access_token
|
|
645
701
|
if self._refresh_token is not None:
|
|
646
|
-
keys[
|
|
702
|
+
keys[DhcoreEnvVar.REFRESH_TOKEN.value] = self._refresh_token
|
|
647
703
|
|
|
648
704
|
for k, v in keys.items():
|
|
649
705
|
set_key(dotenv_path=ENV_FILE, key_to_set=k, value_to_set=v)
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from enum import Enum
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class DhcoreEnvVar(Enum):
|
|
7
|
+
"""
|
|
8
|
+
Environment variables.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
ENDPOINT = "DHCORE_ENDPOINT"
|
|
12
|
+
ISSUER = "DHCORE_ISSUER"
|
|
13
|
+
USER = "DHCORE_USER"
|
|
14
|
+
PASSWORD = "DHCORE_PASSWORD"
|
|
15
|
+
CLIENT_ID = "DHCORE_CLIENT_ID"
|
|
16
|
+
ACCESS_TOKEN = "DHCORE_ACCESS_TOKEN"
|
|
17
|
+
REFRESH_TOKEN = "DHCORE_REFRESH_TOKEN"
|
|
18
|
+
WORKFLOW_IMAGE = "DHCORE_WORKFLOW_IMAGE"
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class AuthType(Enum):
|
|
22
|
+
"""
|
|
23
|
+
Authentication types.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
BASIC = "basic"
|
|
27
|
+
OAUTH2 = "oauth2"
|