digitalhub 0.8.0__py3-none-any.whl → 0.8.0b1__py3-none-any.whl
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/__init__.py +4 -5
- digitalhub/client/builder.py +58 -3
- digitalhub/client/{dhcore/client.py → objects/dhcore.py} +60 -48
- digitalhub/client/{local/client.py → objects/local.py} +2 -2
- digitalhub/context/builder.py +85 -1
- digitalhub/context/context.py +1 -1
- digitalhub/datastores/builder.py +37 -13
- digitalhub/datastores/{_base/datastore.py → objects/base.py} +3 -3
- digitalhub/datastores/{local/datastore.py → objects/local.py} +2 -10
- digitalhub/datastores/{remote/datastore.py → objects/remote.py} +1 -9
- digitalhub/datastores/{s3/datastore.py → objects/s3.py} +2 -10
- digitalhub/datastores/{sql/datastore.py → objects/sql.py} +2 -10
- digitalhub/entities/_base/{_base/entity.py → base.py} +1 -1
- digitalhub/entities/_base/crud.py +389 -247
- digitalhub/entities/_base/entity/{entity.py → base.py} +34 -8
- digitalhub/entities/_base/{context/entity.py → entity/context.py} +6 -6
- digitalhub/entities/_base/{executable/entity.py → entity/executable.py} +36 -61
- digitalhub/entities/_base/{material/entity.py → entity/material.py} +6 -6
- digitalhub/entities/_base/entity/unversioned.py +87 -0
- digitalhub/entities/_base/entity/versioned.py +94 -0
- digitalhub/entities/_base/{entity/metadata.py → metadata.py} +2 -2
- digitalhub/entities/_base/{entity/spec.py → spec/base.py} +11 -11
- digitalhub/entities/_base/{material/spec.py → spec/material.py} +3 -3
- digitalhub/entities/_base/{entity/status.py → status/base.py} +3 -14
- digitalhub/entities/_base/{material/status.py → status/material.py} +1 -1
- digitalhub/entities/_builders/metadata.py +60 -0
- digitalhub/entities/_builders/spec.py +43 -0
- digitalhub/entities/_builders/status.py +62 -0
- digitalhub/entities/{_base/entity/_constructors → _builders}/uuid.py +11 -4
- digitalhub/entities/artifact/builder.py +133 -0
- digitalhub/entities/artifact/crud.py +48 -22
- digitalhub/entities/artifact/{_base/entity.py → entity/_base.py} +5 -5
- digitalhub/entities/artifact/entity/artifact.py +9 -0
- digitalhub/entities/artifact/{artifact/spec.py → spec.py} +16 -4
- digitalhub/entities/artifact/{artifact/status.py → status.py} +1 -1
- digitalhub/entities/dataitem/builder.py +144 -0
- digitalhub/entities/dataitem/crud.py +52 -29
- digitalhub/entities/dataitem/{_base/entity.py → entity/_base.py} +5 -5
- digitalhub/entities/dataitem/entity/dataitem.py +9 -0
- digitalhub/entities/dataitem/entity/iceberg.py +7 -0
- digitalhub/entities/dataitem/{table/entity.py → entity/table.py} +4 -25
- digitalhub/entities/dataitem/spec.py +61 -0
- digitalhub/entities/dataitem/status.py +38 -0
- digitalhub/entities/function/builder.py +86 -0
- digitalhub/entities/function/crud.py +43 -17
- digitalhub/entities/function/{_base/entity.py → entity.py} +12 -9
- digitalhub/entities/function/{_base/models.py → models.py} +1 -1
- digitalhub/entities/function/spec.py +81 -0
- digitalhub/entities/function/status.py +9 -0
- digitalhub/entities/model/builder.py +152 -0
- digitalhub/entities/model/crud.py +48 -21
- digitalhub/entities/model/{_base/entity.py → entity/_base.py} +5 -5
- digitalhub/entities/model/entity/huggingface.py +9 -0
- digitalhub/entities/model/{mlflow/utils.py → entity/mlflow.py} +10 -1
- digitalhub/entities/model/entity/model.py +9 -0
- digitalhub/entities/model/entity/sklearn.py +9 -0
- digitalhub/entities/model/spec.py +146 -0
- digitalhub/entities/model/status.py +33 -0
- digitalhub/entities/project/builder.py +82 -0
- digitalhub/entities/project/crud.py +12 -19
- digitalhub/entities/project/{_base/entity.py → entity.py} +102 -120
- digitalhub/entities/project/{_base/spec.py → spec.py} +4 -4
- digitalhub/entities/project/status.py +9 -0
- digitalhub/entities/registries.py +48 -0
- digitalhub/entities/run/builder.py +77 -0
- digitalhub/entities/run/crud.py +33 -20
- digitalhub/entities/run/{_base/entity.py → entity.py} +189 -35
- digitalhub/entities/run/spec.py +153 -0
- digitalhub/entities/run/status.py +114 -0
- digitalhub/entities/secret/builder.py +93 -0
- digitalhub/entities/secret/crud.py +31 -27
- digitalhub/entities/secret/{_base/entity.py → entity.py} +7 -8
- digitalhub/entities/secret/{_base/spec.py → spec.py} +4 -4
- digitalhub/entities/secret/status.py +9 -0
- digitalhub/entities/task/builder.py +74 -0
- digitalhub/entities/task/crud.py +33 -20
- digitalhub/entities/task/{_base/entity.py → entity.py} +8 -9
- digitalhub/entities/task/{_base/models.py → models.py} +0 -9
- digitalhub/entities/task/{_base/spec.py → spec.py} +7 -9
- digitalhub/entities/task/status.py +9 -0
- digitalhub/entities/{utils/utils.py → utils.py} +2 -20
- digitalhub/entities/workflow/builder.py +91 -0
- digitalhub/entities/workflow/crud.py +43 -17
- digitalhub/entities/workflow/{_base/entity.py → entity.py} +12 -9
- digitalhub/entities/workflow/spec.py +15 -0
- digitalhub/entities/workflow/status.py +9 -0
- digitalhub/readers/builder.py +54 -0
- digitalhub/readers/{pandas/reader.py → objects/pandas.py} +1 -1
- digitalhub/readers/registry.py +15 -0
- digitalhub/registry/models.py +87 -0
- digitalhub/registry/registry.py +74 -0
- digitalhub/registry/utils.py +150 -0
- digitalhub/runtimes/{_base.py → base.py} +65 -3
- digitalhub/runtimes/builder.py +40 -19
- digitalhub/runtimes/kind_registry.py +170 -0
- digitalhub/stores/builder.py +52 -6
- digitalhub/stores/{local/store.py → objects/local.py} +1 -1
- digitalhub/stores/{remote/store.py → objects/remote.py} +1 -1
- digitalhub/stores/{s3/store.py → objects/s3.py} +1 -1
- digitalhub/stores/{sql/store.py → objects/sql.py} +1 -1
- digitalhub/{client/dhcore/utils.py → utils/env_utils.py} +14 -2
- digitalhub/utils/exceptions.py +0 -12
- digitalhub/utils/generic_utils.py +42 -18
- digitalhub/utils/io_utils.py +2 -39
- {digitalhub-0.8.0.dist-info → digitalhub-0.8.0b1.dist-info}/METADATA +2 -3
- digitalhub-0.8.0b1.dist-info/RECORD +161 -0
- {digitalhub-0.8.0.dist-info → digitalhub-0.8.0b1.dist-info}/WHEEL +1 -1
- test/test_crud_artifacts.py +96 -0
- test/test_crud_dataitems.py +96 -0
- test/test_crud_functions.py +1 -1
- test/test_crud_runs.py +1 -1
- test/test_crud_tasks.py +1 -1
- digitalhub/client/api.py +0 -63
- digitalhub/client/dhcore/env.py +0 -21
- digitalhub/client/dhcore/models.py +0 -46
- digitalhub/context/api.py +0 -93
- digitalhub/datastores/api.py +0 -37
- digitalhub/entities/_base/api_utils.py +0 -620
- digitalhub/entities/_base/entity/_constructors/metadata.py +0 -44
- digitalhub/entities/_base/entity/_constructors/spec.py +0 -33
- digitalhub/entities/_base/entity/_constructors/status.py +0 -52
- digitalhub/entities/_base/entity/builder.py +0 -175
- digitalhub/entities/_base/executable/__init__.py +0 -0
- digitalhub/entities/_base/material/__init__.py +0 -0
- digitalhub/entities/_base/runtime_entity/__init__.py +0 -0
- digitalhub/entities/_base/runtime_entity/builder.py +0 -106
- digitalhub/entities/_base/unversioned/__init__.py +0 -0
- digitalhub/entities/_base/unversioned/builder.py +0 -66
- digitalhub/entities/_base/unversioned/entity.py +0 -49
- digitalhub/entities/_base/versioned/__init__.py +0 -0
- digitalhub/entities/_base/versioned/builder.py +0 -68
- digitalhub/entities/_base/versioned/entity.py +0 -53
- digitalhub/entities/artifact/_base/__init__.py +0 -0
- digitalhub/entities/artifact/_base/builder.py +0 -86
- digitalhub/entities/artifact/_base/spec.py +0 -15
- digitalhub/entities/artifact/_base/status.py +0 -9
- digitalhub/entities/artifact/artifact/__init__.py +0 -0
- digitalhub/entities/artifact/artifact/builder.py +0 -18
- digitalhub/entities/artifact/artifact/entity.py +0 -32
- digitalhub/entities/builders.py +0 -63
- digitalhub/entities/dataitem/_base/__init__.py +0 -0
- digitalhub/entities/dataitem/_base/builder.py +0 -86
- digitalhub/entities/dataitem/_base/spec.py +0 -15
- digitalhub/entities/dataitem/_base/status.py +0 -20
- digitalhub/entities/dataitem/dataitem/__init__.py +0 -0
- digitalhub/entities/dataitem/dataitem/builder.py +0 -18
- digitalhub/entities/dataitem/dataitem/entity.py +0 -32
- digitalhub/entities/dataitem/dataitem/spec.py +0 -15
- digitalhub/entities/dataitem/dataitem/status.py +0 -9
- digitalhub/entities/dataitem/iceberg/__init__.py +0 -0
- digitalhub/entities/dataitem/iceberg/builder.py +0 -18
- digitalhub/entities/dataitem/iceberg/entity.py +0 -32
- digitalhub/entities/dataitem/iceberg/spec.py +0 -15
- digitalhub/entities/dataitem/iceberg/status.py +0 -9
- digitalhub/entities/dataitem/table/__init__.py +0 -0
- digitalhub/entities/dataitem/table/builder.py +0 -18
- digitalhub/entities/dataitem/table/spec.py +0 -25
- digitalhub/entities/dataitem/table/status.py +0 -9
- digitalhub/entities/function/_base/__init__.py +0 -0
- digitalhub/entities/function/_base/builder.py +0 -79
- digitalhub/entities/function/_base/spec.py +0 -15
- digitalhub/entities/function/_base/status.py +0 -9
- digitalhub/entities/model/_base/__init__.py +0 -0
- digitalhub/entities/model/_base/builder.py +0 -86
- digitalhub/entities/model/_base/spec.py +0 -49
- digitalhub/entities/model/_base/status.py +0 -9
- digitalhub/entities/model/huggingface/__init__.py +0 -0
- digitalhub/entities/model/huggingface/builder.py +0 -18
- digitalhub/entities/model/huggingface/entity.py +0 -32
- digitalhub/entities/model/huggingface/spec.py +0 -36
- digitalhub/entities/model/huggingface/status.py +0 -9
- digitalhub/entities/model/mlflow/__init__.py +0 -0
- digitalhub/entities/model/mlflow/builder.py +0 -18
- digitalhub/entities/model/mlflow/entity.py +0 -32
- digitalhub/entities/model/mlflow/spec.py +0 -44
- digitalhub/entities/model/mlflow/status.py +0 -9
- digitalhub/entities/model/model/__init__.py +0 -0
- digitalhub/entities/model/model/builder.py +0 -18
- digitalhub/entities/model/model/entity.py +0 -32
- digitalhub/entities/model/model/spec.py +0 -15
- digitalhub/entities/model/model/status.py +0 -9
- digitalhub/entities/model/sklearn/__init__.py +0 -0
- digitalhub/entities/model/sklearn/builder.py +0 -18
- digitalhub/entities/model/sklearn/entity.py +0 -32
- digitalhub/entities/model/sklearn/spec.py +0 -15
- digitalhub/entities/model/sklearn/status.py +0 -9
- digitalhub/entities/project/_base/__init__.py +0 -0
- digitalhub/entities/project/_base/builder.py +0 -128
- digitalhub/entities/project/_base/status.py +0 -9
- digitalhub/entities/run/_base/__init__.py +0 -0
- digitalhub/entities/run/_base/builder.py +0 -94
- digitalhub/entities/run/_base/spec.py +0 -50
- digitalhub/entities/run/_base/status.py +0 -9
- digitalhub/entities/secret/_base/__init__.py +0 -0
- digitalhub/entities/secret/_base/builder.py +0 -81
- digitalhub/entities/secret/_base/status.py +0 -9
- digitalhub/entities/task/_base/__init__.py +0 -0
- digitalhub/entities/task/_base/builder.py +0 -91
- digitalhub/entities/task/_base/status.py +0 -9
- digitalhub/entities/utils/__init__.py +0 -0
- digitalhub/entities/workflow/_base/__init__.py +0 -0
- digitalhub/entities/workflow/_base/builder.py +0 -79
- digitalhub/entities/workflow/_base/spec.py +0 -15
- digitalhub/entities/workflow/_base/status.py +0 -9
- digitalhub/factory/__init__.py +0 -0
- digitalhub/factory/api.py +0 -277
- digitalhub/factory/factory.py +0 -268
- digitalhub/factory/utils.py +0 -90
- digitalhub/readers/_base/__init__.py +0 -0
- digitalhub/readers/_base/builder.py +0 -26
- digitalhub/readers/api.py +0 -80
- digitalhub/readers/factory.py +0 -133
- digitalhub/readers/pandas/__init__.py +0 -0
- digitalhub/readers/pandas/builder.py +0 -29
- digitalhub/stores/_base/__init__.py +0 -0
- digitalhub/stores/api.py +0 -54
- digitalhub/stores/local/__init__.py +0 -0
- digitalhub/stores/remote/__init__.py +0 -0
- digitalhub/stores/s3/__init__.py +0 -0
- digitalhub/stores/sql/__init__.py +0 -0
- digitalhub/utils/s3_utils.py +0 -58
- digitalhub-0.8.0.dist-info/RECORD +0 -231
- test/local/CRUD/test_artifacts.py +0 -96
- test/local/CRUD/test_dataitems.py +0 -96
- test/local/CRUD/test_models.py +0 -95
- /digitalhub/client/{_base → objects}/__init__.py +0 -0
- /digitalhub/client/{_base/client.py → objects/base.py} +0 -0
- /digitalhub/{client/dhcore → datastores/objects}/__init__.py +0 -0
- /digitalhub/entities/{utils → _base}/api.py +0 -0
- /digitalhub/{client/local → entities/_base/spec}/__init__.py +0 -0
- /digitalhub/entities/{utils → _base}/state.py +0 -0
- /digitalhub/{datastores/_base → entities/_base/status}/__init__.py +0 -0
- /digitalhub/{datastores/local → entities/_builders}/__init__.py +0 -0
- /digitalhub/entities/{_base/entity/_constructors → _builders}/name.py +0 -0
- /digitalhub/{datastores/remote → entities/artifact/entity}/__init__.py +0 -0
- /digitalhub/{datastores/s3 → entities/dataitem/entity}/__init__.py +0 -0
- /digitalhub/entities/dataitem/{table/models.py → models.py} +0 -0
- /digitalhub/entities/{utils/entity_types.py → entity_types.py} +0 -0
- /digitalhub/{datastores/sql → entities/model/entity}/__init__.py +0 -0
- /digitalhub/entities/model/{mlflow/models.py → models.py} +0 -0
- /digitalhub/{entities/_base/_base → readers/objects}/__init__.py +0 -0
- /digitalhub/readers/{_base/reader.py → objects/base.py} +0 -0
- /digitalhub/{entities/_base/context → registry}/__init__.py +0 -0
- /digitalhub/{entities/_base/entity/_constructors → stores/objects}/__init__.py +0 -0
- /digitalhub/stores/{_base/store.py → objects/base.py} +0 -0
- {digitalhub-0.8.0.dist-info → digitalhub-0.8.0b1.dist-info}/LICENSE.txt +0 -0
- {digitalhub-0.8.0.dist-info → digitalhub-0.8.0b1.dist-info}/top_level.txt +0 -0
- /test/{local/imports/test_imports.py → test_imports.py} +0 -0
|
@@ -2,9 +2,9 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
from pathlib import Path
|
|
4
4
|
|
|
5
|
-
from digitalhub.entities.
|
|
5
|
+
from digitalhub.entities.entity_types import EntityTypes
|
|
6
|
+
from digitalhub.utils.env_utils import get_s3_bucket
|
|
6
7
|
from digitalhub.utils.file_utils import get_file_mime_type
|
|
7
|
-
from digitalhub.utils.s3_utils import get_s3_bucket
|
|
8
8
|
from digitalhub.utils.uri_utils import check_local_path
|
|
9
9
|
|
|
10
10
|
|
|
@@ -182,21 +182,3 @@ def build_log_path_from_source(
|
|
|
182
182
|
path += f"/{Path(source).name}"
|
|
183
183
|
|
|
184
184
|
return path
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
def get_entity_type_from_key(key: str) -> str:
|
|
188
|
-
"""
|
|
189
|
-
Get entity type.
|
|
190
|
-
|
|
191
|
-
Parameters
|
|
192
|
-
----------
|
|
193
|
-
key : str
|
|
194
|
-
The key of the entity.
|
|
195
|
-
|
|
196
|
-
Returns
|
|
197
|
-
-------
|
|
198
|
-
str
|
|
199
|
-
The entity type.
|
|
200
|
-
"""
|
|
201
|
-
_, entity_type, _, _, _ = parse_entity_key(key)
|
|
202
|
-
return entity_type
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from digitalhub.entities._builders.metadata import build_metadata
|
|
4
|
+
from digitalhub.entities._builders.name import build_name
|
|
5
|
+
from digitalhub.entities._builders.spec import build_spec
|
|
6
|
+
from digitalhub.entities._builders.status import build_status
|
|
7
|
+
from digitalhub.entities._builders.uuid import build_uuid
|
|
8
|
+
from digitalhub.entities.workflow.entity import Workflow
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def workflow_from_parameters(
|
|
12
|
+
project: str,
|
|
13
|
+
name: str,
|
|
14
|
+
kind: str,
|
|
15
|
+
uuid: str | None = None,
|
|
16
|
+
description: str | None = None,
|
|
17
|
+
labels: list[str] | None = None,
|
|
18
|
+
embedded: bool = True,
|
|
19
|
+
**kwargs,
|
|
20
|
+
) -> Workflow:
|
|
21
|
+
"""
|
|
22
|
+
Create a new object.
|
|
23
|
+
|
|
24
|
+
Parameters
|
|
25
|
+
----------
|
|
26
|
+
project : str
|
|
27
|
+
Project name.
|
|
28
|
+
name : str
|
|
29
|
+
Object name.
|
|
30
|
+
kind : str
|
|
31
|
+
Kind the object.
|
|
32
|
+
uuid : str
|
|
33
|
+
ID of the object (UUID4, e.g. 40f25c4b-d26b-4221-b048-9527aff291e2).
|
|
34
|
+
labels : list[str]
|
|
35
|
+
List of labels.
|
|
36
|
+
description : str
|
|
37
|
+
Description of the object (human readable).
|
|
38
|
+
embedded : bool
|
|
39
|
+
Flag to determine if object spec must be embedded in project spec.
|
|
40
|
+
**kwargs : dict
|
|
41
|
+
Spec keyword arguments.
|
|
42
|
+
|
|
43
|
+
Returns
|
|
44
|
+
-------
|
|
45
|
+
Workflow
|
|
46
|
+
Object instance.
|
|
47
|
+
"""
|
|
48
|
+
name = build_name(name)
|
|
49
|
+
uuid = build_uuid(uuid)
|
|
50
|
+
spec = build_spec(
|
|
51
|
+
kind,
|
|
52
|
+
**kwargs,
|
|
53
|
+
)
|
|
54
|
+
metadata = build_metadata(
|
|
55
|
+
kind,
|
|
56
|
+
project=project,
|
|
57
|
+
name=name,
|
|
58
|
+
version=uuid,
|
|
59
|
+
description=description,
|
|
60
|
+
labels=labels,
|
|
61
|
+
embedded=embedded,
|
|
62
|
+
)
|
|
63
|
+
status = build_status(
|
|
64
|
+
kind,
|
|
65
|
+
)
|
|
66
|
+
return Workflow(
|
|
67
|
+
project=project,
|
|
68
|
+
name=name,
|
|
69
|
+
uuid=uuid,
|
|
70
|
+
kind=kind,
|
|
71
|
+
metadata=metadata,
|
|
72
|
+
spec=spec,
|
|
73
|
+
status=status,
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def workflow_from_dict(obj: dict) -> Workflow:
|
|
78
|
+
"""
|
|
79
|
+
Create a new object from dictionary.
|
|
80
|
+
|
|
81
|
+
Parameters
|
|
82
|
+
----------
|
|
83
|
+
obj : dict
|
|
84
|
+
Dictionary to create object from.
|
|
85
|
+
|
|
86
|
+
Returns
|
|
87
|
+
-------
|
|
88
|
+
Workflow
|
|
89
|
+
Object instance.
|
|
90
|
+
"""
|
|
91
|
+
return Workflow.from_dict(obj)
|
|
@@ -2,18 +2,20 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import typing
|
|
4
4
|
|
|
5
|
+
from digitalhub.context.builder import check_context
|
|
5
6
|
from digitalhub.entities._base.crud import (
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
list_context_entities,
|
|
11
|
-
new_context_entity,
|
|
7
|
+
delete_entity_api_ctx,
|
|
8
|
+
list_entity_api_ctx,
|
|
9
|
+
read_entity_api_ctx,
|
|
10
|
+
read_entity_api_ctx_versions,
|
|
12
11
|
)
|
|
13
|
-
from digitalhub.entities.
|
|
12
|
+
from digitalhub.entities.entity_types import EntityTypes
|
|
13
|
+
from digitalhub.entities.workflow.builder import workflow_from_dict, workflow_from_parameters
|
|
14
|
+
from digitalhub.utils.exceptions import EntityAlreadyExistsError
|
|
15
|
+
from digitalhub.utils.io_utils import read_yaml
|
|
14
16
|
|
|
15
17
|
if typing.TYPE_CHECKING:
|
|
16
|
-
from digitalhub.entities.workflow.
|
|
18
|
+
from digitalhub.entities.workflow.entity import Workflow
|
|
17
19
|
|
|
18
20
|
|
|
19
21
|
ENTITY_TYPE = EntityTypes.WORKFLOW.value
|
|
@@ -26,7 +28,7 @@ def new_workflow(
|
|
|
26
28
|
uuid: str | None = None,
|
|
27
29
|
description: str | None = None,
|
|
28
30
|
labels: list[str] | None = None,
|
|
29
|
-
embedded: bool =
|
|
31
|
+
embedded: bool = True,
|
|
30
32
|
**kwargs,
|
|
31
33
|
) -> Workflow:
|
|
32
34
|
"""
|
|
@@ -39,7 +41,7 @@ def new_workflow(
|
|
|
39
41
|
name : str
|
|
40
42
|
Object name.
|
|
41
43
|
uuid : str
|
|
42
|
-
ID of the object.
|
|
44
|
+
ID of the object (UUID4, e.g. 40f25c4b-d26b-4221-b048-9527aff291e2).
|
|
43
45
|
description : str
|
|
44
46
|
Description of the object (human readable).
|
|
45
47
|
labels : list[str]
|
|
@@ -62,7 +64,8 @@ def new_workflow(
|
|
|
62
64
|
>>> code_src="pipeline.py",
|
|
63
65
|
>>> handler="pipeline-handler")
|
|
64
66
|
"""
|
|
65
|
-
|
|
67
|
+
check_context(project)
|
|
68
|
+
obj = workflow_from_parameters(
|
|
66
69
|
project=project,
|
|
67
70
|
name=name,
|
|
68
71
|
kind=kind,
|
|
@@ -72,6 +75,8 @@ def new_workflow(
|
|
|
72
75
|
embedded=embedded,
|
|
73
76
|
**kwargs,
|
|
74
77
|
)
|
|
78
|
+
obj.save()
|
|
79
|
+
return obj
|
|
75
80
|
|
|
76
81
|
|
|
77
82
|
def get_workflow(
|
|
@@ -109,13 +114,14 @@ def get_workflow(
|
|
|
109
114
|
>>> project="my-project",
|
|
110
115
|
>>> entity_id="my-workflow-id")
|
|
111
116
|
"""
|
|
112
|
-
|
|
117
|
+
obj = read_entity_api_ctx(
|
|
113
118
|
identifier,
|
|
114
|
-
|
|
119
|
+
ENTITY_TYPE,
|
|
115
120
|
project=project,
|
|
116
121
|
entity_id=entity_id,
|
|
117
122
|
**kwargs,
|
|
118
123
|
)
|
|
124
|
+
return workflow_from_dict(obj)
|
|
119
125
|
|
|
120
126
|
|
|
121
127
|
def get_workflow_versions(
|
|
@@ -149,12 +155,13 @@ def get_workflow_versions(
|
|
|
149
155
|
>>> obj = get_workflow_versions("my-workflow-name"
|
|
150
156
|
>>> project="my-project")
|
|
151
157
|
"""
|
|
152
|
-
|
|
158
|
+
obj = read_entity_api_ctx_versions(
|
|
153
159
|
identifier,
|
|
154
160
|
entity_type=ENTITY_TYPE,
|
|
155
161
|
project=project,
|
|
156
162
|
**kwargs,
|
|
157
163
|
)
|
|
164
|
+
return [workflow_from_dict(o) for o in obj]
|
|
158
165
|
|
|
159
166
|
|
|
160
167
|
def list_workflows(project: str, **kwargs) -> list[Workflow]:
|
|
@@ -177,11 +184,12 @@ def list_workflows(project: str, **kwargs) -> list[Workflow]:
|
|
|
177
184
|
--------
|
|
178
185
|
>>> objs = list_workflows(project="my-project")
|
|
179
186
|
"""
|
|
180
|
-
|
|
187
|
+
objs = list_entity_api_ctx(
|
|
181
188
|
project=project,
|
|
182
189
|
entity_type=ENTITY_TYPE,
|
|
183
190
|
**kwargs,
|
|
184
191
|
)
|
|
192
|
+
return [workflow_from_dict(obj) for obj in objs]
|
|
185
193
|
|
|
186
194
|
|
|
187
195
|
def import_workflow(file: str) -> Workflow:
|
|
@@ -202,7 +210,25 @@ def import_workflow(file: str) -> Workflow:
|
|
|
202
210
|
--------
|
|
203
211
|
>>> obj = import_workflow("my-workflow.yaml")
|
|
204
212
|
"""
|
|
205
|
-
|
|
213
|
+
dict_obj: dict | list[dict] = read_yaml(file)
|
|
214
|
+
if isinstance(dict_obj, list):
|
|
215
|
+
wkf_dict = dict_obj[0]
|
|
216
|
+
tsk_dicts = dict_obj[1:]
|
|
217
|
+
else:
|
|
218
|
+
wkf_dict = dict_obj
|
|
219
|
+
tsk_dicts = []
|
|
220
|
+
|
|
221
|
+
check_context(wkf_dict.get("project"))
|
|
222
|
+
obj = workflow_from_dict(wkf_dict)
|
|
223
|
+
|
|
224
|
+
obj.import_tasks(tsk_dicts)
|
|
225
|
+
|
|
226
|
+
try:
|
|
227
|
+
obj.save()
|
|
228
|
+
except EntityAlreadyExistsError:
|
|
229
|
+
pass
|
|
230
|
+
finally:
|
|
231
|
+
return obj
|
|
206
232
|
|
|
207
233
|
|
|
208
234
|
def update_workflow(entity: Workflow) -> Workflow:
|
|
@@ -267,7 +293,7 @@ def delete_workflow(
|
|
|
267
293
|
>>> project="my-project",
|
|
268
294
|
>>> delete_all_versions=True)
|
|
269
295
|
"""
|
|
270
|
-
return
|
|
296
|
+
return delete_entity_api_ctx(
|
|
271
297
|
identifier=identifier,
|
|
272
298
|
entity_type=ENTITY_TYPE,
|
|
273
299
|
project=project,
|
|
@@ -2,16 +2,16 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import typing
|
|
4
4
|
|
|
5
|
-
from digitalhub.entities._base.executable
|
|
6
|
-
from digitalhub.entities.
|
|
7
|
-
from digitalhub.
|
|
5
|
+
from digitalhub.entities._base.entity.executable import ExecutableEntity
|
|
6
|
+
from digitalhub.entities.entity_types import EntityTypes
|
|
7
|
+
from digitalhub.runtimes.builder import get_kind_registry
|
|
8
8
|
from digitalhub.utils.exceptions import BackendError
|
|
9
9
|
|
|
10
10
|
if typing.TYPE_CHECKING:
|
|
11
|
-
from digitalhub.entities._base.
|
|
12
|
-
from digitalhub.entities.run.
|
|
13
|
-
from digitalhub.entities.workflow.
|
|
14
|
-
from digitalhub.entities.workflow.
|
|
11
|
+
from digitalhub.entities._base.metadata import Metadata
|
|
12
|
+
from digitalhub.entities.run.entity import Run
|
|
13
|
+
from digitalhub.entities.workflow.spec import WorkflowSpec
|
|
14
|
+
from digitalhub.entities.workflow.status import WorkflowStatus
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
class Workflow(ExecutableEntity):
|
|
@@ -60,9 +60,12 @@ class Workflow(ExecutableEntity):
|
|
|
60
60
|
if action is None:
|
|
61
61
|
action = "pipeline"
|
|
62
62
|
|
|
63
|
+
# Get kind registry
|
|
64
|
+
kind_reg = get_kind_registry(self.kind)
|
|
65
|
+
|
|
63
66
|
# Get task and run kind
|
|
64
|
-
task_kind = get_task_kind_from_action(
|
|
65
|
-
run_kind = get_run_kind(
|
|
67
|
+
task_kind = kind_reg.get_task_kind_from_action(action=action)
|
|
68
|
+
run_kind = kind_reg.get_run_kind()
|
|
66
69
|
|
|
67
70
|
# Create or update new task
|
|
68
71
|
task = self._get_or_create_task(task_kind)
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from digitalhub.entities._base.spec.base import Spec, SpecParams
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class WorkflowSpec(Spec):
|
|
7
|
+
"""
|
|
8
|
+
Workflow specifications.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class WorkflowParams(SpecParams):
|
|
13
|
+
"""
|
|
14
|
+
Workflow parameters.
|
|
15
|
+
"""
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import typing
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
from digitalhub.readers.registry import REGISTRY_DATAFRAME, REGISTRY_FRAMEWORK
|
|
7
|
+
|
|
8
|
+
if typing.TYPE_CHECKING:
|
|
9
|
+
from digitalhub.readers.objects.base import DataframeReader
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def get_reader_by_engine(engine: str) -> DataframeReader:
|
|
13
|
+
"""
|
|
14
|
+
Get Dataframe reader.
|
|
15
|
+
|
|
16
|
+
Parameters
|
|
17
|
+
----------
|
|
18
|
+
engine : str
|
|
19
|
+
Dataframe engine (pandas, polars, etc.).
|
|
20
|
+
|
|
21
|
+
Returns
|
|
22
|
+
-------
|
|
23
|
+
DataframeReader
|
|
24
|
+
Reader object.
|
|
25
|
+
"""
|
|
26
|
+
try:
|
|
27
|
+
return REGISTRY_FRAMEWORK[engine]()
|
|
28
|
+
except KeyError:
|
|
29
|
+
engines = list(REGISTRY_FRAMEWORK.keys())
|
|
30
|
+
msg = f"Unsupported dataframe engine: {engine}. Supported engines: {engines}"
|
|
31
|
+
raise ValueError(msg)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def get_reader_by_object(obj: Any) -> DataframeReader:
|
|
35
|
+
"""
|
|
36
|
+
Get Dataframe reader by object.
|
|
37
|
+
|
|
38
|
+
Parameters
|
|
39
|
+
----------
|
|
40
|
+
obj : Any
|
|
41
|
+
Object to get reader from.
|
|
42
|
+
|
|
43
|
+
Returns
|
|
44
|
+
-------
|
|
45
|
+
DataframeReader
|
|
46
|
+
Reader object.
|
|
47
|
+
"""
|
|
48
|
+
try:
|
|
49
|
+
obj_name = f"{obj.__class__.__module__}.{obj.__class__.__name__}"
|
|
50
|
+
return REGISTRY_DATAFRAME[obj_name]()
|
|
51
|
+
except KeyError:
|
|
52
|
+
types = list(REGISTRY_DATAFRAME.keys())
|
|
53
|
+
msg = f"Unsupported dataframe type: {obj}. Supported types: {types}"
|
|
54
|
+
raise ValueError(msg)
|
|
@@ -7,7 +7,7 @@ import numpy as np
|
|
|
7
7
|
import pandas as pd
|
|
8
8
|
from pandas.errors import ParserError
|
|
9
9
|
|
|
10
|
-
from digitalhub.readers.
|
|
10
|
+
from digitalhub.readers.objects.base import DataframeReader
|
|
11
11
|
from digitalhub.utils.data_utils import build_data_preview, get_data_preview
|
|
12
12
|
|
|
13
13
|
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
REGISTRY_FRAMEWORK = {}
|
|
4
|
+
REGISTRY_DATAFRAME = {}
|
|
5
|
+
DATAFRAME_TYPES = []
|
|
6
|
+
|
|
7
|
+
try:
|
|
8
|
+
from digitalhub.readers.objects.pandas import DataframeReaderPandas
|
|
9
|
+
|
|
10
|
+
REGISTRY_FRAMEWORK["pandas"] = DataframeReaderPandas
|
|
11
|
+
REGISTRY_DATAFRAME["pandas.core.frame.DataFrame"] = DataframeReaderPandas
|
|
12
|
+
DATAFRAME_TYPES.append("pandas.core.frame.DataFrame")
|
|
13
|
+
|
|
14
|
+
except ImportError:
|
|
15
|
+
pass
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from pydantic import BaseModel
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class RuntimeEntry(BaseModel):
|
|
7
|
+
"""
|
|
8
|
+
Model for Runtime entry.
|
|
9
|
+
It specifies the module path and the runtime class name.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
module: str
|
|
13
|
+
"""Module path."""
|
|
14
|
+
|
|
15
|
+
class_name: str
|
|
16
|
+
"""Class name."""
|
|
17
|
+
|
|
18
|
+
kind_registry_module: str
|
|
19
|
+
"""Kind registry module path."""
|
|
20
|
+
|
|
21
|
+
kind_registry_class_name: str
|
|
22
|
+
"""Kind registry class name."""
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class SpecEntry(BaseModel):
|
|
26
|
+
"""
|
|
27
|
+
Model for Spec entry.
|
|
28
|
+
It specifies the module path, the spec class name
|
|
29
|
+
and the spec pydantic class validator.
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
module: str
|
|
33
|
+
"""Module path."""
|
|
34
|
+
|
|
35
|
+
class_name: str
|
|
36
|
+
"""Class name."""
|
|
37
|
+
|
|
38
|
+
parameters_validator: str
|
|
39
|
+
"""Class name of the parameter validator."""
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class StatusEntry(BaseModel):
|
|
43
|
+
"""
|
|
44
|
+
Model for Status entry.
|
|
45
|
+
It specifies the module path and the status class name.
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
module: str
|
|
49
|
+
"""Module path."""
|
|
50
|
+
|
|
51
|
+
class_name: str
|
|
52
|
+
"""Class name."""
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class MetadataEntry(BaseModel):
|
|
56
|
+
"""
|
|
57
|
+
Model for Metadata entry.
|
|
58
|
+
It specifies the module path and the metadata class name.
|
|
59
|
+
"""
|
|
60
|
+
|
|
61
|
+
module: str
|
|
62
|
+
"""Module path."""
|
|
63
|
+
|
|
64
|
+
class_name: str
|
|
65
|
+
"""Class name."""
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
class RegistryEntry(BaseModel):
|
|
69
|
+
"""
|
|
70
|
+
Basic entry model for every entity.
|
|
71
|
+
Functions, tasks and runs specify also the runtime field.
|
|
72
|
+
"""
|
|
73
|
+
|
|
74
|
+
entity_type: str
|
|
75
|
+
"""Entity type."""
|
|
76
|
+
|
|
77
|
+
spec: SpecEntry
|
|
78
|
+
"""Spec infos."""
|
|
79
|
+
|
|
80
|
+
status: StatusEntry
|
|
81
|
+
"""Status infos."""
|
|
82
|
+
|
|
83
|
+
metadata: MetadataEntry
|
|
84
|
+
"""Metadata infos."""
|
|
85
|
+
|
|
86
|
+
runtime: RuntimeEntry = None
|
|
87
|
+
"""Runtime infos."""
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from digitalhub.registry.models import RegistryEntry
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class GlobalEntityRegistry:
|
|
7
|
+
"""
|
|
8
|
+
Global entity registry where all entities classpaths are stored.
|
|
9
|
+
It keeps track of all entities that are registered in the system.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
def register(self, entity_kind: str, entry: dict) -> None:
|
|
13
|
+
"""
|
|
14
|
+
Register an entity kind.
|
|
15
|
+
|
|
16
|
+
Parameters
|
|
17
|
+
----------
|
|
18
|
+
entity_kind : str
|
|
19
|
+
Entity kind to be registered.
|
|
20
|
+
entry : dict
|
|
21
|
+
Entry to be registered.
|
|
22
|
+
|
|
23
|
+
Returns
|
|
24
|
+
-------
|
|
25
|
+
None
|
|
26
|
+
|
|
27
|
+
"""
|
|
28
|
+
if hasattr(self, entity_kind):
|
|
29
|
+
raise ValueError(f"Entity kind {entity_kind} already registered")
|
|
30
|
+
entry = RegistryEntry(**entry)
|
|
31
|
+
setattr(self, entity_kind, entry)
|
|
32
|
+
|
|
33
|
+
def update(self, entity_kind: str, entry: dict) -> None:
|
|
34
|
+
"""
|
|
35
|
+
Update an entity kind.
|
|
36
|
+
|
|
37
|
+
Parameters
|
|
38
|
+
----------
|
|
39
|
+
entity_kind : str
|
|
40
|
+
Entity kind to be updated.
|
|
41
|
+
entry : dict
|
|
42
|
+
Entry to be updated.
|
|
43
|
+
|
|
44
|
+
Returns
|
|
45
|
+
-------
|
|
46
|
+
None
|
|
47
|
+
"""
|
|
48
|
+
if hasattr(self, entity_kind):
|
|
49
|
+
entry = RegistryEntry(**entry)
|
|
50
|
+
setattr(self, entity_kind, entry)
|
|
51
|
+
else:
|
|
52
|
+
raise ValueError(f"Entity kind {entity_kind} not registered")
|
|
53
|
+
|
|
54
|
+
def get_entity_type(self, entity_kind: str) -> str:
|
|
55
|
+
"""
|
|
56
|
+
Get entity type from kind.
|
|
57
|
+
|
|
58
|
+
Parameters
|
|
59
|
+
----------
|
|
60
|
+
entity_kind : str
|
|
61
|
+
Entity kind.
|
|
62
|
+
|
|
63
|
+
Returns
|
|
64
|
+
-------
|
|
65
|
+
str
|
|
66
|
+
Entity type.
|
|
67
|
+
"""
|
|
68
|
+
if not hasattr(self, entity_kind):
|
|
69
|
+
raise ValueError(f"Entity kind {entity_kind} not registered")
|
|
70
|
+
entry: RegistryEntry = getattr(self, entity_kind)
|
|
71
|
+
return entry.entity_type
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
registry = GlobalEntityRegistry()
|