digitalhub 0.8.0b2__py3-none-any.whl → 0.8.0b4__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 +5 -4
- digitalhub/client/builder.py +3 -3
- digitalhub/client/{objects/dhcore.py → dhcore/client.py} +9 -49
- digitalhub/client/dhcore/env.py +21 -0
- digitalhub/client/dhcore/models.py +46 -0
- digitalhub/{utils/env_utils.py → client/dhcore/utils.py} +1 -13
- digitalhub/client/{objects/local.py → local/client.py} +1 -1
- digitalhub/context/builder.py +1 -1
- digitalhub/context/context.py +1 -1
- digitalhub/datastores/{objects/base.py → _base/datastore.py} +1 -1
- digitalhub/datastores/builder.py +6 -6
- digitalhub/datastores/{objects/local.py → local/datastore.py} +1 -1
- digitalhub/datastores/{objects/remote.py → remote/datastore.py} +1 -1
- digitalhub/datastores/{objects/s3.py → s3/datastore.py} +1 -1
- digitalhub/datastores/{objects/sql.py → sql/datastore.py} +1 -1
- digitalhub/entities/_base/{base.py → _base/entity.py} +1 -1
- digitalhub/entities/_base/{entity/context.py → context/entity.py} +4 -4
- digitalhub/entities/_base/crud.py +3 -3
- digitalhub/entities/_base/entity/{base.py → entity.py} +8 -34
- digitalhub/entities/_base/{metadata.py → entity/metadata.py} +2 -2
- digitalhub/entities/_base/{spec/base.py → entity/spec.py} +11 -11
- digitalhub/entities/_base/{status/base.py → entity/status.py} +2 -2
- digitalhub/entities/_base/executable/__init__.py +0 -0
- digitalhub/entities/_base/{entity/executable.py → executable/entity.py} +55 -31
- digitalhub/entities/_base/material/__init__.py +0 -0
- digitalhub/entities/_base/{entity/material.py → material/entity.py} +4 -4
- digitalhub/entities/_base/{spec/material.py → material/spec.py} +3 -3
- digitalhub/entities/_base/{status/material.py → material/status.py} +1 -1
- 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/_builders/entity.py +153 -0
- digitalhub/entities/_builders/metadata.py +5 -21
- digitalhub/entities/_builders/spec.py +11 -21
- digitalhub/entities/_builders/status.py +10 -20
- digitalhub/entities/_builders/uuid.py +4 -11
- digitalhub/entities/artifact/_base/__init__.py +0 -0
- digitalhub/entities/artifact/_base/builder.py +86 -0
- digitalhub/entities/artifact/{entity/_base.py → _base/entity.py} +5 -5
- 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/{spec.py → artifact/spec.py} +4 -16
- digitalhub/entities/artifact/{status.py → artifact/status.py} +1 -1
- digitalhub/entities/artifact/builder.py +16 -98
- digitalhub/entities/artifact/crud.py +4 -4
- digitalhub/entities/builders.py +63 -0
- digitalhub/entities/dataitem/_base/__init__.py +0 -0
- digitalhub/entities/dataitem/_base/builder.py +86 -0
- digitalhub/entities/dataitem/{entity/_base.py → _base/entity.py} +5 -5
- digitalhub/entities/dataitem/_base/spec.py +15 -0
- digitalhub/entities/dataitem/_base/status.py +20 -0
- digitalhub/entities/dataitem/builder.py +16 -109
- digitalhub/entities/dataitem/crud.py +8 -5
- 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/{entity/table.py → table/entity.py} +24 -3
- digitalhub/entities/dataitem/table/spec.py +25 -0
- digitalhub/entities/dataitem/table/status.py +9 -0
- digitalhub/entities/function/_base/__init__.py +0 -0
- digitalhub/entities/function/_base/builder.py +78 -0
- digitalhub/entities/function/{entity.py → _base/entity.py} +8 -8
- digitalhub/entities/function/{models.py → _base/models.py} +1 -1
- digitalhub/entities/function/_base/spec.py +15 -0
- digitalhub/entities/function/_base/status.py +9 -0
- digitalhub/entities/function/builder.py +22 -57
- digitalhub/entities/function/crud.py +3 -3
- digitalhub/entities/model/_base/__init__.py +0 -0
- digitalhub/entities/model/_base/builder.py +86 -0
- digitalhub/entities/model/{entity/_base.py → _base/entity.py} +5 -5
- digitalhub/entities/model/_base/spec.py +49 -0
- digitalhub/entities/model/_base/status.py +9 -0
- digitalhub/entities/model/builder.py +16 -117
- digitalhub/entities/model/crud.py +4 -4
- 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/spec.py +44 -0
- digitalhub/entities/model/mlflow/status.py +9 -0
- digitalhub/entities/model/{entity/mlflow.py → mlflow/utils.py} +1 -10
- 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/_base/__init__.py +0 -0
- digitalhub/entities/project/_base/builder.py +128 -0
- digitalhub/entities/project/{entity.py → _base/entity.py} +18 -60
- digitalhub/entities/project/{spec.py → _base/spec.py} +4 -4
- digitalhub/entities/project/_base/status.py +9 -0
- digitalhub/entities/project/builder.py +20 -51
- digitalhub/entities/project/crud.py +2 -2
- digitalhub/entities/run/_base/__init__.py +0 -0
- digitalhub/entities/run/_base/builder.py +73 -0
- digitalhub/entities/run/{entity.py → _base/entity.py} +12 -155
- digitalhub/entities/run/{spec.py → _base/spec.py} +8 -8
- digitalhub/entities/run/{status.py → _base/status.py} +4 -4
- digitalhub/entities/run/builder.py +21 -47
- digitalhub/entities/run/crud.py +3 -3
- digitalhub/entities/secret/_base/__init__.py +0 -0
- digitalhub/entities/secret/_base/builder.py +81 -0
- digitalhub/entities/secret/{entity.py → _base/entity.py} +7 -6
- digitalhub/entities/secret/{spec.py → _base/spec.py} +4 -4
- digitalhub/entities/secret/_base/status.py +9 -0
- digitalhub/entities/secret/builder.py +20 -62
- digitalhub/entities/secret/crud.py +12 -4
- digitalhub/entities/task/_base/__init__.py +0 -0
- digitalhub/entities/task/_base/builder.py +76 -0
- digitalhub/entities/task/{entity.py → _base/entity.py} +6 -6
- digitalhub/entities/task/{models.py → _base/models.py} +9 -0
- digitalhub/entities/task/{spec.py → _base/spec.py} +9 -7
- digitalhub/entities/task/_base/status.py +9 -0
- digitalhub/entities/task/builder.py +21 -44
- digitalhub/entities/task/crud.py +3 -3
- digitalhub/entities/utils/__init__.py +0 -0
- digitalhub/entities/{utils.py → utils/utils.py} +2 -2
- digitalhub/entities/workflow/_base/__init__.py +0 -0
- digitalhub/entities/workflow/_base/builder.py +78 -0
- digitalhub/entities/workflow/{entity.py → _base/entity.py} +8 -8
- digitalhub/entities/workflow/_base/spec.py +15 -0
- digitalhub/entities/workflow/_base/status.py +9 -0
- digitalhub/entities/workflow/builder.py +20 -60
- digitalhub/entities/workflow/crud.py +3 -3
- digitalhub/factory/__init__.py +0 -0
- digitalhub/factory/factory.py +204 -0
- digitalhub/factory/utils.py +90 -0
- digitalhub/readers/_base/__init__.py +0 -0
- digitalhub/readers/builder.py +1 -1
- digitalhub/readers/pandas/__init__.py +0 -0
- digitalhub/readers/{objects/pandas.py → pandas/readers.py} +1 -1
- digitalhub/readers/registry.py +1 -1
- digitalhub/runtimes/builder.py +24 -41
- digitalhub/runtimes/kind_registry.py +14 -0
- digitalhub/runtimes/utils.py +28 -0
- digitalhub/stores/_base/__init__.py +0 -0
- digitalhub/stores/builder.py +6 -6
- digitalhub/stores/local/__init__.py +0 -0
- digitalhub/stores/{objects/local.py → local/store.py} +1 -1
- digitalhub/stores/remote/__init__.py +0 -0
- digitalhub/stores/{objects/remote.py → remote/store.py} +1 -1
- digitalhub/stores/s3/__init__.py +0 -0
- digitalhub/stores/{objects/s3.py → s3/store.py} +1 -1
- digitalhub/stores/sql/__init__.py +0 -0
- digitalhub/stores/{objects/sql.py → sql/store.py} +1 -1
- digitalhub/utils/exceptions.py +6 -0
- digitalhub/utils/generic_utils.py +18 -42
- digitalhub/utils/s3_utils.py +58 -0
- {digitalhub-0.8.0b2.dist-info → digitalhub-0.8.0b4.dist-info}/METADATA +3 -2
- digitalhub-0.8.0b4.dist-info/RECORD +232 -0
- {digitalhub-0.8.0b2.dist-info → digitalhub-0.8.0b4.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/entities/_base/entity/unversioned.py +0 -87
- digitalhub/entities/_base/entity/versioned.py +0 -94
- digitalhub/entities/artifact/entity/artifact.py +0 -9
- digitalhub/entities/dataitem/entity/dataitem.py +0 -9
- digitalhub/entities/dataitem/entity/iceberg.py +0 -7
- digitalhub/entities/dataitem/spec.py +0 -61
- digitalhub/entities/dataitem/status.py +0 -38
- digitalhub/entities/function/spec.py +0 -81
- digitalhub/entities/function/status.py +0 -9
- digitalhub/entities/model/entity/huggingface.py +0 -9
- digitalhub/entities/model/entity/model.py +0 -9
- digitalhub/entities/model/entity/sklearn.py +0 -9
- digitalhub/entities/model/spec.py +0 -146
- digitalhub/entities/model/status.py +0 -33
- digitalhub/entities/project/status.py +0 -9
- digitalhub/entities/registries.py +0 -48
- digitalhub/entities/secret/status.py +0 -9
- digitalhub/entities/task/status.py +0 -9
- digitalhub/entities/workflow/spec.py +0 -15
- digitalhub/entities/workflow/status.py +0 -9
- digitalhub/registry/models.py +0 -87
- digitalhub/registry/registry.py +0 -74
- digitalhub/registry/utils.py +0 -150
- digitalhub-0.8.0b2.dist-info/RECORD +0 -161
- test/test_crud_artifacts.py +0 -96
- test/test_crud_dataitems.py +0 -96
- /digitalhub/client/{objects → _base}/__init__.py +0 -0
- /digitalhub/client/{objects/base.py → _base/client.py} +0 -0
- /digitalhub/{datastores/objects → client/dhcore}/__init__.py +0 -0
- /digitalhub/{entities/_base/spec → client/local}/__init__.py +0 -0
- /digitalhub/{entities/_base/status → datastores/_base}/__init__.py +0 -0
- /digitalhub/{entities/artifact/entity → datastores/local}/__init__.py +0 -0
- /digitalhub/{entities/dataitem/entity → datastores/remote}/__init__.py +0 -0
- /digitalhub/{entities/model/entity → datastores/s3}/__init__.py +0 -0
- /digitalhub/{readers/objects → datastores/sql}/__init__.py +0 -0
- /digitalhub/{registry → entities/_base/_base}/__init__.py +0 -0
- /digitalhub/{stores/objects → entities/_base/context}/__init__.py +0 -0
- /digitalhub/entities/dataitem/{models.py → table/models.py} +0 -0
- /digitalhub/entities/model/{models.py → mlflow/models.py} +0 -0
- /digitalhub/entities/{_base → utils}/api.py +0 -0
- /digitalhub/entities/{entity_types.py → utils/entity_types.py} +0 -0
- /digitalhub/entities/{_base → utils}/state.py +0 -0
- /digitalhub/readers/{objects/base.py → _base/readers.py} +0 -0
- /digitalhub/runtimes/{base.py → _base.py} +0 -0
- /digitalhub/stores/{objects/base.py → _base/store.py} +0 -0
- {digitalhub-0.8.0b2.dist-info → digitalhub-0.8.0b4.dist-info}/LICENSE.txt +0 -0
- {digitalhub-0.8.0b2.dist-info → digitalhub-0.8.0b4.dist-info}/top_level.txt +0 -0
- /test/{test_imports.py → local/imports/test_imports.py} +0 -0
|
@@ -3,18 +3,18 @@ from __future__ import annotations
|
|
|
3
3
|
import typing
|
|
4
4
|
|
|
5
5
|
from digitalhub.entities._base.crud import list_entity_api_ctx
|
|
6
|
-
from digitalhub.entities._base.entity
|
|
7
|
-
from digitalhub.entities.entity_types import EntityTypes
|
|
6
|
+
from digitalhub.entities._base.versioned.entity import VersionedEntity
|
|
8
7
|
from digitalhub.entities.run.crud import delete_run, get_run, list_runs
|
|
9
8
|
from digitalhub.entities.task.crud import delete_task, task_from_dict, task_from_parameters
|
|
9
|
+
from digitalhub.entities.utils.entity_types import EntityTypes
|
|
10
10
|
from digitalhub.utils.exceptions import EntityAlreadyExistsError, EntityError
|
|
11
11
|
|
|
12
12
|
if typing.TYPE_CHECKING:
|
|
13
|
-
from digitalhub.entities._base.metadata import Metadata
|
|
14
|
-
from digitalhub.entities._base.spec
|
|
15
|
-
from digitalhub.entities._base.status
|
|
16
|
-
from digitalhub.entities.run.entity import Run
|
|
17
|
-
from digitalhub.entities.task.entity import Task
|
|
13
|
+
from digitalhub.entities._base.entity.metadata import Metadata
|
|
14
|
+
from digitalhub.entities._base.entity.spec import Spec
|
|
15
|
+
from digitalhub.entities._base.entity.status import Status
|
|
16
|
+
from digitalhub.entities.run._base.entity import Run
|
|
17
|
+
from digitalhub.entities.task._base.entity import Task
|
|
18
18
|
|
|
19
19
|
|
|
20
20
|
class ExecutableEntity(VersionedEntity):
|
|
@@ -57,7 +57,7 @@ class ExecutableEntity(VersionedEntity):
|
|
|
57
57
|
# Tasks
|
|
58
58
|
##############################
|
|
59
59
|
|
|
60
|
-
def _get_or_create_task(self, kind: str
|
|
60
|
+
def _get_or_create_task(self, kind: str) -> Task:
|
|
61
61
|
"""
|
|
62
62
|
Get or create task.
|
|
63
63
|
|
|
@@ -72,7 +72,10 @@ class ExecutableEntity(VersionedEntity):
|
|
|
72
72
|
Task.
|
|
73
73
|
"""
|
|
74
74
|
if self._tasks.get(kind) is None:
|
|
75
|
-
|
|
75
|
+
try:
|
|
76
|
+
self._tasks[kind] = self.get_task(kind)
|
|
77
|
+
except EntityError:
|
|
78
|
+
self._tasks[kind] = self.new_task(kind)
|
|
76
79
|
return self._tasks[kind]
|
|
77
80
|
|
|
78
81
|
def import_tasks(self, tasks: list[dict]) -> None:
|
|
@@ -147,6 +150,34 @@ class ExecutableEntity(VersionedEntity):
|
|
|
147
150
|
self._tasks[task_kind] = task
|
|
148
151
|
return task
|
|
149
152
|
|
|
153
|
+
def get_task(self, kind: str) -> Task:
|
|
154
|
+
"""
|
|
155
|
+
Get task.
|
|
156
|
+
|
|
157
|
+
Parameters
|
|
158
|
+
----------
|
|
159
|
+
kind : str
|
|
160
|
+
Kind the object.
|
|
161
|
+
|
|
162
|
+
Returns
|
|
163
|
+
-------
|
|
164
|
+
Task
|
|
165
|
+
Task.
|
|
166
|
+
|
|
167
|
+
Raises
|
|
168
|
+
------
|
|
169
|
+
EntityError
|
|
170
|
+
If task is not created.
|
|
171
|
+
"""
|
|
172
|
+
try:
|
|
173
|
+
return self._tasks[kind]
|
|
174
|
+
except KeyError:
|
|
175
|
+
resp = self._get_task_from_backend(kind)
|
|
176
|
+
if not resp:
|
|
177
|
+
raise EntityError(f"Task {kind} is not created")
|
|
178
|
+
self._tasks[kind] = task_from_dict(resp[0])
|
|
179
|
+
return self._tasks[kind]
|
|
180
|
+
|
|
150
181
|
def update_task(self, kind: str, **kwargs) -> Task:
|
|
151
182
|
"""
|
|
152
183
|
Update task.
|
|
@@ -180,47 +211,42 @@ class ExecutableEntity(VersionedEntity):
|
|
|
180
211
|
self._tasks[kind] = task
|
|
181
212
|
return task
|
|
182
213
|
|
|
183
|
-
def
|
|
214
|
+
def delete_task(self, kind: str, cascade: bool = True) -> dict:
|
|
184
215
|
"""
|
|
185
|
-
|
|
216
|
+
Delete task.
|
|
186
217
|
|
|
187
218
|
Parameters
|
|
188
219
|
----------
|
|
189
220
|
kind : str
|
|
190
221
|
Kind the object.
|
|
222
|
+
cascade : bool
|
|
223
|
+
Flag to determine if cascade deletion must be performed.
|
|
191
224
|
|
|
192
225
|
Returns
|
|
193
226
|
-------
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
Raises
|
|
198
|
-
------
|
|
199
|
-
EntityError
|
|
200
|
-
If task is not created.
|
|
227
|
+
dict
|
|
228
|
+
Response from backend.
|
|
201
229
|
"""
|
|
202
|
-
self.
|
|
203
|
-
|
|
230
|
+
resp = delete_task(self._tasks[kind].key, cascade=cascade)
|
|
231
|
+
self._tasks.pop(kind, None)
|
|
232
|
+
return resp
|
|
204
233
|
|
|
205
|
-
def
|
|
234
|
+
def _get_task_from_backend(self, kind: str) -> list:
|
|
206
235
|
"""
|
|
207
|
-
|
|
236
|
+
List tasks from backend filtered by function and kind.
|
|
208
237
|
|
|
209
238
|
Parameters
|
|
210
239
|
----------
|
|
211
240
|
kind : str
|
|
212
241
|
Kind the object.
|
|
213
|
-
cascade : bool
|
|
214
|
-
Flag to determine if cascade deletion must be performed.
|
|
215
242
|
|
|
216
243
|
Returns
|
|
217
244
|
-------
|
|
218
|
-
|
|
245
|
+
list
|
|
219
246
|
Response from backend.
|
|
220
247
|
"""
|
|
221
|
-
|
|
222
|
-
self.
|
|
223
|
-
return resp
|
|
248
|
+
params = {"function": self._get_executable_string(), "kind": kind}
|
|
249
|
+
return list_entity_api_ctx(self.project, EntityTypes.TASK.value, params=params)
|
|
224
250
|
|
|
225
251
|
def _check_task_in_backend(self, kind: str) -> bool:
|
|
226
252
|
"""
|
|
@@ -236,9 +262,7 @@ class ExecutableEntity(VersionedEntity):
|
|
|
236
262
|
bool
|
|
237
263
|
Flag to determine if task exists in backend.
|
|
238
264
|
"""
|
|
239
|
-
|
|
240
|
-
params = {"function": self._get_executable_string(), "kind": kind}
|
|
241
|
-
resp = list_entity_api_ctx(self.project, EntityTypes.TASK.value, params=params)
|
|
265
|
+
resp = self._get_task_from_backend(kind)
|
|
242
266
|
if not resp:
|
|
243
267
|
return False
|
|
244
268
|
return True
|
|
File without changes
|
|
@@ -4,13 +4,13 @@ import typing
|
|
|
4
4
|
from pathlib import Path
|
|
5
5
|
|
|
6
6
|
from digitalhub.entities._base.crud import files_info_get_api, files_info_put_api
|
|
7
|
-
from digitalhub.entities._base.entity
|
|
7
|
+
from digitalhub.entities._base.versioned.entity import VersionedEntity
|
|
8
8
|
from digitalhub.stores.builder import get_store
|
|
9
9
|
|
|
10
10
|
if typing.TYPE_CHECKING:
|
|
11
|
-
from digitalhub.entities._base.metadata import Metadata
|
|
12
|
-
from digitalhub.entities._base.spec
|
|
13
|
-
from digitalhub.entities._base.status
|
|
11
|
+
from digitalhub.entities._base.entity.metadata import Metadata
|
|
12
|
+
from digitalhub.entities._base.material.spec import MaterialSpec
|
|
13
|
+
from digitalhub.entities._base.material.status import MaterialStatus
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
class MaterialEntity(VersionedEntity):
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from digitalhub.entities._base.spec
|
|
3
|
+
from digitalhub.entities._base.entity.spec import Spec, SpecValidator
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
class MaterialSpec(Spec):
|
|
7
7
|
"""
|
|
8
|
-
Material
|
|
8
|
+
Material specifications.class.
|
|
9
9
|
"""
|
|
10
10
|
|
|
11
11
|
def __init__(self, path: str, **kwargs) -> None:
|
|
@@ -13,7 +13,7 @@ class MaterialSpec(Spec):
|
|
|
13
13
|
self.path = path
|
|
14
14
|
|
|
15
15
|
|
|
16
|
-
class
|
|
16
|
+
class MaterialValidator(SpecValidator):
|
|
17
17
|
"""
|
|
18
18
|
Material parameters class.
|
|
19
19
|
"""
|
|
File without changes
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import typing
|
|
4
|
+
|
|
5
|
+
from digitalhub.entities._builders.entity import EntityBuilder
|
|
6
|
+
|
|
7
|
+
if typing.TYPE_CHECKING:
|
|
8
|
+
from digitalhub.entities._base.unversioned.entity import UnversionedEntity
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class UnversionedBuilder(EntityBuilder):
|
|
12
|
+
"""
|
|
13
|
+
Unversioned builder.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
def from_dict(self, obj: dict, validate: bool = True) -> UnversionedEntity:
|
|
17
|
+
"""
|
|
18
|
+
Create a new object from dictionary.
|
|
19
|
+
|
|
20
|
+
Parameters
|
|
21
|
+
----------
|
|
22
|
+
obj : dict
|
|
23
|
+
Dictionary to create object from.
|
|
24
|
+
validate : bool
|
|
25
|
+
Flag to indicate if arguments must be validated.
|
|
26
|
+
|
|
27
|
+
Returns
|
|
28
|
+
-------
|
|
29
|
+
UnversionedEntity
|
|
30
|
+
Object instance.
|
|
31
|
+
"""
|
|
32
|
+
parsed_dict = self._parse_dict(obj, validate=validate)
|
|
33
|
+
return self.build_entity(**parsed_dict)
|
|
34
|
+
|
|
35
|
+
def _parse_dict(self, obj: dict, validate: bool = True) -> dict:
|
|
36
|
+
"""
|
|
37
|
+
Get dictionary and parse it to a valid entity dictionary.
|
|
38
|
+
|
|
39
|
+
Parameters
|
|
40
|
+
----------
|
|
41
|
+
entity : str
|
|
42
|
+
Entity type.
|
|
43
|
+
obj : dict
|
|
44
|
+
Dictionary to parse.
|
|
45
|
+
|
|
46
|
+
Returns
|
|
47
|
+
-------
|
|
48
|
+
dict
|
|
49
|
+
A dictionary containing the attributes of the entity instance.
|
|
50
|
+
"""
|
|
51
|
+
project = obj.get("project")
|
|
52
|
+
kind = obj.get("kind")
|
|
53
|
+
uuid = self.build_uuid(obj.get("id"))
|
|
54
|
+
metadata = self.build_metadata(**obj.get("metadata", {}))
|
|
55
|
+
spec = self.build_spec(validate=validate, **obj.get("spec", {}))
|
|
56
|
+
status = self.build_status(**obj.get("status", {}))
|
|
57
|
+
user = obj.get("user")
|
|
58
|
+
return {
|
|
59
|
+
"project": project,
|
|
60
|
+
"uuid": uuid,
|
|
61
|
+
"kind": kind,
|
|
62
|
+
"metadata": metadata,
|
|
63
|
+
"spec": spec,
|
|
64
|
+
"status": status,
|
|
65
|
+
"user": user,
|
|
66
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import typing
|
|
4
|
+
|
|
5
|
+
from digitalhub.entities._base.context.entity import ContextEntity
|
|
6
|
+
from digitalhub.utils.io_utils import write_yaml
|
|
7
|
+
|
|
8
|
+
if typing.TYPE_CHECKING:
|
|
9
|
+
from digitalhub.entities._base.entity.metadata import Metadata
|
|
10
|
+
from digitalhub.entities._base.entity.spec import Spec
|
|
11
|
+
from digitalhub.entities._base.entity.status import Status
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class UnversionedEntity(ContextEntity):
|
|
15
|
+
def __init__(
|
|
16
|
+
self,
|
|
17
|
+
project: str,
|
|
18
|
+
uuid: str,
|
|
19
|
+
kind: str,
|
|
20
|
+
metadata: Metadata,
|
|
21
|
+
spec: Spec,
|
|
22
|
+
status: Status,
|
|
23
|
+
user: str | None = None,
|
|
24
|
+
) -> None:
|
|
25
|
+
super().__init__(project, kind, metadata, spec, status, user)
|
|
26
|
+
self.id = uuid
|
|
27
|
+
self.key = f"store://{project}/{self.ENTITY_TYPE}/{kind}/{uuid}"
|
|
28
|
+
self._obj_attr.extend(["id"])
|
|
29
|
+
|
|
30
|
+
def export(self, filename: str | None = None) -> str:
|
|
31
|
+
"""
|
|
32
|
+
Export object as a YAML file.
|
|
33
|
+
|
|
34
|
+
Parameters
|
|
35
|
+
----------
|
|
36
|
+
filename : str
|
|
37
|
+
Name of the export YAML file. If not specified, the default value is used.
|
|
38
|
+
|
|
39
|
+
Returns
|
|
40
|
+
-------
|
|
41
|
+
str
|
|
42
|
+
Exported file.
|
|
43
|
+
"""
|
|
44
|
+
obj = self.to_dict()
|
|
45
|
+
if filename is None:
|
|
46
|
+
filename = f"{self.ENTITY_TYPE}-{self.id}.yml"
|
|
47
|
+
pth = self._context().root / filename
|
|
48
|
+
write_yaml(pth, obj)
|
|
49
|
+
return str(pth)
|
|
File without changes
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import typing
|
|
4
|
+
|
|
5
|
+
from digitalhub.entities._builders.entity import EntityBuilder
|
|
6
|
+
|
|
7
|
+
if typing.TYPE_CHECKING:
|
|
8
|
+
from digitalhub.entities._base.versioned.entity import VersionedEntity
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class VersionedBuilder(EntityBuilder):
|
|
12
|
+
"""
|
|
13
|
+
Versioned builder.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
def from_dict(self, obj: dict, validate: bool = True) -> VersionedEntity:
|
|
17
|
+
"""
|
|
18
|
+
Create a new object from dictionary.
|
|
19
|
+
|
|
20
|
+
Parameters
|
|
21
|
+
----------
|
|
22
|
+
obj : dict
|
|
23
|
+
Dictionary to create object from.
|
|
24
|
+
validate : bool
|
|
25
|
+
Flag to indicate if arguments must be validated.
|
|
26
|
+
|
|
27
|
+
Returns
|
|
28
|
+
-------
|
|
29
|
+
VersionedEntity
|
|
30
|
+
Object instance.
|
|
31
|
+
"""
|
|
32
|
+
parsed_dict = self._parse_dict(obj, validate=validate)
|
|
33
|
+
return self.build_entity(**parsed_dict)
|
|
34
|
+
|
|
35
|
+
def _parse_dict(self, obj: dict, validate: bool = True) -> dict:
|
|
36
|
+
"""
|
|
37
|
+
Get dictionary and parse it to a valid entity dictionary.
|
|
38
|
+
|
|
39
|
+
Parameters
|
|
40
|
+
----------
|
|
41
|
+
entity : str
|
|
42
|
+
Entity type.
|
|
43
|
+
obj : dict
|
|
44
|
+
Dictionary to parse.
|
|
45
|
+
|
|
46
|
+
Returns
|
|
47
|
+
-------
|
|
48
|
+
dict
|
|
49
|
+
A dictionary containing the attributes of the entity instance.
|
|
50
|
+
"""
|
|
51
|
+
project = obj.get("project")
|
|
52
|
+
kind = obj.get("kind")
|
|
53
|
+
name = self.build_name(obj.get("name"))
|
|
54
|
+
uuid = self.build_uuid(obj.get("id"))
|
|
55
|
+
metadata = self.build_metadata(**obj.get("metadata", {}))
|
|
56
|
+
spec = self.build_spec(validate=validate, **obj.get("spec", {}))
|
|
57
|
+
status = self.build_status(**obj.get("status", {}))
|
|
58
|
+
user = obj.get("user")
|
|
59
|
+
return {
|
|
60
|
+
"project": project,
|
|
61
|
+
"name": name,
|
|
62
|
+
"uuid": uuid,
|
|
63
|
+
"kind": kind,
|
|
64
|
+
"metadata": metadata,
|
|
65
|
+
"spec": spec,
|
|
66
|
+
"status": status,
|
|
67
|
+
"user": user,
|
|
68
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import typing
|
|
4
|
+
|
|
5
|
+
from digitalhub.entities._base.context.entity import ContextEntity
|
|
6
|
+
from digitalhub.utils.io_utils import write_yaml
|
|
7
|
+
|
|
8
|
+
if typing.TYPE_CHECKING:
|
|
9
|
+
from digitalhub.entities._base.entity.metadata import Metadata
|
|
10
|
+
from digitalhub.entities._base.entity.spec import Spec
|
|
11
|
+
from digitalhub.entities._base.entity.status import Status
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class VersionedEntity(ContextEntity):
|
|
15
|
+
def __init__(
|
|
16
|
+
self,
|
|
17
|
+
project: str,
|
|
18
|
+
name: str,
|
|
19
|
+
uuid: str,
|
|
20
|
+
kind: str,
|
|
21
|
+
metadata: Metadata,
|
|
22
|
+
spec: Spec,
|
|
23
|
+
status: Status,
|
|
24
|
+
user: str | None = None,
|
|
25
|
+
) -> None:
|
|
26
|
+
super().__init__(project, kind, metadata, spec, status, user)
|
|
27
|
+
self.name = name
|
|
28
|
+
self.id = uuid
|
|
29
|
+
self.key = f"store://{project}/{self.ENTITY_TYPE}/{kind}/{name}:{uuid}"
|
|
30
|
+
|
|
31
|
+
# Add attributes to be used in the to_dict method
|
|
32
|
+
self._obj_attr.extend(["name", "id"])
|
|
33
|
+
|
|
34
|
+
def export(self, filename: str | None = None) -> str:
|
|
35
|
+
"""
|
|
36
|
+
Export object as a YAML file.
|
|
37
|
+
|
|
38
|
+
Parameters
|
|
39
|
+
----------
|
|
40
|
+
filename : str
|
|
41
|
+
Name of the export YAML file. If not specified, the default value is used.
|
|
42
|
+
|
|
43
|
+
Returns
|
|
44
|
+
-------
|
|
45
|
+
str
|
|
46
|
+
Exported file.
|
|
47
|
+
"""
|
|
48
|
+
obj = self.to_dict()
|
|
49
|
+
if filename is None:
|
|
50
|
+
filename = f"{self.ENTITY_TYPE}-{self.name}-{self.id}.yml"
|
|
51
|
+
pth = self._context().root / filename
|
|
52
|
+
write_yaml(pth, obj)
|
|
53
|
+
return str(pth)
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import typing
|
|
4
|
+
from abc import abstractmethod
|
|
5
|
+
|
|
6
|
+
from digitalhub.entities._builders.metadata import build_metadata
|
|
7
|
+
from digitalhub.entities._builders.name import build_name
|
|
8
|
+
from digitalhub.entities._builders.spec import build_spec
|
|
9
|
+
from digitalhub.entities._builders.status import build_status
|
|
10
|
+
from digitalhub.entities._builders.uuid import build_uuid
|
|
11
|
+
from digitalhub.utils.exceptions import BuilderError
|
|
12
|
+
|
|
13
|
+
if typing.TYPE_CHECKING:
|
|
14
|
+
from digitalhub.entities._base.entity.entity import Entity
|
|
15
|
+
from digitalhub.entities._base.entity.metadata import Metadata
|
|
16
|
+
from digitalhub.entities._base.entity.spec import Spec, SpecValidator
|
|
17
|
+
from digitalhub.entities._base.entity.status import Status
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class EntityBuilder:
|
|
21
|
+
"""
|
|
22
|
+
Builder class for building entities.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
# Class variables
|
|
26
|
+
ENTITY_TYPE: str = None
|
|
27
|
+
ENTITY_CLASS: Entity = None
|
|
28
|
+
ENTITY_SPEC_CLASS: Spec = None
|
|
29
|
+
ENTITY_SPEC_VALIDATOR: SpecValidator = None
|
|
30
|
+
ENTITY_STATUS_CLASS: Status = None
|
|
31
|
+
ENTITY_KIND: str = None
|
|
32
|
+
|
|
33
|
+
def __init__(self) -> None:
|
|
34
|
+
if self.ENTITY_TYPE is None:
|
|
35
|
+
raise BuilderError("ENTITY_TYPE must be set")
|
|
36
|
+
if self.ENTITY_CLASS is None:
|
|
37
|
+
raise BuilderError("ENTITY_CLASS must be set")
|
|
38
|
+
if self.ENTITY_SPEC_CLASS is None:
|
|
39
|
+
raise BuilderError("ENTITY_SPEC_CLASS must be set")
|
|
40
|
+
if self.ENTITY_SPEC_VALIDATOR is None:
|
|
41
|
+
raise BuilderError("ENTITY_SPEC_VALIDATOR must be set")
|
|
42
|
+
if self.ENTITY_STATUS_CLASS is None:
|
|
43
|
+
raise BuilderError("ENTITY_STATUS_CLASS must be set")
|
|
44
|
+
if self.ENTITY_KIND is None:
|
|
45
|
+
raise BuilderError("ENTITY_KIND must be set")
|
|
46
|
+
|
|
47
|
+
def build_name(self, name: str) -> str:
|
|
48
|
+
"""
|
|
49
|
+
Build entity name.
|
|
50
|
+
|
|
51
|
+
Parameters
|
|
52
|
+
----------
|
|
53
|
+
name : str
|
|
54
|
+
Entity name.
|
|
55
|
+
|
|
56
|
+
Returns
|
|
57
|
+
-------
|
|
58
|
+
str
|
|
59
|
+
Entity name.
|
|
60
|
+
"""
|
|
61
|
+
return build_name(name)
|
|
62
|
+
|
|
63
|
+
def build_uuid(self, uuid: str) -> str:
|
|
64
|
+
"""
|
|
65
|
+
Build entity uuid.
|
|
66
|
+
|
|
67
|
+
Parameters
|
|
68
|
+
----------
|
|
69
|
+
uuid : str
|
|
70
|
+
Entity uuid.
|
|
71
|
+
|
|
72
|
+
Returns
|
|
73
|
+
-------
|
|
74
|
+
str
|
|
75
|
+
Entity uuid.
|
|
76
|
+
"""
|
|
77
|
+
return build_uuid(uuid)
|
|
78
|
+
|
|
79
|
+
def build_metadata(self, **kwargs) -> Metadata:
|
|
80
|
+
"""
|
|
81
|
+
Build entity metadata object.
|
|
82
|
+
|
|
83
|
+
Parameters
|
|
84
|
+
----------
|
|
85
|
+
**kwargs : dict
|
|
86
|
+
Keyword arguments for the constructor.
|
|
87
|
+
|
|
88
|
+
Returns
|
|
89
|
+
-------
|
|
90
|
+
Metadata
|
|
91
|
+
Metadata object.
|
|
92
|
+
"""
|
|
93
|
+
return build_metadata(**kwargs)
|
|
94
|
+
|
|
95
|
+
def build_spec(self, validate: bool = True, **kwargs) -> Spec:
|
|
96
|
+
"""
|
|
97
|
+
Build entity spec object.
|
|
98
|
+
|
|
99
|
+
Parameters
|
|
100
|
+
----------
|
|
101
|
+
**kwargs : dict
|
|
102
|
+
Keyword arguments for the constructor.
|
|
103
|
+
|
|
104
|
+
Returns
|
|
105
|
+
-------
|
|
106
|
+
Spec
|
|
107
|
+
Spec object.
|
|
108
|
+
"""
|
|
109
|
+
return build_spec(self.ENTITY_SPEC_CLASS, self.ENTITY_SPEC_VALIDATOR, validate=validate, **kwargs)
|
|
110
|
+
|
|
111
|
+
def build_status(self, **kwargs) -> Status:
|
|
112
|
+
"""
|
|
113
|
+
Build entity status object.
|
|
114
|
+
|
|
115
|
+
Parameters
|
|
116
|
+
----------
|
|
117
|
+
**kwargs : dict
|
|
118
|
+
Keyword arguments for the constructor.
|
|
119
|
+
|
|
120
|
+
Returns
|
|
121
|
+
-------
|
|
122
|
+
Status
|
|
123
|
+
Status object.
|
|
124
|
+
"""
|
|
125
|
+
return build_status(self.ENTITY_STATUS_CLASS, **kwargs)
|
|
126
|
+
|
|
127
|
+
def build_entity(self, **kwargs) -> Entity:
|
|
128
|
+
"""
|
|
129
|
+
Build entity object.
|
|
130
|
+
|
|
131
|
+
Parameters
|
|
132
|
+
----------
|
|
133
|
+
**kwargs : dict
|
|
134
|
+
Keyword arguments for the constructor.
|
|
135
|
+
|
|
136
|
+
Returns
|
|
137
|
+
-------
|
|
138
|
+
Entity
|
|
139
|
+
Entity object.
|
|
140
|
+
"""
|
|
141
|
+
return self.ENTITY_CLASS(**kwargs)
|
|
142
|
+
|
|
143
|
+
@abstractmethod
|
|
144
|
+
def build(self, *args, **kwargs) -> Entity:
|
|
145
|
+
"""
|
|
146
|
+
Build entity object.
|
|
147
|
+
"""
|
|
148
|
+
|
|
149
|
+
@abstractmethod
|
|
150
|
+
def from_dict(self, obj: dict, validate: bool = True) -> Entity:
|
|
151
|
+
"""
|
|
152
|
+
Build entity object from dictionary.
|
|
153
|
+
"""
|
|
@@ -1,30 +1,16 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
import
|
|
4
|
-
|
|
5
|
-
from digitalhub.registry.registry import registry
|
|
6
|
-
from digitalhub.registry.utils import import_class
|
|
3
|
+
from digitalhub.entities._base.entity.metadata import Metadata
|
|
7
4
|
from digitalhub.utils.generic_utils import get_timestamp
|
|
8
5
|
|
|
9
|
-
if typing.TYPE_CHECKING:
|
|
10
|
-
from digitalhub.entities._base.metadata import Metadata
|
|
11
|
-
from digitalhub.registry.models import RegistryEntry
|
|
12
|
-
|
|
13
6
|
|
|
14
|
-
def build_metadata(
|
|
7
|
+
def build_metadata(**kwargs) -> Metadata:
|
|
15
8
|
"""
|
|
16
|
-
Build entity metadata object.
|
|
17
|
-
|
|
18
|
-
arguments to pass to the metadata's constructor.
|
|
19
|
-
The specific Metadata class is searched in the global
|
|
20
|
-
registry, where lies info about where to find the class.
|
|
21
|
-
The arguments are parsed, eventually adding default values,
|
|
22
|
-
and then passed to the constructor.
|
|
9
|
+
Build entity metadata object. This method is used to build entity
|
|
10
|
+
metadata.
|
|
23
11
|
|
|
24
12
|
Parameters
|
|
25
13
|
----------
|
|
26
|
-
kind : str
|
|
27
|
-
Registry entry kind.
|
|
28
14
|
**kwargs : dict
|
|
29
15
|
Keyword arguments for the constructor.
|
|
30
16
|
|
|
@@ -33,10 +19,8 @@ def build_metadata(kind: str, **kwargs) -> Metadata:
|
|
|
33
19
|
Metadata
|
|
34
20
|
Metadata object.
|
|
35
21
|
"""
|
|
36
|
-
infos: RegistryEntry = getattr(registry, kind)
|
|
37
|
-
metadata = import_class(infos.metadata.module, infos.metadata.class_name)
|
|
38
22
|
kwargs = parse_arguments(**kwargs)
|
|
39
|
-
return
|
|
23
|
+
return Metadata(**kwargs)
|
|
40
24
|
|
|
41
25
|
|
|
42
26
|
def parse_arguments(**kwargs) -> dict:
|