digitalhub 0.7.0b2__py3-none-any.whl → 0.8.0__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 +63 -93
- digitalhub/client/__init__.py +0 -0
- digitalhub/client/_base/__init__.py +0 -0
- digitalhub/client/_base/client.py +56 -0
- digitalhub/client/api.py +63 -0
- digitalhub/client/builder.py +50 -0
- digitalhub/client/dhcore/__init__.py +0 -0
- digitalhub/client/dhcore/client.py +669 -0
- digitalhub/client/dhcore/env.py +21 -0
- digitalhub/client/dhcore/models.py +46 -0
- digitalhub/client/dhcore/utils.py +111 -0
- digitalhub/client/local/__init__.py +0 -0
- digitalhub/client/local/client.py +533 -0
- digitalhub/context/__init__.py +0 -0
- digitalhub/context/api.py +93 -0
- digitalhub/context/builder.py +94 -0
- digitalhub/context/context.py +136 -0
- digitalhub/datastores/__init__.py +0 -0
- digitalhub/datastores/_base/__init__.py +0 -0
- digitalhub/datastores/_base/datastore.py +85 -0
- digitalhub/datastores/api.py +37 -0
- digitalhub/datastores/builder.py +110 -0
- digitalhub/datastores/local/__init__.py +0 -0
- digitalhub/datastores/local/datastore.py +50 -0
- digitalhub/datastores/remote/__init__.py +0 -0
- digitalhub/datastores/remote/datastore.py +31 -0
- digitalhub/datastores/s3/__init__.py +0 -0
- digitalhub/datastores/s3/datastore.py +46 -0
- digitalhub/datastores/sql/__init__.py +0 -0
- digitalhub/datastores/sql/datastore.py +68 -0
- digitalhub/entities/__init__.py +0 -0
- digitalhub/entities/_base/__init__.py +0 -0
- digitalhub/entities/_base/_base/__init__.py +0 -0
- digitalhub/entities/_base/_base/entity.py +82 -0
- digitalhub/entities/_base/api_utils.py +620 -0
- digitalhub/entities/_base/context/__init__.py +0 -0
- digitalhub/entities/_base/context/entity.py +118 -0
- digitalhub/entities/_base/crud.py +468 -0
- digitalhub/entities/_base/entity/__init__.py +0 -0
- digitalhub/entities/_base/entity/_constructors/__init__.py +0 -0
- digitalhub/entities/_base/entity/_constructors/metadata.py +44 -0
- digitalhub/entities/_base/entity/_constructors/name.py +31 -0
- digitalhub/entities/_base/entity/_constructors/spec.py +33 -0
- digitalhub/entities/_base/entity/_constructors/status.py +52 -0
- digitalhub/entities/_base/entity/_constructors/uuid.py +26 -0
- digitalhub/entities/_base/entity/builder.py +175 -0
- digitalhub/entities/_base/entity/entity.py +106 -0
- digitalhub/entities/_base/entity/metadata.py +59 -0
- digitalhub/entities/_base/entity/spec.py +58 -0
- digitalhub/entities/_base/entity/status.py +43 -0
- digitalhub/entities/_base/executable/__init__.py +0 -0
- digitalhub/entities/_base/executable/entity.py +405 -0
- digitalhub/entities/_base/material/__init__.py +0 -0
- digitalhub/entities/_base/material/entity.py +214 -0
- digitalhub/entities/_base/material/spec.py +22 -0
- digitalhub/entities/_base/material/status.py +49 -0
- digitalhub/entities/_base/runtime_entity/__init__.py +0 -0
- digitalhub/entities/_base/runtime_entity/builder.py +106 -0
- digitalhub/entities/_base/unversioned/__init__.py +0 -0
- digitalhub/entities/_base/unversioned/builder.py +66 -0
- digitalhub/entities/_base/unversioned/entity.py +49 -0
- digitalhub/entities/_base/versioned/__init__.py +0 -0
- digitalhub/entities/_base/versioned/builder.py +68 -0
- digitalhub/entities/_base/versioned/entity.py +53 -0
- digitalhub/entities/artifact/__init__.py +0 -0
- digitalhub/entities/artifact/_base/__init__.py +0 -0
- digitalhub/entities/artifact/_base/builder.py +86 -0
- digitalhub/entities/artifact/_base/entity.py +39 -0
- digitalhub/entities/artifact/_base/spec.py +15 -0
- digitalhub/entities/artifact/_base/status.py +9 -0
- digitalhub/entities/artifact/artifact/__init__.py +0 -0
- digitalhub/entities/artifact/artifact/builder.py +18 -0
- digitalhub/entities/artifact/artifact/entity.py +32 -0
- digitalhub/entities/artifact/artifact/spec.py +27 -0
- digitalhub/entities/artifact/artifact/status.py +15 -0
- digitalhub/entities/artifact/crud.py +332 -0
- digitalhub/entities/builders.py +63 -0
- digitalhub/entities/dataitem/__init__.py +0 -0
- digitalhub/entities/dataitem/_base/__init__.py +0 -0
- digitalhub/entities/dataitem/_base/builder.py +86 -0
- digitalhub/entities/dataitem/_base/entity.py +75 -0
- digitalhub/entities/dataitem/_base/spec.py +15 -0
- digitalhub/entities/dataitem/_base/status.py +20 -0
- digitalhub/entities/dataitem/crud.py +372 -0
- digitalhub/entities/dataitem/dataitem/__init__.py +0 -0
- digitalhub/entities/dataitem/dataitem/builder.py +18 -0
- digitalhub/entities/dataitem/dataitem/entity.py +32 -0
- digitalhub/entities/dataitem/dataitem/spec.py +15 -0
- digitalhub/entities/dataitem/dataitem/status.py +9 -0
- digitalhub/entities/dataitem/iceberg/__init__.py +0 -0
- digitalhub/entities/dataitem/iceberg/builder.py +18 -0
- digitalhub/entities/dataitem/iceberg/entity.py +32 -0
- digitalhub/entities/dataitem/iceberg/spec.py +15 -0
- digitalhub/entities/dataitem/iceberg/status.py +9 -0
- digitalhub/entities/dataitem/table/__init__.py +0 -0
- digitalhub/entities/dataitem/table/builder.py +18 -0
- digitalhub/entities/dataitem/table/entity.py +146 -0
- digitalhub/entities/dataitem/table/models.py +62 -0
- digitalhub/entities/dataitem/table/spec.py +25 -0
- digitalhub/entities/dataitem/table/status.py +9 -0
- digitalhub/entities/function/__init__.py +0 -0
- digitalhub/entities/function/_base/__init__.py +0 -0
- digitalhub/entities/function/_base/builder.py +79 -0
- digitalhub/entities/function/_base/entity.py +98 -0
- digitalhub/entities/function/_base/models.py +118 -0
- digitalhub/entities/function/_base/spec.py +15 -0
- digitalhub/entities/function/_base/status.py +9 -0
- digitalhub/entities/function/crud.py +279 -0
- digitalhub/entities/model/__init__.py +0 -0
- digitalhub/entities/model/_base/__init__.py +0 -0
- digitalhub/entities/model/_base/builder.py +86 -0
- digitalhub/entities/model/_base/entity.py +34 -0
- digitalhub/entities/model/_base/spec.py +49 -0
- digitalhub/entities/model/_base/status.py +9 -0
- digitalhub/entities/model/crud.py +331 -0
- digitalhub/entities/model/huggingface/__init__.py +0 -0
- digitalhub/entities/model/huggingface/builder.py +18 -0
- digitalhub/entities/model/huggingface/entity.py +32 -0
- digitalhub/entities/model/huggingface/spec.py +36 -0
- digitalhub/entities/model/huggingface/status.py +9 -0
- digitalhub/entities/model/mlflow/__init__.py +0 -0
- digitalhub/entities/model/mlflow/builder.py +18 -0
- digitalhub/entities/model/mlflow/entity.py +32 -0
- digitalhub/entities/model/mlflow/models.py +26 -0
- digitalhub/entities/model/mlflow/spec.py +44 -0
- digitalhub/entities/model/mlflow/status.py +9 -0
- digitalhub/entities/model/mlflow/utils.py +81 -0
- digitalhub/entities/model/model/__init__.py +0 -0
- digitalhub/entities/model/model/builder.py +18 -0
- digitalhub/entities/model/model/entity.py +32 -0
- digitalhub/entities/model/model/spec.py +15 -0
- digitalhub/entities/model/model/status.py +9 -0
- digitalhub/entities/model/sklearn/__init__.py +0 -0
- digitalhub/entities/model/sklearn/builder.py +18 -0
- digitalhub/entities/model/sklearn/entity.py +32 -0
- digitalhub/entities/model/sklearn/spec.py +15 -0
- digitalhub/entities/model/sklearn/status.py +9 -0
- digitalhub/entities/project/__init__.py +0 -0
- digitalhub/entities/project/_base/__init__.py +0 -0
- digitalhub/entities/project/_base/builder.py +128 -0
- digitalhub/entities/project/_base/entity.py +2078 -0
- digitalhub/entities/project/_base/spec.py +50 -0
- digitalhub/entities/project/_base/status.py +9 -0
- digitalhub/entities/project/crud.py +357 -0
- digitalhub/entities/run/__init__.py +0 -0
- digitalhub/entities/run/_base/__init__.py +0 -0
- digitalhub/entities/run/_base/builder.py +94 -0
- digitalhub/entities/run/_base/entity.py +307 -0
- digitalhub/entities/run/_base/spec.py +50 -0
- digitalhub/entities/run/_base/status.py +9 -0
- digitalhub/entities/run/crud.py +219 -0
- digitalhub/entities/secret/__init__.py +0 -0
- digitalhub/entities/secret/_base/__init__.py +0 -0
- digitalhub/entities/secret/_base/builder.py +81 -0
- digitalhub/entities/secret/_base/entity.py +74 -0
- digitalhub/entities/secret/_base/spec.py +35 -0
- digitalhub/entities/secret/_base/status.py +9 -0
- digitalhub/entities/secret/crud.py +290 -0
- digitalhub/entities/task/__init__.py +0 -0
- digitalhub/entities/task/_base/__init__.py +0 -0
- digitalhub/entities/task/_base/builder.py +91 -0
- digitalhub/entities/task/_base/entity.py +136 -0
- digitalhub/entities/task/_base/models.py +208 -0
- digitalhub/entities/task/_base/spec.py +53 -0
- digitalhub/entities/task/_base/status.py +9 -0
- digitalhub/entities/task/crud.py +228 -0
- digitalhub/entities/utils/__init__.py +0 -0
- digitalhub/entities/utils/api.py +346 -0
- digitalhub/entities/utils/entity_types.py +19 -0
- digitalhub/entities/utils/state.py +31 -0
- digitalhub/entities/utils/utils.py +202 -0
- digitalhub/entities/workflow/__init__.py +0 -0
- digitalhub/entities/workflow/_base/__init__.py +0 -0
- digitalhub/entities/workflow/_base/builder.py +79 -0
- digitalhub/entities/workflow/_base/entity.py +74 -0
- digitalhub/entities/workflow/_base/spec.py +15 -0
- digitalhub/entities/workflow/_base/status.py +9 -0
- digitalhub/entities/workflow/crud.py +278 -0
- digitalhub/factory/__init__.py +0 -0
- digitalhub/factory/api.py +277 -0
- digitalhub/factory/factory.py +268 -0
- digitalhub/factory/utils.py +90 -0
- digitalhub/readers/__init__.py +0 -0
- digitalhub/readers/_base/__init__.py +0 -0
- digitalhub/readers/_base/builder.py +26 -0
- digitalhub/readers/_base/reader.py +70 -0
- digitalhub/readers/api.py +80 -0
- digitalhub/readers/factory.py +133 -0
- digitalhub/readers/pandas/__init__.py +0 -0
- digitalhub/readers/pandas/builder.py +29 -0
- digitalhub/readers/pandas/reader.py +207 -0
- digitalhub/runtimes/__init__.py +0 -0
- digitalhub/runtimes/_base.py +102 -0
- digitalhub/runtimes/builder.py +32 -0
- digitalhub/stores/__init__.py +0 -0
- digitalhub/stores/_base/__init__.py +0 -0
- digitalhub/stores/_base/store.py +189 -0
- digitalhub/stores/api.py +54 -0
- digitalhub/stores/builder.py +211 -0
- digitalhub/stores/local/__init__.py +0 -0
- digitalhub/stores/local/store.py +230 -0
- digitalhub/stores/remote/__init__.py +0 -0
- digitalhub/stores/remote/store.py +143 -0
- digitalhub/stores/s3/__init__.py +0 -0
- digitalhub/stores/s3/store.py +563 -0
- digitalhub/stores/sql/__init__.py +0 -0
- digitalhub/stores/sql/store.py +328 -0
- digitalhub/utils/__init__.py +0 -0
- digitalhub/utils/data_utils.py +127 -0
- digitalhub/utils/exceptions.py +67 -0
- digitalhub/utils/file_utils.py +204 -0
- digitalhub/utils/generic_utils.py +183 -0
- digitalhub/utils/git_utils.py +148 -0
- digitalhub/utils/io_utils.py +116 -0
- digitalhub/utils/logger.py +17 -0
- digitalhub/utils/s3_utils.py +58 -0
- digitalhub/utils/uri_utils.py +56 -0
- {digitalhub-0.7.0b2.dist-info → digitalhub-0.8.0.dist-info}/METADATA +30 -13
- digitalhub-0.8.0.dist-info/RECORD +231 -0
- {digitalhub-0.7.0b2.dist-info → digitalhub-0.8.0.dist-info}/WHEEL +1 -1
- test/local/CRUD/test_artifacts.py +96 -0
- test/local/CRUD/test_dataitems.py +96 -0
- test/local/CRUD/test_models.py +95 -0
- test/test_crud_functions.py +1 -1
- test/test_crud_runs.py +1 -1
- test/test_crud_tasks.py +1 -1
- digitalhub-0.7.0b2.dist-info/RECORD +0 -14
- test/test_crud_artifacts.py +0 -96
- test/test_crud_dataitems.py +0 -96
- {digitalhub-0.7.0b2.dist-info → digitalhub-0.8.0.dist-info}/LICENSE.txt +0 -0
- {digitalhub-0.7.0b2.dist-info → digitalhub-0.8.0.dist-info}/top_level.txt +0 -0
- /test/{test_imports.py → local/imports/test_imports.py} +0 -0
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import typing
|
|
4
|
+
|
|
5
|
+
from digitalhub.entities._base.crud import (
|
|
6
|
+
delete_entity,
|
|
7
|
+
get_material_entity,
|
|
8
|
+
get_material_entity_versions,
|
|
9
|
+
import_context_entity,
|
|
10
|
+
list_material_entities,
|
|
11
|
+
new_context_entity,
|
|
12
|
+
)
|
|
13
|
+
from digitalhub.entities._base.entity._constructors.uuid import build_uuid
|
|
14
|
+
from digitalhub.entities.artifact._base.entity import Artifact
|
|
15
|
+
from digitalhub.entities.utils.entity_types import EntityTypes
|
|
16
|
+
from digitalhub.entities.utils.utils import build_log_path_from_source, eval_local_source
|
|
17
|
+
|
|
18
|
+
if typing.TYPE_CHECKING:
|
|
19
|
+
from digitalhub.entities.artifact._base.entity import Artifact
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
ENTITY_TYPE = EntityTypes.ARTIFACT.value
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def new_artifact(
|
|
26
|
+
project: str,
|
|
27
|
+
name: str,
|
|
28
|
+
kind: str,
|
|
29
|
+
uuid: str | None = None,
|
|
30
|
+
description: str | None = None,
|
|
31
|
+
labels: list[str] | None = None,
|
|
32
|
+
embedded: bool = False,
|
|
33
|
+
path: str | None = None,
|
|
34
|
+
**kwargs,
|
|
35
|
+
) -> Artifact:
|
|
36
|
+
"""
|
|
37
|
+
Create a new object.
|
|
38
|
+
|
|
39
|
+
Parameters
|
|
40
|
+
----------
|
|
41
|
+
project : str
|
|
42
|
+
Project name.
|
|
43
|
+
name : str
|
|
44
|
+
Object name.
|
|
45
|
+
kind : str
|
|
46
|
+
Kind the object.
|
|
47
|
+
uuid : str
|
|
48
|
+
ID of the object.
|
|
49
|
+
description : str
|
|
50
|
+
Description of the object (human readable).
|
|
51
|
+
labels : list[str]
|
|
52
|
+
List of labels.
|
|
53
|
+
embedded : bool
|
|
54
|
+
Flag to determine if object spec must be embedded in project spec.
|
|
55
|
+
path : str
|
|
56
|
+
Object path on local file system or remote storage. It is also the destination path of upload() method.
|
|
57
|
+
**kwargs : dict
|
|
58
|
+
Spec keyword arguments.
|
|
59
|
+
|
|
60
|
+
Returns
|
|
61
|
+
-------
|
|
62
|
+
Artifact
|
|
63
|
+
Object instance.
|
|
64
|
+
|
|
65
|
+
Examples
|
|
66
|
+
--------
|
|
67
|
+
>>> obj = new_artifact(project="my-project",
|
|
68
|
+
>>> name="my-artifact",
|
|
69
|
+
>>> kind="artifact",
|
|
70
|
+
>>> path="s3://my-bucket/my-key")
|
|
71
|
+
"""
|
|
72
|
+
return new_context_entity(
|
|
73
|
+
project=project,
|
|
74
|
+
name=name,
|
|
75
|
+
kind=kind,
|
|
76
|
+
uuid=uuid,
|
|
77
|
+
description=description,
|
|
78
|
+
labels=labels,
|
|
79
|
+
embedded=embedded,
|
|
80
|
+
path=path,
|
|
81
|
+
**kwargs,
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def log_artifact(
|
|
86
|
+
project: str,
|
|
87
|
+
name: str,
|
|
88
|
+
kind: str,
|
|
89
|
+
source: list[str] | str,
|
|
90
|
+
path: str | None = None,
|
|
91
|
+
**kwargs,
|
|
92
|
+
) -> Artifact:
|
|
93
|
+
"""
|
|
94
|
+
Create and upload an object.
|
|
95
|
+
|
|
96
|
+
Parameters
|
|
97
|
+
----------
|
|
98
|
+
project : str
|
|
99
|
+
Project name.
|
|
100
|
+
name : str
|
|
101
|
+
Object name.
|
|
102
|
+
kind : str
|
|
103
|
+
Kind the object.
|
|
104
|
+
source : str
|
|
105
|
+
Artifact location on local path.
|
|
106
|
+
path : str
|
|
107
|
+
Destination path of the artifact. If not provided, it's generated.
|
|
108
|
+
**kwargs : dict
|
|
109
|
+
New artifact spec parameters.
|
|
110
|
+
|
|
111
|
+
Returns
|
|
112
|
+
-------
|
|
113
|
+
Artifact
|
|
114
|
+
Object instance.
|
|
115
|
+
|
|
116
|
+
Examples
|
|
117
|
+
--------
|
|
118
|
+
>>> obj = log_artifact(project="my-project",
|
|
119
|
+
>>> name="my-artifact",
|
|
120
|
+
>>> kind="artifact",
|
|
121
|
+
>>> source="./local-path")
|
|
122
|
+
"""
|
|
123
|
+
eval_local_source(source)
|
|
124
|
+
|
|
125
|
+
if path is None:
|
|
126
|
+
uuid = build_uuid()
|
|
127
|
+
kwargs["uuid"] = uuid
|
|
128
|
+
path = build_log_path_from_source(project, ENTITY_TYPE, name, uuid, source)
|
|
129
|
+
|
|
130
|
+
obj = new_artifact(project=project, name=name, kind=kind, path=path, **kwargs)
|
|
131
|
+
obj.upload(source)
|
|
132
|
+
return obj
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def get_artifact(
|
|
136
|
+
identifier: str,
|
|
137
|
+
project: str | None = None,
|
|
138
|
+
entity_id: str | None = None,
|
|
139
|
+
**kwargs,
|
|
140
|
+
) -> Artifact:
|
|
141
|
+
"""
|
|
142
|
+
Get object from backend.
|
|
143
|
+
|
|
144
|
+
Parameters
|
|
145
|
+
----------
|
|
146
|
+
identifier : str
|
|
147
|
+
Entity key (store://...) or entity name.
|
|
148
|
+
project : str
|
|
149
|
+
Project name.
|
|
150
|
+
entity_id : str
|
|
151
|
+
Entity ID.
|
|
152
|
+
**kwargs : dict
|
|
153
|
+
Parameters to pass to the API call.
|
|
154
|
+
|
|
155
|
+
Returns
|
|
156
|
+
-------
|
|
157
|
+
Artifact
|
|
158
|
+
Object instance.
|
|
159
|
+
|
|
160
|
+
Examples
|
|
161
|
+
--------
|
|
162
|
+
Using entity key:
|
|
163
|
+
>>> obj = get_artifact("store://my-artifact-key")
|
|
164
|
+
|
|
165
|
+
Using entity name:
|
|
166
|
+
>>> obj = get_artifact("my-artifact-name"
|
|
167
|
+
>>> project="my-project",
|
|
168
|
+
>>> entity_id="my-artifact-id")
|
|
169
|
+
"""
|
|
170
|
+
return get_material_entity(
|
|
171
|
+
identifier=identifier,
|
|
172
|
+
entity_type=ENTITY_TYPE,
|
|
173
|
+
project=project,
|
|
174
|
+
entity_id=entity_id,
|
|
175
|
+
**kwargs,
|
|
176
|
+
)
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
def get_artifact_versions(
|
|
180
|
+
identifier: str,
|
|
181
|
+
project: str | None = None,
|
|
182
|
+
**kwargs,
|
|
183
|
+
) -> list[Artifact]:
|
|
184
|
+
"""
|
|
185
|
+
Get object versions from backend.
|
|
186
|
+
|
|
187
|
+
Parameters
|
|
188
|
+
----------
|
|
189
|
+
identifier : str
|
|
190
|
+
Entity key (store://...) or entity name.
|
|
191
|
+
project : str
|
|
192
|
+
Project name.
|
|
193
|
+
**kwargs : dict
|
|
194
|
+
Parameters to pass to the API call.
|
|
195
|
+
|
|
196
|
+
Returns
|
|
197
|
+
-------
|
|
198
|
+
list[Artifact]
|
|
199
|
+
List of object instances.
|
|
200
|
+
|
|
201
|
+
Examples
|
|
202
|
+
--------
|
|
203
|
+
Using entity key:
|
|
204
|
+
>>> obj = get_artifact_versions("store://my-artifact-key")
|
|
205
|
+
|
|
206
|
+
Using entity name:
|
|
207
|
+
>>> obj = get_artifact_versions("my-artifact-name"
|
|
208
|
+
>>> project="my-project")
|
|
209
|
+
"""
|
|
210
|
+
return get_material_entity_versions(
|
|
211
|
+
identifier=identifier,
|
|
212
|
+
entity_type=ENTITY_TYPE,
|
|
213
|
+
project=project,
|
|
214
|
+
**kwargs,
|
|
215
|
+
)
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
def list_artifacts(project: str, **kwargs) -> list[Artifact]:
|
|
219
|
+
"""
|
|
220
|
+
List all latest version objects from backend.
|
|
221
|
+
|
|
222
|
+
Parameters
|
|
223
|
+
----------
|
|
224
|
+
project : str
|
|
225
|
+
Project name.
|
|
226
|
+
**kwargs : dict
|
|
227
|
+
Parameters to pass to the API call.
|
|
228
|
+
|
|
229
|
+
Returns
|
|
230
|
+
-------
|
|
231
|
+
list[Artifact]
|
|
232
|
+
List of object instances.
|
|
233
|
+
|
|
234
|
+
Examples
|
|
235
|
+
--------
|
|
236
|
+
>>> objs = list_artifacts(project="my-project")
|
|
237
|
+
"""
|
|
238
|
+
return list_material_entities(
|
|
239
|
+
project=project,
|
|
240
|
+
entity_type=ENTITY_TYPE,
|
|
241
|
+
**kwargs,
|
|
242
|
+
)
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
def import_artifact(file: str) -> Artifact:
|
|
246
|
+
"""
|
|
247
|
+
Import object from a YAML file.
|
|
248
|
+
|
|
249
|
+
Parameters
|
|
250
|
+
----------
|
|
251
|
+
file : str
|
|
252
|
+
Path to YAML file.
|
|
253
|
+
|
|
254
|
+
Returns
|
|
255
|
+
-------
|
|
256
|
+
Artifact
|
|
257
|
+
Object instance.
|
|
258
|
+
|
|
259
|
+
Examples
|
|
260
|
+
--------
|
|
261
|
+
>>> obj = import_artifact("my-artifact.yaml")
|
|
262
|
+
"""
|
|
263
|
+
return import_context_entity(file)
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
def update_artifact(entity: Artifact) -> Artifact:
|
|
267
|
+
"""
|
|
268
|
+
Update object. Note that object spec are immutable.
|
|
269
|
+
|
|
270
|
+
Parameters
|
|
271
|
+
----------
|
|
272
|
+
entity : Artifact
|
|
273
|
+
Object to update.
|
|
274
|
+
|
|
275
|
+
Returns
|
|
276
|
+
-------
|
|
277
|
+
Artifact
|
|
278
|
+
Entity updated.
|
|
279
|
+
|
|
280
|
+
Examples
|
|
281
|
+
--------
|
|
282
|
+
>>> obj = update_artifact(obj)
|
|
283
|
+
"""
|
|
284
|
+
return entity.save(update=True)
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
def delete_artifact(
|
|
288
|
+
identifier: str,
|
|
289
|
+
project: str | None = None,
|
|
290
|
+
entity_id: str | None = None,
|
|
291
|
+
delete_all_versions: bool = False,
|
|
292
|
+
**kwargs,
|
|
293
|
+
) -> dict:
|
|
294
|
+
"""
|
|
295
|
+
Delete object from backend.
|
|
296
|
+
|
|
297
|
+
Parameters
|
|
298
|
+
----------
|
|
299
|
+
identifier : str
|
|
300
|
+
Entity key (store://...) or entity name.
|
|
301
|
+
project : str
|
|
302
|
+
Project name.
|
|
303
|
+
entity_id : str
|
|
304
|
+
Entity ID.
|
|
305
|
+
delete_all_versions : bool
|
|
306
|
+
Delete all versions of the named entity. If True, use entity name instead of entity key as identifier.
|
|
307
|
+
**kwargs : dict
|
|
308
|
+
Parameters to pass to the API call.
|
|
309
|
+
|
|
310
|
+
Returns
|
|
311
|
+
-------
|
|
312
|
+
dict
|
|
313
|
+
Response from backend.
|
|
314
|
+
|
|
315
|
+
Examples
|
|
316
|
+
--------
|
|
317
|
+
If delete_all_versions is False:
|
|
318
|
+
>>> delete_artifact("store://my-artifact-key")
|
|
319
|
+
|
|
320
|
+
Otherwise:
|
|
321
|
+
>>> delete_artifact("my-artifact-name",
|
|
322
|
+
>>> project="my-project",
|
|
323
|
+
>>> delete_all_versions=True)
|
|
324
|
+
"""
|
|
325
|
+
return delete_entity(
|
|
326
|
+
identifier=identifier,
|
|
327
|
+
entity_type=ENTITY_TYPE,
|
|
328
|
+
project=project,
|
|
329
|
+
entity_id=entity_id,
|
|
330
|
+
delete_all_versions=delete_all_versions,
|
|
331
|
+
**kwargs,
|
|
332
|
+
)
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from digitalhub.entities.artifact.artifact.builder import ArtifactArtifactBuilder
|
|
4
|
+
from digitalhub.entities.dataitem.dataitem.builder import DataitemDataitemBuilder
|
|
5
|
+
from digitalhub.entities.dataitem.table.builder import DataitemTableBuilder
|
|
6
|
+
from digitalhub.entities.model.mlflow.builder import ModelModelBuilder
|
|
7
|
+
from digitalhub.entities.project._base.builder import ProjectProjectBuilder
|
|
8
|
+
from digitalhub.entities.secret._base.builder import SecretSecretBuilder
|
|
9
|
+
|
|
10
|
+
entity_builders = (
|
|
11
|
+
(ProjectProjectBuilder.ENTITY_KIND, ProjectProjectBuilder),
|
|
12
|
+
(SecretSecretBuilder.ENTITY_KIND, SecretSecretBuilder),
|
|
13
|
+
(ArtifactArtifactBuilder.ENTITY_KIND, ArtifactArtifactBuilder),
|
|
14
|
+
(DataitemDataitemBuilder.ENTITY_KIND, DataitemDataitemBuilder),
|
|
15
|
+
(DataitemTableBuilder.ENTITY_KIND, DataitemTableBuilder),
|
|
16
|
+
(ModelModelBuilder.ENTITY_KIND, ModelModelBuilder),
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
##############################
|
|
20
|
+
# Potential uninstalled entities
|
|
21
|
+
##############################
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
try:
|
|
25
|
+
from digitalhub.entities.dataitem.iceberg.builder import DataitemIcebergBuilder
|
|
26
|
+
|
|
27
|
+
entity_builders = (
|
|
28
|
+
*entity_builders,
|
|
29
|
+
(DataitemIcebergBuilder.ENTITY_KIND, DataitemIcebergBuilder),
|
|
30
|
+
)
|
|
31
|
+
except ImportError:
|
|
32
|
+
...
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
try:
|
|
36
|
+
from digitalhub.entities.model.model.builder import ModelMlflowBuilder
|
|
37
|
+
|
|
38
|
+
entity_builders = (
|
|
39
|
+
*entity_builders,
|
|
40
|
+
(ModelMlflowBuilder.ENTITY_KIND, ModelMlflowBuilder),
|
|
41
|
+
)
|
|
42
|
+
except ImportError:
|
|
43
|
+
...
|
|
44
|
+
|
|
45
|
+
try:
|
|
46
|
+
from digitalhub.entities.model.sklearn.builder import ModelSklearnBuilder
|
|
47
|
+
|
|
48
|
+
entity_builders = (
|
|
49
|
+
*entity_builders,
|
|
50
|
+
(ModelSklearnBuilder.ENTITY_KIND, ModelSklearnBuilder),
|
|
51
|
+
)
|
|
52
|
+
except ImportError:
|
|
53
|
+
...
|
|
54
|
+
|
|
55
|
+
try:
|
|
56
|
+
from digitalhub.entities.model.huggingface.builder import ModelHuggingfaceBuilder
|
|
57
|
+
|
|
58
|
+
entity_builders = (
|
|
59
|
+
*entity_builders,
|
|
60
|
+
(ModelHuggingfaceBuilder.ENTITY_KIND, ModelHuggingfaceBuilder),
|
|
61
|
+
)
|
|
62
|
+
except ImportError:
|
|
63
|
+
...
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import typing
|
|
4
|
+
|
|
5
|
+
from digitalhub.entities._base.versioned.builder import VersionedBuilder
|
|
6
|
+
from digitalhub.entities.utils.entity_types import EntityTypes
|
|
7
|
+
from digitalhub.utils.exceptions import EntityError
|
|
8
|
+
|
|
9
|
+
if typing.TYPE_CHECKING:
|
|
10
|
+
from digitalhub.entities.dataitem._base.entity import Dataitem
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class DataitemBuilder(VersionedBuilder):
|
|
14
|
+
"""
|
|
15
|
+
Dataitem builder.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
ENTITY_TYPE = EntityTypes.DATAITEM.value
|
|
19
|
+
|
|
20
|
+
def build(
|
|
21
|
+
self,
|
|
22
|
+
kind: str,
|
|
23
|
+
project: str,
|
|
24
|
+
name: str,
|
|
25
|
+
uuid: str | None = None,
|
|
26
|
+
description: str | None = None,
|
|
27
|
+
labels: list[str] | None = None,
|
|
28
|
+
embedded: bool = False,
|
|
29
|
+
path: str | None = None,
|
|
30
|
+
**kwargs,
|
|
31
|
+
) -> Dataitem:
|
|
32
|
+
"""
|
|
33
|
+
Create a new object.
|
|
34
|
+
|
|
35
|
+
Parameters
|
|
36
|
+
----------
|
|
37
|
+
project : str
|
|
38
|
+
Project name.
|
|
39
|
+
name : str
|
|
40
|
+
Object name.
|
|
41
|
+
kind : str
|
|
42
|
+
Kind the object.
|
|
43
|
+
uuid : str
|
|
44
|
+
ID of the object.
|
|
45
|
+
description : str
|
|
46
|
+
Description of the object (human readable).
|
|
47
|
+
labels : list[str]
|
|
48
|
+
List of labels.
|
|
49
|
+
embedded : bool
|
|
50
|
+
Flag to determine if object spec must be embedded in project spec.
|
|
51
|
+
path : str
|
|
52
|
+
Object path on local file system or remote storage. It is also the destination path of upload() method.
|
|
53
|
+
**kwargs : dict
|
|
54
|
+
Spec keyword arguments.
|
|
55
|
+
|
|
56
|
+
Returns
|
|
57
|
+
-------
|
|
58
|
+
Dataitem
|
|
59
|
+
Object instance.
|
|
60
|
+
"""
|
|
61
|
+
if path is None:
|
|
62
|
+
raise EntityError("Path must be provided.")
|
|
63
|
+
|
|
64
|
+
name = self.build_name(name)
|
|
65
|
+
uuid = self.build_uuid(uuid)
|
|
66
|
+
metadata = self.build_metadata(
|
|
67
|
+
project=project,
|
|
68
|
+
name=name,
|
|
69
|
+
description=description,
|
|
70
|
+
labels=labels,
|
|
71
|
+
embedded=embedded,
|
|
72
|
+
)
|
|
73
|
+
spec = self.build_spec(
|
|
74
|
+
path=path,
|
|
75
|
+
**kwargs,
|
|
76
|
+
)
|
|
77
|
+
status = self.build_status()
|
|
78
|
+
return self.build_entity(
|
|
79
|
+
project=project,
|
|
80
|
+
name=name,
|
|
81
|
+
uuid=uuid,
|
|
82
|
+
kind=kind,
|
|
83
|
+
metadata=metadata,
|
|
84
|
+
spec=spec,
|
|
85
|
+
status=status,
|
|
86
|
+
)
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import typing
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
|
|
6
|
+
from digitalhub.entities._base.material.entity import MaterialEntity
|
|
7
|
+
from digitalhub.entities.utils.entity_types import EntityTypes
|
|
8
|
+
from digitalhub.utils.exceptions import EntityError
|
|
9
|
+
from digitalhub.utils.uri_utils import map_uri_scheme
|
|
10
|
+
|
|
11
|
+
if typing.TYPE_CHECKING:
|
|
12
|
+
from digitalhub.entities._base.entity.metadata import Metadata
|
|
13
|
+
from digitalhub.entities.dataitem._base.spec import DataitemSpec
|
|
14
|
+
from digitalhub.entities.dataitem._base.status import DataitemStatus
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class Dataitem(MaterialEntity):
|
|
18
|
+
"""
|
|
19
|
+
A class representing a dataitem.
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
ENTITY_TYPE = EntityTypes.DATAITEM.value
|
|
23
|
+
|
|
24
|
+
def __init__(
|
|
25
|
+
self,
|
|
26
|
+
project: str,
|
|
27
|
+
name: str,
|
|
28
|
+
uuid: str,
|
|
29
|
+
kind: str,
|
|
30
|
+
metadata: Metadata,
|
|
31
|
+
spec: DataitemSpec,
|
|
32
|
+
status: DataitemStatus,
|
|
33
|
+
user: str | None = None,
|
|
34
|
+
) -> None:
|
|
35
|
+
super().__init__(project, name, uuid, kind, metadata, spec, status, user)
|
|
36
|
+
self.spec: DataitemSpec
|
|
37
|
+
self.status: DataitemStatus
|
|
38
|
+
|
|
39
|
+
##############################
|
|
40
|
+
# Private helper methods
|
|
41
|
+
##############################
|
|
42
|
+
|
|
43
|
+
@staticmethod
|
|
44
|
+
def _get_extension(path: str, file_format: str | None = None) -> str:
|
|
45
|
+
"""
|
|
46
|
+
Get extension of path.
|
|
47
|
+
|
|
48
|
+
Parameters
|
|
49
|
+
----------
|
|
50
|
+
path : str
|
|
51
|
+
Path to get extension from.
|
|
52
|
+
file_format : str
|
|
53
|
+
File format.
|
|
54
|
+
|
|
55
|
+
Returns
|
|
56
|
+
-------
|
|
57
|
+
str
|
|
58
|
+
File extension.
|
|
59
|
+
|
|
60
|
+
Raises
|
|
61
|
+
------
|
|
62
|
+
EntityError
|
|
63
|
+
If file format is not supported.
|
|
64
|
+
"""
|
|
65
|
+
if file_format is not None:
|
|
66
|
+
return file_format
|
|
67
|
+
|
|
68
|
+
scheme = map_uri_scheme(path)
|
|
69
|
+
if scheme == "sql":
|
|
70
|
+
return "parquet"
|
|
71
|
+
|
|
72
|
+
ext = Path(path).suffix[1:]
|
|
73
|
+
if ext is not None:
|
|
74
|
+
return ext
|
|
75
|
+
raise EntityError("Unknown file format. Only csv and parquet are supported.")
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from digitalhub.entities._base.material.spec import MaterialSpec, MaterialValidator
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class DataitemSpec(MaterialSpec):
|
|
7
|
+
"""
|
|
8
|
+
DataitemSpec specifications.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class DataitemValidator(MaterialValidator):
|
|
13
|
+
"""
|
|
14
|
+
DataitemValidator validator.
|
|
15
|
+
"""
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from digitalhub.entities._base.material.status import MaterialStatus
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class DataitemStatus(MaterialStatus):
|
|
7
|
+
"""
|
|
8
|
+
DataitemStatus status.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
def __init__(
|
|
12
|
+
self,
|
|
13
|
+
state: str,
|
|
14
|
+
message: str | None = None,
|
|
15
|
+
files: list[dict] | None = None,
|
|
16
|
+
preview: dict | None = None,
|
|
17
|
+
**kwargs,
|
|
18
|
+
) -> None:
|
|
19
|
+
super().__init__(state, message, files)
|
|
20
|
+
self.preview = preview
|