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,118 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import typing
|
|
4
|
+
|
|
5
|
+
from digitalhub.context.api import get_context
|
|
6
|
+
from digitalhub.entities._base.api_utils import create_entity_api_ctx, read_entity_api_ctx, update_entity_api_ctx
|
|
7
|
+
from digitalhub.entities._base.entity.entity import Entity
|
|
8
|
+
from digitalhub.utils.generic_utils import get_timestamp
|
|
9
|
+
|
|
10
|
+
if typing.TYPE_CHECKING:
|
|
11
|
+
from digitalhub.context.context import Context
|
|
12
|
+
from digitalhub.entities._base.entity.metadata import Metadata
|
|
13
|
+
from digitalhub.entities._base.entity.spec import Spec
|
|
14
|
+
from digitalhub.entities._base.entity.status import Status
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class ContextEntity(Entity):
|
|
18
|
+
def __init__(
|
|
19
|
+
self,
|
|
20
|
+
project: str,
|
|
21
|
+
kind: str,
|
|
22
|
+
metadata: Metadata,
|
|
23
|
+
spec: Spec,
|
|
24
|
+
status: Status,
|
|
25
|
+
user: str | None = None,
|
|
26
|
+
) -> None:
|
|
27
|
+
super().__init__(kind, metadata, spec, status, user)
|
|
28
|
+
self.project = project
|
|
29
|
+
self._obj_attr.extend(["project"])
|
|
30
|
+
|
|
31
|
+
##############################
|
|
32
|
+
# Save / Refresh / Export
|
|
33
|
+
##############################
|
|
34
|
+
|
|
35
|
+
def save(self, update: bool = False) -> ContextEntity:
|
|
36
|
+
"""
|
|
37
|
+
Save or update the entity into the backend.
|
|
38
|
+
|
|
39
|
+
Parameters
|
|
40
|
+
----------
|
|
41
|
+
update : bool
|
|
42
|
+
Flag to indicate update.
|
|
43
|
+
|
|
44
|
+
Returns
|
|
45
|
+
-------
|
|
46
|
+
ContextEntity
|
|
47
|
+
Entity saved.
|
|
48
|
+
"""
|
|
49
|
+
obj = self.to_dict()
|
|
50
|
+
if not update:
|
|
51
|
+
return self._save(obj)
|
|
52
|
+
return self._update(obj)
|
|
53
|
+
|
|
54
|
+
def _save(self, obj: dict) -> ContextEntity:
|
|
55
|
+
"""
|
|
56
|
+
Save entity into backend.
|
|
57
|
+
|
|
58
|
+
Parameters
|
|
59
|
+
----------
|
|
60
|
+
obj : dict
|
|
61
|
+
Object instance as dictionary.
|
|
62
|
+
|
|
63
|
+
Returns
|
|
64
|
+
-------
|
|
65
|
+
ContextEntity
|
|
66
|
+
Entity saved.
|
|
67
|
+
"""
|
|
68
|
+
new_obj = create_entity_api_ctx(self.project, self.ENTITY_TYPE, obj)
|
|
69
|
+
self._update_attributes(new_obj)
|
|
70
|
+
return self
|
|
71
|
+
|
|
72
|
+
def _update(self, obj: dict) -> ContextEntity:
|
|
73
|
+
"""
|
|
74
|
+
Update entity in backend.
|
|
75
|
+
|
|
76
|
+
Parameters
|
|
77
|
+
----------
|
|
78
|
+
obj : dict
|
|
79
|
+
Object instance as dictionary.
|
|
80
|
+
|
|
81
|
+
Returns
|
|
82
|
+
-------
|
|
83
|
+
ContextEntity
|
|
84
|
+
Entity updated.
|
|
85
|
+
"""
|
|
86
|
+
if self._context().local:
|
|
87
|
+
self.metadata.updated = obj["metadata"]["updated"] = get_timestamp()
|
|
88
|
+
new_obj = update_entity_api_ctx(self.project, self.ENTITY_TYPE, self.id, obj)
|
|
89
|
+
self._update_attributes(new_obj)
|
|
90
|
+
return self
|
|
91
|
+
|
|
92
|
+
def refresh(self) -> ContextEntity:
|
|
93
|
+
"""
|
|
94
|
+
Refresh object from backend.
|
|
95
|
+
|
|
96
|
+
Returns
|
|
97
|
+
-------
|
|
98
|
+
ContextEntity
|
|
99
|
+
Entity refreshed.
|
|
100
|
+
"""
|
|
101
|
+
new_obj = read_entity_api_ctx(self.key)
|
|
102
|
+
self._update_attributes(new_obj)
|
|
103
|
+
return self
|
|
104
|
+
|
|
105
|
+
##############################
|
|
106
|
+
# Context
|
|
107
|
+
##############################
|
|
108
|
+
|
|
109
|
+
def _context(self) -> Context:
|
|
110
|
+
"""
|
|
111
|
+
Get context.
|
|
112
|
+
|
|
113
|
+
Returns
|
|
114
|
+
-------
|
|
115
|
+
Context
|
|
116
|
+
Context object.
|
|
117
|
+
"""
|
|
118
|
+
return get_context(self.project)
|
|
@@ -0,0 +1,468 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import typing
|
|
4
|
+
|
|
5
|
+
from digitalhub.client.api import build_client, get_client
|
|
6
|
+
from digitalhub.context.api import check_context
|
|
7
|
+
from digitalhub.entities._base.api_utils import (
|
|
8
|
+
delete_entity_api_ctx,
|
|
9
|
+
list_entity_api_ctx,
|
|
10
|
+
read_entity_api_base,
|
|
11
|
+
read_entity_api_ctx,
|
|
12
|
+
read_entity_api_ctx_versions,
|
|
13
|
+
)
|
|
14
|
+
from digitalhub.entities.utils.entity_types import EntityTypes
|
|
15
|
+
from digitalhub.entities.utils.utils import parse_entity_key
|
|
16
|
+
from digitalhub.factory.api import build_entity_from_dict, build_entity_from_params
|
|
17
|
+
from digitalhub.utils.exceptions import ContextError, EntityAlreadyExistsError, EntityError, EntityNotExistsError
|
|
18
|
+
from digitalhub.utils.io_utils import read_yaml
|
|
19
|
+
|
|
20
|
+
if typing.TYPE_CHECKING:
|
|
21
|
+
from digitalhub.entities._base.context.entity import ContextEntity
|
|
22
|
+
from digitalhub.entities._base.executable.entity import ExecutableEntity
|
|
23
|
+
from digitalhub.entities._base.material.entity import MaterialEntity
|
|
24
|
+
from digitalhub.entities._base.unversioned.entity import UnversionedEntity
|
|
25
|
+
from digitalhub.entities._base.versioned.entity import VersionedEntity
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _check_context(project: str) -> None:
|
|
29
|
+
"""
|
|
30
|
+
Check if the given project is in the context.
|
|
31
|
+
Otherwise try to get the project from remote.
|
|
32
|
+
|
|
33
|
+
Parameters
|
|
34
|
+
----------
|
|
35
|
+
project : str
|
|
36
|
+
Project name.
|
|
37
|
+
|
|
38
|
+
Returns
|
|
39
|
+
-------
|
|
40
|
+
None
|
|
41
|
+
"""
|
|
42
|
+
try:
|
|
43
|
+
check_context(project)
|
|
44
|
+
except ContextError:
|
|
45
|
+
try:
|
|
46
|
+
build_client()
|
|
47
|
+
client = get_client()
|
|
48
|
+
obj = read_entity_api_base(client, EntityTypes.PROJECT.value, project)
|
|
49
|
+
build_entity_from_dict(obj)
|
|
50
|
+
except EntityNotExistsError:
|
|
51
|
+
raise ContextError(f"Project '{project}' not found.")
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def _check_project_from_identifier(identifier: str, project: str | None = None) -> None:
|
|
55
|
+
"""
|
|
56
|
+
Check if the given project is in the context.
|
|
57
|
+
Otherwise try to get the project from remote.
|
|
58
|
+
|
|
59
|
+
Parameters
|
|
60
|
+
----------
|
|
61
|
+
identifier : str
|
|
62
|
+
Entity key (store://...) or entity name.
|
|
63
|
+
project : str
|
|
64
|
+
Project name.
|
|
65
|
+
|
|
66
|
+
Returns
|
|
67
|
+
-------
|
|
68
|
+
None
|
|
69
|
+
"""
|
|
70
|
+
if not identifier.startswith("store://"):
|
|
71
|
+
if project is None:
|
|
72
|
+
raise EntityError("Specify project if you do not specify entity key.")
|
|
73
|
+
|
|
74
|
+
else:
|
|
75
|
+
project, _, _, _, _ = parse_entity_key(identifier)
|
|
76
|
+
|
|
77
|
+
_check_context(project)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def new_context_entity(**kwargs) -> ContextEntity:
|
|
81
|
+
"""
|
|
82
|
+
Create a new object.
|
|
83
|
+
|
|
84
|
+
Parameters
|
|
85
|
+
----------
|
|
86
|
+
project : str
|
|
87
|
+
Project name.
|
|
88
|
+
kind : str
|
|
89
|
+
Kind the object.
|
|
90
|
+
uuid : str
|
|
91
|
+
ID of the object.
|
|
92
|
+
description : str
|
|
93
|
+
Description of the object (human readable).
|
|
94
|
+
labels : list[str]
|
|
95
|
+
List of labels.
|
|
96
|
+
embedded : bool
|
|
97
|
+
Flag to determine if object spec must be embedded in project spec.
|
|
98
|
+
|
|
99
|
+
Returns
|
|
100
|
+
-------
|
|
101
|
+
ContextEntity
|
|
102
|
+
Object instance.
|
|
103
|
+
"""
|
|
104
|
+
_check_context(kwargs["project"])
|
|
105
|
+
obj = build_entity_from_params(**kwargs)
|
|
106
|
+
obj.save()
|
|
107
|
+
return obj
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def get_versioned_entity(
|
|
111
|
+
identifier: str,
|
|
112
|
+
entity_type: str | None = None,
|
|
113
|
+
project: str | None = None,
|
|
114
|
+
entity_id: str | None = None,
|
|
115
|
+
**kwargs,
|
|
116
|
+
) -> VersionedEntity:
|
|
117
|
+
"""
|
|
118
|
+
Get object from backend.
|
|
119
|
+
|
|
120
|
+
Parameters
|
|
121
|
+
----------
|
|
122
|
+
identifier : str
|
|
123
|
+
Entity key (store://...) or entity name.
|
|
124
|
+
entity_type : str
|
|
125
|
+
Entity type.
|
|
126
|
+
project : str
|
|
127
|
+
Project name.
|
|
128
|
+
entity_id : str
|
|
129
|
+
Entity ID.
|
|
130
|
+
**kwargs : dict
|
|
131
|
+
Parameters to pass to the API call.
|
|
132
|
+
|
|
133
|
+
Returns
|
|
134
|
+
-------
|
|
135
|
+
VersionedEntity
|
|
136
|
+
Object instance.
|
|
137
|
+
"""
|
|
138
|
+
_check_project_from_identifier(identifier, project)
|
|
139
|
+
obj = read_entity_api_ctx(
|
|
140
|
+
identifier,
|
|
141
|
+
entity_type=entity_type,
|
|
142
|
+
project=project,
|
|
143
|
+
entity_id=entity_id,
|
|
144
|
+
**kwargs,
|
|
145
|
+
)
|
|
146
|
+
return build_entity_from_dict(obj)
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def get_unversioned_entity(
|
|
150
|
+
identifier: str,
|
|
151
|
+
entity_type: str | None = None,
|
|
152
|
+
project: str | None = None,
|
|
153
|
+
**kwargs,
|
|
154
|
+
) -> UnversionedEntity:
|
|
155
|
+
"""
|
|
156
|
+
Get object from backend.
|
|
157
|
+
|
|
158
|
+
Parameters
|
|
159
|
+
----------
|
|
160
|
+
entity_type : str
|
|
161
|
+
Entity type.
|
|
162
|
+
identifier : str
|
|
163
|
+
Entity key (store://...) or entity name.
|
|
164
|
+
project : str
|
|
165
|
+
Project name.
|
|
166
|
+
entity_id : str
|
|
167
|
+
Entity ID.
|
|
168
|
+
**kwargs : dict
|
|
169
|
+
Parameters to pass to the API call.
|
|
170
|
+
|
|
171
|
+
Returns
|
|
172
|
+
-------
|
|
173
|
+
UnversionedEntity
|
|
174
|
+
Object instance.
|
|
175
|
+
"""
|
|
176
|
+
_check_project_from_identifier(identifier, project)
|
|
177
|
+
|
|
178
|
+
obj = read_entity_api_ctx(
|
|
179
|
+
identifier,
|
|
180
|
+
entity_type=entity_type,
|
|
181
|
+
project=project,
|
|
182
|
+
**kwargs,
|
|
183
|
+
)
|
|
184
|
+
return build_entity_from_dict(obj)
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
def get_material_entity(
|
|
188
|
+
identifier: str,
|
|
189
|
+
entity_type: str | None = None,
|
|
190
|
+
project: str | None = None,
|
|
191
|
+
entity_id: str | None = None,
|
|
192
|
+
**kwargs,
|
|
193
|
+
) -> MaterialEntity:
|
|
194
|
+
"""
|
|
195
|
+
Get object from backend.
|
|
196
|
+
|
|
197
|
+
Parameters
|
|
198
|
+
----------
|
|
199
|
+
identifier : str
|
|
200
|
+
Entity key (store://...) or entity name.
|
|
201
|
+
entity_type : str
|
|
202
|
+
Entity type.
|
|
203
|
+
project : str
|
|
204
|
+
Project name.
|
|
205
|
+
entity_id : str
|
|
206
|
+
Entity ID.
|
|
207
|
+
**kwargs : dict
|
|
208
|
+
Parameters to pass to the API call.
|
|
209
|
+
|
|
210
|
+
Returns
|
|
211
|
+
-------
|
|
212
|
+
MaterialEntity
|
|
213
|
+
Object instance.
|
|
214
|
+
"""
|
|
215
|
+
obj: MaterialEntity = get_versioned_entity(
|
|
216
|
+
identifier,
|
|
217
|
+
entity_type=entity_type,
|
|
218
|
+
project=project,
|
|
219
|
+
entity_id=entity_id,
|
|
220
|
+
**kwargs,
|
|
221
|
+
)
|
|
222
|
+
obj._get_files_info()
|
|
223
|
+
return obj
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
def get_context_entity_versions(
|
|
227
|
+
identifier: str,
|
|
228
|
+
entity_type: str | None = None,
|
|
229
|
+
project: str | None = None,
|
|
230
|
+
**kwargs,
|
|
231
|
+
) -> list[ContextEntity]:
|
|
232
|
+
"""
|
|
233
|
+
Get object versions from backend.
|
|
234
|
+
|
|
235
|
+
Parameters
|
|
236
|
+
----------
|
|
237
|
+
identifier : str
|
|
238
|
+
Entity key (store://...) or entity name.
|
|
239
|
+
entity_type : str
|
|
240
|
+
Entity type.
|
|
241
|
+
project : str
|
|
242
|
+
Project name.
|
|
243
|
+
**kwargs : dict
|
|
244
|
+
Parameters to pass to the API call.
|
|
245
|
+
|
|
246
|
+
Returns
|
|
247
|
+
-------
|
|
248
|
+
list[ContextEntity]
|
|
249
|
+
List of object instances.
|
|
250
|
+
"""
|
|
251
|
+
_check_project_from_identifier(identifier, project)
|
|
252
|
+
obj = read_entity_api_ctx_versions(
|
|
253
|
+
identifier,
|
|
254
|
+
entity_type=entity_type,
|
|
255
|
+
project=project,
|
|
256
|
+
**kwargs,
|
|
257
|
+
)
|
|
258
|
+
return [build_entity_from_dict(o) for o in obj]
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
def get_material_entity_versions(
|
|
262
|
+
identifier: str,
|
|
263
|
+
entity_type: str | None = None,
|
|
264
|
+
project: str | None = None,
|
|
265
|
+
**kwargs,
|
|
266
|
+
) -> list[MaterialEntity]:
|
|
267
|
+
"""
|
|
268
|
+
Get object versions from backend.
|
|
269
|
+
|
|
270
|
+
Parameters
|
|
271
|
+
----------
|
|
272
|
+
identifier : str
|
|
273
|
+
Entity key (store://...) or entity name.
|
|
274
|
+
entity_type : str
|
|
275
|
+
Entity type.
|
|
276
|
+
project : str
|
|
277
|
+
Project name.
|
|
278
|
+
**kwargs : dict
|
|
279
|
+
Parameters to pass to the API call.
|
|
280
|
+
|
|
281
|
+
Returns
|
|
282
|
+
-------
|
|
283
|
+
list[MaterialEntity]
|
|
284
|
+
List of object instances.
|
|
285
|
+
"""
|
|
286
|
+
_check_project_from_identifier(identifier, project)
|
|
287
|
+
objs = read_entity_api_ctx_versions(
|
|
288
|
+
identifier,
|
|
289
|
+
entity_type=entity_type,
|
|
290
|
+
project=project,
|
|
291
|
+
**kwargs,
|
|
292
|
+
)
|
|
293
|
+
objects = []
|
|
294
|
+
for o in objs:
|
|
295
|
+
entity: MaterialEntity = build_entity_from_dict(o)
|
|
296
|
+
entity._get_files_info()
|
|
297
|
+
objects.append(entity)
|
|
298
|
+
return objects
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
def list_context_entities(project: str, entity_type: str, **kwargs) -> list[ContextEntity]:
|
|
302
|
+
"""
|
|
303
|
+
List all latest version objects from backend.
|
|
304
|
+
|
|
305
|
+
Parameters
|
|
306
|
+
----------
|
|
307
|
+
project : str
|
|
308
|
+
Project name.
|
|
309
|
+
entity_type : str
|
|
310
|
+
Entity type.
|
|
311
|
+
**kwargs : dict
|
|
312
|
+
Parameters to pass to the API call.
|
|
313
|
+
|
|
314
|
+
Returns
|
|
315
|
+
-------
|
|
316
|
+
list[ContextEntity]
|
|
317
|
+
List of object instances.
|
|
318
|
+
"""
|
|
319
|
+
_check_context(project)
|
|
320
|
+
objs = list_entity_api_ctx(
|
|
321
|
+
project=project,
|
|
322
|
+
entity_type=entity_type,
|
|
323
|
+
**kwargs,
|
|
324
|
+
)
|
|
325
|
+
return [build_entity_from_dict(obj) for obj in objs]
|
|
326
|
+
|
|
327
|
+
|
|
328
|
+
def list_material_entities(
|
|
329
|
+
project: str,
|
|
330
|
+
entity_type: str,
|
|
331
|
+
**kwargs,
|
|
332
|
+
) -> list[MaterialEntity]:
|
|
333
|
+
"""
|
|
334
|
+
List all latest version objects from backend.
|
|
335
|
+
|
|
336
|
+
Parameters
|
|
337
|
+
----------
|
|
338
|
+
project : str
|
|
339
|
+
Project name.
|
|
340
|
+
entity_type : str
|
|
341
|
+
Entity type.
|
|
342
|
+
**kwargs : dict
|
|
343
|
+
Parameters to pass to the API call.
|
|
344
|
+
|
|
345
|
+
Returns
|
|
346
|
+
-------
|
|
347
|
+
list[MaterialEntity]
|
|
348
|
+
List of object instances.
|
|
349
|
+
"""
|
|
350
|
+
_check_context(project)
|
|
351
|
+
objs = list_entity_api_ctx(
|
|
352
|
+
project=project,
|
|
353
|
+
entity_type=entity_type,
|
|
354
|
+
**kwargs,
|
|
355
|
+
)
|
|
356
|
+
objects = []
|
|
357
|
+
for o in objs:
|
|
358
|
+
entity: MaterialEntity = build_entity_from_dict(o)
|
|
359
|
+
entity._get_files_info()
|
|
360
|
+
objects.append(entity)
|
|
361
|
+
return objects
|
|
362
|
+
|
|
363
|
+
|
|
364
|
+
def import_context_entity(file: str) -> ContextEntity:
|
|
365
|
+
"""
|
|
366
|
+
Get object from file.
|
|
367
|
+
|
|
368
|
+
Parameters
|
|
369
|
+
----------
|
|
370
|
+
file : str
|
|
371
|
+
Path to YAML file.
|
|
372
|
+
|
|
373
|
+
Returns
|
|
374
|
+
-------
|
|
375
|
+
ContextEntity
|
|
376
|
+
Object instance.
|
|
377
|
+
"""
|
|
378
|
+
dict_obj: dict = read_yaml(file)
|
|
379
|
+
|
|
380
|
+
_check_context(dict_obj["project"])
|
|
381
|
+
|
|
382
|
+
obj = build_entity_from_dict(dict_obj)
|
|
383
|
+
try:
|
|
384
|
+
obj.save()
|
|
385
|
+
except EntityAlreadyExistsError:
|
|
386
|
+
pass
|
|
387
|
+
return obj
|
|
388
|
+
|
|
389
|
+
|
|
390
|
+
def import_executable_entity(file: str) -> ExecutableEntity:
|
|
391
|
+
"""
|
|
392
|
+
Get object from file.
|
|
393
|
+
|
|
394
|
+
Parameters
|
|
395
|
+
----------
|
|
396
|
+
file : str
|
|
397
|
+
Path to YAML file.
|
|
398
|
+
|
|
399
|
+
Returns
|
|
400
|
+
-------
|
|
401
|
+
ExecutableEntity
|
|
402
|
+
Object instance.
|
|
403
|
+
"""
|
|
404
|
+
dict_obj: dict | list[dict] = read_yaml(file)
|
|
405
|
+
if isinstance(dict_obj, list):
|
|
406
|
+
exec_dict = dict_obj[0]
|
|
407
|
+
tsk_dicts = dict_obj[1:]
|
|
408
|
+
else:
|
|
409
|
+
exec_dict = dict_obj
|
|
410
|
+
tsk_dicts = []
|
|
411
|
+
|
|
412
|
+
_check_context(exec_dict["project"])
|
|
413
|
+
|
|
414
|
+
obj: ExecutableEntity = build_entity_from_dict(exec_dict)
|
|
415
|
+
|
|
416
|
+
obj.import_tasks(tsk_dicts)
|
|
417
|
+
|
|
418
|
+
try:
|
|
419
|
+
obj.save()
|
|
420
|
+
except EntityAlreadyExistsError:
|
|
421
|
+
pass
|
|
422
|
+
return obj
|
|
423
|
+
|
|
424
|
+
|
|
425
|
+
def delete_entity(
|
|
426
|
+
identifier: str,
|
|
427
|
+
entity_type: str | None = None,
|
|
428
|
+
project: str | None = None,
|
|
429
|
+
entity_id: str | None = None,
|
|
430
|
+
delete_all_versions: bool = False,
|
|
431
|
+
cascade: bool = True,
|
|
432
|
+
**kwargs,
|
|
433
|
+
) -> dict:
|
|
434
|
+
"""
|
|
435
|
+
Delete object from backend.
|
|
436
|
+
|
|
437
|
+
Parameters
|
|
438
|
+
----------
|
|
439
|
+
identifier : str
|
|
440
|
+
Entity key (store://...) or entity name.
|
|
441
|
+
entity_type : str
|
|
442
|
+
Entity type.
|
|
443
|
+
project : str
|
|
444
|
+
Project name.
|
|
445
|
+
entity_id : str
|
|
446
|
+
Entity ID.
|
|
447
|
+
delete_all_versions : bool
|
|
448
|
+
Delete all versions of the named entity. If True, use entity name instead of entity key as identifier.
|
|
449
|
+
cascade : bool
|
|
450
|
+
Cascade delete.
|
|
451
|
+
**kwargs : dict
|
|
452
|
+
Parameters to pass to the API call.
|
|
453
|
+
|
|
454
|
+
Returns
|
|
455
|
+
-------
|
|
456
|
+
dict
|
|
457
|
+
Response from backend.
|
|
458
|
+
"""
|
|
459
|
+
_check_project_from_identifier(identifier, project)
|
|
460
|
+
return delete_entity_api_ctx(
|
|
461
|
+
identifier=identifier,
|
|
462
|
+
entity_type=entity_type,
|
|
463
|
+
project=project,
|
|
464
|
+
entity_id=entity_id,
|
|
465
|
+
delete_all_versions=delete_all_versions,
|
|
466
|
+
cascade=cascade,
|
|
467
|
+
**kwargs,
|
|
468
|
+
)
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from digitalhub.entities._base.entity.metadata import Metadata
|
|
4
|
+
from digitalhub.utils.generic_utils import get_timestamp
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def build_metadata(**kwargs) -> Metadata:
|
|
8
|
+
"""
|
|
9
|
+
Build entity metadata object. This method is used to build entity
|
|
10
|
+
metadata.
|
|
11
|
+
|
|
12
|
+
Parameters
|
|
13
|
+
----------
|
|
14
|
+
**kwargs : dict
|
|
15
|
+
Keyword arguments for the constructor.
|
|
16
|
+
|
|
17
|
+
Returns
|
|
18
|
+
-------
|
|
19
|
+
Metadata
|
|
20
|
+
Metadata object.
|
|
21
|
+
"""
|
|
22
|
+
kwargs = parse_arguments(**kwargs)
|
|
23
|
+
return Metadata(**kwargs)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def parse_arguments(**kwargs) -> dict:
|
|
27
|
+
"""
|
|
28
|
+
Parse keyword arguments and add default values if necessary.
|
|
29
|
+
|
|
30
|
+
Parameters
|
|
31
|
+
----------
|
|
32
|
+
**kwargs : dict
|
|
33
|
+
Keyword arguments.
|
|
34
|
+
|
|
35
|
+
Returns
|
|
36
|
+
-------
|
|
37
|
+
dict
|
|
38
|
+
A dictionary containing the entity metadata attributes.
|
|
39
|
+
"""
|
|
40
|
+
if "created" not in kwargs or kwargs["created"] is None:
|
|
41
|
+
kwargs["created"] = get_timestamp()
|
|
42
|
+
if "updated" not in kwargs or kwargs["updated"] is None:
|
|
43
|
+
kwargs["updated"] = kwargs["created"]
|
|
44
|
+
return kwargs
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from pydantic import BaseModel, Field
|
|
4
|
+
|
|
5
|
+
NAME_REGEX = r"^[a-zA-Z0-9._+-]+$"
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class NameValidator(BaseModel):
|
|
9
|
+
"""
|
|
10
|
+
Validate name format.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
name: str = Field(min_length=1, max_length=256, regex=NAME_REGEX)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def build_name(name: str) -> str:
|
|
17
|
+
"""
|
|
18
|
+
Build name.
|
|
19
|
+
|
|
20
|
+
Parameters
|
|
21
|
+
----------
|
|
22
|
+
name : str
|
|
23
|
+
The name.
|
|
24
|
+
|
|
25
|
+
Returns
|
|
26
|
+
-------
|
|
27
|
+
str
|
|
28
|
+
The name.
|
|
29
|
+
"""
|
|
30
|
+
NameValidator(name=name)
|
|
31
|
+
return name
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import typing
|
|
4
|
+
|
|
5
|
+
if typing.TYPE_CHECKING:
|
|
6
|
+
from digitalhub.entities._base.entity.spec import Spec, SpecValidator
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def build_spec(spec_cls: Spec, spec_validator: SpecValidator, validate: bool = True, **kwargs) -> Spec:
|
|
10
|
+
"""
|
|
11
|
+
Build entity spec object. This method is used to build entity
|
|
12
|
+
specifications and is used to validate the parameters passed
|
|
13
|
+
to the constructor.
|
|
14
|
+
|
|
15
|
+
Parameters
|
|
16
|
+
----------
|
|
17
|
+
spec_cls : Spec
|
|
18
|
+
Spec class.
|
|
19
|
+
spec_validator : SpecValidator
|
|
20
|
+
Spec validator class.
|
|
21
|
+
validate : bool
|
|
22
|
+
Flag to determine if validate kwargs.
|
|
23
|
+
**kwargs : dict
|
|
24
|
+
Keyword arguments for the constructor.
|
|
25
|
+
|
|
26
|
+
Returns
|
|
27
|
+
-------
|
|
28
|
+
Spec
|
|
29
|
+
Spec object.
|
|
30
|
+
"""
|
|
31
|
+
if validate:
|
|
32
|
+
kwargs = spec_validator(**kwargs).dict(by_alias=True, exclude_none=True)
|
|
33
|
+
return spec_cls(**kwargs)
|