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,82 @@
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.project.entity import Project
8
+
9
+
10
+ def project_from_parameters(
11
+ name: str,
12
+ kind: str,
13
+ description: str | None = None,
14
+ labels: list[str] | None = None,
15
+ local: bool = False,
16
+ context: str | None = None,
17
+ **kwargs,
18
+ ) -> Project:
19
+ """
20
+ Create a new object.
21
+
22
+ Parameters
23
+ ----------
24
+ name : str
25
+ Object name.
26
+ kind : str
27
+ Kind the object.
28
+ description : str
29
+ Description of the object (human readable).
30
+ labels : list[str]
31
+ List of labels.
32
+ local : bool
33
+ If True, use local backend, if False use DHCore backend. Default to False.
34
+ context : str
35
+ The context local folder of the project.
36
+ **kwargs : dict
37
+ Spec keyword arguments.
38
+
39
+ Returns
40
+ -------
41
+ Project
42
+ Object instance.
43
+ """
44
+ name = build_name(name)
45
+ spec = build_spec(
46
+ kind,
47
+ context=context,
48
+ **kwargs,
49
+ )
50
+ metadata = build_metadata(
51
+ kind,
52
+ project=name,
53
+ name=name,
54
+ description=description,
55
+ labels=labels,
56
+ )
57
+ status = build_status(kind)
58
+ return Project(
59
+ name=name,
60
+ kind=kind,
61
+ metadata=metadata,
62
+ spec=spec,
63
+ status=status,
64
+ local=local,
65
+ )
66
+
67
+
68
+ def project_from_dict(obj: dict) -> Project:
69
+ """
70
+ Create a new object from dictionary.
71
+
72
+ Parameters
73
+ ----------
74
+ obj : dict
75
+ Dictionary to create object from.
76
+
77
+ Returns
78
+ -------
79
+ Project
80
+ Object instance.
81
+ """
82
+ return Project.from_dict(obj)
@@ -4,16 +4,16 @@ import importlib.util as imputil
4
4
  import typing
5
5
  from pathlib import Path
6
6
 
7
- from digitalhub.client.api import build_client, get_client
8
- from digitalhub.context.api import delete_context
9
- from digitalhub.entities._base.api_utils import delete_entity_api_base, read_entity_api_base, update_entity_api_base
10
- from digitalhub.entities.utils.entity_types import EntityTypes
11
- from digitalhub.factory.api import build_entity_from_dict, build_entity_from_params
12
- from digitalhub.utils.exceptions import BackendError, EntityAlreadyExistsError, EntityError
7
+ from digitalhub.client.builder import build_client, get_client
8
+ from digitalhub.context.builder import delete_context
9
+ from digitalhub.entities._base.crud import delete_entity_api_base, read_entity_api_base, update_entity_api_base
10
+ from digitalhub.entities.entity_types import EntityTypes
11
+ from digitalhub.entities.project.builder import project_from_dict, project_from_parameters
12
+ from digitalhub.utils.exceptions import BackendError, EntityError
13
13
  from digitalhub.utils.io_utils import read_yaml
14
14
 
15
15
  if typing.TYPE_CHECKING:
16
- from digitalhub.entities.project._base.entity import Project
16
+ from digitalhub.entities.project.entity import Project
17
17
 
18
18
 
19
19
  ENTITY_TYPE = EntityTypes.PROJECT.value
@@ -63,7 +63,7 @@ def new_project(
63
63
  build_client(local, config)
64
64
  if context is None:
65
65
  context = name
66
- obj = build_entity_from_params(
66
+ obj = project_from_parameters(
67
67
  name=name,
68
68
  kind="project",
69
69
  description=description,
@@ -112,7 +112,7 @@ def get_project(
112
112
  client = get_client(local)
113
113
  obj = read_entity_api_base(client, ENTITY_TYPE, name, **kwargs)
114
114
  obj["local"] = local
115
- project = build_entity_from_dict(obj)
115
+ project = project_from_dict(obj)
116
116
  return _setup_project(project, setup_kwargs)
117
117
 
118
118
 
@@ -148,18 +148,11 @@ def import_project(
148
148
  build_client(local, config)
149
149
  dict_obj: dict = read_yaml(file)
150
150
  dict_obj["local"] = local
151
- obj = build_entity_from_dict(dict_obj)
151
+ obj = project_from_dict(dict_obj)
152
152
  obj = _setup_project(obj, setup_kwargs)
153
153
 
154
- try:
155
- obj.save()
156
- except EntityAlreadyExistsError:
157
- pass
158
-
159
154
  # Import related entities
160
- obj._import_entities(dict_obj)
161
-
162
- obj.refresh()
155
+ obj._import_entities()
163
156
 
164
157
  return obj
165
158
 
@@ -285,7 +278,7 @@ def update_project(entity: Project, local: bool = False, **kwargs) -> Project:
285
278
  """
286
279
  client = get_client(local)
287
280
  obj = update_entity_api_base(client, ENTITY_TYPE, entity.name, entity.to_dict(), **kwargs)
288
- return build_entity_from_dict(obj)
281
+ return project_from_dict(obj)
289
282
 
290
283
 
291
284
  def delete_project(
@@ -4,17 +4,21 @@ import typing
4
4
  from pathlib import Path
5
5
  from typing import Any
6
6
 
7
- from digitalhub.client.api import get_client
8
- from digitalhub.context.api import set_context
9
- from digitalhub.entities._base.api_utils import (
7
+ from digitalhub.client.builder import get_client
8
+ from digitalhub.context.builder import set_context
9
+ from digitalhub.entities._base.crud import (
10
10
  create_entity_api_base,
11
11
  read_entity_api_base,
12
12
  read_entity_api_ctx,
13
13
  update_entity_api_base,
14
14
  )
15
- from digitalhub.entities._base.crud import import_context_entity, import_executable_entity
16
- from digitalhub.entities._base.entity.entity import Entity
15
+ from digitalhub.entities._base.entity.base import Entity
16
+ from digitalhub.entities._builders.metadata import build_metadata
17
+ from digitalhub.entities._builders.name import build_name
18
+ from digitalhub.entities._builders.spec import build_spec
19
+ from digitalhub.entities._builders.status import build_status
17
20
  from digitalhub.entities.artifact.crud import (
21
+ artifact_from_dict,
18
22
  delete_artifact,
19
23
  get_artifact,
20
24
  get_artifact_versions,
@@ -25,6 +29,7 @@ from digitalhub.entities.artifact.crud import (
25
29
  update_artifact,
26
30
  )
27
31
  from digitalhub.entities.dataitem.crud import (
32
+ dataitem_from_dict,
28
33
  delete_dataitem,
29
34
  get_dataitem,
30
35
  get_dataitem_versions,
@@ -34,8 +39,10 @@ from digitalhub.entities.dataitem.crud import (
34
39
  new_dataitem,
35
40
  update_dataitem,
36
41
  )
42
+ from digitalhub.entities.entity_types import EntityTypes
37
43
  from digitalhub.entities.function.crud import (
38
44
  delete_function,
45
+ function_from_dict,
39
46
  get_function,
40
47
  get_function_versions,
41
48
  import_function,
@@ -50,6 +57,7 @@ from digitalhub.entities.model.crud import (
50
57
  import_model,
51
58
  list_models,
52
59
  log_model,
60
+ model_from_dict,
53
61
  new_model,
54
62
  update_model,
55
63
  )
@@ -63,7 +71,6 @@ from digitalhub.entities.secret.crud import (
63
71
  new_secret,
64
72
  update_secret,
65
73
  )
66
- from digitalhub.entities.utils.entity_types import EntityTypes
67
74
  from digitalhub.entities.workflow.crud import (
68
75
  delete_workflow,
69
76
  get_workflow,
@@ -72,24 +79,49 @@ from digitalhub.entities.workflow.crud import (
72
79
  list_workflows,
73
80
  new_workflow,
74
81
  update_workflow,
82
+ workflow_from_dict,
75
83
  )
76
- from digitalhub.factory.api import build_entity_from_dict
77
84
  from digitalhub.utils.exceptions import BackendError, EntityAlreadyExistsError, EntityError
78
85
  from digitalhub.utils.generic_utils import get_timestamp
79
86
  from digitalhub.utils.io_utils import write_yaml
80
87
  from digitalhub.utils.uri_utils import map_uri_scheme
81
88
 
82
89
  if typing.TYPE_CHECKING:
83
- from digitalhub.entities._base.entity.metadata import Metadata
84
- from digitalhub.entities.artifact._base.entity import Artifact
85
- from digitalhub.entities.dataitem._base.entity import Dataitem
86
- from digitalhub.entities.function._base.entity import Function
87
- from digitalhub.entities.model._base.entity import Model
88
- from digitalhub.entities.project._base.spec import ProjectSpec
89
- from digitalhub.entities.project._base.status import ProjectStatus
90
- from digitalhub.entities.run._base.entity import Run
91
- from digitalhub.entities.secret._base.entity import Secret
92
- from digitalhub.entities.workflow._base.entity import Workflow
90
+ from digitalhub.entities._base.metadata import Metadata
91
+ from digitalhub.entities.artifact.entity._base import Artifact
92
+ from digitalhub.entities.dataitem.entity._base import Dataitem
93
+ from digitalhub.entities.function.entity import Function
94
+ from digitalhub.entities.model.entity._base import Model
95
+ from digitalhub.entities.project.spec import ProjectSpec
96
+ from digitalhub.entities.project.status import ProjectStatus
97
+ from digitalhub.entities.run.entity import Run
98
+ from digitalhub.entities.secret.entity import Secret
99
+ from digitalhub.entities.workflow.entity import Workflow
100
+
101
+
102
+ ARTIFACTS = EntityTypes.ARTIFACT.value + "s"
103
+ FUNCTIONS = EntityTypes.FUNCTION.value + "s"
104
+ WORKFLOWS = EntityTypes.WORKFLOW.value + "s"
105
+ DATAITEMS = EntityTypes.DATAITEM.value + "s"
106
+ MODELS = EntityTypes.MODEL.value + "s"
107
+
108
+ CTX_ENTITIES = [ARTIFACTS, FUNCTIONS, WORKFLOWS, DATAITEMS, MODELS]
109
+
110
+ FROM_DICT_MAP = {
111
+ ARTIFACTS: artifact_from_dict,
112
+ FUNCTIONS: function_from_dict,
113
+ WORKFLOWS: workflow_from_dict,
114
+ DATAITEMS: dataitem_from_dict,
115
+ MODELS: model_from_dict,
116
+ }
117
+
118
+ IMPORT_MAP = {
119
+ ARTIFACTS: import_artifact,
120
+ FUNCTIONS: import_function,
121
+ WORKFLOWS: import_workflow,
122
+ DATAITEMS: import_dataitem,
123
+ MODELS: import_model,
124
+ }
93
125
 
94
126
 
95
127
  class Project(Entity):
@@ -192,7 +224,6 @@ class Project(Entity):
192
224
  filename = f"{self.kind}_{self.name}.yml"
193
225
  pth = Path(self.spec.context) / filename
194
226
  pth.parent.mkdir(parents=True, exist_ok=True)
195
-
196
227
  obj = self._export_not_embedded(obj)
197
228
  write_yaml(pth, obj)
198
229
  return str(pth)
@@ -226,16 +257,16 @@ class Project(Entity):
226
257
  Updatated project object in dictionary format with referenced entities.
227
258
  """
228
259
  # Cycle over entity types
229
- for entity_type in self._get_entity_types():
260
+ for entity_type in CTX_ENTITIES:
230
261
  # Entity types are stored as a list of entities
231
262
  for idx, entity in enumerate(obj.get("spec", {}).get(entity_type, [])):
232
263
  # Export entity if not embedded is in metadata, else do nothing
233
- if not self._is_embedded(entity):
264
+ if not entity["metadata"]["embedded"]:
234
265
  # Get entity object from backend
235
266
  obj_dict: dict = read_entity_api_ctx(entity["key"])
236
267
 
237
268
  # Create from dict (not need to new method, we do not save to backend)
238
- ent = build_entity_from_dict(obj_dict)
269
+ ent = FROM_DICT_MAP[entity_type](obj_dict)
239
270
 
240
271
  # Export and stor ref in object metadata inside project
241
272
  pth = ent.export()
@@ -244,121 +275,76 @@ class Project(Entity):
244
275
  # Return updated object
245
276
  return obj
246
277
 
247
- def _import_entities(self, obj: dict) -> None:
278
+ def _import_entities(self) -> None:
248
279
  """
249
280
  Import project entities.
250
281
 
251
- Parameters
252
- ----------
253
- obj : dict
254
- Project object in dictionary format.
255
-
256
282
  Returns
257
283
  -------
258
284
  None
259
285
  """
260
- entity_types = self._get_entity_types()
261
-
262
286
  # Cycle over entity types
263
- for entity_type in entity_types:
287
+ for entity_type in CTX_ENTITIES:
264
288
  # Entity types are stored as a list of entities
265
- for entity in obj.get("spec", {}).get(entity_type, []):
266
- embedded = self._is_embedded(entity)
267
- ref = entity["metadata"].get("ref")
289
+ for entity in getattr(self.spec, entity_type, []):
290
+ entity_metadata = entity["metadata"]
291
+ embedded = entity_metadata.get("embedded", False)
292
+ ref = entity_metadata.get("ref", None)
268
293
 
269
- # Import entity if not embedded and there is a ref
294
+ # Import entity if not embedded
270
295
  if not embedded and ref is not None:
271
296
  # Import entity from local ref
272
297
  if map_uri_scheme(ref) == "local":
273
298
  try:
274
- # Artifacts, Dataitems and Models
275
- if entity_type in entity_types[:3]:
276
- import_context_entity(ref)
277
-
278
- # Functions and Workflows
279
- elif entity_type in entity_types[3:]:
280
- import_executable_entity(ref)
281
-
299
+ IMPORT_MAP[entity_type](ref)
282
300
  except FileNotFoundError:
283
301
  msg = f"File not found: {ref}."
284
302
  raise EntityError(msg)
285
303
 
286
304
  # If entity is embedded, create it and try to save
287
305
  elif embedded:
288
- # It's possible that embedded field in metadata is not shown
289
- if entity["metadata"].get("embedded") is None:
290
- entity["metadata"]["embedded"] = True
291
-
292
306
  try:
293
- build_entity_from_dict(entity).save()
307
+ FROM_DICT_MAP[entity_type](entity).save()
294
308
  except EntityAlreadyExistsError:
295
309
  pass
296
310
 
297
- def _is_embedded(self, entity: dict) -> bool:
298
- """
299
- Check if entity is embedded.
300
-
301
- Parameters
302
- ----------
303
- entity : dict
304
- Entity in dictionary format.
305
-
306
- Returns
307
- -------
308
- bool
309
- True if entity is embedded.
310
- """
311
- metadata_embedded = entity["metadata"].get("embedded", False)
312
- no_status = entity.get("status", None) is None
313
- no_spec = entity.get("spec", None) is None
314
- return metadata_embedded or not (no_status and no_spec)
315
-
316
- def _get_entity_types(self) -> list[str]:
317
- """
318
- Get entity types.
319
-
320
- Returns
321
- -------
322
- list
323
- Entity types.
324
- """
325
- return [
326
- f"{EntityTypes.ARTIFACT.value}s",
327
- f"{EntityTypes.DATAITEM.value}s",
328
- f"{EntityTypes.MODEL.value}s",
329
- f"{EntityTypes.FUNCTION.value}s",
330
- f"{EntityTypes.WORKFLOW.value}s",
331
- ]
311
+ ##############################
312
+ # Static interface methods
313
+ ##############################
332
314
 
333
- def run(self, workflow: str | None = None, **kwargs) -> Run:
315
+ @staticmethod
316
+ def _parse_dict(obj: dict, validate: bool = True) -> dict:
334
317
  """
335
- Run workflow project.
318
+ Get dictionary and parse it to a valid entity dictionary.
336
319
 
337
320
  Parameters
338
321
  ----------
339
- workflow : str
340
- Workflow name.
341
- **kwargs : dict
342
- Keyword arguments passed to workflow.run().
322
+ entity : str
323
+ Entity type.
324
+ obj : dict
325
+ Dictionary to parse.
343
326
 
344
327
  Returns
345
328
  -------
346
- Run
347
- Run instance.
348
- """
349
- self.refresh()
350
-
351
- workflow = workflow if workflow is not None else "main"
352
-
353
- for i in self.spec.workflows:
354
- if workflow in [i["name"], i["key"]]:
355
- entity = self.get_workflow(i["key"])
356
- break
357
- else:
358
- msg = f"Workflow {workflow} not found."
359
- raise EntityError(msg)
360
-
361
- return entity.run(**kwargs)
329
+ dict
330
+ A dictionary containing the attributes of the entity instance.
331
+ """
332
+ name = build_name(obj.get("name"))
333
+ kind = obj.get("kind")
334
+ metadata = build_metadata(kind, **obj.get("metadata", {}))
335
+ spec = build_spec(kind, validate=validate, **obj.get("spec", {}))
336
+ status = build_status(kind, **obj.get("status", {}))
337
+ user = obj.get("user")
338
+ local = obj.get("local", False)
339
+ return {
340
+ "name": name,
341
+ "kind": kind,
342
+ "metadata": metadata,
343
+ "spec": spec,
344
+ "status": status,
345
+ "user": user,
346
+ "local": local,
347
+ }
362
348
 
363
349
  ##############################
364
350
  # Artifacts
@@ -371,7 +357,7 @@ class Project(Entity):
371
357
  uuid: str | None = None,
372
358
  description: str | None = None,
373
359
  labels: list[str] | None = None,
374
- embedded: bool = False,
360
+ embedded: bool = True,
375
361
  path: str | None = None,
376
362
  **kwargs,
377
363
  ) -> Artifact:
@@ -385,7 +371,7 @@ class Project(Entity):
385
371
  kind : str
386
372
  Kind the object.
387
373
  uuid : str
388
- ID of the object.
374
+ ID of the object (UUID4, e.g. 40f25c4b-d26b-4221-b048-9527aff291e2).
389
375
  description : str
390
376
  Description of the object (human readable).
391
377
  labels : list[str]
@@ -662,7 +648,7 @@ class Project(Entity):
662
648
  uuid: str | None = None,
663
649
  description: str | None = None,
664
650
  labels: list[str] | None = None,
665
- embedded: bool = False,
651
+ embedded: bool = True,
666
652
  path: str | None = None,
667
653
  **kwargs,
668
654
  ) -> Dataitem:
@@ -676,7 +662,7 @@ class Project(Entity):
676
662
  kind : str
677
663
  Kind the object.
678
664
  uuid : str
679
- ID of the object.
665
+ ID of the object (UUID4, e.g. 40f25c4b-d26b-4221-b048-9527aff291e2).
680
666
  description : str
681
667
  Description of the object (human readable).
682
668
  labels : list[str]
@@ -966,7 +952,7 @@ class Project(Entity):
966
952
  uuid: str | None = None,
967
953
  description: str | None = None,
968
954
  labels: list[str] | None = None,
969
- embedded: bool = False,
955
+ embedded: bool = True,
970
956
  path: str | None = None,
971
957
  **kwargs,
972
958
  ) -> Model:
@@ -980,7 +966,7 @@ class Project(Entity):
980
966
  kind : str
981
967
  Kind the object.
982
968
  uuid : str
983
- ID of the object.
969
+ ID of the object (UUID4, e.g. 40f25c4b-d26b-4221-b048-9527aff291e2).
984
970
  description : str
985
971
  Description of the object (human readable).
986
972
  labels : list[str]
@@ -1258,7 +1244,7 @@ class Project(Entity):
1258
1244
  uuid: str | None = None,
1259
1245
  description: str | None = None,
1260
1246
  labels: list[str] | None = None,
1261
- embedded: bool = False,
1247
+ embedded: bool = True,
1262
1248
  **kwargs,
1263
1249
  ) -> Function:
1264
1250
  """
@@ -1271,7 +1257,7 @@ class Project(Entity):
1271
1257
  kind : str
1272
1258
  Kind the object.
1273
1259
  uuid : str
1274
- ID of the object.
1260
+ ID of the object (UUID4, e.g. 40f25c4b-d26b-4221-b048-9527aff291e2).
1275
1261
  description : str
1276
1262
  Description of the object (human readable).
1277
1263
  labels : list[str]
@@ -1504,7 +1490,7 @@ class Project(Entity):
1504
1490
  uuid: str | None = None,
1505
1491
  description: str | None = None,
1506
1492
  labels: list[str] | None = None,
1507
- embedded: bool = False,
1493
+ embedded: bool = True,
1508
1494
  **kwargs,
1509
1495
  ) -> Workflow:
1510
1496
  """
@@ -1517,7 +1503,7 @@ class Project(Entity):
1517
1503
  kind : str
1518
1504
  Kind the object.
1519
1505
  uuid : str
1520
- ID of the object.
1506
+ ID of the object (UUID4, e.g. 40f25c4b-d26b-4221-b048-9527aff291e2).
1521
1507
  description : str
1522
1508
  Description of the object (human readable).
1523
1509
  labels : list[str]
@@ -1749,7 +1735,7 @@ class Project(Entity):
1749
1735
  uuid: str | None = None,
1750
1736
  description: str | None = None,
1751
1737
  labels: list[str] | None = None,
1752
- embedded: bool = False,
1738
+ embedded: bool = True,
1753
1739
  secret_value: str | None = None,
1754
1740
  **kwargs,
1755
1741
  ) -> Secret:
@@ -1761,7 +1747,7 @@ class Project(Entity):
1761
1747
  name : str
1762
1748
  Object name.
1763
1749
  uuid : str
1764
- ID of the object.
1750
+ ID of the object (UUID4, e.g. 40f25c4b-d26b-4221-b048-9527aff291e2).
1765
1751
  description : str
1766
1752
  Description of the object (human readable).
1767
1753
  labels : list[str]
@@ -2072,7 +2058,3 @@ class Project(Entity):
2072
2058
  **kwargs,
2073
2059
  )
2074
2060
  self.refresh()
2075
-
2076
- ##############################
2077
- # Project methods
2078
- ##############################
@@ -1,11 +1,11 @@
1
1
  from __future__ import annotations
2
2
 
3
- from digitalhub.entities._base.entity.spec import Spec, SpecValidator
3
+ from digitalhub.entities._base.spec.base import Spec, SpecParams
4
4
 
5
5
 
6
6
  class ProjectSpec(Spec):
7
7
  """
8
- ProjectSpec specifications.
8
+ Project specification.
9
9
  """
10
10
 
11
11
  def __init__(
@@ -26,9 +26,9 @@ class ProjectSpec(Spec):
26
26
  self.models = models if models is not None else []
27
27
 
28
28
 
29
- class ProjectValidator(SpecValidator):
29
+ class ProjectParams(SpecParams):
30
30
  """
31
- ProjectValidator validator.
31
+ Parameters model for project.
32
32
  """
33
33
 
34
34
  context: str = None
@@ -0,0 +1,9 @@
1
+ from __future__ import annotations
2
+
3
+ from digitalhub.entities._base.status.base import Status
4
+
5
+
6
+ class ProjectStatus(Status):
7
+ """
8
+ Status class for project entities.
9
+ """
@@ -0,0 +1,48 @@
1
+ from __future__ import annotations
2
+
3
+ from digitalhub.entities.entity_types import EntityTypes
4
+ from digitalhub.registry.registry import registry
5
+ from digitalhub.registry.utils import create_info
6
+
7
+ # Root module
8
+ root = "digitalhub.entities"
9
+
10
+ # Projects
11
+ entity_type = EntityTypes.PROJECT.value
12
+ prefix = entity_type.capitalize()
13
+ project_info = create_info(root, entity_type, prefix)
14
+ registry.register("project", project_info)
15
+
16
+
17
+ # Secrets
18
+ entity_type = EntityTypes.SECRET.value
19
+ prefix = entity_type.capitalize()
20
+ secret_info = create_info(root, entity_type, prefix)
21
+ registry.register("secret", secret_info)
22
+
23
+
24
+ # Artifacts
25
+ entity_type = EntityTypes.ARTIFACT.value
26
+ for i in ["artifact"]:
27
+ prefix = entity_type.capitalize()
28
+ suffix = i.capitalize()
29
+ artifact_info = create_info(root, entity_type, prefix, suffix)
30
+ registry.register(i, artifact_info)
31
+
32
+
33
+ # Dataitems
34
+ entity_type = EntityTypes.DATAITEM.value
35
+ for i in ["dataitem", "table"]:
36
+ prefix = entity_type.capitalize()
37
+ suffix = i.capitalize()
38
+ dataitem_info = create_info(root, entity_type, prefix, suffix)
39
+ registry.register(i, dataitem_info)
40
+
41
+
42
+ # Models
43
+ entity_type = EntityTypes.MODEL.value
44
+ for i in ["model", "mlflow", "sklearn", "huggingface"]:
45
+ prefix = entity_type.capitalize()
46
+ suffix = i.capitalize()
47
+ model_info = create_info(root, entity_type, prefix, suffix)
48
+ registry.register(i, model_info)