digitalhub 0.8.0b2__py3-none-any.whl → 0.8.0b4__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 (229) hide show
  1. digitalhub/__init__.py +5 -4
  2. digitalhub/client/builder.py +3 -3
  3. digitalhub/client/{objects/dhcore.py → dhcore/client.py} +9 -49
  4. digitalhub/client/dhcore/env.py +21 -0
  5. digitalhub/client/dhcore/models.py +46 -0
  6. digitalhub/{utils/env_utils.py → client/dhcore/utils.py} +1 -13
  7. digitalhub/client/{objects/local.py → local/client.py} +1 -1
  8. digitalhub/context/builder.py +1 -1
  9. digitalhub/context/context.py +1 -1
  10. digitalhub/datastores/{objects/base.py → _base/datastore.py} +1 -1
  11. digitalhub/datastores/builder.py +6 -6
  12. digitalhub/datastores/{objects/local.py → local/datastore.py} +1 -1
  13. digitalhub/datastores/{objects/remote.py → remote/datastore.py} +1 -1
  14. digitalhub/datastores/{objects/s3.py → s3/datastore.py} +1 -1
  15. digitalhub/datastores/{objects/sql.py → sql/datastore.py} +1 -1
  16. digitalhub/entities/_base/{base.py → _base/entity.py} +1 -1
  17. digitalhub/entities/_base/{entity/context.py → context/entity.py} +4 -4
  18. digitalhub/entities/_base/crud.py +3 -3
  19. digitalhub/entities/_base/entity/{base.py → entity.py} +8 -34
  20. digitalhub/entities/_base/{metadata.py → entity/metadata.py} +2 -2
  21. digitalhub/entities/_base/{spec/base.py → entity/spec.py} +11 -11
  22. digitalhub/entities/_base/{status/base.py → entity/status.py} +2 -2
  23. digitalhub/entities/_base/executable/__init__.py +0 -0
  24. digitalhub/entities/_base/{entity/executable.py → executable/entity.py} +55 -31
  25. digitalhub/entities/_base/material/__init__.py +0 -0
  26. digitalhub/entities/_base/{entity/material.py → material/entity.py} +4 -4
  27. digitalhub/entities/_base/{spec/material.py → material/spec.py} +3 -3
  28. digitalhub/entities/_base/{status/material.py → material/status.py} +1 -1
  29. digitalhub/entities/_base/unversioned/__init__.py +0 -0
  30. digitalhub/entities/_base/unversioned/builder.py +66 -0
  31. digitalhub/entities/_base/unversioned/entity.py +49 -0
  32. digitalhub/entities/_base/versioned/__init__.py +0 -0
  33. digitalhub/entities/_base/versioned/builder.py +68 -0
  34. digitalhub/entities/_base/versioned/entity.py +53 -0
  35. digitalhub/entities/_builders/entity.py +153 -0
  36. digitalhub/entities/_builders/metadata.py +5 -21
  37. digitalhub/entities/_builders/spec.py +11 -21
  38. digitalhub/entities/_builders/status.py +10 -20
  39. digitalhub/entities/_builders/uuid.py +4 -11
  40. digitalhub/entities/artifact/_base/__init__.py +0 -0
  41. digitalhub/entities/artifact/_base/builder.py +86 -0
  42. digitalhub/entities/artifact/{entity/_base.py → _base/entity.py} +5 -5
  43. digitalhub/entities/artifact/_base/spec.py +15 -0
  44. digitalhub/entities/artifact/_base/status.py +9 -0
  45. digitalhub/entities/artifact/artifact/__init__.py +0 -0
  46. digitalhub/entities/artifact/artifact/builder.py +18 -0
  47. digitalhub/entities/artifact/artifact/entity.py +32 -0
  48. digitalhub/entities/artifact/{spec.py → artifact/spec.py} +4 -16
  49. digitalhub/entities/artifact/{status.py → artifact/status.py} +1 -1
  50. digitalhub/entities/artifact/builder.py +16 -98
  51. digitalhub/entities/artifact/crud.py +4 -4
  52. digitalhub/entities/builders.py +63 -0
  53. digitalhub/entities/dataitem/_base/__init__.py +0 -0
  54. digitalhub/entities/dataitem/_base/builder.py +86 -0
  55. digitalhub/entities/dataitem/{entity/_base.py → _base/entity.py} +5 -5
  56. digitalhub/entities/dataitem/_base/spec.py +15 -0
  57. digitalhub/entities/dataitem/_base/status.py +20 -0
  58. digitalhub/entities/dataitem/builder.py +16 -109
  59. digitalhub/entities/dataitem/crud.py +8 -5
  60. digitalhub/entities/dataitem/dataitem/__init__.py +0 -0
  61. digitalhub/entities/dataitem/dataitem/builder.py +18 -0
  62. digitalhub/entities/dataitem/dataitem/entity.py +32 -0
  63. digitalhub/entities/dataitem/dataitem/spec.py +15 -0
  64. digitalhub/entities/dataitem/dataitem/status.py +9 -0
  65. digitalhub/entities/dataitem/iceberg/__init__.py +0 -0
  66. digitalhub/entities/dataitem/iceberg/builder.py +18 -0
  67. digitalhub/entities/dataitem/iceberg/entity.py +32 -0
  68. digitalhub/entities/dataitem/iceberg/spec.py +15 -0
  69. digitalhub/entities/dataitem/iceberg/status.py +9 -0
  70. digitalhub/entities/dataitem/table/__init__.py +0 -0
  71. digitalhub/entities/dataitem/table/builder.py +18 -0
  72. digitalhub/entities/dataitem/{entity/table.py → table/entity.py} +24 -3
  73. digitalhub/entities/dataitem/table/spec.py +25 -0
  74. digitalhub/entities/dataitem/table/status.py +9 -0
  75. digitalhub/entities/function/_base/__init__.py +0 -0
  76. digitalhub/entities/function/_base/builder.py +78 -0
  77. digitalhub/entities/function/{entity.py → _base/entity.py} +8 -8
  78. digitalhub/entities/function/{models.py → _base/models.py} +1 -1
  79. digitalhub/entities/function/_base/spec.py +15 -0
  80. digitalhub/entities/function/_base/status.py +9 -0
  81. digitalhub/entities/function/builder.py +22 -57
  82. digitalhub/entities/function/crud.py +3 -3
  83. digitalhub/entities/model/_base/__init__.py +0 -0
  84. digitalhub/entities/model/_base/builder.py +86 -0
  85. digitalhub/entities/model/{entity/_base.py → _base/entity.py} +5 -5
  86. digitalhub/entities/model/_base/spec.py +49 -0
  87. digitalhub/entities/model/_base/status.py +9 -0
  88. digitalhub/entities/model/builder.py +16 -117
  89. digitalhub/entities/model/crud.py +4 -4
  90. digitalhub/entities/model/huggingface/__init__.py +0 -0
  91. digitalhub/entities/model/huggingface/builder.py +18 -0
  92. digitalhub/entities/model/huggingface/entity.py +32 -0
  93. digitalhub/entities/model/huggingface/spec.py +36 -0
  94. digitalhub/entities/model/huggingface/status.py +9 -0
  95. digitalhub/entities/model/mlflow/__init__.py +0 -0
  96. digitalhub/entities/model/mlflow/builder.py +18 -0
  97. digitalhub/entities/model/mlflow/entity.py +32 -0
  98. digitalhub/entities/model/mlflow/spec.py +44 -0
  99. digitalhub/entities/model/mlflow/status.py +9 -0
  100. digitalhub/entities/model/{entity/mlflow.py → mlflow/utils.py} +1 -10
  101. digitalhub/entities/model/model/__init__.py +0 -0
  102. digitalhub/entities/model/model/builder.py +18 -0
  103. digitalhub/entities/model/model/entity.py +32 -0
  104. digitalhub/entities/model/model/spec.py +15 -0
  105. digitalhub/entities/model/model/status.py +9 -0
  106. digitalhub/entities/model/sklearn/__init__.py +0 -0
  107. digitalhub/entities/model/sklearn/builder.py +18 -0
  108. digitalhub/entities/model/sklearn/entity.py +32 -0
  109. digitalhub/entities/model/sklearn/spec.py +15 -0
  110. digitalhub/entities/model/sklearn/status.py +9 -0
  111. digitalhub/entities/project/_base/__init__.py +0 -0
  112. digitalhub/entities/project/_base/builder.py +128 -0
  113. digitalhub/entities/project/{entity.py → _base/entity.py} +18 -60
  114. digitalhub/entities/project/{spec.py → _base/spec.py} +4 -4
  115. digitalhub/entities/project/_base/status.py +9 -0
  116. digitalhub/entities/project/builder.py +20 -51
  117. digitalhub/entities/project/crud.py +2 -2
  118. digitalhub/entities/run/_base/__init__.py +0 -0
  119. digitalhub/entities/run/_base/builder.py +73 -0
  120. digitalhub/entities/run/{entity.py → _base/entity.py} +12 -155
  121. digitalhub/entities/run/{spec.py → _base/spec.py} +8 -8
  122. digitalhub/entities/run/{status.py → _base/status.py} +4 -4
  123. digitalhub/entities/run/builder.py +21 -47
  124. digitalhub/entities/run/crud.py +3 -3
  125. digitalhub/entities/secret/_base/__init__.py +0 -0
  126. digitalhub/entities/secret/_base/builder.py +81 -0
  127. digitalhub/entities/secret/{entity.py → _base/entity.py} +7 -6
  128. digitalhub/entities/secret/{spec.py → _base/spec.py} +4 -4
  129. digitalhub/entities/secret/_base/status.py +9 -0
  130. digitalhub/entities/secret/builder.py +20 -62
  131. digitalhub/entities/secret/crud.py +12 -4
  132. digitalhub/entities/task/_base/__init__.py +0 -0
  133. digitalhub/entities/task/_base/builder.py +76 -0
  134. digitalhub/entities/task/{entity.py → _base/entity.py} +6 -6
  135. digitalhub/entities/task/{models.py → _base/models.py} +9 -0
  136. digitalhub/entities/task/{spec.py → _base/spec.py} +9 -7
  137. digitalhub/entities/task/_base/status.py +9 -0
  138. digitalhub/entities/task/builder.py +21 -44
  139. digitalhub/entities/task/crud.py +3 -3
  140. digitalhub/entities/utils/__init__.py +0 -0
  141. digitalhub/entities/{utils.py → utils/utils.py} +2 -2
  142. digitalhub/entities/workflow/_base/__init__.py +0 -0
  143. digitalhub/entities/workflow/_base/builder.py +78 -0
  144. digitalhub/entities/workflow/{entity.py → _base/entity.py} +8 -8
  145. digitalhub/entities/workflow/_base/spec.py +15 -0
  146. digitalhub/entities/workflow/_base/status.py +9 -0
  147. digitalhub/entities/workflow/builder.py +20 -60
  148. digitalhub/entities/workflow/crud.py +3 -3
  149. digitalhub/factory/__init__.py +0 -0
  150. digitalhub/factory/factory.py +204 -0
  151. digitalhub/factory/utils.py +90 -0
  152. digitalhub/readers/_base/__init__.py +0 -0
  153. digitalhub/readers/builder.py +1 -1
  154. digitalhub/readers/pandas/__init__.py +0 -0
  155. digitalhub/readers/{objects/pandas.py → pandas/readers.py} +1 -1
  156. digitalhub/readers/registry.py +1 -1
  157. digitalhub/runtimes/builder.py +24 -41
  158. digitalhub/runtimes/kind_registry.py +14 -0
  159. digitalhub/runtimes/utils.py +28 -0
  160. digitalhub/stores/_base/__init__.py +0 -0
  161. digitalhub/stores/builder.py +6 -6
  162. digitalhub/stores/local/__init__.py +0 -0
  163. digitalhub/stores/{objects/local.py → local/store.py} +1 -1
  164. digitalhub/stores/remote/__init__.py +0 -0
  165. digitalhub/stores/{objects/remote.py → remote/store.py} +1 -1
  166. digitalhub/stores/s3/__init__.py +0 -0
  167. digitalhub/stores/{objects/s3.py → s3/store.py} +1 -1
  168. digitalhub/stores/sql/__init__.py +0 -0
  169. digitalhub/stores/{objects/sql.py → sql/store.py} +1 -1
  170. digitalhub/utils/exceptions.py +6 -0
  171. digitalhub/utils/generic_utils.py +18 -42
  172. digitalhub/utils/s3_utils.py +58 -0
  173. {digitalhub-0.8.0b2.dist-info → digitalhub-0.8.0b4.dist-info}/METADATA +3 -2
  174. digitalhub-0.8.0b4.dist-info/RECORD +232 -0
  175. {digitalhub-0.8.0b2.dist-info → digitalhub-0.8.0b4.dist-info}/WHEEL +1 -1
  176. test/local/CRUD/test_artifacts.py +96 -0
  177. test/local/CRUD/test_dataitems.py +96 -0
  178. test/local/CRUD/test_models.py +95 -0
  179. test/test_crud_functions.py +1 -1
  180. test/test_crud_runs.py +1 -1
  181. test/test_crud_tasks.py +1 -1
  182. digitalhub/entities/_base/entity/unversioned.py +0 -87
  183. digitalhub/entities/_base/entity/versioned.py +0 -94
  184. digitalhub/entities/artifact/entity/artifact.py +0 -9
  185. digitalhub/entities/dataitem/entity/dataitem.py +0 -9
  186. digitalhub/entities/dataitem/entity/iceberg.py +0 -7
  187. digitalhub/entities/dataitem/spec.py +0 -61
  188. digitalhub/entities/dataitem/status.py +0 -38
  189. digitalhub/entities/function/spec.py +0 -81
  190. digitalhub/entities/function/status.py +0 -9
  191. digitalhub/entities/model/entity/huggingface.py +0 -9
  192. digitalhub/entities/model/entity/model.py +0 -9
  193. digitalhub/entities/model/entity/sklearn.py +0 -9
  194. digitalhub/entities/model/spec.py +0 -146
  195. digitalhub/entities/model/status.py +0 -33
  196. digitalhub/entities/project/status.py +0 -9
  197. digitalhub/entities/registries.py +0 -48
  198. digitalhub/entities/secret/status.py +0 -9
  199. digitalhub/entities/task/status.py +0 -9
  200. digitalhub/entities/workflow/spec.py +0 -15
  201. digitalhub/entities/workflow/status.py +0 -9
  202. digitalhub/registry/models.py +0 -87
  203. digitalhub/registry/registry.py +0 -74
  204. digitalhub/registry/utils.py +0 -150
  205. digitalhub-0.8.0b2.dist-info/RECORD +0 -161
  206. test/test_crud_artifacts.py +0 -96
  207. test/test_crud_dataitems.py +0 -96
  208. /digitalhub/client/{objects → _base}/__init__.py +0 -0
  209. /digitalhub/client/{objects/base.py → _base/client.py} +0 -0
  210. /digitalhub/{datastores/objects → client/dhcore}/__init__.py +0 -0
  211. /digitalhub/{entities/_base/spec → client/local}/__init__.py +0 -0
  212. /digitalhub/{entities/_base/status → datastores/_base}/__init__.py +0 -0
  213. /digitalhub/{entities/artifact/entity → datastores/local}/__init__.py +0 -0
  214. /digitalhub/{entities/dataitem/entity → datastores/remote}/__init__.py +0 -0
  215. /digitalhub/{entities/model/entity → datastores/s3}/__init__.py +0 -0
  216. /digitalhub/{readers/objects → datastores/sql}/__init__.py +0 -0
  217. /digitalhub/{registry → entities/_base/_base}/__init__.py +0 -0
  218. /digitalhub/{stores/objects → entities/_base/context}/__init__.py +0 -0
  219. /digitalhub/entities/dataitem/{models.py → table/models.py} +0 -0
  220. /digitalhub/entities/model/{models.py → mlflow/models.py} +0 -0
  221. /digitalhub/entities/{_base → utils}/api.py +0 -0
  222. /digitalhub/entities/{entity_types.py → utils/entity_types.py} +0 -0
  223. /digitalhub/entities/{_base → utils}/state.py +0 -0
  224. /digitalhub/readers/{objects/base.py → _base/readers.py} +0 -0
  225. /digitalhub/runtimes/{base.py → _base.py} +0 -0
  226. /digitalhub/stores/{objects/base.py → _base/store.py} +0 -0
  227. {digitalhub-0.8.0b2.dist-info → digitalhub-0.8.0b4.dist-info}/LICENSE.txt +0 -0
  228. {digitalhub-0.8.0b2.dist-info → digitalhub-0.8.0b4.dist-info}/top_level.txt +0 -0
  229. /test/{test_imports.py → local/imports/test_imports.py} +0 -0
@@ -3,18 +3,18 @@ from __future__ import annotations
3
3
  import typing
4
4
 
5
5
  from digitalhub.entities._base.crud import list_entity_api_ctx
6
- from digitalhub.entities._base.entity.versioned import VersionedEntity
7
- from digitalhub.entities.entity_types import EntityTypes
6
+ from digitalhub.entities._base.versioned.entity import VersionedEntity
8
7
  from digitalhub.entities.run.crud import delete_run, get_run, list_runs
9
8
  from digitalhub.entities.task.crud import delete_task, task_from_dict, task_from_parameters
9
+ from digitalhub.entities.utils.entity_types import EntityTypes
10
10
  from digitalhub.utils.exceptions import EntityAlreadyExistsError, EntityError
11
11
 
12
12
  if typing.TYPE_CHECKING:
13
- from digitalhub.entities._base.metadata import Metadata
14
- from digitalhub.entities._base.spec.base import Spec
15
- from digitalhub.entities._base.status.base import Status
16
- from digitalhub.entities.run.entity import Run
17
- from digitalhub.entities.task.entity import Task
13
+ from digitalhub.entities._base.entity.metadata import Metadata
14
+ from digitalhub.entities._base.entity.spec import Spec
15
+ from digitalhub.entities._base.entity.status import Status
16
+ from digitalhub.entities.run._base.entity import Run
17
+ from digitalhub.entities.task._base.entity import Task
18
18
 
19
19
 
20
20
  class ExecutableEntity(VersionedEntity):
@@ -57,7 +57,7 @@ class ExecutableEntity(VersionedEntity):
57
57
  # Tasks
58
58
  ##############################
59
59
 
60
- def _get_or_create_task(self, kind: str, **kwargs) -> Task:
60
+ def _get_or_create_task(self, kind: str) -> Task:
61
61
  """
62
62
  Get or create task.
63
63
 
@@ -72,7 +72,10 @@ class ExecutableEntity(VersionedEntity):
72
72
  Task.
73
73
  """
74
74
  if self._tasks.get(kind) is None:
75
- return self.new_task(kind)
75
+ try:
76
+ self._tasks[kind] = self.get_task(kind)
77
+ except EntityError:
78
+ self._tasks[kind] = self.new_task(kind)
76
79
  return self._tasks[kind]
77
80
 
78
81
  def import_tasks(self, tasks: list[dict]) -> None:
@@ -147,6 +150,34 @@ class ExecutableEntity(VersionedEntity):
147
150
  self._tasks[task_kind] = task
148
151
  return task
149
152
 
153
+ def get_task(self, kind: str) -> Task:
154
+ """
155
+ Get task.
156
+
157
+ Parameters
158
+ ----------
159
+ kind : str
160
+ Kind the object.
161
+
162
+ Returns
163
+ -------
164
+ Task
165
+ Task.
166
+
167
+ Raises
168
+ ------
169
+ EntityError
170
+ If task is not created.
171
+ """
172
+ try:
173
+ return self._tasks[kind]
174
+ except KeyError:
175
+ resp = self._get_task_from_backend(kind)
176
+ if not resp:
177
+ raise EntityError(f"Task {kind} is not created")
178
+ self._tasks[kind] = task_from_dict(resp[0])
179
+ return self._tasks[kind]
180
+
150
181
  def update_task(self, kind: str, **kwargs) -> Task:
151
182
  """
152
183
  Update task.
@@ -180,47 +211,42 @@ class ExecutableEntity(VersionedEntity):
180
211
  self._tasks[kind] = task
181
212
  return task
182
213
 
183
- def get_task(self, kind: str) -> Task:
214
+ def delete_task(self, kind: str, cascade: bool = True) -> dict:
184
215
  """
185
- Get task.
216
+ Delete task.
186
217
 
187
218
  Parameters
188
219
  ----------
189
220
  kind : str
190
221
  Kind the object.
222
+ cascade : bool
223
+ Flag to determine if cascade deletion must be performed.
191
224
 
192
225
  Returns
193
226
  -------
194
- Task
195
- Task.
196
-
197
- Raises
198
- ------
199
- EntityError
200
- If task is not created.
227
+ dict
228
+ Response from backend.
201
229
  """
202
- self._raise_if_not_exists(kind)
203
- return self._tasks[kind]
230
+ resp = delete_task(self._tasks[kind].key, cascade=cascade)
231
+ self._tasks.pop(kind, None)
232
+ return resp
204
233
 
205
- def delete_task(self, kind: str, cascade: bool = True) -> dict:
234
+ def _get_task_from_backend(self, kind: str) -> list:
206
235
  """
207
- Delete task.
236
+ List tasks from backend filtered by function and kind.
208
237
 
209
238
  Parameters
210
239
  ----------
211
240
  kind : str
212
241
  Kind the object.
213
- cascade : bool
214
- Flag to determine if cascade deletion must be performed.
215
242
 
216
243
  Returns
217
244
  -------
218
- dict
245
+ list
219
246
  Response from backend.
220
247
  """
221
- resp = delete_task(self._tasks[kind].key, cascade=cascade)
222
- self._tasks.pop(kind, None)
223
- return resp
248
+ params = {"function": self._get_executable_string(), "kind": kind}
249
+ return list_entity_api_ctx(self.project, EntityTypes.TASK.value, params=params)
224
250
 
225
251
  def _check_task_in_backend(self, kind: str) -> bool:
226
252
  """
@@ -236,9 +262,7 @@ class ExecutableEntity(VersionedEntity):
236
262
  bool
237
263
  Flag to determine if task exists in backend.
238
264
  """
239
- # List tasks from backend filtered by function and kind
240
- params = {"function": self._get_executable_string(), "kind": kind}
241
- resp = list_entity_api_ctx(self.project, EntityTypes.TASK.value, params=params)
265
+ resp = self._get_task_from_backend(kind)
242
266
  if not resp:
243
267
  return False
244
268
  return True
File without changes
@@ -4,13 +4,13 @@ import typing
4
4
  from pathlib import Path
5
5
 
6
6
  from digitalhub.entities._base.crud import files_info_get_api, files_info_put_api
7
- from digitalhub.entities._base.entity.versioned import VersionedEntity
7
+ from digitalhub.entities._base.versioned.entity import VersionedEntity
8
8
  from digitalhub.stores.builder import get_store
9
9
 
10
10
  if typing.TYPE_CHECKING:
11
- from digitalhub.entities._base.metadata import Metadata
12
- from digitalhub.entities._base.spec.material import MaterialSpec
13
- from digitalhub.entities._base.status.material import MaterialStatus
11
+ from digitalhub.entities._base.entity.metadata import Metadata
12
+ from digitalhub.entities._base.material.spec import MaterialSpec
13
+ from digitalhub.entities._base.material.status import MaterialStatus
14
14
 
15
15
 
16
16
  class MaterialEntity(VersionedEntity):
@@ -1,11 +1,11 @@
1
1
  from __future__ import annotations
2
2
 
3
- from digitalhub.entities._base.spec.base import Spec, SpecParams
3
+ from digitalhub.entities._base.entity.spec import Spec, SpecValidator
4
4
 
5
5
 
6
6
  class MaterialSpec(Spec):
7
7
  """
8
- Material specification class.
8
+ Material specifications.class.
9
9
  """
10
10
 
11
11
  def __init__(self, path: str, **kwargs) -> None:
@@ -13,7 +13,7 @@ class MaterialSpec(Spec):
13
13
  self.path = path
14
14
 
15
15
 
16
- class MaterialParams(SpecParams):
16
+ class MaterialValidator(SpecValidator):
17
17
  """
18
18
  Material parameters class.
19
19
  """
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from digitalhub.entities._base.status.base import Status
3
+ from digitalhub.entities._base.entity.status import Status
4
4
 
5
5
 
6
6
  class MaterialStatus(Status):
File without changes
@@ -0,0 +1,66 @@
1
+ from __future__ import annotations
2
+
3
+ import typing
4
+
5
+ from digitalhub.entities._builders.entity import EntityBuilder
6
+
7
+ if typing.TYPE_CHECKING:
8
+ from digitalhub.entities._base.unversioned.entity import UnversionedEntity
9
+
10
+
11
+ class UnversionedBuilder(EntityBuilder):
12
+ """
13
+ Unversioned builder.
14
+ """
15
+
16
+ def from_dict(self, obj: dict, validate: bool = True) -> UnversionedEntity:
17
+ """
18
+ Create a new object from dictionary.
19
+
20
+ Parameters
21
+ ----------
22
+ obj : dict
23
+ Dictionary to create object from.
24
+ validate : bool
25
+ Flag to indicate if arguments must be validated.
26
+
27
+ Returns
28
+ -------
29
+ UnversionedEntity
30
+ Object instance.
31
+ """
32
+ parsed_dict = self._parse_dict(obj, validate=validate)
33
+ return self.build_entity(**parsed_dict)
34
+
35
+ def _parse_dict(self, obj: dict, validate: bool = True) -> dict:
36
+ """
37
+ Get dictionary and parse it to a valid entity dictionary.
38
+
39
+ Parameters
40
+ ----------
41
+ entity : str
42
+ Entity type.
43
+ obj : dict
44
+ Dictionary to parse.
45
+
46
+ Returns
47
+ -------
48
+ dict
49
+ A dictionary containing the attributes of the entity instance.
50
+ """
51
+ project = obj.get("project")
52
+ kind = obj.get("kind")
53
+ uuid = self.build_uuid(obj.get("id"))
54
+ metadata = self.build_metadata(**obj.get("metadata", {}))
55
+ spec = self.build_spec(validate=validate, **obj.get("spec", {}))
56
+ status = self.build_status(**obj.get("status", {}))
57
+ user = obj.get("user")
58
+ return {
59
+ "project": project,
60
+ "uuid": uuid,
61
+ "kind": kind,
62
+ "metadata": metadata,
63
+ "spec": spec,
64
+ "status": status,
65
+ "user": user,
66
+ }
@@ -0,0 +1,49 @@
1
+ from __future__ import annotations
2
+
3
+ import typing
4
+
5
+ from digitalhub.entities._base.context.entity import ContextEntity
6
+ from digitalhub.utils.io_utils import write_yaml
7
+
8
+ if typing.TYPE_CHECKING:
9
+ from digitalhub.entities._base.entity.metadata import Metadata
10
+ from digitalhub.entities._base.entity.spec import Spec
11
+ from digitalhub.entities._base.entity.status import Status
12
+
13
+
14
+ class UnversionedEntity(ContextEntity):
15
+ def __init__(
16
+ self,
17
+ project: str,
18
+ uuid: str,
19
+ kind: str,
20
+ metadata: Metadata,
21
+ spec: Spec,
22
+ status: Status,
23
+ user: str | None = None,
24
+ ) -> None:
25
+ super().__init__(project, kind, metadata, spec, status, user)
26
+ self.id = uuid
27
+ self.key = f"store://{project}/{self.ENTITY_TYPE}/{kind}/{uuid}"
28
+ self._obj_attr.extend(["id"])
29
+
30
+ def export(self, filename: str | None = None) -> str:
31
+ """
32
+ Export object as a YAML file.
33
+
34
+ Parameters
35
+ ----------
36
+ filename : str
37
+ Name of the export YAML file. If not specified, the default value is used.
38
+
39
+ Returns
40
+ -------
41
+ str
42
+ Exported file.
43
+ """
44
+ obj = self.to_dict()
45
+ if filename is None:
46
+ filename = f"{self.ENTITY_TYPE}-{self.id}.yml"
47
+ pth = self._context().root / filename
48
+ write_yaml(pth, obj)
49
+ return str(pth)
File without changes
@@ -0,0 +1,68 @@
1
+ from __future__ import annotations
2
+
3
+ import typing
4
+
5
+ from digitalhub.entities._builders.entity import EntityBuilder
6
+
7
+ if typing.TYPE_CHECKING:
8
+ from digitalhub.entities._base.versioned.entity import VersionedEntity
9
+
10
+
11
+ class VersionedBuilder(EntityBuilder):
12
+ """
13
+ Versioned builder.
14
+ """
15
+
16
+ def from_dict(self, obj: dict, validate: bool = True) -> VersionedEntity:
17
+ """
18
+ Create a new object from dictionary.
19
+
20
+ Parameters
21
+ ----------
22
+ obj : dict
23
+ Dictionary to create object from.
24
+ validate : bool
25
+ Flag to indicate if arguments must be validated.
26
+
27
+ Returns
28
+ -------
29
+ VersionedEntity
30
+ Object instance.
31
+ """
32
+ parsed_dict = self._parse_dict(obj, validate=validate)
33
+ return self.build_entity(**parsed_dict)
34
+
35
+ def _parse_dict(self, obj: dict, validate: bool = True) -> dict:
36
+ """
37
+ Get dictionary and parse it to a valid entity dictionary.
38
+
39
+ Parameters
40
+ ----------
41
+ entity : str
42
+ Entity type.
43
+ obj : dict
44
+ Dictionary to parse.
45
+
46
+ Returns
47
+ -------
48
+ dict
49
+ A dictionary containing the attributes of the entity instance.
50
+ """
51
+ project = obj.get("project")
52
+ kind = obj.get("kind")
53
+ name = self.build_name(obj.get("name"))
54
+ uuid = self.build_uuid(obj.get("id"))
55
+ metadata = self.build_metadata(**obj.get("metadata", {}))
56
+ spec = self.build_spec(validate=validate, **obj.get("spec", {}))
57
+ status = self.build_status(**obj.get("status", {}))
58
+ user = obj.get("user")
59
+ return {
60
+ "project": project,
61
+ "name": name,
62
+ "uuid": uuid,
63
+ "kind": kind,
64
+ "metadata": metadata,
65
+ "spec": spec,
66
+ "status": status,
67
+ "user": user,
68
+ }
@@ -0,0 +1,53 @@
1
+ from __future__ import annotations
2
+
3
+ import typing
4
+
5
+ from digitalhub.entities._base.context.entity import ContextEntity
6
+ from digitalhub.utils.io_utils import write_yaml
7
+
8
+ if typing.TYPE_CHECKING:
9
+ from digitalhub.entities._base.entity.metadata import Metadata
10
+ from digitalhub.entities._base.entity.spec import Spec
11
+ from digitalhub.entities._base.entity.status import Status
12
+
13
+
14
+ class VersionedEntity(ContextEntity):
15
+ def __init__(
16
+ self,
17
+ project: str,
18
+ name: str,
19
+ uuid: str,
20
+ kind: str,
21
+ metadata: Metadata,
22
+ spec: Spec,
23
+ status: Status,
24
+ user: str | None = None,
25
+ ) -> None:
26
+ super().__init__(project, kind, metadata, spec, status, user)
27
+ self.name = name
28
+ self.id = uuid
29
+ self.key = f"store://{project}/{self.ENTITY_TYPE}/{kind}/{name}:{uuid}"
30
+
31
+ # Add attributes to be used in the to_dict method
32
+ self._obj_attr.extend(["name", "id"])
33
+
34
+ def export(self, filename: str | None = None) -> str:
35
+ """
36
+ Export object as a YAML file.
37
+
38
+ Parameters
39
+ ----------
40
+ filename : str
41
+ Name of the export YAML file. If not specified, the default value is used.
42
+
43
+ Returns
44
+ -------
45
+ str
46
+ Exported file.
47
+ """
48
+ obj = self.to_dict()
49
+ if filename is None:
50
+ filename = f"{self.ENTITY_TYPE}-{self.name}-{self.id}.yml"
51
+ pth = self._context().root / filename
52
+ write_yaml(pth, obj)
53
+ return str(pth)
@@ -0,0 +1,153 @@
1
+ from __future__ import annotations
2
+
3
+ import typing
4
+ from abc import abstractmethod
5
+
6
+ from digitalhub.entities._builders.metadata import build_metadata
7
+ from digitalhub.entities._builders.name import build_name
8
+ from digitalhub.entities._builders.spec import build_spec
9
+ from digitalhub.entities._builders.status import build_status
10
+ from digitalhub.entities._builders.uuid import build_uuid
11
+ from digitalhub.utils.exceptions import BuilderError
12
+
13
+ if typing.TYPE_CHECKING:
14
+ from digitalhub.entities._base.entity.entity import Entity
15
+ from digitalhub.entities._base.entity.metadata import Metadata
16
+ from digitalhub.entities._base.entity.spec import Spec, SpecValidator
17
+ from digitalhub.entities._base.entity.status import Status
18
+
19
+
20
+ class EntityBuilder:
21
+ """
22
+ Builder class for building entities.
23
+ """
24
+
25
+ # Class variables
26
+ ENTITY_TYPE: str = None
27
+ ENTITY_CLASS: Entity = None
28
+ ENTITY_SPEC_CLASS: Spec = None
29
+ ENTITY_SPEC_VALIDATOR: SpecValidator = None
30
+ ENTITY_STATUS_CLASS: Status = None
31
+ ENTITY_KIND: str = None
32
+
33
+ def __init__(self) -> None:
34
+ if self.ENTITY_TYPE is None:
35
+ raise BuilderError("ENTITY_TYPE must be set")
36
+ if self.ENTITY_CLASS is None:
37
+ raise BuilderError("ENTITY_CLASS must be set")
38
+ if self.ENTITY_SPEC_CLASS is None:
39
+ raise BuilderError("ENTITY_SPEC_CLASS must be set")
40
+ if self.ENTITY_SPEC_VALIDATOR is None:
41
+ raise BuilderError("ENTITY_SPEC_VALIDATOR must be set")
42
+ if self.ENTITY_STATUS_CLASS is None:
43
+ raise BuilderError("ENTITY_STATUS_CLASS must be set")
44
+ if self.ENTITY_KIND is None:
45
+ raise BuilderError("ENTITY_KIND must be set")
46
+
47
+ def build_name(self, name: str) -> str:
48
+ """
49
+ Build entity name.
50
+
51
+ Parameters
52
+ ----------
53
+ name : str
54
+ Entity name.
55
+
56
+ Returns
57
+ -------
58
+ str
59
+ Entity name.
60
+ """
61
+ return build_name(name)
62
+
63
+ def build_uuid(self, uuid: str) -> str:
64
+ """
65
+ Build entity uuid.
66
+
67
+ Parameters
68
+ ----------
69
+ uuid : str
70
+ Entity uuid.
71
+
72
+ Returns
73
+ -------
74
+ str
75
+ Entity uuid.
76
+ """
77
+ return build_uuid(uuid)
78
+
79
+ def build_metadata(self, **kwargs) -> Metadata:
80
+ """
81
+ Build entity metadata object.
82
+
83
+ Parameters
84
+ ----------
85
+ **kwargs : dict
86
+ Keyword arguments for the constructor.
87
+
88
+ Returns
89
+ -------
90
+ Metadata
91
+ Metadata object.
92
+ """
93
+ return build_metadata(**kwargs)
94
+
95
+ def build_spec(self, validate: bool = True, **kwargs) -> Spec:
96
+ """
97
+ Build entity spec object.
98
+
99
+ Parameters
100
+ ----------
101
+ **kwargs : dict
102
+ Keyword arguments for the constructor.
103
+
104
+ Returns
105
+ -------
106
+ Spec
107
+ Spec object.
108
+ """
109
+ return build_spec(self.ENTITY_SPEC_CLASS, self.ENTITY_SPEC_VALIDATOR, validate=validate, **kwargs)
110
+
111
+ def build_status(self, **kwargs) -> Status:
112
+ """
113
+ Build entity status object.
114
+
115
+ Parameters
116
+ ----------
117
+ **kwargs : dict
118
+ Keyword arguments for the constructor.
119
+
120
+ Returns
121
+ -------
122
+ Status
123
+ Status object.
124
+ """
125
+ return build_status(self.ENTITY_STATUS_CLASS, **kwargs)
126
+
127
+ def build_entity(self, **kwargs) -> Entity:
128
+ """
129
+ Build entity object.
130
+
131
+ Parameters
132
+ ----------
133
+ **kwargs : dict
134
+ Keyword arguments for the constructor.
135
+
136
+ Returns
137
+ -------
138
+ Entity
139
+ Entity object.
140
+ """
141
+ return self.ENTITY_CLASS(**kwargs)
142
+
143
+ @abstractmethod
144
+ def build(self, *args, **kwargs) -> Entity:
145
+ """
146
+ Build entity object.
147
+ """
148
+
149
+ @abstractmethod
150
+ def from_dict(self, obj: dict, validate: bool = True) -> Entity:
151
+ """
152
+ Build entity object from dictionary.
153
+ """
@@ -1,30 +1,16 @@
1
1
  from __future__ import annotations
2
2
 
3
- import typing
4
-
5
- from digitalhub.registry.registry import registry
6
- from digitalhub.registry.utils import import_class
3
+ from digitalhub.entities._base.entity.metadata import Metadata
7
4
  from digitalhub.utils.generic_utils import get_timestamp
8
5
 
9
- if typing.TYPE_CHECKING:
10
- from digitalhub.entities._base.metadata import Metadata
11
- from digitalhub.registry.models import RegistryEntry
12
-
13
6
 
14
- def build_metadata(kind: str, **kwargs) -> Metadata:
7
+ def build_metadata(**kwargs) -> Metadata:
15
8
  """
16
- Build entity metadata object. The builder takes as input
17
- the kind of metadata's object to build and the keyword
18
- arguments to pass to the metadata's constructor.
19
- The specific Metadata class is searched in the global
20
- registry, where lies info about where to find the class.
21
- The arguments are parsed, eventually adding default values,
22
- and then passed to the constructor.
9
+ Build entity metadata object. This method is used to build entity
10
+ metadata.
23
11
 
24
12
  Parameters
25
13
  ----------
26
- kind : str
27
- Registry entry kind.
28
14
  **kwargs : dict
29
15
  Keyword arguments for the constructor.
30
16
 
@@ -33,10 +19,8 @@ def build_metadata(kind: str, **kwargs) -> Metadata:
33
19
  Metadata
34
20
  Metadata object.
35
21
  """
36
- infos: RegistryEntry = getattr(registry, kind)
37
- metadata = import_class(infos.metadata.module, infos.metadata.class_name)
38
22
  kwargs = parse_arguments(**kwargs)
39
- return metadata(**kwargs)
23
+ return Metadata(**kwargs)
40
24
 
41
25
 
42
26
  def parse_arguments(**kwargs) -> dict: