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,332 @@
1
+ from __future__ import annotations
2
+
3
+ import typing
4
+
5
+ from digitalhub.entities._base.crud import (
6
+ delete_entity,
7
+ get_material_entity,
8
+ get_material_entity_versions,
9
+ import_context_entity,
10
+ list_material_entities,
11
+ new_context_entity,
12
+ )
13
+ from digitalhub.entities._base.entity._constructors.uuid import build_uuid
14
+ from digitalhub.entities.artifact._base.entity import Artifact
15
+ from digitalhub.entities.utils.entity_types import EntityTypes
16
+ from digitalhub.entities.utils.utils import build_log_path_from_source, eval_local_source
17
+
18
+ if typing.TYPE_CHECKING:
19
+ from digitalhub.entities.artifact._base.entity import Artifact
20
+
21
+
22
+ ENTITY_TYPE = EntityTypes.ARTIFACT.value
23
+
24
+
25
+ def new_artifact(
26
+ project: str,
27
+ name: str,
28
+ kind: str,
29
+ uuid: str | None = None,
30
+ description: str | None = None,
31
+ labels: list[str] | None = None,
32
+ embedded: bool = False,
33
+ path: str | None = None,
34
+ **kwargs,
35
+ ) -> Artifact:
36
+ """
37
+ Create a new object.
38
+
39
+ Parameters
40
+ ----------
41
+ project : str
42
+ Project name.
43
+ name : str
44
+ Object name.
45
+ kind : str
46
+ Kind the object.
47
+ uuid : str
48
+ ID of the object.
49
+ description : str
50
+ Description of the object (human readable).
51
+ labels : list[str]
52
+ List of labels.
53
+ embedded : bool
54
+ Flag to determine if object spec must be embedded in project spec.
55
+ path : str
56
+ Object path on local file system or remote storage. It is also the destination path of upload() method.
57
+ **kwargs : dict
58
+ Spec keyword arguments.
59
+
60
+ Returns
61
+ -------
62
+ Artifact
63
+ Object instance.
64
+
65
+ Examples
66
+ --------
67
+ >>> obj = new_artifact(project="my-project",
68
+ >>> name="my-artifact",
69
+ >>> kind="artifact",
70
+ >>> path="s3://my-bucket/my-key")
71
+ """
72
+ return new_context_entity(
73
+ project=project,
74
+ name=name,
75
+ kind=kind,
76
+ uuid=uuid,
77
+ description=description,
78
+ labels=labels,
79
+ embedded=embedded,
80
+ path=path,
81
+ **kwargs,
82
+ )
83
+
84
+
85
+ def log_artifact(
86
+ project: str,
87
+ name: str,
88
+ kind: str,
89
+ source: list[str] | str,
90
+ path: str | None = None,
91
+ **kwargs,
92
+ ) -> Artifact:
93
+ """
94
+ Create and upload an object.
95
+
96
+ Parameters
97
+ ----------
98
+ project : str
99
+ Project name.
100
+ name : str
101
+ Object name.
102
+ kind : str
103
+ Kind the object.
104
+ source : str
105
+ Artifact location on local path.
106
+ path : str
107
+ Destination path of the artifact. If not provided, it's generated.
108
+ **kwargs : dict
109
+ New artifact spec parameters.
110
+
111
+ Returns
112
+ -------
113
+ Artifact
114
+ Object instance.
115
+
116
+ Examples
117
+ --------
118
+ >>> obj = log_artifact(project="my-project",
119
+ >>> name="my-artifact",
120
+ >>> kind="artifact",
121
+ >>> source="./local-path")
122
+ """
123
+ eval_local_source(source)
124
+
125
+ if path is None:
126
+ uuid = build_uuid()
127
+ kwargs["uuid"] = uuid
128
+ path = build_log_path_from_source(project, ENTITY_TYPE, name, uuid, source)
129
+
130
+ obj = new_artifact(project=project, name=name, kind=kind, path=path, **kwargs)
131
+ obj.upload(source)
132
+ return obj
133
+
134
+
135
+ def get_artifact(
136
+ identifier: str,
137
+ project: str | None = None,
138
+ entity_id: str | None = None,
139
+ **kwargs,
140
+ ) -> Artifact:
141
+ """
142
+ Get object from backend.
143
+
144
+ Parameters
145
+ ----------
146
+ identifier : str
147
+ Entity key (store://...) or entity name.
148
+ project : str
149
+ Project name.
150
+ entity_id : str
151
+ Entity ID.
152
+ **kwargs : dict
153
+ Parameters to pass to the API call.
154
+
155
+ Returns
156
+ -------
157
+ Artifact
158
+ Object instance.
159
+
160
+ Examples
161
+ --------
162
+ Using entity key:
163
+ >>> obj = get_artifact("store://my-artifact-key")
164
+
165
+ Using entity name:
166
+ >>> obj = get_artifact("my-artifact-name"
167
+ >>> project="my-project",
168
+ >>> entity_id="my-artifact-id")
169
+ """
170
+ return get_material_entity(
171
+ identifier=identifier,
172
+ entity_type=ENTITY_TYPE,
173
+ project=project,
174
+ entity_id=entity_id,
175
+ **kwargs,
176
+ )
177
+
178
+
179
+ def get_artifact_versions(
180
+ identifier: str,
181
+ project: str | None = None,
182
+ **kwargs,
183
+ ) -> list[Artifact]:
184
+ """
185
+ Get object versions from backend.
186
+
187
+ Parameters
188
+ ----------
189
+ identifier : str
190
+ Entity key (store://...) or entity name.
191
+ project : str
192
+ Project name.
193
+ **kwargs : dict
194
+ Parameters to pass to the API call.
195
+
196
+ Returns
197
+ -------
198
+ list[Artifact]
199
+ List of object instances.
200
+
201
+ Examples
202
+ --------
203
+ Using entity key:
204
+ >>> obj = get_artifact_versions("store://my-artifact-key")
205
+
206
+ Using entity name:
207
+ >>> obj = get_artifact_versions("my-artifact-name"
208
+ >>> project="my-project")
209
+ """
210
+ return get_material_entity_versions(
211
+ identifier=identifier,
212
+ entity_type=ENTITY_TYPE,
213
+ project=project,
214
+ **kwargs,
215
+ )
216
+
217
+
218
+ def list_artifacts(project: str, **kwargs) -> list[Artifact]:
219
+ """
220
+ List all latest version objects from backend.
221
+
222
+ Parameters
223
+ ----------
224
+ project : str
225
+ Project name.
226
+ **kwargs : dict
227
+ Parameters to pass to the API call.
228
+
229
+ Returns
230
+ -------
231
+ list[Artifact]
232
+ List of object instances.
233
+
234
+ Examples
235
+ --------
236
+ >>> objs = list_artifacts(project="my-project")
237
+ """
238
+ return list_material_entities(
239
+ project=project,
240
+ entity_type=ENTITY_TYPE,
241
+ **kwargs,
242
+ )
243
+
244
+
245
+ def import_artifact(file: str) -> Artifact:
246
+ """
247
+ Import object from a YAML file.
248
+
249
+ Parameters
250
+ ----------
251
+ file : str
252
+ Path to YAML file.
253
+
254
+ Returns
255
+ -------
256
+ Artifact
257
+ Object instance.
258
+
259
+ Examples
260
+ --------
261
+ >>> obj = import_artifact("my-artifact.yaml")
262
+ """
263
+ return import_context_entity(file)
264
+
265
+
266
+ def update_artifact(entity: Artifact) -> Artifact:
267
+ """
268
+ Update object. Note that object spec are immutable.
269
+
270
+ Parameters
271
+ ----------
272
+ entity : Artifact
273
+ Object to update.
274
+
275
+ Returns
276
+ -------
277
+ Artifact
278
+ Entity updated.
279
+
280
+ Examples
281
+ --------
282
+ >>> obj = update_artifact(obj)
283
+ """
284
+ return entity.save(update=True)
285
+
286
+
287
+ def delete_artifact(
288
+ identifier: str,
289
+ project: str | None = None,
290
+ entity_id: str | None = None,
291
+ delete_all_versions: bool = False,
292
+ **kwargs,
293
+ ) -> dict:
294
+ """
295
+ Delete object from backend.
296
+
297
+ Parameters
298
+ ----------
299
+ identifier : str
300
+ Entity key (store://...) or entity name.
301
+ project : str
302
+ Project name.
303
+ entity_id : str
304
+ Entity ID.
305
+ delete_all_versions : bool
306
+ Delete all versions of the named entity. If True, use entity name instead of entity key as identifier.
307
+ **kwargs : dict
308
+ Parameters to pass to the API call.
309
+
310
+ Returns
311
+ -------
312
+ dict
313
+ Response from backend.
314
+
315
+ Examples
316
+ --------
317
+ If delete_all_versions is False:
318
+ >>> delete_artifact("store://my-artifact-key")
319
+
320
+ Otherwise:
321
+ >>> delete_artifact("my-artifact-name",
322
+ >>> project="my-project",
323
+ >>> delete_all_versions=True)
324
+ """
325
+ return delete_entity(
326
+ identifier=identifier,
327
+ entity_type=ENTITY_TYPE,
328
+ project=project,
329
+ entity_id=entity_id,
330
+ delete_all_versions=delete_all_versions,
331
+ **kwargs,
332
+ )
@@ -0,0 +1,63 @@
1
+ from __future__ import annotations
2
+
3
+ from digitalhub.entities.artifact.artifact.builder import ArtifactArtifactBuilder
4
+ from digitalhub.entities.dataitem.dataitem.builder import DataitemDataitemBuilder
5
+ from digitalhub.entities.dataitem.table.builder import DataitemTableBuilder
6
+ from digitalhub.entities.model.mlflow.builder import ModelModelBuilder
7
+ from digitalhub.entities.project._base.builder import ProjectProjectBuilder
8
+ from digitalhub.entities.secret._base.builder import SecretSecretBuilder
9
+
10
+ entity_builders = (
11
+ (ProjectProjectBuilder.ENTITY_KIND, ProjectProjectBuilder),
12
+ (SecretSecretBuilder.ENTITY_KIND, SecretSecretBuilder),
13
+ (ArtifactArtifactBuilder.ENTITY_KIND, ArtifactArtifactBuilder),
14
+ (DataitemDataitemBuilder.ENTITY_KIND, DataitemDataitemBuilder),
15
+ (DataitemTableBuilder.ENTITY_KIND, DataitemTableBuilder),
16
+ (ModelModelBuilder.ENTITY_KIND, ModelModelBuilder),
17
+ )
18
+
19
+ ##############################
20
+ # Potential uninstalled entities
21
+ ##############################
22
+
23
+
24
+ try:
25
+ from digitalhub.entities.dataitem.iceberg.builder import DataitemIcebergBuilder
26
+
27
+ entity_builders = (
28
+ *entity_builders,
29
+ (DataitemIcebergBuilder.ENTITY_KIND, DataitemIcebergBuilder),
30
+ )
31
+ except ImportError:
32
+ ...
33
+
34
+
35
+ try:
36
+ from digitalhub.entities.model.model.builder import ModelMlflowBuilder
37
+
38
+ entity_builders = (
39
+ *entity_builders,
40
+ (ModelMlflowBuilder.ENTITY_KIND, ModelMlflowBuilder),
41
+ )
42
+ except ImportError:
43
+ ...
44
+
45
+ try:
46
+ from digitalhub.entities.model.sklearn.builder import ModelSklearnBuilder
47
+
48
+ entity_builders = (
49
+ *entity_builders,
50
+ (ModelSklearnBuilder.ENTITY_KIND, ModelSklearnBuilder),
51
+ )
52
+ except ImportError:
53
+ ...
54
+
55
+ try:
56
+ from digitalhub.entities.model.huggingface.builder import ModelHuggingfaceBuilder
57
+
58
+ entity_builders = (
59
+ *entity_builders,
60
+ (ModelHuggingfaceBuilder.ENTITY_KIND, ModelHuggingfaceBuilder),
61
+ )
62
+ except ImportError:
63
+ ...
File without changes
File without changes
@@ -0,0 +1,86 @@
1
+ from __future__ import annotations
2
+
3
+ import typing
4
+
5
+ from digitalhub.entities._base.versioned.builder import VersionedBuilder
6
+ from digitalhub.entities.utils.entity_types import EntityTypes
7
+ from digitalhub.utils.exceptions import EntityError
8
+
9
+ if typing.TYPE_CHECKING:
10
+ from digitalhub.entities.dataitem._base.entity import Dataitem
11
+
12
+
13
+ class DataitemBuilder(VersionedBuilder):
14
+ """
15
+ Dataitem builder.
16
+ """
17
+
18
+ ENTITY_TYPE = EntityTypes.DATAITEM.value
19
+
20
+ def build(
21
+ self,
22
+ kind: str,
23
+ project: str,
24
+ name: str,
25
+ uuid: str | None = None,
26
+ description: str | None = None,
27
+ labels: list[str] | None = None,
28
+ embedded: bool = False,
29
+ path: str | None = None,
30
+ **kwargs,
31
+ ) -> Dataitem:
32
+ """
33
+ Create a new object.
34
+
35
+ Parameters
36
+ ----------
37
+ project : str
38
+ Project name.
39
+ name : str
40
+ Object name.
41
+ kind : str
42
+ Kind the object.
43
+ uuid : str
44
+ ID of the object.
45
+ description : str
46
+ Description of the object (human readable).
47
+ labels : list[str]
48
+ List of labels.
49
+ embedded : bool
50
+ Flag to determine if object spec must be embedded in project spec.
51
+ path : str
52
+ Object path on local file system or remote storage. It is also the destination path of upload() method.
53
+ **kwargs : dict
54
+ Spec keyword arguments.
55
+
56
+ Returns
57
+ -------
58
+ Dataitem
59
+ Object instance.
60
+ """
61
+ if path is None:
62
+ raise EntityError("Path must be provided.")
63
+
64
+ name = self.build_name(name)
65
+ uuid = self.build_uuid(uuid)
66
+ metadata = self.build_metadata(
67
+ project=project,
68
+ name=name,
69
+ description=description,
70
+ labels=labels,
71
+ embedded=embedded,
72
+ )
73
+ spec = self.build_spec(
74
+ path=path,
75
+ **kwargs,
76
+ )
77
+ status = self.build_status()
78
+ return self.build_entity(
79
+ project=project,
80
+ name=name,
81
+ uuid=uuid,
82
+ kind=kind,
83
+ metadata=metadata,
84
+ spec=spec,
85
+ status=status,
86
+ )
@@ -0,0 +1,75 @@
1
+ from __future__ import annotations
2
+
3
+ import typing
4
+ from pathlib import Path
5
+
6
+ from digitalhub.entities._base.material.entity import MaterialEntity
7
+ from digitalhub.entities.utils.entity_types import EntityTypes
8
+ from digitalhub.utils.exceptions import EntityError
9
+ from digitalhub.utils.uri_utils import map_uri_scheme
10
+
11
+ if typing.TYPE_CHECKING:
12
+ from digitalhub.entities._base.entity.metadata import Metadata
13
+ from digitalhub.entities.dataitem._base.spec import DataitemSpec
14
+ from digitalhub.entities.dataitem._base.status import DataitemStatus
15
+
16
+
17
+ class Dataitem(MaterialEntity):
18
+ """
19
+ A class representing a dataitem.
20
+ """
21
+
22
+ ENTITY_TYPE = EntityTypes.DATAITEM.value
23
+
24
+ def __init__(
25
+ self,
26
+ project: str,
27
+ name: str,
28
+ uuid: str,
29
+ kind: str,
30
+ metadata: Metadata,
31
+ spec: DataitemSpec,
32
+ status: DataitemStatus,
33
+ user: str | None = None,
34
+ ) -> None:
35
+ super().__init__(project, name, uuid, kind, metadata, spec, status, user)
36
+ self.spec: DataitemSpec
37
+ self.status: DataitemStatus
38
+
39
+ ##############################
40
+ # Private helper methods
41
+ ##############################
42
+
43
+ @staticmethod
44
+ def _get_extension(path: str, file_format: str | None = None) -> str:
45
+ """
46
+ Get extension of path.
47
+
48
+ Parameters
49
+ ----------
50
+ path : str
51
+ Path to get extension from.
52
+ file_format : str
53
+ File format.
54
+
55
+ Returns
56
+ -------
57
+ str
58
+ File extension.
59
+
60
+ Raises
61
+ ------
62
+ EntityError
63
+ If file format is not supported.
64
+ """
65
+ if file_format is not None:
66
+ return file_format
67
+
68
+ scheme = map_uri_scheme(path)
69
+ if scheme == "sql":
70
+ return "parquet"
71
+
72
+ ext = Path(path).suffix[1:]
73
+ if ext is not None:
74
+ return ext
75
+ raise EntityError("Unknown file format. Only csv and parquet are supported.")
@@ -0,0 +1,15 @@
1
+ from __future__ import annotations
2
+
3
+ from digitalhub.entities._base.material.spec import MaterialSpec, MaterialValidator
4
+
5
+
6
+ class DataitemSpec(MaterialSpec):
7
+ """
8
+ DataitemSpec specifications.
9
+ """
10
+
11
+
12
+ class DataitemValidator(MaterialValidator):
13
+ """
14
+ DataitemValidator validator.
15
+ """
@@ -0,0 +1,20 @@
1
+ from __future__ import annotations
2
+
3
+ from digitalhub.entities._base.material.status import MaterialStatus
4
+
5
+
6
+ class DataitemStatus(MaterialStatus):
7
+ """
8
+ DataitemStatus status.
9
+ """
10
+
11
+ def __init__(
12
+ self,
13
+ state: str,
14
+ message: str | None = None,
15
+ files: list[dict] | None = None,
16
+ preview: dict | None = None,
17
+ **kwargs,
18
+ ) -> None:
19
+ super().__init__(state, message, files)
20
+ self.preview = preview