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.

Files changed (232) hide show
  1. digitalhub/__init__.py +63 -93
  2. digitalhub/client/__init__.py +0 -0
  3. digitalhub/client/_base/__init__.py +0 -0
  4. digitalhub/client/_base/client.py +56 -0
  5. digitalhub/client/api.py +63 -0
  6. digitalhub/client/builder.py +50 -0
  7. digitalhub/client/dhcore/__init__.py +0 -0
  8. digitalhub/client/dhcore/client.py +669 -0
  9. digitalhub/client/dhcore/env.py +21 -0
  10. digitalhub/client/dhcore/models.py +46 -0
  11. digitalhub/client/dhcore/utils.py +111 -0
  12. digitalhub/client/local/__init__.py +0 -0
  13. digitalhub/client/local/client.py +533 -0
  14. digitalhub/context/__init__.py +0 -0
  15. digitalhub/context/api.py +93 -0
  16. digitalhub/context/builder.py +94 -0
  17. digitalhub/context/context.py +136 -0
  18. digitalhub/datastores/__init__.py +0 -0
  19. digitalhub/datastores/_base/__init__.py +0 -0
  20. digitalhub/datastores/_base/datastore.py +85 -0
  21. digitalhub/datastores/api.py +37 -0
  22. digitalhub/datastores/builder.py +110 -0
  23. digitalhub/datastores/local/__init__.py +0 -0
  24. digitalhub/datastores/local/datastore.py +50 -0
  25. digitalhub/datastores/remote/__init__.py +0 -0
  26. digitalhub/datastores/remote/datastore.py +31 -0
  27. digitalhub/datastores/s3/__init__.py +0 -0
  28. digitalhub/datastores/s3/datastore.py +46 -0
  29. digitalhub/datastores/sql/__init__.py +0 -0
  30. digitalhub/datastores/sql/datastore.py +68 -0
  31. digitalhub/entities/__init__.py +0 -0
  32. digitalhub/entities/_base/__init__.py +0 -0
  33. digitalhub/entities/_base/_base/__init__.py +0 -0
  34. digitalhub/entities/_base/_base/entity.py +82 -0
  35. digitalhub/entities/_base/api_utils.py +620 -0
  36. digitalhub/entities/_base/context/__init__.py +0 -0
  37. digitalhub/entities/_base/context/entity.py +118 -0
  38. digitalhub/entities/_base/crud.py +468 -0
  39. digitalhub/entities/_base/entity/__init__.py +0 -0
  40. digitalhub/entities/_base/entity/_constructors/__init__.py +0 -0
  41. digitalhub/entities/_base/entity/_constructors/metadata.py +44 -0
  42. digitalhub/entities/_base/entity/_constructors/name.py +31 -0
  43. digitalhub/entities/_base/entity/_constructors/spec.py +33 -0
  44. digitalhub/entities/_base/entity/_constructors/status.py +52 -0
  45. digitalhub/entities/_base/entity/_constructors/uuid.py +26 -0
  46. digitalhub/entities/_base/entity/builder.py +175 -0
  47. digitalhub/entities/_base/entity/entity.py +106 -0
  48. digitalhub/entities/_base/entity/metadata.py +59 -0
  49. digitalhub/entities/_base/entity/spec.py +58 -0
  50. digitalhub/entities/_base/entity/status.py +43 -0
  51. digitalhub/entities/_base/executable/__init__.py +0 -0
  52. digitalhub/entities/_base/executable/entity.py +405 -0
  53. digitalhub/entities/_base/material/__init__.py +0 -0
  54. digitalhub/entities/_base/material/entity.py +214 -0
  55. digitalhub/entities/_base/material/spec.py +22 -0
  56. digitalhub/entities/_base/material/status.py +49 -0
  57. digitalhub/entities/_base/runtime_entity/__init__.py +0 -0
  58. digitalhub/entities/_base/runtime_entity/builder.py +106 -0
  59. digitalhub/entities/_base/unversioned/__init__.py +0 -0
  60. digitalhub/entities/_base/unversioned/builder.py +66 -0
  61. digitalhub/entities/_base/unversioned/entity.py +49 -0
  62. digitalhub/entities/_base/versioned/__init__.py +0 -0
  63. digitalhub/entities/_base/versioned/builder.py +68 -0
  64. digitalhub/entities/_base/versioned/entity.py +53 -0
  65. digitalhub/entities/artifact/__init__.py +0 -0
  66. digitalhub/entities/artifact/_base/__init__.py +0 -0
  67. digitalhub/entities/artifact/_base/builder.py +86 -0
  68. digitalhub/entities/artifact/_base/entity.py +39 -0
  69. digitalhub/entities/artifact/_base/spec.py +15 -0
  70. digitalhub/entities/artifact/_base/status.py +9 -0
  71. digitalhub/entities/artifact/artifact/__init__.py +0 -0
  72. digitalhub/entities/artifact/artifact/builder.py +18 -0
  73. digitalhub/entities/artifact/artifact/entity.py +32 -0
  74. digitalhub/entities/artifact/artifact/spec.py +27 -0
  75. digitalhub/entities/artifact/artifact/status.py +15 -0
  76. digitalhub/entities/artifact/crud.py +332 -0
  77. digitalhub/entities/builders.py +63 -0
  78. digitalhub/entities/dataitem/__init__.py +0 -0
  79. digitalhub/entities/dataitem/_base/__init__.py +0 -0
  80. digitalhub/entities/dataitem/_base/builder.py +86 -0
  81. digitalhub/entities/dataitem/_base/entity.py +75 -0
  82. digitalhub/entities/dataitem/_base/spec.py +15 -0
  83. digitalhub/entities/dataitem/_base/status.py +20 -0
  84. digitalhub/entities/dataitem/crud.py +372 -0
  85. digitalhub/entities/dataitem/dataitem/__init__.py +0 -0
  86. digitalhub/entities/dataitem/dataitem/builder.py +18 -0
  87. digitalhub/entities/dataitem/dataitem/entity.py +32 -0
  88. digitalhub/entities/dataitem/dataitem/spec.py +15 -0
  89. digitalhub/entities/dataitem/dataitem/status.py +9 -0
  90. digitalhub/entities/dataitem/iceberg/__init__.py +0 -0
  91. digitalhub/entities/dataitem/iceberg/builder.py +18 -0
  92. digitalhub/entities/dataitem/iceberg/entity.py +32 -0
  93. digitalhub/entities/dataitem/iceberg/spec.py +15 -0
  94. digitalhub/entities/dataitem/iceberg/status.py +9 -0
  95. digitalhub/entities/dataitem/table/__init__.py +0 -0
  96. digitalhub/entities/dataitem/table/builder.py +18 -0
  97. digitalhub/entities/dataitem/table/entity.py +146 -0
  98. digitalhub/entities/dataitem/table/models.py +62 -0
  99. digitalhub/entities/dataitem/table/spec.py +25 -0
  100. digitalhub/entities/dataitem/table/status.py +9 -0
  101. digitalhub/entities/function/__init__.py +0 -0
  102. digitalhub/entities/function/_base/__init__.py +0 -0
  103. digitalhub/entities/function/_base/builder.py +79 -0
  104. digitalhub/entities/function/_base/entity.py +98 -0
  105. digitalhub/entities/function/_base/models.py +118 -0
  106. digitalhub/entities/function/_base/spec.py +15 -0
  107. digitalhub/entities/function/_base/status.py +9 -0
  108. digitalhub/entities/function/crud.py +279 -0
  109. digitalhub/entities/model/__init__.py +0 -0
  110. digitalhub/entities/model/_base/__init__.py +0 -0
  111. digitalhub/entities/model/_base/builder.py +86 -0
  112. digitalhub/entities/model/_base/entity.py +34 -0
  113. digitalhub/entities/model/_base/spec.py +49 -0
  114. digitalhub/entities/model/_base/status.py +9 -0
  115. digitalhub/entities/model/crud.py +331 -0
  116. digitalhub/entities/model/huggingface/__init__.py +0 -0
  117. digitalhub/entities/model/huggingface/builder.py +18 -0
  118. digitalhub/entities/model/huggingface/entity.py +32 -0
  119. digitalhub/entities/model/huggingface/spec.py +36 -0
  120. digitalhub/entities/model/huggingface/status.py +9 -0
  121. digitalhub/entities/model/mlflow/__init__.py +0 -0
  122. digitalhub/entities/model/mlflow/builder.py +18 -0
  123. digitalhub/entities/model/mlflow/entity.py +32 -0
  124. digitalhub/entities/model/mlflow/models.py +26 -0
  125. digitalhub/entities/model/mlflow/spec.py +44 -0
  126. digitalhub/entities/model/mlflow/status.py +9 -0
  127. digitalhub/entities/model/mlflow/utils.py +81 -0
  128. digitalhub/entities/model/model/__init__.py +0 -0
  129. digitalhub/entities/model/model/builder.py +18 -0
  130. digitalhub/entities/model/model/entity.py +32 -0
  131. digitalhub/entities/model/model/spec.py +15 -0
  132. digitalhub/entities/model/model/status.py +9 -0
  133. digitalhub/entities/model/sklearn/__init__.py +0 -0
  134. digitalhub/entities/model/sklearn/builder.py +18 -0
  135. digitalhub/entities/model/sklearn/entity.py +32 -0
  136. digitalhub/entities/model/sklearn/spec.py +15 -0
  137. digitalhub/entities/model/sklearn/status.py +9 -0
  138. digitalhub/entities/project/__init__.py +0 -0
  139. digitalhub/entities/project/_base/__init__.py +0 -0
  140. digitalhub/entities/project/_base/builder.py +128 -0
  141. digitalhub/entities/project/_base/entity.py +2078 -0
  142. digitalhub/entities/project/_base/spec.py +50 -0
  143. digitalhub/entities/project/_base/status.py +9 -0
  144. digitalhub/entities/project/crud.py +357 -0
  145. digitalhub/entities/run/__init__.py +0 -0
  146. digitalhub/entities/run/_base/__init__.py +0 -0
  147. digitalhub/entities/run/_base/builder.py +94 -0
  148. digitalhub/entities/run/_base/entity.py +307 -0
  149. digitalhub/entities/run/_base/spec.py +50 -0
  150. digitalhub/entities/run/_base/status.py +9 -0
  151. digitalhub/entities/run/crud.py +219 -0
  152. digitalhub/entities/secret/__init__.py +0 -0
  153. digitalhub/entities/secret/_base/__init__.py +0 -0
  154. digitalhub/entities/secret/_base/builder.py +81 -0
  155. digitalhub/entities/secret/_base/entity.py +74 -0
  156. digitalhub/entities/secret/_base/spec.py +35 -0
  157. digitalhub/entities/secret/_base/status.py +9 -0
  158. digitalhub/entities/secret/crud.py +290 -0
  159. digitalhub/entities/task/__init__.py +0 -0
  160. digitalhub/entities/task/_base/__init__.py +0 -0
  161. digitalhub/entities/task/_base/builder.py +91 -0
  162. digitalhub/entities/task/_base/entity.py +136 -0
  163. digitalhub/entities/task/_base/models.py +208 -0
  164. digitalhub/entities/task/_base/spec.py +53 -0
  165. digitalhub/entities/task/_base/status.py +9 -0
  166. digitalhub/entities/task/crud.py +228 -0
  167. digitalhub/entities/utils/__init__.py +0 -0
  168. digitalhub/entities/utils/api.py +346 -0
  169. digitalhub/entities/utils/entity_types.py +19 -0
  170. digitalhub/entities/utils/state.py +31 -0
  171. digitalhub/entities/utils/utils.py +202 -0
  172. digitalhub/entities/workflow/__init__.py +0 -0
  173. digitalhub/entities/workflow/_base/__init__.py +0 -0
  174. digitalhub/entities/workflow/_base/builder.py +79 -0
  175. digitalhub/entities/workflow/_base/entity.py +74 -0
  176. digitalhub/entities/workflow/_base/spec.py +15 -0
  177. digitalhub/entities/workflow/_base/status.py +9 -0
  178. digitalhub/entities/workflow/crud.py +278 -0
  179. digitalhub/factory/__init__.py +0 -0
  180. digitalhub/factory/api.py +277 -0
  181. digitalhub/factory/factory.py +268 -0
  182. digitalhub/factory/utils.py +90 -0
  183. digitalhub/readers/__init__.py +0 -0
  184. digitalhub/readers/_base/__init__.py +0 -0
  185. digitalhub/readers/_base/builder.py +26 -0
  186. digitalhub/readers/_base/reader.py +70 -0
  187. digitalhub/readers/api.py +80 -0
  188. digitalhub/readers/factory.py +133 -0
  189. digitalhub/readers/pandas/__init__.py +0 -0
  190. digitalhub/readers/pandas/builder.py +29 -0
  191. digitalhub/readers/pandas/reader.py +207 -0
  192. digitalhub/runtimes/__init__.py +0 -0
  193. digitalhub/runtimes/_base.py +102 -0
  194. digitalhub/runtimes/builder.py +32 -0
  195. digitalhub/stores/__init__.py +0 -0
  196. digitalhub/stores/_base/__init__.py +0 -0
  197. digitalhub/stores/_base/store.py +189 -0
  198. digitalhub/stores/api.py +54 -0
  199. digitalhub/stores/builder.py +211 -0
  200. digitalhub/stores/local/__init__.py +0 -0
  201. digitalhub/stores/local/store.py +230 -0
  202. digitalhub/stores/remote/__init__.py +0 -0
  203. digitalhub/stores/remote/store.py +143 -0
  204. digitalhub/stores/s3/__init__.py +0 -0
  205. digitalhub/stores/s3/store.py +563 -0
  206. digitalhub/stores/sql/__init__.py +0 -0
  207. digitalhub/stores/sql/store.py +328 -0
  208. digitalhub/utils/__init__.py +0 -0
  209. digitalhub/utils/data_utils.py +127 -0
  210. digitalhub/utils/exceptions.py +67 -0
  211. digitalhub/utils/file_utils.py +204 -0
  212. digitalhub/utils/generic_utils.py +183 -0
  213. digitalhub/utils/git_utils.py +148 -0
  214. digitalhub/utils/io_utils.py +116 -0
  215. digitalhub/utils/logger.py +17 -0
  216. digitalhub/utils/s3_utils.py +58 -0
  217. digitalhub/utils/uri_utils.py +56 -0
  218. {digitalhub-0.7.0b2.dist-info → digitalhub-0.8.0.dist-info}/METADATA +30 -13
  219. digitalhub-0.8.0.dist-info/RECORD +231 -0
  220. {digitalhub-0.7.0b2.dist-info → digitalhub-0.8.0.dist-info}/WHEEL +1 -1
  221. test/local/CRUD/test_artifacts.py +96 -0
  222. test/local/CRUD/test_dataitems.py +96 -0
  223. test/local/CRUD/test_models.py +95 -0
  224. test/test_crud_functions.py +1 -1
  225. test/test_crud_runs.py +1 -1
  226. test/test_crud_tasks.py +1 -1
  227. digitalhub-0.7.0b2.dist-info/RECORD +0 -14
  228. test/test_crud_artifacts.py +0 -96
  229. test/test_crud_dataitems.py +0 -96
  230. {digitalhub-0.7.0b2.dist-info → digitalhub-0.8.0.dist-info}/LICENSE.txt +0 -0
  231. {digitalhub-0.7.0b2.dist-info → digitalhub-0.8.0.dist-info}/top_level.txt +0 -0
  232. /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
+ """
@@ -0,0 +1,9 @@
1
+ from __future__ import annotations
2
+
3
+ from digitalhub.entities.dataitem._base.status import DataitemStatus
4
+
5
+
6
+ class DataitemStatusDataitem(DataitemStatus):
7
+ """
8
+ DataitemStatusDataitem status.
9
+ """
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
+ """
@@ -0,0 +1,9 @@
1
+ from __future__ import annotations
2
+
3
+ from digitalhub.entities.dataitem._base.status import DataitemStatus
4
+
5
+
6
+ class DataitemStatusIceberg(DataitemStatus):
7
+ """
8
+ DataitemStatusIceberg status.
9
+ """
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)