digitalhub 0.8.0b7__py3-none-any.whl → 0.8.0b11__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 +1 -1
- digitalhub/client/api.py +63 -0
- digitalhub/client/builder.py +0 -55
- digitalhub/client/dhcore/client.py +39 -11
- digitalhub/client/dhcore/utils.py +1 -1
- digitalhub/client/local/client.py +1 -1
- digitalhub/context/api.py +93 -0
- digitalhub/context/builder.py +0 -84
- digitalhub/datastores/_base/datastore.py +2 -2
- digitalhub/datastores/api.py +37 -0
- digitalhub/datastores/builder.py +7 -31
- digitalhub/datastores/local/datastore.py +9 -1
- digitalhub/datastores/remote/datastore.py +8 -0
- digitalhub/datastores/s3/datastore.py +9 -1
- digitalhub/datastores/sql/datastore.py +9 -1
- digitalhub/entities/_base/api_utils.py +620 -0
- digitalhub/entities/_base/context/entity.py +2 -2
- digitalhub/entities/_base/crud.py +204 -408
- digitalhub/entities/_base/entity/entity.py +1 -1
- digitalhub/entities/_base/executable/entity.py +7 -6
- digitalhub/entities/_base/material/entity.py +2 -2
- digitalhub/entities/_base/runtime_entity/builder.py +11 -0
- digitalhub/entities/artifact/_base/builder.py +1 -1
- digitalhub/entities/artifact/crud.py +17 -43
- digitalhub/entities/dataitem/_base/builder.py +1 -1
- digitalhub/entities/dataitem/crud.py +20 -46
- digitalhub/entities/dataitem/table/entity.py +1 -1
- digitalhub/entities/function/_base/builder.py +1 -1
- digitalhub/entities/function/crud.py +14 -40
- digitalhub/entities/model/_base/builder.py +1 -1
- digitalhub/entities/model/crud.py +16 -43
- digitalhub/entities/project/_base/entity.py +71 -44
- digitalhub/entities/project/crud.py +8 -8
- digitalhub/entities/run/_base/builder.py +21 -1
- digitalhub/entities/run/_base/entity.py +1 -1
- digitalhub/entities/run/crud.py +17 -30
- digitalhub/entities/secret/_base/entity.py +1 -1
- digitalhub/entities/secret/crud.py +16 -28
- digitalhub/entities/task/_base/builder.py +22 -1
- digitalhub/entities/task/_base/entity.py +3 -2
- digitalhub/entities/task/crud.py +17 -30
- digitalhub/entities/workflow/_base/builder.py +1 -1
- digitalhub/entities/workflow/crud.py +14 -40
- digitalhub/factory/api.py +31 -25
- digitalhub/factory/factory.py +7 -5
- digitalhub/readers/_base/builder.py +26 -0
- digitalhub/readers/api.py +80 -0
- digitalhub/readers/factory.py +133 -0
- digitalhub/readers/pandas/builder.py +29 -0
- digitalhub/readers/pandas/{readers.py → reader.py} +1 -1
- digitalhub/stores/api.py +54 -0
- digitalhub/stores/builder.py +0 -46
- digitalhub/utils/io_utils.py +38 -2
- {digitalhub-0.8.0b7.dist-info → digitalhub-0.8.0b11.dist-info}/METADATA +1 -1
- {digitalhub-0.8.0b7.dist-info → digitalhub-0.8.0b11.dist-info}/RECORD +59 -61
- digitalhub/entities/artifact/builder.py +0 -51
- digitalhub/entities/dataitem/builder.py +0 -51
- digitalhub/entities/function/builder.py +0 -51
- digitalhub/entities/model/builder.py +0 -51
- digitalhub/entities/project/builder.py +0 -51
- digitalhub/entities/run/builder.py +0 -51
- digitalhub/entities/secret/builder.py +0 -51
- digitalhub/entities/task/builder.py +0 -51
- digitalhub/entities/workflow/builder.py +0 -51
- digitalhub/readers/builder.py +0 -54
- digitalhub/readers/registry.py +0 -15
- /digitalhub/readers/_base/{readers.py → reader.py} +0 -0
- {digitalhub-0.8.0b7.dist-info → digitalhub-0.8.0b11.dist-info}/LICENSE.txt +0 -0
- {digitalhub-0.8.0b7.dist-info → digitalhub-0.8.0b11.dist-info}/WHEEL +0 -0
- {digitalhub-0.8.0b7.dist-info → digitalhub-0.8.0b11.dist-info}/top_level.txt +0 -0
|
@@ -2,17 +2,17 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import typing
|
|
4
4
|
|
|
5
|
-
from digitalhub.context.
|
|
5
|
+
from digitalhub.context.api import check_context
|
|
6
6
|
from digitalhub.entities._base.crud import (
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
delete_entity,
|
|
8
|
+
get_context_entity_versions,
|
|
9
|
+
get_versioned_entity,
|
|
10
|
+
import_context_entity,
|
|
11
|
+
list_context_entities,
|
|
12
|
+
new_context_entity,
|
|
11
13
|
)
|
|
12
|
-
from digitalhub.entities.secret.builder import secret_from_dict, secret_from_parameters
|
|
13
14
|
from digitalhub.entities.utils.entity_types import EntityTypes
|
|
14
|
-
from digitalhub.utils.exceptions import
|
|
15
|
-
from digitalhub.utils.io_utils import read_yaml
|
|
15
|
+
from digitalhub.utils.exceptions import EntityNotExistsError
|
|
16
16
|
|
|
17
17
|
if typing.TYPE_CHECKING:
|
|
18
18
|
from digitalhub.entities.secret._base.entity import Secret
|
|
@@ -27,7 +27,7 @@ def new_secret(
|
|
|
27
27
|
uuid: str | None = None,
|
|
28
28
|
description: str | None = None,
|
|
29
29
|
labels: list[str] | None = None,
|
|
30
|
-
embedded: bool =
|
|
30
|
+
embedded: bool = False,
|
|
31
31
|
secret_value: str | None = None,
|
|
32
32
|
**kwargs,
|
|
33
33
|
) -> Secret:
|
|
@@ -68,8 +68,7 @@ def new_secret(
|
|
|
68
68
|
|
|
69
69
|
if secret_value is None:
|
|
70
70
|
raise ValueError("secret_value must be provided.")
|
|
71
|
-
|
|
72
|
-
obj = secret_from_parameters(
|
|
71
|
+
obj: Secret = new_context_entity(
|
|
73
72
|
project=project,
|
|
74
73
|
name=name,
|
|
75
74
|
kind="secret",
|
|
@@ -79,7 +78,6 @@ def new_secret(
|
|
|
79
78
|
embedded=embedded,
|
|
80
79
|
**kwargs,
|
|
81
80
|
)
|
|
82
|
-
obj.save()
|
|
83
81
|
obj.set_secret_value(value=secret_value)
|
|
84
82
|
return obj
|
|
85
83
|
|
|
@@ -127,14 +125,13 @@ def get_secret(
|
|
|
127
125
|
else:
|
|
128
126
|
raise EntityNotExistsError(f"Secret {identifier} not found.")
|
|
129
127
|
|
|
130
|
-
|
|
128
|
+
return get_versioned_entity(
|
|
131
129
|
identifier,
|
|
132
|
-
ENTITY_TYPE,
|
|
130
|
+
entity_type=ENTITY_TYPE,
|
|
133
131
|
project=project,
|
|
134
132
|
entity_id=entity_id,
|
|
135
133
|
**kwargs,
|
|
136
134
|
)
|
|
137
|
-
return secret_from_dict(obj)
|
|
138
135
|
|
|
139
136
|
|
|
140
137
|
def get_secret_versions(
|
|
@@ -168,13 +165,12 @@ def get_secret_versions(
|
|
|
168
165
|
>>> objs = get_secret_versions("my-secret-name",
|
|
169
166
|
>>> project="my-project")
|
|
170
167
|
"""
|
|
171
|
-
|
|
168
|
+
return get_context_entity_versions(
|
|
172
169
|
identifier,
|
|
173
170
|
entity_type=ENTITY_TYPE,
|
|
174
171
|
project=project,
|
|
175
172
|
**kwargs,
|
|
176
173
|
)
|
|
177
|
-
return [secret_from_dict(o) for o in obj]
|
|
178
174
|
|
|
179
175
|
|
|
180
176
|
def list_secrets(project: str, **kwargs) -> list[Secret]:
|
|
@@ -197,12 +193,11 @@ def list_secrets(project: str, **kwargs) -> list[Secret]:
|
|
|
197
193
|
--------
|
|
198
194
|
>>> objs = list_secrets(project="my-project")
|
|
199
195
|
"""
|
|
200
|
-
|
|
196
|
+
return list_context_entities(
|
|
201
197
|
project=project,
|
|
202
198
|
entity_type=ENTITY_TYPE,
|
|
203
199
|
**kwargs,
|
|
204
200
|
)
|
|
205
|
-
return [secret_from_dict(obj) for obj in objs]
|
|
206
201
|
|
|
207
202
|
|
|
208
203
|
def import_secret(file: str) -> Secret:
|
|
@@ -223,14 +218,7 @@ def import_secret(file: str) -> Secret:
|
|
|
223
218
|
--------
|
|
224
219
|
>>> obj = import_secret("my-secret.yaml")
|
|
225
220
|
"""
|
|
226
|
-
|
|
227
|
-
obj = secret_from_dict(dict_obj)
|
|
228
|
-
try:
|
|
229
|
-
obj.save()
|
|
230
|
-
except EntityAlreadyExistsError:
|
|
231
|
-
pass
|
|
232
|
-
finally:
|
|
233
|
-
return obj
|
|
221
|
+
return import_context_entity(file)
|
|
234
222
|
|
|
235
223
|
|
|
236
224
|
def update_secret(entity: Secret) -> Secret:
|
|
@@ -292,7 +280,7 @@ def delete_secret(
|
|
|
292
280
|
>>> project="my-project",
|
|
293
281
|
>>> delete_all_versions=True)
|
|
294
282
|
"""
|
|
295
|
-
return
|
|
283
|
+
return delete_entity(
|
|
296
284
|
identifier=identifier,
|
|
297
285
|
entity_type=ENTITY_TYPE,
|
|
298
286
|
project=project,
|
|
@@ -2,7 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import typing
|
|
4
4
|
|
|
5
|
-
from digitalhub.entities._base.runtime_entity.builder import RuntimeEntityBuilder
|
|
5
|
+
from digitalhub.entities._base.runtime_entity.builder import RuntimeEntityBuilder, EntityError
|
|
6
6
|
from digitalhub.entities._base.unversioned.builder import UnversionedBuilder
|
|
7
7
|
from digitalhub.entities.utils.entity_types import EntityTypes
|
|
8
8
|
|
|
@@ -49,6 +49,10 @@ class TaskBuilder(UnversionedBuilder, RuntimeEntityBuilder):
|
|
|
49
49
|
Task
|
|
50
50
|
Object instance.
|
|
51
51
|
"""
|
|
52
|
+
if function is None:
|
|
53
|
+
raise EntityError("function must be provided")
|
|
54
|
+
|
|
55
|
+
self._check_kind_validity(function)
|
|
52
56
|
uuid = self.build_uuid(uuid)
|
|
53
57
|
metadata = self.build_metadata(
|
|
54
58
|
project=project,
|
|
@@ -68,3 +72,20 @@ class TaskBuilder(UnversionedBuilder, RuntimeEntityBuilder):
|
|
|
68
72
|
spec=spec,
|
|
69
73
|
status=status,
|
|
70
74
|
)
|
|
75
|
+
|
|
76
|
+
def _check_kind_validity(self, function: str) -> None:
|
|
77
|
+
"""
|
|
78
|
+
Check kind validity.
|
|
79
|
+
|
|
80
|
+
Parameters
|
|
81
|
+
----------
|
|
82
|
+
function : str
|
|
83
|
+
Function string.
|
|
84
|
+
|
|
85
|
+
Returns
|
|
86
|
+
-------
|
|
87
|
+
None
|
|
88
|
+
"""
|
|
89
|
+
function_kind = function.split("://")[0]
|
|
90
|
+
if self.EXECUTABLE_KIND != function_kind:
|
|
91
|
+
raise EntityError(f"Invalid task '{self.ENTITY_KIND}' for function kind '{function_kind}'")
|
|
@@ -3,8 +3,9 @@ from __future__ import annotations
|
|
|
3
3
|
import typing
|
|
4
4
|
|
|
5
5
|
from digitalhub.entities._base.unversioned.entity import UnversionedEntity
|
|
6
|
-
from digitalhub.entities.run.crud import delete_run, get_run, new_run
|
|
6
|
+
from digitalhub.entities.run.crud import delete_run, get_run, new_run
|
|
7
7
|
from digitalhub.entities.utils.entity_types import EntityTypes
|
|
8
|
+
from digitalhub.factory.api import build_entity_from_params
|
|
8
9
|
|
|
9
10
|
if typing.TYPE_CHECKING:
|
|
10
11
|
from digitalhub.entities._base.entity.metadata import Metadata
|
|
@@ -100,7 +101,7 @@ class Task(UnversionedEntity):
|
|
|
100
101
|
Run object.
|
|
101
102
|
"""
|
|
102
103
|
if kwargs["local_execution"]:
|
|
103
|
-
return
|
|
104
|
+
return build_entity_from_params(**kwargs)
|
|
104
105
|
return new_run(**kwargs)
|
|
105
106
|
|
|
106
107
|
def get_run(self, entity_key: str) -> Run:
|
digitalhub/entities/task/crud.py
CHANGED
|
@@ -2,12 +2,15 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import typing
|
|
4
4
|
|
|
5
|
-
from digitalhub.
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
from digitalhub.entities._base.crud import (
|
|
6
|
+
delete_entity,
|
|
7
|
+
get_unversioned_entity,
|
|
8
|
+
import_context_entity,
|
|
9
|
+
list_context_entities,
|
|
10
|
+
new_context_entity,
|
|
11
|
+
)
|
|
8
12
|
from digitalhub.entities.utils.entity_types import EntityTypes
|
|
9
|
-
from digitalhub.utils.exceptions import
|
|
10
|
-
from digitalhub.utils.io_utils import read_yaml
|
|
13
|
+
from digitalhub.utils.exceptions import EntityError
|
|
11
14
|
|
|
12
15
|
if typing.TYPE_CHECKING:
|
|
13
16
|
from digitalhub.entities.task._base.entity import Task
|
|
@@ -49,13 +52,11 @@ def new_task(
|
|
|
49
52
|
|
|
50
53
|
Examples
|
|
51
54
|
--------
|
|
52
|
-
>>> obj =
|
|
53
|
-
>>>
|
|
54
|
-
>>>
|
|
55
|
-
>>> task="task-string"
|
|
55
|
+
>>> obj = new_task(project="my-project",
|
|
56
|
+
>>> kind="python+job",
|
|
57
|
+
>>> function="function-string")
|
|
56
58
|
"""
|
|
57
|
-
|
|
58
|
-
obj = task_from_parameters(
|
|
59
|
+
return new_context_entity(
|
|
59
60
|
project=project,
|
|
60
61
|
kind=kind,
|
|
61
62
|
uuid=uuid,
|
|
@@ -63,8 +64,6 @@ def new_task(
|
|
|
63
64
|
function=function,
|
|
64
65
|
**kwargs,
|
|
65
66
|
)
|
|
66
|
-
obj.save()
|
|
67
|
-
return obj
|
|
68
67
|
|
|
69
68
|
|
|
70
69
|
def get_task(
|
|
@@ -98,16 +97,12 @@ def get_task(
|
|
|
98
97
|
>>> obj = get_task("my-task-id"
|
|
99
98
|
>>> project="my-project")
|
|
100
99
|
"""
|
|
101
|
-
|
|
102
|
-
raise EntityError("Task has no name. Use key instead.")
|
|
103
|
-
obj = read_entity_api_ctx(
|
|
100
|
+
return get_unversioned_entity(
|
|
104
101
|
identifier,
|
|
105
|
-
ENTITY_TYPE,
|
|
102
|
+
entity_type=ENTITY_TYPE,
|
|
106
103
|
project=project,
|
|
107
|
-
entity_id=identifier,
|
|
108
104
|
**kwargs,
|
|
109
105
|
)
|
|
110
|
-
return task_from_dict(obj)
|
|
111
106
|
|
|
112
107
|
|
|
113
108
|
def list_tasks(project: str, **kwargs) -> list[Task]:
|
|
@@ -130,12 +125,11 @@ def list_tasks(project: str, **kwargs) -> list[Task]:
|
|
|
130
125
|
--------
|
|
131
126
|
>>> objs = list_tasks(project="my-project")
|
|
132
127
|
"""
|
|
133
|
-
|
|
128
|
+
return list_context_entities(
|
|
134
129
|
project=project,
|
|
135
130
|
entity_type=ENTITY_TYPE,
|
|
136
131
|
**kwargs,
|
|
137
132
|
)
|
|
138
|
-
return [task_from_dict(obj) for obj in objs]
|
|
139
133
|
|
|
140
134
|
|
|
141
135
|
def import_task(file: str) -> Task:
|
|
@@ -156,14 +150,7 @@ def import_task(file: str) -> Task:
|
|
|
156
150
|
-------
|
|
157
151
|
>>> obj = import_task("my-task.yaml")
|
|
158
152
|
"""
|
|
159
|
-
|
|
160
|
-
obj = task_from_dict(dict_obj)
|
|
161
|
-
try:
|
|
162
|
-
obj.save()
|
|
163
|
-
except EntityAlreadyExistsError:
|
|
164
|
-
pass
|
|
165
|
-
finally:
|
|
166
|
-
return obj
|
|
153
|
+
return import_context_entity(file)
|
|
167
154
|
|
|
168
155
|
|
|
169
156
|
def update_task(entity: Task) -> Task:
|
|
@@ -230,7 +217,7 @@ def delete_task(
|
|
|
230
217
|
"""
|
|
231
218
|
if not identifier.startswith("store://"):
|
|
232
219
|
raise EntityError("Task has no name. Use key instead.")
|
|
233
|
-
return
|
|
220
|
+
return delete_entity(
|
|
234
221
|
identifier=identifier,
|
|
235
222
|
entity_type=ENTITY_TYPE,
|
|
236
223
|
project=project,
|
|
@@ -2,17 +2,15 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import typing
|
|
4
4
|
|
|
5
|
-
from digitalhub.context.builder import check_context
|
|
6
5
|
from digitalhub.entities._base.crud import (
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
delete_entity,
|
|
7
|
+
get_context_entity_versions,
|
|
8
|
+
get_versioned_entity,
|
|
9
|
+
import_executable_entity,
|
|
10
|
+
list_context_entities,
|
|
11
|
+
new_context_entity,
|
|
11
12
|
)
|
|
12
13
|
from digitalhub.entities.utils.entity_types import EntityTypes
|
|
13
|
-
from digitalhub.entities.workflow.builder import workflow_from_dict, workflow_from_parameters
|
|
14
|
-
from digitalhub.utils.exceptions import EntityAlreadyExistsError
|
|
15
|
-
from digitalhub.utils.io_utils import read_yaml
|
|
16
14
|
|
|
17
15
|
if typing.TYPE_CHECKING:
|
|
18
16
|
from digitalhub.entities.workflow._base.entity import Workflow
|
|
@@ -28,7 +26,7 @@ def new_workflow(
|
|
|
28
26
|
uuid: str | None = None,
|
|
29
27
|
description: str | None = None,
|
|
30
28
|
labels: list[str] | None = None,
|
|
31
|
-
embedded: bool =
|
|
29
|
+
embedded: bool = False,
|
|
32
30
|
**kwargs,
|
|
33
31
|
) -> Workflow:
|
|
34
32
|
"""
|
|
@@ -64,8 +62,7 @@ def new_workflow(
|
|
|
64
62
|
>>> code_src="pipeline.py",
|
|
65
63
|
>>> handler="pipeline-handler")
|
|
66
64
|
"""
|
|
67
|
-
|
|
68
|
-
obj = workflow_from_parameters(
|
|
65
|
+
return new_context_entity(
|
|
69
66
|
project=project,
|
|
70
67
|
name=name,
|
|
71
68
|
kind=kind,
|
|
@@ -75,8 +72,6 @@ def new_workflow(
|
|
|
75
72
|
embedded=embedded,
|
|
76
73
|
**kwargs,
|
|
77
74
|
)
|
|
78
|
-
obj.save()
|
|
79
|
-
return obj
|
|
80
75
|
|
|
81
76
|
|
|
82
77
|
def get_workflow(
|
|
@@ -114,14 +109,13 @@ def get_workflow(
|
|
|
114
109
|
>>> project="my-project",
|
|
115
110
|
>>> entity_id="my-workflow-id")
|
|
116
111
|
"""
|
|
117
|
-
|
|
112
|
+
return get_versioned_entity(
|
|
118
113
|
identifier,
|
|
119
|
-
ENTITY_TYPE,
|
|
114
|
+
entity_type=ENTITY_TYPE,
|
|
120
115
|
project=project,
|
|
121
116
|
entity_id=entity_id,
|
|
122
117
|
**kwargs,
|
|
123
118
|
)
|
|
124
|
-
return workflow_from_dict(obj)
|
|
125
119
|
|
|
126
120
|
|
|
127
121
|
def get_workflow_versions(
|
|
@@ -155,13 +149,12 @@ def get_workflow_versions(
|
|
|
155
149
|
>>> obj = get_workflow_versions("my-workflow-name"
|
|
156
150
|
>>> project="my-project")
|
|
157
151
|
"""
|
|
158
|
-
|
|
152
|
+
return get_context_entity_versions(
|
|
159
153
|
identifier,
|
|
160
154
|
entity_type=ENTITY_TYPE,
|
|
161
155
|
project=project,
|
|
162
156
|
**kwargs,
|
|
163
157
|
)
|
|
164
|
-
return [workflow_from_dict(o) for o in obj]
|
|
165
158
|
|
|
166
159
|
|
|
167
160
|
def list_workflows(project: str, **kwargs) -> list[Workflow]:
|
|
@@ -184,12 +177,11 @@ def list_workflows(project: str, **kwargs) -> list[Workflow]:
|
|
|
184
177
|
--------
|
|
185
178
|
>>> objs = list_workflows(project="my-project")
|
|
186
179
|
"""
|
|
187
|
-
|
|
180
|
+
return list_context_entities(
|
|
188
181
|
project=project,
|
|
189
182
|
entity_type=ENTITY_TYPE,
|
|
190
183
|
**kwargs,
|
|
191
184
|
)
|
|
192
|
-
return [workflow_from_dict(obj) for obj in objs]
|
|
193
185
|
|
|
194
186
|
|
|
195
187
|
def import_workflow(file: str) -> Workflow:
|
|
@@ -210,25 +202,7 @@ def import_workflow(file: str) -> Workflow:
|
|
|
210
202
|
--------
|
|
211
203
|
>>> obj = import_workflow("my-workflow.yaml")
|
|
212
204
|
"""
|
|
213
|
-
|
|
214
|
-
if isinstance(dict_obj, list):
|
|
215
|
-
wkf_dict = dict_obj[0]
|
|
216
|
-
tsk_dicts = dict_obj[1:]
|
|
217
|
-
else:
|
|
218
|
-
wkf_dict = dict_obj
|
|
219
|
-
tsk_dicts = []
|
|
220
|
-
|
|
221
|
-
check_context(wkf_dict.get("project"))
|
|
222
|
-
obj = workflow_from_dict(wkf_dict)
|
|
223
|
-
|
|
224
|
-
obj.import_tasks(tsk_dicts)
|
|
225
|
-
|
|
226
|
-
try:
|
|
227
|
-
obj.save()
|
|
228
|
-
except EntityAlreadyExistsError:
|
|
229
|
-
pass
|
|
230
|
-
finally:
|
|
231
|
-
return obj
|
|
205
|
+
return import_executable_entity(file)
|
|
232
206
|
|
|
233
207
|
|
|
234
208
|
def update_workflow(entity: Workflow) -> Workflow:
|
|
@@ -293,7 +267,7 @@ def delete_workflow(
|
|
|
293
267
|
>>> project="my-project",
|
|
294
268
|
>>> delete_all_versions=True)
|
|
295
269
|
"""
|
|
296
|
-
return
|
|
270
|
+
return delete_entity(
|
|
297
271
|
identifier=identifier,
|
|
298
272
|
entity_type=ENTITY_TYPE,
|
|
299
273
|
project=project,
|
digitalhub/factory/api.py
CHANGED
|
@@ -13,22 +13,48 @@ if typing.TYPE_CHECKING:
|
|
|
13
13
|
from digitalhub.runtimes._base import Runtime
|
|
14
14
|
|
|
15
15
|
|
|
16
|
-
def
|
|
16
|
+
def build_entity_from_params(**kwargs) -> Entity:
|
|
17
17
|
"""
|
|
18
18
|
Build an entity.
|
|
19
19
|
|
|
20
20
|
Parameters
|
|
21
21
|
----------
|
|
22
|
-
|
|
23
|
-
Entity
|
|
22
|
+
**kwargs
|
|
23
|
+
Entity parameters.
|
|
24
24
|
|
|
25
25
|
Returns
|
|
26
26
|
-------
|
|
27
27
|
Entity
|
|
28
28
|
Entity object.
|
|
29
29
|
"""
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
try:
|
|
31
|
+
kind = kwargs["kind"]
|
|
32
|
+
except KeyError:
|
|
33
|
+
raise BuilderError("Missing 'kind' parameter.")
|
|
34
|
+
_raise_if_entity_builder_not_found(kind)
|
|
35
|
+
return factory.build_entity_from_params(kind, **kwargs)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def build_entity_from_dict(obj: dict) -> Entity:
|
|
39
|
+
"""
|
|
40
|
+
Build an entity from a dictionary.
|
|
41
|
+
|
|
42
|
+
Parameters
|
|
43
|
+
----------
|
|
44
|
+
obj : dict
|
|
45
|
+
Dictionary with entity data.
|
|
46
|
+
|
|
47
|
+
Returns
|
|
48
|
+
-------
|
|
49
|
+
Entity
|
|
50
|
+
Entity object.
|
|
51
|
+
"""
|
|
52
|
+
try:
|
|
53
|
+
kind = obj["kind"]
|
|
54
|
+
except KeyError:
|
|
55
|
+
raise BuilderError("Missing 'kind' parameter.")
|
|
56
|
+
_raise_if_entity_builder_not_found(kind)
|
|
57
|
+
return factory.build_entity_from_dict(kind, obj)
|
|
32
58
|
|
|
33
59
|
|
|
34
60
|
def build_spec(kind_to_build_from: str, **kwargs) -> Spec:
|
|
@@ -105,26 +131,6 @@ def build_runtime(kind_to_build_from: str, project: str) -> Runtime:
|
|
|
105
131
|
return factory.build_runtime(kind_to_build_from, project)
|
|
106
132
|
|
|
107
133
|
|
|
108
|
-
def build_entity_from_dict(kind_to_build_from: str, dict_data: dict) -> Entity:
|
|
109
|
-
"""
|
|
110
|
-
Build an entity from a dictionary.
|
|
111
|
-
|
|
112
|
-
Parameters
|
|
113
|
-
----------
|
|
114
|
-
kind_to_build_from : str
|
|
115
|
-
Entity type.
|
|
116
|
-
dict_data : dict
|
|
117
|
-
Dictionary with entity data.
|
|
118
|
-
|
|
119
|
-
Returns
|
|
120
|
-
-------
|
|
121
|
-
Entity
|
|
122
|
-
Entity object.
|
|
123
|
-
"""
|
|
124
|
-
_raise_if_entity_builder_not_found(kind_to_build_from)
|
|
125
|
-
return factory.build_entity_from_dict(kind_to_build_from, dict_data)
|
|
126
|
-
|
|
127
|
-
|
|
128
134
|
def get_entity_type_from_kind(kind: str) -> str:
|
|
129
135
|
"""
|
|
130
136
|
Get entity type from builder.
|
digitalhub/factory/factory.py
CHANGED
|
@@ -62,23 +62,25 @@ class Factory:
|
|
|
62
62
|
raise BuilderError(f"Builder {name} already exists.")
|
|
63
63
|
self._runtime_builders[name] = builder()
|
|
64
64
|
|
|
65
|
-
def build_entity_from_params(self, kind_to_build_from: str,
|
|
65
|
+
def build_entity_from_params(self, kind_to_build_from: str, **kwargs) -> Entity:
|
|
66
66
|
"""
|
|
67
|
-
Build an entity.
|
|
67
|
+
Build an entity from parameters.
|
|
68
68
|
|
|
69
69
|
Parameters
|
|
70
70
|
----------
|
|
71
71
|
kind_to_build_from : str
|
|
72
72
|
Entity type.
|
|
73
|
+
**kwargs
|
|
74
|
+
Entity parameters.
|
|
73
75
|
|
|
74
76
|
Returns
|
|
75
77
|
-------
|
|
76
78
|
Entity
|
|
77
79
|
Entity object.
|
|
78
80
|
"""
|
|
79
|
-
return self._entity_builders[kind_to_build_from].build(
|
|
81
|
+
return self._entity_builders[kind_to_build_from].build(**kwargs)
|
|
80
82
|
|
|
81
|
-
def build_entity_from_dict(self, kind_to_build_from: str,
|
|
83
|
+
def build_entity_from_dict(self, kind_to_build_from: str, obj: dict) -> Entity:
|
|
82
84
|
"""
|
|
83
85
|
Build an entity from a dictionary.
|
|
84
86
|
|
|
@@ -94,7 +96,7 @@ class Factory:
|
|
|
94
96
|
Entity
|
|
95
97
|
Entity object.
|
|
96
98
|
"""
|
|
97
|
-
return self._entity_builders[kind_to_build_from].from_dict(
|
|
99
|
+
return self._entity_builders[kind_to_build_from].from_dict(obj)
|
|
98
100
|
|
|
99
101
|
def build_spec(self, kind_to_build_from: str, **kwargs) -> Spec:
|
|
100
102
|
"""
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import typing
|
|
4
|
+
from abc import abstractmethod
|
|
5
|
+
|
|
6
|
+
from digitalhub.utils.exceptions import BuilderError
|
|
7
|
+
|
|
8
|
+
if typing.TYPE_CHECKING:
|
|
9
|
+
from digitalhub.readers._base.reader import DataframeReader
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class ReaderBuilder:
|
|
13
|
+
ENGINE = None
|
|
14
|
+
DATAFRAME_CLASS = None
|
|
15
|
+
|
|
16
|
+
def __init__(self):
|
|
17
|
+
if self.ENGINE is None:
|
|
18
|
+
raise BuilderError("ENGINE must be set.")
|
|
19
|
+
if self.DATAFRAME_CLASS is None:
|
|
20
|
+
raise BuilderError("DATAFRAME_CLASS must be set.")
|
|
21
|
+
|
|
22
|
+
@abstractmethod
|
|
23
|
+
def build(self, **kwargs) -> DataframeReader:
|
|
24
|
+
"""
|
|
25
|
+
Build reader object.
|
|
26
|
+
"""
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import typing
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
from digitalhub.readers.factory import factory
|
|
7
|
+
|
|
8
|
+
if typing.TYPE_CHECKING:
|
|
9
|
+
from digitalhub.readers._base.reader import DataframeReader
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def get_reader_by_engine(engine: str | None = None) -> DataframeReader:
|
|
13
|
+
"""
|
|
14
|
+
Get Dataframe reader.
|
|
15
|
+
|
|
16
|
+
Parameters
|
|
17
|
+
----------
|
|
18
|
+
engine : str
|
|
19
|
+
Dataframe engine (pandas, polars, etc.).
|
|
20
|
+
|
|
21
|
+
Returns
|
|
22
|
+
-------
|
|
23
|
+
DataframeReader
|
|
24
|
+
Reader object.
|
|
25
|
+
"""
|
|
26
|
+
if engine is None:
|
|
27
|
+
engine = factory.get_default()
|
|
28
|
+
try:
|
|
29
|
+
return factory.build(engine=engine)
|
|
30
|
+
except KeyError:
|
|
31
|
+
engines = factory.list_supported_engines()
|
|
32
|
+
msg = f"Unsupported dataframe engine: '{engine}'. Supported engines: {engines}"
|
|
33
|
+
raise ValueError(msg)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def get_reader_by_object(obj: Any) -> DataframeReader:
|
|
37
|
+
"""
|
|
38
|
+
Get Dataframe reader by object.
|
|
39
|
+
|
|
40
|
+
Parameters
|
|
41
|
+
----------
|
|
42
|
+
obj : Any
|
|
43
|
+
Object to get reader from.
|
|
44
|
+
|
|
45
|
+
Returns
|
|
46
|
+
-------
|
|
47
|
+
DataframeReader
|
|
48
|
+
Reader object.
|
|
49
|
+
"""
|
|
50
|
+
try:
|
|
51
|
+
obj_name = f"{obj.__class__.__module__}.{obj.__class__.__name__}"
|
|
52
|
+
return factory.build(dataframe=obj_name)
|
|
53
|
+
except KeyError:
|
|
54
|
+
types = factory.list_supported_dataframes()
|
|
55
|
+
msg = f"Unsupported dataframe type: '{obj}'. Supported types: {types}"
|
|
56
|
+
raise ValueError(msg)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def get_supported_engines() -> list[str]:
|
|
60
|
+
"""
|
|
61
|
+
Get supported engines.
|
|
62
|
+
|
|
63
|
+
Returns
|
|
64
|
+
-------
|
|
65
|
+
list
|
|
66
|
+
List of supported engines.
|
|
67
|
+
"""
|
|
68
|
+
return factory.list_supported_engines()
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def get_supported_dataframes() -> list[str]:
|
|
72
|
+
"""
|
|
73
|
+
Get supported dataframes.
|
|
74
|
+
|
|
75
|
+
Returns
|
|
76
|
+
-------
|
|
77
|
+
list
|
|
78
|
+
List of supported dataframes.
|
|
79
|
+
"""
|
|
80
|
+
return factory.list_supported_dataframes()
|