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,372 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import typing
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
from typing import Any
|
|
6
|
+
from urllib.parse import urlparse
|
|
7
|
+
|
|
8
|
+
from digitalhub.entities._base.crud import (
|
|
9
|
+
delete_entity,
|
|
10
|
+
get_material_entity,
|
|
11
|
+
get_material_entity_versions,
|
|
12
|
+
import_context_entity,
|
|
13
|
+
list_material_entities,
|
|
14
|
+
new_context_entity,
|
|
15
|
+
)
|
|
16
|
+
from digitalhub.entities._base.entity._constructors.uuid import build_uuid
|
|
17
|
+
from digitalhub.entities.utils.entity_types import EntityTypes
|
|
18
|
+
from digitalhub.entities.utils.utils import build_log_path_from_filename, build_log_path_from_source, eval_local_source
|
|
19
|
+
from digitalhub.factory.api import build_entity_from_params
|
|
20
|
+
from digitalhub.readers.api import get_reader_by_object
|
|
21
|
+
from digitalhub.stores.api import get_store
|
|
22
|
+
from digitalhub.utils.generic_utils import slugify_string
|
|
23
|
+
|
|
24
|
+
if typing.TYPE_CHECKING:
|
|
25
|
+
from digitalhub.entities.dataitem._base.entity import Dataitem
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
ENTITY_TYPE = EntityTypes.DATAITEM.value
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def new_dataitem(
|
|
32
|
+
project: str,
|
|
33
|
+
name: str,
|
|
34
|
+
kind: str,
|
|
35
|
+
uuid: str | None = None,
|
|
36
|
+
description: str | None = None,
|
|
37
|
+
labels: list[str] | None = None,
|
|
38
|
+
embedded: bool = False,
|
|
39
|
+
path: str | None = None,
|
|
40
|
+
**kwargs,
|
|
41
|
+
) -> Dataitem:
|
|
42
|
+
"""
|
|
43
|
+
Create a new object.
|
|
44
|
+
|
|
45
|
+
Parameters
|
|
46
|
+
----------
|
|
47
|
+
project : str
|
|
48
|
+
Project name.
|
|
49
|
+
name : str
|
|
50
|
+
Object name.
|
|
51
|
+
kind : str
|
|
52
|
+
Kind the object.
|
|
53
|
+
uuid : str
|
|
54
|
+
ID of the object.
|
|
55
|
+
description : str
|
|
56
|
+
Description of the object (human readable).
|
|
57
|
+
labels : list[str]
|
|
58
|
+
List of labels.
|
|
59
|
+
embedded : bool
|
|
60
|
+
Flag to determine if object spec must be embedded in project spec.
|
|
61
|
+
path : str
|
|
62
|
+
Object path on local file system or remote storage. It is also the destination path of upload() method.
|
|
63
|
+
**kwargs : dict
|
|
64
|
+
Spec keyword arguments.
|
|
65
|
+
|
|
66
|
+
Returns
|
|
67
|
+
-------
|
|
68
|
+
Dataitem
|
|
69
|
+
Object instance.
|
|
70
|
+
|
|
71
|
+
Examples
|
|
72
|
+
--------
|
|
73
|
+
>>> obj = new_dataitem(project="my-project",
|
|
74
|
+
>>> name="my-dataitem",
|
|
75
|
+
>>> kind="dataitem",
|
|
76
|
+
>>> path="s3://my-bucket/my-key")
|
|
77
|
+
"""
|
|
78
|
+
return new_context_entity(
|
|
79
|
+
project=project,
|
|
80
|
+
name=name,
|
|
81
|
+
kind=kind,
|
|
82
|
+
uuid=uuid,
|
|
83
|
+
description=description,
|
|
84
|
+
labels=labels,
|
|
85
|
+
embedded=embedded,
|
|
86
|
+
path=path,
|
|
87
|
+
**kwargs,
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def log_dataitem(
|
|
92
|
+
project: str,
|
|
93
|
+
name: str,
|
|
94
|
+
kind: str,
|
|
95
|
+
source: list[str] | str | None = None,
|
|
96
|
+
data: Any | None = None,
|
|
97
|
+
extension: str | None = None,
|
|
98
|
+
path: str | None = None,
|
|
99
|
+
**kwargs,
|
|
100
|
+
) -> Dataitem:
|
|
101
|
+
"""
|
|
102
|
+
Log a dataitem to the project.
|
|
103
|
+
|
|
104
|
+
Parameters
|
|
105
|
+
----------
|
|
106
|
+
project : str
|
|
107
|
+
Project name.
|
|
108
|
+
name : str
|
|
109
|
+
Object name.
|
|
110
|
+
kind : str
|
|
111
|
+
Kind the object.
|
|
112
|
+
source : str
|
|
113
|
+
Dataitem location on local path.
|
|
114
|
+
data : Any
|
|
115
|
+
Dataframe to log. Alternative to source.
|
|
116
|
+
extension : str
|
|
117
|
+
Extension of the output dataframe.
|
|
118
|
+
path : str
|
|
119
|
+
Destination path of the dataitem. If not provided, it's generated.
|
|
120
|
+
**kwargs : dict
|
|
121
|
+
New dataitem spec parameters.
|
|
122
|
+
|
|
123
|
+
Returns
|
|
124
|
+
-------
|
|
125
|
+
Dataitem
|
|
126
|
+
Object instance.
|
|
127
|
+
|
|
128
|
+
Examples
|
|
129
|
+
--------
|
|
130
|
+
>>> obj = log_dataitem(project="my-project",
|
|
131
|
+
>>> name="my-dataitem",
|
|
132
|
+
>>> kind="table",
|
|
133
|
+
>>> data=df)
|
|
134
|
+
"""
|
|
135
|
+
if (source is None) == (data is None):
|
|
136
|
+
raise ValueError("You must provide source or data.")
|
|
137
|
+
|
|
138
|
+
# Case where source is provided
|
|
139
|
+
if source is not None:
|
|
140
|
+
eval_local_source(source)
|
|
141
|
+
|
|
142
|
+
if path is None:
|
|
143
|
+
uuid = build_uuid()
|
|
144
|
+
kwargs["uuid"] = uuid
|
|
145
|
+
path = build_log_path_from_source(project, ENTITY_TYPE, name, uuid, source)
|
|
146
|
+
|
|
147
|
+
obj = new_dataitem(project=project, name=name, kind=kind, path=path, **kwargs)
|
|
148
|
+
obj.upload(source)
|
|
149
|
+
|
|
150
|
+
# Case where data is provided
|
|
151
|
+
else:
|
|
152
|
+
extension = extension if extension is not None else "parquet"
|
|
153
|
+
if path is None:
|
|
154
|
+
uuid = build_uuid()
|
|
155
|
+
kwargs["uuid"] = uuid
|
|
156
|
+
slug = slugify_string(name) + f".{extension}"
|
|
157
|
+
path = build_log_path_from_filename(project, ENTITY_TYPE, name, uuid, slug)
|
|
158
|
+
|
|
159
|
+
obj = build_entity_from_params(project=project, name=name, kind=kind, path=path, **kwargs)
|
|
160
|
+
if kind == "table":
|
|
161
|
+
dst = obj.write_df(df=data, extension=extension)
|
|
162
|
+
reader = get_reader_by_object(data)
|
|
163
|
+
obj.spec.schema = reader.get_schema(data)
|
|
164
|
+
obj.status.preview = reader.get_preview(data)
|
|
165
|
+
store = get_store(obj.spec.path)
|
|
166
|
+
src = Path(urlparse(obj.spec.path).path).name
|
|
167
|
+
paths = [(dst, src)]
|
|
168
|
+
infos = store.get_file_info(paths)
|
|
169
|
+
obj.status.add_files_info(infos)
|
|
170
|
+
obj.save()
|
|
171
|
+
|
|
172
|
+
return obj
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def get_dataitem(
|
|
176
|
+
identifier: str,
|
|
177
|
+
project: str | None = None,
|
|
178
|
+
entity_id: str | None = None,
|
|
179
|
+
**kwargs,
|
|
180
|
+
) -> Dataitem:
|
|
181
|
+
"""
|
|
182
|
+
Get object from backend.
|
|
183
|
+
|
|
184
|
+
Parameters
|
|
185
|
+
----------
|
|
186
|
+
identifier : str
|
|
187
|
+
Entity key (store://...) or entity name.
|
|
188
|
+
project : str
|
|
189
|
+
Project name.
|
|
190
|
+
entity_id : str
|
|
191
|
+
Entity ID.
|
|
192
|
+
**kwargs : dict
|
|
193
|
+
Parameters to pass to the API call.
|
|
194
|
+
|
|
195
|
+
Returns
|
|
196
|
+
-------
|
|
197
|
+
Dataitem
|
|
198
|
+
Object instance.
|
|
199
|
+
|
|
200
|
+
Examples
|
|
201
|
+
--------
|
|
202
|
+
Using entity key:
|
|
203
|
+
>>> obj = get_dataitem("store://my-dataitem-key")
|
|
204
|
+
|
|
205
|
+
Using entity name:
|
|
206
|
+
>>> obj = get_dataitem("my-dataitem-name"
|
|
207
|
+
>>> project="my-project",
|
|
208
|
+
>>> entity_id="my-dataitem-id")
|
|
209
|
+
"""
|
|
210
|
+
return get_material_entity(
|
|
211
|
+
identifier=identifier,
|
|
212
|
+
entity_type=ENTITY_TYPE,
|
|
213
|
+
project=project,
|
|
214
|
+
entity_id=entity_id,
|
|
215
|
+
**kwargs,
|
|
216
|
+
)
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
def get_dataitem_versions(
|
|
220
|
+
identifier: str,
|
|
221
|
+
project: str | None = None,
|
|
222
|
+
**kwargs,
|
|
223
|
+
) -> list[Dataitem]:
|
|
224
|
+
"""
|
|
225
|
+
Get object versions from backend.
|
|
226
|
+
|
|
227
|
+
Parameters
|
|
228
|
+
----------
|
|
229
|
+
identifier : str
|
|
230
|
+
Entity key (store://...) or entity name.
|
|
231
|
+
project : str
|
|
232
|
+
Project name.
|
|
233
|
+
**kwargs : dict
|
|
234
|
+
Parameters to pass to the API call.
|
|
235
|
+
|
|
236
|
+
Returns
|
|
237
|
+
-------
|
|
238
|
+
list[Dataitem]
|
|
239
|
+
List of object instances.
|
|
240
|
+
|
|
241
|
+
Examples
|
|
242
|
+
--------
|
|
243
|
+
Using entity key:
|
|
244
|
+
>>> objs = get_dataitem_versions("store://my-dataitem-key")
|
|
245
|
+
|
|
246
|
+
Using entity name:
|
|
247
|
+
>>> objs = get_dataitem_versions("my-dataitem-name",
|
|
248
|
+
>>> project="my-project")
|
|
249
|
+
"""
|
|
250
|
+
return get_material_entity_versions(
|
|
251
|
+
identifier=identifier,
|
|
252
|
+
entity_type=ENTITY_TYPE,
|
|
253
|
+
project=project,
|
|
254
|
+
**kwargs,
|
|
255
|
+
)
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
def list_dataitems(project: str, **kwargs) -> list[Dataitem]:
|
|
259
|
+
"""
|
|
260
|
+
List all latest version objects from backend.
|
|
261
|
+
|
|
262
|
+
Parameters
|
|
263
|
+
----------
|
|
264
|
+
project : str
|
|
265
|
+
Project name.
|
|
266
|
+
**kwargs : dict
|
|
267
|
+
Parameters to pass to the API call.
|
|
268
|
+
|
|
269
|
+
Returns
|
|
270
|
+
-------
|
|
271
|
+
list[Dataitem]
|
|
272
|
+
List of object instances.
|
|
273
|
+
|
|
274
|
+
Examples
|
|
275
|
+
--------
|
|
276
|
+
>>> objs = list_dataitems(project="my-project")
|
|
277
|
+
"""
|
|
278
|
+
return list_material_entities(
|
|
279
|
+
project=project,
|
|
280
|
+
entity_type=ENTITY_TYPE,
|
|
281
|
+
**kwargs,
|
|
282
|
+
)
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
def import_dataitem(file: str) -> Dataitem:
|
|
286
|
+
"""
|
|
287
|
+
Import object from a YAML file.
|
|
288
|
+
|
|
289
|
+
Parameters
|
|
290
|
+
----------
|
|
291
|
+
file : str
|
|
292
|
+
Path to YAML file.
|
|
293
|
+
|
|
294
|
+
Returns
|
|
295
|
+
-------
|
|
296
|
+
Dataitem
|
|
297
|
+
Object instance.
|
|
298
|
+
|
|
299
|
+
Examples
|
|
300
|
+
--------
|
|
301
|
+
>>> obj = import_dataitem("my-dataitem.yaml")
|
|
302
|
+
"""
|
|
303
|
+
return import_context_entity(file)
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
def update_dataitem(entity: Dataitem) -> Dataitem:
|
|
307
|
+
"""
|
|
308
|
+
Update object. Note that object spec are immutable.
|
|
309
|
+
|
|
310
|
+
Parameters
|
|
311
|
+
----------
|
|
312
|
+
entity : Dataitem
|
|
313
|
+
Object to update.
|
|
314
|
+
|
|
315
|
+
Returns
|
|
316
|
+
-------
|
|
317
|
+
Dataitem
|
|
318
|
+
Entity updated.
|
|
319
|
+
|
|
320
|
+
Examples
|
|
321
|
+
--------
|
|
322
|
+
>>> obj = update_dataitem(obj)
|
|
323
|
+
"""
|
|
324
|
+
return entity.save(update=True)
|
|
325
|
+
|
|
326
|
+
|
|
327
|
+
def delete_dataitem(
|
|
328
|
+
identifier: str,
|
|
329
|
+
project: str | None = None,
|
|
330
|
+
entity_id: str | None = None,
|
|
331
|
+
delete_all_versions: bool = False,
|
|
332
|
+
**kwargs,
|
|
333
|
+
) -> dict:
|
|
334
|
+
"""
|
|
335
|
+
Delete object from backend.
|
|
336
|
+
|
|
337
|
+
Parameters
|
|
338
|
+
----------
|
|
339
|
+
identifier : str
|
|
340
|
+
Entity key (store://...) or entity name.
|
|
341
|
+
project : str
|
|
342
|
+
Project name.
|
|
343
|
+
entity_id : str
|
|
344
|
+
Entity ID.
|
|
345
|
+
delete_all_versions : bool
|
|
346
|
+
Delete all versions of the named entity. If True, use entity name instead of entity key as identifier.
|
|
347
|
+
**kwargs : dict
|
|
348
|
+
Parameters to pass to the API call.
|
|
349
|
+
|
|
350
|
+
Returns
|
|
351
|
+
-------
|
|
352
|
+
dict
|
|
353
|
+
Response from backend.
|
|
354
|
+
|
|
355
|
+
Examples
|
|
356
|
+
--------
|
|
357
|
+
If delete_all_versions is False:
|
|
358
|
+
>>> obj = delete_dataitem("store://my-dataitem-key")
|
|
359
|
+
|
|
360
|
+
Otherwise:
|
|
361
|
+
>>> obj = delete_dataitem("my-dataitem-name",
|
|
362
|
+
>>> project="my-project",
|
|
363
|
+
>>> delete_all_versions=True)
|
|
364
|
+
"""
|
|
365
|
+
return delete_entity(
|
|
366
|
+
identifier=identifier,
|
|
367
|
+
entity_type=ENTITY_TYPE,
|
|
368
|
+
project=project,
|
|
369
|
+
entity_id=entity_id,
|
|
370
|
+
delete_all_versions=delete_all_versions,
|
|
371
|
+
**kwargs,
|
|
372
|
+
)
|
|
File without changes
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from digitalhub.entities.dataitem._base.builder import DataitemBuilder
|
|
4
|
+
from digitalhub.entities.dataitem.dataitem.entity import DataitemDataitem
|
|
5
|
+
from digitalhub.entities.dataitem.dataitem.spec import DataitemSpecDataitem, DataitemValidatorDataitem
|
|
6
|
+
from digitalhub.entities.dataitem.dataitem.status import DataitemStatusDataitem
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class DataitemDataitemBuilder(DataitemBuilder):
|
|
10
|
+
"""
|
|
11
|
+
DataitemDataitem builder.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
ENTITY_CLASS = DataitemDataitem
|
|
15
|
+
ENTITY_SPEC_CLASS = DataitemSpecDataitem
|
|
16
|
+
ENTITY_SPEC_VALIDATOR = DataitemValidatorDataitem
|
|
17
|
+
ENTITY_STATUS_CLASS = DataitemStatusDataitem
|
|
18
|
+
ENTITY_KIND = "dataitem"
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import typing
|
|
4
|
+
|
|
5
|
+
from digitalhub.entities.dataitem._base.entity import Dataitem
|
|
6
|
+
|
|
7
|
+
if typing.TYPE_CHECKING:
|
|
8
|
+
from digitalhub.entities._base.entity.metadata import Metadata
|
|
9
|
+
from digitalhub.entities.dataitem.dataitem.spec import DataitemSpecDataitem
|
|
10
|
+
from digitalhub.entities.dataitem.dataitem.status import DataitemStatusDataitem
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class DataitemDataitem(Dataitem):
|
|
14
|
+
"""
|
|
15
|
+
DataitemDataitem class.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
def __init__(
|
|
19
|
+
self,
|
|
20
|
+
project: str,
|
|
21
|
+
name: str,
|
|
22
|
+
uuid: str,
|
|
23
|
+
kind: str,
|
|
24
|
+
metadata: Metadata,
|
|
25
|
+
spec: DataitemSpecDataitem,
|
|
26
|
+
status: DataitemStatusDataitem,
|
|
27
|
+
user: str | None = None,
|
|
28
|
+
) -> None:
|
|
29
|
+
super().__init__(project, name, uuid, kind, metadata, spec, status, user)
|
|
30
|
+
|
|
31
|
+
self.spec: DataitemSpecDataitem
|
|
32
|
+
self.status: DataitemStatusDataitem
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from digitalhub.entities.dataitem._base.spec import DataitemSpec, DataitemValidator
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class DataitemSpecDataitem(DataitemSpec):
|
|
7
|
+
"""
|
|
8
|
+
DataitemSpecDataitem specifications.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class DataitemValidatorDataitem(DataitemValidator):
|
|
13
|
+
"""
|
|
14
|
+
DataitemValidatorDataitem validator.
|
|
15
|
+
"""
|
|
File without changes
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from digitalhub.entities.dataitem._base.builder import DataitemBuilder
|
|
4
|
+
from digitalhub.entities.dataitem.iceberg.entity import DataitemIceberg
|
|
5
|
+
from digitalhub.entities.dataitem.iceberg.spec import DataitemSpecIceberg, DataitemValidatorIceberg
|
|
6
|
+
from digitalhub.entities.dataitem.iceberg.status import DataitemStatusIceberg
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class DataitemIcebergBuilder(DataitemBuilder):
|
|
10
|
+
"""
|
|
11
|
+
DataitemIceberg builder.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
ENTITY_CLASS = DataitemIceberg
|
|
15
|
+
ENTITY_SPEC_CLASS = DataitemSpecIceberg
|
|
16
|
+
ENTITY_SPEC_VALIDATOR = DataitemValidatorIceberg
|
|
17
|
+
ENTITY_STATUS_CLASS = DataitemStatusIceberg
|
|
18
|
+
ENTITY_KIND = "iceberg"
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import typing
|
|
4
|
+
|
|
5
|
+
from digitalhub.entities.dataitem._base.entity import Dataitem
|
|
6
|
+
|
|
7
|
+
if typing.TYPE_CHECKING:
|
|
8
|
+
from digitalhub.entities._base.entity.metadata import Metadata
|
|
9
|
+
from digitalhub.entities.dataitem.iceberg.spec import DataitemSpecIceberg
|
|
10
|
+
from digitalhub.entities.dataitem.iceberg.status import DataitemStatusIceberg
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class DataitemIceberg(Dataitem):
|
|
14
|
+
"""
|
|
15
|
+
DataitemIceberg class.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
def __init__(
|
|
19
|
+
self,
|
|
20
|
+
project: str,
|
|
21
|
+
name: str,
|
|
22
|
+
uuid: str,
|
|
23
|
+
kind: str,
|
|
24
|
+
metadata: Metadata,
|
|
25
|
+
spec: DataitemSpecIceberg,
|
|
26
|
+
status: DataitemStatusIceberg,
|
|
27
|
+
user: str | None = None,
|
|
28
|
+
) -> None:
|
|
29
|
+
super().__init__(project, name, uuid, kind, metadata, spec, status, user)
|
|
30
|
+
|
|
31
|
+
self.spec: DataitemSpecIceberg
|
|
32
|
+
self.status: DataitemStatusIceberg
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from digitalhub.entities.dataitem._base.spec import DataitemSpec, DataitemValidator
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class DataitemSpecIceberg(DataitemSpec):
|
|
7
|
+
"""
|
|
8
|
+
DataitemSpecIceberg specifications.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class DataitemValidatorIceberg(DataitemValidator):
|
|
13
|
+
"""
|
|
14
|
+
DataitemValidatorIceberg validator.
|
|
15
|
+
"""
|
|
File without changes
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from digitalhub.entities.dataitem._base.builder import DataitemBuilder
|
|
4
|
+
from digitalhub.entities.dataitem.table.entity import DataitemTable
|
|
5
|
+
from digitalhub.entities.dataitem.table.spec import DataitemSpecTable, DataitemValidatorTable
|
|
6
|
+
from digitalhub.entities.dataitem.table.status import DataitemStatusTable
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class DataitemTableBuilder(DataitemBuilder):
|
|
10
|
+
"""
|
|
11
|
+
DataitemTable builder.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
ENTITY_CLASS = DataitemTable
|
|
15
|
+
ENTITY_SPEC_CLASS = DataitemSpecTable
|
|
16
|
+
ENTITY_SPEC_VALIDATOR = DataitemValidatorTable
|
|
17
|
+
ENTITY_STATUS_CLASS = DataitemStatusTable
|
|
18
|
+
ENTITY_KIND = "table"
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import shutil
|
|
4
|
+
import typing
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
from digitalhub.datastores.api import get_datastore
|
|
9
|
+
from digitalhub.entities.dataitem._base.entity import Dataitem
|
|
10
|
+
from digitalhub.utils.uri_utils import check_local_path
|
|
11
|
+
|
|
12
|
+
if typing.TYPE_CHECKING:
|
|
13
|
+
from digitalhub.entities._base.entity.metadata import Metadata
|
|
14
|
+
from digitalhub.entities.dataitem.table.spec import DataitemSpecTable
|
|
15
|
+
from digitalhub.entities.dataitem.table.status import DataitemStatusTable
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class DataitemTable(Dataitem):
|
|
19
|
+
"""
|
|
20
|
+
DataitemTable class.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
def __init__(
|
|
24
|
+
self,
|
|
25
|
+
project: str,
|
|
26
|
+
name: str,
|
|
27
|
+
uuid: str,
|
|
28
|
+
kind: str,
|
|
29
|
+
metadata: Metadata,
|
|
30
|
+
spec: DataitemSpecTable,
|
|
31
|
+
status: DataitemStatusTable,
|
|
32
|
+
user: str | None = None,
|
|
33
|
+
) -> None:
|
|
34
|
+
super().__init__(project, name, uuid, kind, metadata, spec, status, user)
|
|
35
|
+
|
|
36
|
+
self.spec: DataitemSpecTable
|
|
37
|
+
self.status: DataitemStatusTable
|
|
38
|
+
|
|
39
|
+
def as_df(
|
|
40
|
+
self,
|
|
41
|
+
file_format: str | None = None,
|
|
42
|
+
engine: str | None = None,
|
|
43
|
+
clean_tmp_path: bool = True,
|
|
44
|
+
**kwargs,
|
|
45
|
+
) -> Any:
|
|
46
|
+
"""
|
|
47
|
+
Read dataitem file (csv or parquet) as a DataFrame from spec.path.
|
|
48
|
+
If the dataitem is not local, it will be downloaded to a temporary
|
|
49
|
+
folder named tmp_dir in the project context folder.
|
|
50
|
+
If clean_tmp_path is True, the temporary folder will be deleted after the
|
|
51
|
+
method is executed.
|
|
52
|
+
It's possible to pass additional arguments to the this function. These
|
|
53
|
+
keyword arguments will be passed to the DataFrame reader function such as
|
|
54
|
+
pandas's read_csv or read_parquet.
|
|
55
|
+
|
|
56
|
+
Parameters
|
|
57
|
+
----------
|
|
58
|
+
file_format : str
|
|
59
|
+
Format of the file. (Supported csv and parquet).
|
|
60
|
+
engine : str
|
|
61
|
+
Dataframe framework, by default pandas.
|
|
62
|
+
clean_tmp_path : bool
|
|
63
|
+
If True, the temporary folder will be deleted.
|
|
64
|
+
**kwargs : dict
|
|
65
|
+
Keyword arguments passed to the read_df function.
|
|
66
|
+
|
|
67
|
+
Returns
|
|
68
|
+
-------
|
|
69
|
+
Any
|
|
70
|
+
DataFrame.
|
|
71
|
+
"""
|
|
72
|
+
if engine is None:
|
|
73
|
+
engine = "pandas"
|
|
74
|
+
try:
|
|
75
|
+
if check_local_path(self.spec.path):
|
|
76
|
+
tmp_dir = None
|
|
77
|
+
data_path = self.spec.path
|
|
78
|
+
else:
|
|
79
|
+
tmp_dir = self._context().root / "tmp_data"
|
|
80
|
+
tmp_dir.mkdir(parents=True, exist_ok=True)
|
|
81
|
+
data_path = self.download(destination=str(tmp_dir), overwrite=True)
|
|
82
|
+
|
|
83
|
+
if Path(data_path).is_dir():
|
|
84
|
+
files = [str(i) for i in Path(data_path).rglob("*") if i.is_file()]
|
|
85
|
+
checker = files[0]
|
|
86
|
+
else:
|
|
87
|
+
checker = data_path
|
|
88
|
+
|
|
89
|
+
extension = self._get_extension(checker, file_format)
|
|
90
|
+
datastore = get_datastore("")
|
|
91
|
+
|
|
92
|
+
return datastore.read_df(data_path, extension, engine, **kwargs)
|
|
93
|
+
|
|
94
|
+
except Exception as e:
|
|
95
|
+
raise e
|
|
96
|
+
|
|
97
|
+
finally:
|
|
98
|
+
# Delete tmp folder
|
|
99
|
+
self._clean_tmp_path(tmp_dir, clean_tmp_path)
|
|
100
|
+
|
|
101
|
+
def write_df(
|
|
102
|
+
self,
|
|
103
|
+
df: Any,
|
|
104
|
+
extension: str | None = None,
|
|
105
|
+
**kwargs,
|
|
106
|
+
) -> str:
|
|
107
|
+
"""
|
|
108
|
+
Write DataFrame as parquet/csv/table into dataitem spec.path.
|
|
109
|
+
keyword arguments will be passed to the DataFrame reader function such as
|
|
110
|
+
pandas's to_csv or to_parquet.
|
|
111
|
+
|
|
112
|
+
Parameters
|
|
113
|
+
----------
|
|
114
|
+
df : Any
|
|
115
|
+
DataFrame to write.
|
|
116
|
+
extension : str
|
|
117
|
+
Extension of the file.
|
|
118
|
+
**kwargs : dict
|
|
119
|
+
Keyword arguments passed to the write_df function.
|
|
120
|
+
|
|
121
|
+
Returns
|
|
122
|
+
-------
|
|
123
|
+
str
|
|
124
|
+
Path to the written dataframe.
|
|
125
|
+
"""
|
|
126
|
+
datastore = get_datastore(self.spec.path)
|
|
127
|
+
return datastore.write_df(df, self.spec.path, extension=extension, **kwargs)
|
|
128
|
+
|
|
129
|
+
@staticmethod
|
|
130
|
+
def _clean_tmp_path(pth: Path | None, clean: bool) -> None:
|
|
131
|
+
"""
|
|
132
|
+
Clean temporary path.
|
|
133
|
+
|
|
134
|
+
Parameters
|
|
135
|
+
----------
|
|
136
|
+
pth : Path | None
|
|
137
|
+
Path to clean.
|
|
138
|
+
clean : bool
|
|
139
|
+
If True, the path will be cleaned.
|
|
140
|
+
|
|
141
|
+
Returns
|
|
142
|
+
-------
|
|
143
|
+
None
|
|
144
|
+
"""
|
|
145
|
+
if pth is not None and clean:
|
|
146
|
+
shutil.rmtree(pth)
|