digitalhub 0.8.0__py3-none-any.whl → 0.8.0b1__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 (248) hide show
  1. digitalhub/__init__.py +4 -5
  2. digitalhub/client/builder.py +58 -3
  3. digitalhub/client/{dhcore/client.py → objects/dhcore.py} +60 -48
  4. digitalhub/client/{local/client.py → objects/local.py} +2 -2
  5. digitalhub/context/builder.py +85 -1
  6. digitalhub/context/context.py +1 -1
  7. digitalhub/datastores/builder.py +37 -13
  8. digitalhub/datastores/{_base/datastore.py → objects/base.py} +3 -3
  9. digitalhub/datastores/{local/datastore.py → objects/local.py} +2 -10
  10. digitalhub/datastores/{remote/datastore.py → objects/remote.py} +1 -9
  11. digitalhub/datastores/{s3/datastore.py → objects/s3.py} +2 -10
  12. digitalhub/datastores/{sql/datastore.py → objects/sql.py} +2 -10
  13. digitalhub/entities/_base/{_base/entity.py → base.py} +1 -1
  14. digitalhub/entities/_base/crud.py +389 -247
  15. digitalhub/entities/_base/entity/{entity.py → base.py} +34 -8
  16. digitalhub/entities/_base/{context/entity.py → entity/context.py} +6 -6
  17. digitalhub/entities/_base/{executable/entity.py → entity/executable.py} +36 -61
  18. digitalhub/entities/_base/{material/entity.py → entity/material.py} +6 -6
  19. digitalhub/entities/_base/entity/unversioned.py +87 -0
  20. digitalhub/entities/_base/entity/versioned.py +94 -0
  21. digitalhub/entities/_base/{entity/metadata.py → metadata.py} +2 -2
  22. digitalhub/entities/_base/{entity/spec.py → spec/base.py} +11 -11
  23. digitalhub/entities/_base/{material/spec.py → spec/material.py} +3 -3
  24. digitalhub/entities/_base/{entity/status.py → status/base.py} +3 -14
  25. digitalhub/entities/_base/{material/status.py → status/material.py} +1 -1
  26. digitalhub/entities/_builders/metadata.py +60 -0
  27. digitalhub/entities/_builders/spec.py +43 -0
  28. digitalhub/entities/_builders/status.py +62 -0
  29. digitalhub/entities/{_base/entity/_constructors → _builders}/uuid.py +11 -4
  30. digitalhub/entities/artifact/builder.py +133 -0
  31. digitalhub/entities/artifact/crud.py +48 -22
  32. digitalhub/entities/artifact/{_base/entity.py → entity/_base.py} +5 -5
  33. digitalhub/entities/artifact/entity/artifact.py +9 -0
  34. digitalhub/entities/artifact/{artifact/spec.py → spec.py} +16 -4
  35. digitalhub/entities/artifact/{artifact/status.py → status.py} +1 -1
  36. digitalhub/entities/dataitem/builder.py +144 -0
  37. digitalhub/entities/dataitem/crud.py +52 -29
  38. digitalhub/entities/dataitem/{_base/entity.py → entity/_base.py} +5 -5
  39. digitalhub/entities/dataitem/entity/dataitem.py +9 -0
  40. digitalhub/entities/dataitem/entity/iceberg.py +7 -0
  41. digitalhub/entities/dataitem/{table/entity.py → entity/table.py} +4 -25
  42. digitalhub/entities/dataitem/spec.py +61 -0
  43. digitalhub/entities/dataitem/status.py +38 -0
  44. digitalhub/entities/function/builder.py +86 -0
  45. digitalhub/entities/function/crud.py +43 -17
  46. digitalhub/entities/function/{_base/entity.py → entity.py} +12 -9
  47. digitalhub/entities/function/{_base/models.py → models.py} +1 -1
  48. digitalhub/entities/function/spec.py +81 -0
  49. digitalhub/entities/function/status.py +9 -0
  50. digitalhub/entities/model/builder.py +152 -0
  51. digitalhub/entities/model/crud.py +48 -21
  52. digitalhub/entities/model/{_base/entity.py → entity/_base.py} +5 -5
  53. digitalhub/entities/model/entity/huggingface.py +9 -0
  54. digitalhub/entities/model/{mlflow/utils.py → entity/mlflow.py} +10 -1
  55. digitalhub/entities/model/entity/model.py +9 -0
  56. digitalhub/entities/model/entity/sklearn.py +9 -0
  57. digitalhub/entities/model/spec.py +146 -0
  58. digitalhub/entities/model/status.py +33 -0
  59. digitalhub/entities/project/builder.py +82 -0
  60. digitalhub/entities/project/crud.py +12 -19
  61. digitalhub/entities/project/{_base/entity.py → entity.py} +102 -120
  62. digitalhub/entities/project/{_base/spec.py → spec.py} +4 -4
  63. digitalhub/entities/project/status.py +9 -0
  64. digitalhub/entities/registries.py +48 -0
  65. digitalhub/entities/run/builder.py +77 -0
  66. digitalhub/entities/run/crud.py +33 -20
  67. digitalhub/entities/run/{_base/entity.py → entity.py} +189 -35
  68. digitalhub/entities/run/spec.py +153 -0
  69. digitalhub/entities/run/status.py +114 -0
  70. digitalhub/entities/secret/builder.py +93 -0
  71. digitalhub/entities/secret/crud.py +31 -27
  72. digitalhub/entities/secret/{_base/entity.py → entity.py} +7 -8
  73. digitalhub/entities/secret/{_base/spec.py → spec.py} +4 -4
  74. digitalhub/entities/secret/status.py +9 -0
  75. digitalhub/entities/task/builder.py +74 -0
  76. digitalhub/entities/task/crud.py +33 -20
  77. digitalhub/entities/task/{_base/entity.py → entity.py} +8 -9
  78. digitalhub/entities/task/{_base/models.py → models.py} +0 -9
  79. digitalhub/entities/task/{_base/spec.py → spec.py} +7 -9
  80. digitalhub/entities/task/status.py +9 -0
  81. digitalhub/entities/{utils/utils.py → utils.py} +2 -20
  82. digitalhub/entities/workflow/builder.py +91 -0
  83. digitalhub/entities/workflow/crud.py +43 -17
  84. digitalhub/entities/workflow/{_base/entity.py → entity.py} +12 -9
  85. digitalhub/entities/workflow/spec.py +15 -0
  86. digitalhub/entities/workflow/status.py +9 -0
  87. digitalhub/readers/builder.py +54 -0
  88. digitalhub/readers/{pandas/reader.py → objects/pandas.py} +1 -1
  89. digitalhub/readers/registry.py +15 -0
  90. digitalhub/registry/models.py +87 -0
  91. digitalhub/registry/registry.py +74 -0
  92. digitalhub/registry/utils.py +150 -0
  93. digitalhub/runtimes/{_base.py → base.py} +65 -3
  94. digitalhub/runtimes/builder.py +40 -19
  95. digitalhub/runtimes/kind_registry.py +170 -0
  96. digitalhub/stores/builder.py +52 -6
  97. digitalhub/stores/{local/store.py → objects/local.py} +1 -1
  98. digitalhub/stores/{remote/store.py → objects/remote.py} +1 -1
  99. digitalhub/stores/{s3/store.py → objects/s3.py} +1 -1
  100. digitalhub/stores/{sql/store.py → objects/sql.py} +1 -1
  101. digitalhub/{client/dhcore/utils.py → utils/env_utils.py} +14 -2
  102. digitalhub/utils/exceptions.py +0 -12
  103. digitalhub/utils/generic_utils.py +42 -18
  104. digitalhub/utils/io_utils.py +2 -39
  105. {digitalhub-0.8.0.dist-info → digitalhub-0.8.0b1.dist-info}/METADATA +2 -3
  106. digitalhub-0.8.0b1.dist-info/RECORD +161 -0
  107. {digitalhub-0.8.0.dist-info → digitalhub-0.8.0b1.dist-info}/WHEEL +1 -1
  108. test/test_crud_artifacts.py +96 -0
  109. test/test_crud_dataitems.py +96 -0
  110. test/test_crud_functions.py +1 -1
  111. test/test_crud_runs.py +1 -1
  112. test/test_crud_tasks.py +1 -1
  113. digitalhub/client/api.py +0 -63
  114. digitalhub/client/dhcore/env.py +0 -21
  115. digitalhub/client/dhcore/models.py +0 -46
  116. digitalhub/context/api.py +0 -93
  117. digitalhub/datastores/api.py +0 -37
  118. digitalhub/entities/_base/api_utils.py +0 -620
  119. digitalhub/entities/_base/entity/_constructors/metadata.py +0 -44
  120. digitalhub/entities/_base/entity/_constructors/spec.py +0 -33
  121. digitalhub/entities/_base/entity/_constructors/status.py +0 -52
  122. digitalhub/entities/_base/entity/builder.py +0 -175
  123. digitalhub/entities/_base/executable/__init__.py +0 -0
  124. digitalhub/entities/_base/material/__init__.py +0 -0
  125. digitalhub/entities/_base/runtime_entity/__init__.py +0 -0
  126. digitalhub/entities/_base/runtime_entity/builder.py +0 -106
  127. digitalhub/entities/_base/unversioned/__init__.py +0 -0
  128. digitalhub/entities/_base/unversioned/builder.py +0 -66
  129. digitalhub/entities/_base/unversioned/entity.py +0 -49
  130. digitalhub/entities/_base/versioned/__init__.py +0 -0
  131. digitalhub/entities/_base/versioned/builder.py +0 -68
  132. digitalhub/entities/_base/versioned/entity.py +0 -53
  133. digitalhub/entities/artifact/_base/__init__.py +0 -0
  134. digitalhub/entities/artifact/_base/builder.py +0 -86
  135. digitalhub/entities/artifact/_base/spec.py +0 -15
  136. digitalhub/entities/artifact/_base/status.py +0 -9
  137. digitalhub/entities/artifact/artifact/__init__.py +0 -0
  138. digitalhub/entities/artifact/artifact/builder.py +0 -18
  139. digitalhub/entities/artifact/artifact/entity.py +0 -32
  140. digitalhub/entities/builders.py +0 -63
  141. digitalhub/entities/dataitem/_base/__init__.py +0 -0
  142. digitalhub/entities/dataitem/_base/builder.py +0 -86
  143. digitalhub/entities/dataitem/_base/spec.py +0 -15
  144. digitalhub/entities/dataitem/_base/status.py +0 -20
  145. digitalhub/entities/dataitem/dataitem/__init__.py +0 -0
  146. digitalhub/entities/dataitem/dataitem/builder.py +0 -18
  147. digitalhub/entities/dataitem/dataitem/entity.py +0 -32
  148. digitalhub/entities/dataitem/dataitem/spec.py +0 -15
  149. digitalhub/entities/dataitem/dataitem/status.py +0 -9
  150. digitalhub/entities/dataitem/iceberg/__init__.py +0 -0
  151. digitalhub/entities/dataitem/iceberg/builder.py +0 -18
  152. digitalhub/entities/dataitem/iceberg/entity.py +0 -32
  153. digitalhub/entities/dataitem/iceberg/spec.py +0 -15
  154. digitalhub/entities/dataitem/iceberg/status.py +0 -9
  155. digitalhub/entities/dataitem/table/__init__.py +0 -0
  156. digitalhub/entities/dataitem/table/builder.py +0 -18
  157. digitalhub/entities/dataitem/table/spec.py +0 -25
  158. digitalhub/entities/dataitem/table/status.py +0 -9
  159. digitalhub/entities/function/_base/__init__.py +0 -0
  160. digitalhub/entities/function/_base/builder.py +0 -79
  161. digitalhub/entities/function/_base/spec.py +0 -15
  162. digitalhub/entities/function/_base/status.py +0 -9
  163. digitalhub/entities/model/_base/__init__.py +0 -0
  164. digitalhub/entities/model/_base/builder.py +0 -86
  165. digitalhub/entities/model/_base/spec.py +0 -49
  166. digitalhub/entities/model/_base/status.py +0 -9
  167. digitalhub/entities/model/huggingface/__init__.py +0 -0
  168. digitalhub/entities/model/huggingface/builder.py +0 -18
  169. digitalhub/entities/model/huggingface/entity.py +0 -32
  170. digitalhub/entities/model/huggingface/spec.py +0 -36
  171. digitalhub/entities/model/huggingface/status.py +0 -9
  172. digitalhub/entities/model/mlflow/__init__.py +0 -0
  173. digitalhub/entities/model/mlflow/builder.py +0 -18
  174. digitalhub/entities/model/mlflow/entity.py +0 -32
  175. digitalhub/entities/model/mlflow/spec.py +0 -44
  176. digitalhub/entities/model/mlflow/status.py +0 -9
  177. digitalhub/entities/model/model/__init__.py +0 -0
  178. digitalhub/entities/model/model/builder.py +0 -18
  179. digitalhub/entities/model/model/entity.py +0 -32
  180. digitalhub/entities/model/model/spec.py +0 -15
  181. digitalhub/entities/model/model/status.py +0 -9
  182. digitalhub/entities/model/sklearn/__init__.py +0 -0
  183. digitalhub/entities/model/sklearn/builder.py +0 -18
  184. digitalhub/entities/model/sklearn/entity.py +0 -32
  185. digitalhub/entities/model/sklearn/spec.py +0 -15
  186. digitalhub/entities/model/sklearn/status.py +0 -9
  187. digitalhub/entities/project/_base/__init__.py +0 -0
  188. digitalhub/entities/project/_base/builder.py +0 -128
  189. digitalhub/entities/project/_base/status.py +0 -9
  190. digitalhub/entities/run/_base/__init__.py +0 -0
  191. digitalhub/entities/run/_base/builder.py +0 -94
  192. digitalhub/entities/run/_base/spec.py +0 -50
  193. digitalhub/entities/run/_base/status.py +0 -9
  194. digitalhub/entities/secret/_base/__init__.py +0 -0
  195. digitalhub/entities/secret/_base/builder.py +0 -81
  196. digitalhub/entities/secret/_base/status.py +0 -9
  197. digitalhub/entities/task/_base/__init__.py +0 -0
  198. digitalhub/entities/task/_base/builder.py +0 -91
  199. digitalhub/entities/task/_base/status.py +0 -9
  200. digitalhub/entities/utils/__init__.py +0 -0
  201. digitalhub/entities/workflow/_base/__init__.py +0 -0
  202. digitalhub/entities/workflow/_base/builder.py +0 -79
  203. digitalhub/entities/workflow/_base/spec.py +0 -15
  204. digitalhub/entities/workflow/_base/status.py +0 -9
  205. digitalhub/factory/__init__.py +0 -0
  206. digitalhub/factory/api.py +0 -277
  207. digitalhub/factory/factory.py +0 -268
  208. digitalhub/factory/utils.py +0 -90
  209. digitalhub/readers/_base/__init__.py +0 -0
  210. digitalhub/readers/_base/builder.py +0 -26
  211. digitalhub/readers/api.py +0 -80
  212. digitalhub/readers/factory.py +0 -133
  213. digitalhub/readers/pandas/__init__.py +0 -0
  214. digitalhub/readers/pandas/builder.py +0 -29
  215. digitalhub/stores/_base/__init__.py +0 -0
  216. digitalhub/stores/api.py +0 -54
  217. digitalhub/stores/local/__init__.py +0 -0
  218. digitalhub/stores/remote/__init__.py +0 -0
  219. digitalhub/stores/s3/__init__.py +0 -0
  220. digitalhub/stores/sql/__init__.py +0 -0
  221. digitalhub/utils/s3_utils.py +0 -58
  222. digitalhub-0.8.0.dist-info/RECORD +0 -231
  223. test/local/CRUD/test_artifacts.py +0 -96
  224. test/local/CRUD/test_dataitems.py +0 -96
  225. test/local/CRUD/test_models.py +0 -95
  226. /digitalhub/client/{_base → objects}/__init__.py +0 -0
  227. /digitalhub/client/{_base/client.py → objects/base.py} +0 -0
  228. /digitalhub/{client/dhcore → datastores/objects}/__init__.py +0 -0
  229. /digitalhub/entities/{utils → _base}/api.py +0 -0
  230. /digitalhub/{client/local → entities/_base/spec}/__init__.py +0 -0
  231. /digitalhub/entities/{utils → _base}/state.py +0 -0
  232. /digitalhub/{datastores/_base → entities/_base/status}/__init__.py +0 -0
  233. /digitalhub/{datastores/local → entities/_builders}/__init__.py +0 -0
  234. /digitalhub/entities/{_base/entity/_constructors → _builders}/name.py +0 -0
  235. /digitalhub/{datastores/remote → entities/artifact/entity}/__init__.py +0 -0
  236. /digitalhub/{datastores/s3 → entities/dataitem/entity}/__init__.py +0 -0
  237. /digitalhub/entities/dataitem/{table/models.py → models.py} +0 -0
  238. /digitalhub/entities/{utils/entity_types.py → entity_types.py} +0 -0
  239. /digitalhub/{datastores/sql → entities/model/entity}/__init__.py +0 -0
  240. /digitalhub/entities/model/{mlflow/models.py → models.py} +0 -0
  241. /digitalhub/{entities/_base/_base → readers/objects}/__init__.py +0 -0
  242. /digitalhub/readers/{_base/reader.py → objects/base.py} +0 -0
  243. /digitalhub/{entities/_base/context → registry}/__init__.py +0 -0
  244. /digitalhub/{entities/_base/entity/_constructors → stores/objects}/__init__.py +0 -0
  245. /digitalhub/stores/{_base/store.py → objects/base.py} +0 -0
  246. {digitalhub-0.8.0.dist-info → digitalhub-0.8.0b1.dist-info}/LICENSE.txt +0 -0
  247. {digitalhub-0.8.0.dist-info → digitalhub-0.8.0b1.dist-info}/top_level.txt +0 -0
  248. /test/{local/imports/test_imports.py → test_imports.py} +0 -0
@@ -0,0 +1,9 @@
1
+ from __future__ import annotations
2
+
3
+ from digitalhub.entities._base.status.base import Status
4
+
5
+
6
+ class TaskStatus(Status):
7
+ """
8
+ Status class for task entities.
9
+ """
@@ -2,9 +2,9 @@ from __future__ import annotations
2
2
 
3
3
  from pathlib import Path
4
4
 
5
- from digitalhub.entities.utils.entity_types import EntityTypes
5
+ from digitalhub.entities.entity_types import EntityTypes
6
+ from digitalhub.utils.env_utils import get_s3_bucket
6
7
  from digitalhub.utils.file_utils import get_file_mime_type
7
- from digitalhub.utils.s3_utils import get_s3_bucket
8
8
  from digitalhub.utils.uri_utils import check_local_path
9
9
 
10
10
 
@@ -182,21 +182,3 @@ def build_log_path_from_source(
182
182
  path += f"/{Path(source).name}"
183
183
 
184
184
  return path
185
-
186
-
187
- def get_entity_type_from_key(key: str) -> str:
188
- """
189
- Get entity type.
190
-
191
- Parameters
192
- ----------
193
- key : str
194
- The key of the entity.
195
-
196
- Returns
197
- -------
198
- str
199
- The entity type.
200
- """
201
- _, entity_type, _, _, _ = parse_entity_key(key)
202
- return entity_type
@@ -0,0 +1,91 @@
1
+ from __future__ import annotations
2
+
3
+ from digitalhub.entities._builders.metadata import build_metadata
4
+ from digitalhub.entities._builders.name import build_name
5
+ from digitalhub.entities._builders.spec import build_spec
6
+ from digitalhub.entities._builders.status import build_status
7
+ from digitalhub.entities._builders.uuid import build_uuid
8
+ from digitalhub.entities.workflow.entity import Workflow
9
+
10
+
11
+ def workflow_from_parameters(
12
+ project: str,
13
+ name: str,
14
+ kind: str,
15
+ uuid: str | None = None,
16
+ description: str | None = None,
17
+ labels: list[str] | None = None,
18
+ embedded: bool = True,
19
+ **kwargs,
20
+ ) -> Workflow:
21
+ """
22
+ Create a new object.
23
+
24
+ Parameters
25
+ ----------
26
+ project : str
27
+ Project name.
28
+ name : str
29
+ Object name.
30
+ kind : str
31
+ Kind the object.
32
+ uuid : str
33
+ ID of the object (UUID4, e.g. 40f25c4b-d26b-4221-b048-9527aff291e2).
34
+ labels : list[str]
35
+ List of labels.
36
+ description : str
37
+ Description of the object (human readable).
38
+ embedded : bool
39
+ Flag to determine if object spec must be embedded in project spec.
40
+ **kwargs : dict
41
+ Spec keyword arguments.
42
+
43
+ Returns
44
+ -------
45
+ Workflow
46
+ Object instance.
47
+ """
48
+ name = build_name(name)
49
+ uuid = build_uuid(uuid)
50
+ spec = build_spec(
51
+ kind,
52
+ **kwargs,
53
+ )
54
+ metadata = build_metadata(
55
+ kind,
56
+ project=project,
57
+ name=name,
58
+ version=uuid,
59
+ description=description,
60
+ labels=labels,
61
+ embedded=embedded,
62
+ )
63
+ status = build_status(
64
+ kind,
65
+ )
66
+ return Workflow(
67
+ project=project,
68
+ name=name,
69
+ uuid=uuid,
70
+ kind=kind,
71
+ metadata=metadata,
72
+ spec=spec,
73
+ status=status,
74
+ )
75
+
76
+
77
+ def workflow_from_dict(obj: dict) -> Workflow:
78
+ """
79
+ Create a new object from dictionary.
80
+
81
+ Parameters
82
+ ----------
83
+ obj : dict
84
+ Dictionary to create object from.
85
+
86
+ Returns
87
+ -------
88
+ Workflow
89
+ Object instance.
90
+ """
91
+ return Workflow.from_dict(obj)
@@ -2,18 +2,20 @@ from __future__ import annotations
2
2
 
3
3
  import typing
4
4
 
5
+ from digitalhub.context.builder import check_context
5
6
  from digitalhub.entities._base.crud import (
6
- delete_entity,
7
- get_context_entity_versions,
8
- get_versioned_entity,
9
- import_executable_entity,
10
- list_context_entities,
11
- new_context_entity,
7
+ delete_entity_api_ctx,
8
+ list_entity_api_ctx,
9
+ read_entity_api_ctx,
10
+ read_entity_api_ctx_versions,
12
11
  )
13
- from digitalhub.entities.utils.entity_types import EntityTypes
12
+ from digitalhub.entities.entity_types import EntityTypes
13
+ from digitalhub.entities.workflow.builder import workflow_from_dict, workflow_from_parameters
14
+ from digitalhub.utils.exceptions import EntityAlreadyExistsError
15
+ from digitalhub.utils.io_utils import read_yaml
14
16
 
15
17
  if typing.TYPE_CHECKING:
16
- from digitalhub.entities.workflow._base.entity import Workflow
18
+ from digitalhub.entities.workflow.entity import Workflow
17
19
 
18
20
 
19
21
  ENTITY_TYPE = EntityTypes.WORKFLOW.value
@@ -26,7 +28,7 @@ def new_workflow(
26
28
  uuid: str | None = None,
27
29
  description: str | None = None,
28
30
  labels: list[str] | None = None,
29
- embedded: bool = False,
31
+ embedded: bool = True,
30
32
  **kwargs,
31
33
  ) -> Workflow:
32
34
  """
@@ -39,7 +41,7 @@ def new_workflow(
39
41
  name : str
40
42
  Object name.
41
43
  uuid : str
42
- ID of the object.
44
+ ID of the object (UUID4, e.g. 40f25c4b-d26b-4221-b048-9527aff291e2).
43
45
  description : str
44
46
  Description of the object (human readable).
45
47
  labels : list[str]
@@ -62,7 +64,8 @@ def new_workflow(
62
64
  >>> code_src="pipeline.py",
63
65
  >>> handler="pipeline-handler")
64
66
  """
65
- return new_context_entity(
67
+ check_context(project)
68
+ obj = workflow_from_parameters(
66
69
  project=project,
67
70
  name=name,
68
71
  kind=kind,
@@ -72,6 +75,8 @@ def new_workflow(
72
75
  embedded=embedded,
73
76
  **kwargs,
74
77
  )
78
+ obj.save()
79
+ return obj
75
80
 
76
81
 
77
82
  def get_workflow(
@@ -109,13 +114,14 @@ def get_workflow(
109
114
  >>> project="my-project",
110
115
  >>> entity_id="my-workflow-id")
111
116
  """
112
- return get_versioned_entity(
117
+ obj = read_entity_api_ctx(
113
118
  identifier,
114
- entity_type=ENTITY_TYPE,
119
+ ENTITY_TYPE,
115
120
  project=project,
116
121
  entity_id=entity_id,
117
122
  **kwargs,
118
123
  )
124
+ return workflow_from_dict(obj)
119
125
 
120
126
 
121
127
  def get_workflow_versions(
@@ -149,12 +155,13 @@ def get_workflow_versions(
149
155
  >>> obj = get_workflow_versions("my-workflow-name"
150
156
  >>> project="my-project")
151
157
  """
152
- return get_context_entity_versions(
158
+ obj = read_entity_api_ctx_versions(
153
159
  identifier,
154
160
  entity_type=ENTITY_TYPE,
155
161
  project=project,
156
162
  **kwargs,
157
163
  )
164
+ return [workflow_from_dict(o) for o in obj]
158
165
 
159
166
 
160
167
  def list_workflows(project: str, **kwargs) -> list[Workflow]:
@@ -177,11 +184,12 @@ def list_workflows(project: str, **kwargs) -> list[Workflow]:
177
184
  --------
178
185
  >>> objs = list_workflows(project="my-project")
179
186
  """
180
- return list_context_entities(
187
+ objs = list_entity_api_ctx(
181
188
  project=project,
182
189
  entity_type=ENTITY_TYPE,
183
190
  **kwargs,
184
191
  )
192
+ return [workflow_from_dict(obj) for obj in objs]
185
193
 
186
194
 
187
195
  def import_workflow(file: str) -> Workflow:
@@ -202,7 +210,25 @@ def import_workflow(file: str) -> Workflow:
202
210
  --------
203
211
  >>> obj = import_workflow("my-workflow.yaml")
204
212
  """
205
- return import_executable_entity(file)
213
+ dict_obj: dict | list[dict] = read_yaml(file)
214
+ if isinstance(dict_obj, list):
215
+ wkf_dict = dict_obj[0]
216
+ tsk_dicts = dict_obj[1:]
217
+ else:
218
+ wkf_dict = dict_obj
219
+ tsk_dicts = []
220
+
221
+ check_context(wkf_dict.get("project"))
222
+ obj = workflow_from_dict(wkf_dict)
223
+
224
+ obj.import_tasks(tsk_dicts)
225
+
226
+ try:
227
+ obj.save()
228
+ except EntityAlreadyExistsError:
229
+ pass
230
+ finally:
231
+ return obj
206
232
 
207
233
 
208
234
  def update_workflow(entity: Workflow) -> Workflow:
@@ -267,7 +293,7 @@ def delete_workflow(
267
293
  >>> project="my-project",
268
294
  >>> delete_all_versions=True)
269
295
  """
270
- return delete_entity(
296
+ return delete_entity_api_ctx(
271
297
  identifier=identifier,
272
298
  entity_type=ENTITY_TYPE,
273
299
  project=project,
@@ -2,16 +2,16 @@ from __future__ import annotations
2
2
 
3
3
  import typing
4
4
 
5
- from digitalhub.entities._base.executable.entity import ExecutableEntity
6
- from digitalhub.entities.utils.entity_types import EntityTypes
7
- from digitalhub.factory.api import get_run_kind, get_task_kind_from_action
5
+ from digitalhub.entities._base.entity.executable import ExecutableEntity
6
+ from digitalhub.entities.entity_types import EntityTypes
7
+ from digitalhub.runtimes.builder import get_kind_registry
8
8
  from digitalhub.utils.exceptions import BackendError
9
9
 
10
10
  if typing.TYPE_CHECKING:
11
- from digitalhub.entities._base.entity.metadata import Metadata
12
- from digitalhub.entities.run._base.entity import Run
13
- from digitalhub.entities.workflow._base.spec import WorkflowSpec
14
- from digitalhub.entities.workflow._base.status import WorkflowStatus
11
+ from digitalhub.entities._base.metadata import Metadata
12
+ from digitalhub.entities.run.entity import Run
13
+ from digitalhub.entities.workflow.spec import WorkflowSpec
14
+ from digitalhub.entities.workflow.status import WorkflowStatus
15
15
 
16
16
 
17
17
  class Workflow(ExecutableEntity):
@@ -60,9 +60,12 @@ class Workflow(ExecutableEntity):
60
60
  if action is None:
61
61
  action = "pipeline"
62
62
 
63
+ # Get kind registry
64
+ kind_reg = get_kind_registry(self.kind)
65
+
63
66
  # Get task and run kind
64
- task_kind = get_task_kind_from_action(self.kind, action)
65
- run_kind = get_run_kind(self.kind)
67
+ task_kind = kind_reg.get_task_kind_from_action(action=action)
68
+ run_kind = kind_reg.get_run_kind()
66
69
 
67
70
  # Create or update new task
68
71
  task = self._get_or_create_task(task_kind)
@@ -0,0 +1,15 @@
1
+ from __future__ import annotations
2
+
3
+ from digitalhub.entities._base.spec.base import Spec, SpecParams
4
+
5
+
6
+ class WorkflowSpec(Spec):
7
+ """
8
+ Workflow specifications.
9
+ """
10
+
11
+
12
+ class WorkflowParams(SpecParams):
13
+ """
14
+ Workflow parameters.
15
+ """
@@ -0,0 +1,9 @@
1
+ from __future__ import annotations
2
+
3
+ from digitalhub.entities._base.status.base import Status
4
+
5
+
6
+ class WorkflowStatus(Status):
7
+ """
8
+ Status class for workflow entities.
9
+ """
@@ -0,0 +1,54 @@
1
+ from __future__ import annotations
2
+
3
+ import typing
4
+ from typing import Any
5
+
6
+ from digitalhub.readers.registry import REGISTRY_DATAFRAME, REGISTRY_FRAMEWORK
7
+
8
+ if typing.TYPE_CHECKING:
9
+ from digitalhub.readers.objects.base import DataframeReader
10
+
11
+
12
+ def get_reader_by_engine(engine: str) -> DataframeReader:
13
+ """
14
+ Get Dataframe reader.
15
+
16
+ Parameters
17
+ ----------
18
+ engine : str
19
+ Dataframe engine (pandas, polars, etc.).
20
+
21
+ Returns
22
+ -------
23
+ DataframeReader
24
+ Reader object.
25
+ """
26
+ try:
27
+ return REGISTRY_FRAMEWORK[engine]()
28
+ except KeyError:
29
+ engines = list(REGISTRY_FRAMEWORK.keys())
30
+ msg = f"Unsupported dataframe engine: {engine}. Supported engines: {engines}"
31
+ raise ValueError(msg)
32
+
33
+
34
+ def get_reader_by_object(obj: Any) -> DataframeReader:
35
+ """
36
+ Get Dataframe reader by object.
37
+
38
+ Parameters
39
+ ----------
40
+ obj : Any
41
+ Object to get reader from.
42
+
43
+ Returns
44
+ -------
45
+ DataframeReader
46
+ Reader object.
47
+ """
48
+ try:
49
+ obj_name = f"{obj.__class__.__module__}.{obj.__class__.__name__}"
50
+ return REGISTRY_DATAFRAME[obj_name]()
51
+ except KeyError:
52
+ types = list(REGISTRY_DATAFRAME.keys())
53
+ msg = f"Unsupported dataframe type: {obj}. Supported types: {types}"
54
+ raise ValueError(msg)
@@ -7,7 +7,7 @@ import numpy as np
7
7
  import pandas as pd
8
8
  from pandas.errors import ParserError
9
9
 
10
- from digitalhub.readers._base.reader import DataframeReader
10
+ from digitalhub.readers.objects.base import DataframeReader
11
11
  from digitalhub.utils.data_utils import build_data_preview, get_data_preview
12
12
 
13
13
 
@@ -0,0 +1,15 @@
1
+ from __future__ import annotations
2
+
3
+ REGISTRY_FRAMEWORK = {}
4
+ REGISTRY_DATAFRAME = {}
5
+ DATAFRAME_TYPES = []
6
+
7
+ try:
8
+ from digitalhub.readers.objects.pandas import DataframeReaderPandas
9
+
10
+ REGISTRY_FRAMEWORK["pandas"] = DataframeReaderPandas
11
+ REGISTRY_DATAFRAME["pandas.core.frame.DataFrame"] = DataframeReaderPandas
12
+ DATAFRAME_TYPES.append("pandas.core.frame.DataFrame")
13
+
14
+ except ImportError:
15
+ pass
@@ -0,0 +1,87 @@
1
+ from __future__ import annotations
2
+
3
+ from pydantic import BaseModel
4
+
5
+
6
+ class RuntimeEntry(BaseModel):
7
+ """
8
+ Model for Runtime entry.
9
+ It specifies the module path and the runtime class name.
10
+ """
11
+
12
+ module: str
13
+ """Module path."""
14
+
15
+ class_name: str
16
+ """Class name."""
17
+
18
+ kind_registry_module: str
19
+ """Kind registry module path."""
20
+
21
+ kind_registry_class_name: str
22
+ """Kind registry class name."""
23
+
24
+
25
+ class SpecEntry(BaseModel):
26
+ """
27
+ Model for Spec entry.
28
+ It specifies the module path, the spec class name
29
+ and the spec pydantic class validator.
30
+ """
31
+
32
+ module: str
33
+ """Module path."""
34
+
35
+ class_name: str
36
+ """Class name."""
37
+
38
+ parameters_validator: str
39
+ """Class name of the parameter validator."""
40
+
41
+
42
+ class StatusEntry(BaseModel):
43
+ """
44
+ Model for Status entry.
45
+ It specifies the module path and the status class name.
46
+ """
47
+
48
+ module: str
49
+ """Module path."""
50
+
51
+ class_name: str
52
+ """Class name."""
53
+
54
+
55
+ class MetadataEntry(BaseModel):
56
+ """
57
+ Model for Metadata entry.
58
+ It specifies the module path and the metadata class name.
59
+ """
60
+
61
+ module: str
62
+ """Module path."""
63
+
64
+ class_name: str
65
+ """Class name."""
66
+
67
+
68
+ class RegistryEntry(BaseModel):
69
+ """
70
+ Basic entry model for every entity.
71
+ Functions, tasks and runs specify also the runtime field.
72
+ """
73
+
74
+ entity_type: str
75
+ """Entity type."""
76
+
77
+ spec: SpecEntry
78
+ """Spec infos."""
79
+
80
+ status: StatusEntry
81
+ """Status infos."""
82
+
83
+ metadata: MetadataEntry
84
+ """Metadata infos."""
85
+
86
+ runtime: RuntimeEntry = None
87
+ """Runtime infos."""
@@ -0,0 +1,74 @@
1
+ from __future__ import annotations
2
+
3
+ from digitalhub.registry.models import RegistryEntry
4
+
5
+
6
+ class GlobalEntityRegistry:
7
+ """
8
+ Global entity registry where all entities classpaths are stored.
9
+ It keeps track of all entities that are registered in the system.
10
+ """
11
+
12
+ def register(self, entity_kind: str, entry: dict) -> None:
13
+ """
14
+ Register an entity kind.
15
+
16
+ Parameters
17
+ ----------
18
+ entity_kind : str
19
+ Entity kind to be registered.
20
+ entry : dict
21
+ Entry to be registered.
22
+
23
+ Returns
24
+ -------
25
+ None
26
+
27
+ """
28
+ if hasattr(self, entity_kind):
29
+ raise ValueError(f"Entity kind {entity_kind} already registered")
30
+ entry = RegistryEntry(**entry)
31
+ setattr(self, entity_kind, entry)
32
+
33
+ def update(self, entity_kind: str, entry: dict) -> None:
34
+ """
35
+ Update an entity kind.
36
+
37
+ Parameters
38
+ ----------
39
+ entity_kind : str
40
+ Entity kind to be updated.
41
+ entry : dict
42
+ Entry to be updated.
43
+
44
+ Returns
45
+ -------
46
+ None
47
+ """
48
+ if hasattr(self, entity_kind):
49
+ entry = RegistryEntry(**entry)
50
+ setattr(self, entity_kind, entry)
51
+ else:
52
+ raise ValueError(f"Entity kind {entity_kind} not registered")
53
+
54
+ def get_entity_type(self, entity_kind: str) -> str:
55
+ """
56
+ Get entity type from kind.
57
+
58
+ Parameters
59
+ ----------
60
+ entity_kind : str
61
+ Entity kind.
62
+
63
+ Returns
64
+ -------
65
+ str
66
+ Entity type.
67
+ """
68
+ if not hasattr(self, entity_kind):
69
+ raise ValueError(f"Entity kind {entity_kind} not registered")
70
+ entry: RegistryEntry = getattr(self, entity_kind)
71
+ return entry.entity_type
72
+
73
+
74
+ registry = GlobalEntityRegistry()