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
@@ -3,20 +3,19 @@ from __future__ import annotations
3
3
  import typing
4
4
  from abc import ABCMeta, abstractmethod
5
5
 
6
- from digitalhub.entities._base._base.entity import Base
7
- from digitalhub.factory.api import build_entity_from_dict
6
+ from digitalhub.entities._base.base import ModelObj
8
7
 
9
8
  if typing.TYPE_CHECKING:
10
- from digitalhub.entities._base.entity.metadata import Metadata
11
- from digitalhub.entities._base.entity.spec import Spec
12
- from digitalhub.entities._base.entity.status import Status
9
+ from digitalhub.entities._base.metadata import Metadata
10
+ from digitalhub.entities._base.spec.base import Spec
11
+ from digitalhub.entities._base.status.base import Status
13
12
 
14
13
 
15
- class Entity(Base, metaclass=ABCMeta):
14
+ class Entity(ModelObj, metaclass=ABCMeta):
16
15
  """
17
16
  Abstract class for entities.
18
17
 
19
- An entity is a collection of metadata, specifications.and status
18
+ An entity is a collection of metadata, specification and status
20
19
  representing a variety of objects handled by Digitalhub.
21
20
  """
22
21
 
@@ -69,7 +68,7 @@ class Entity(Base, metaclass=ABCMeta):
69
68
  -------
70
69
  None
71
70
  """
72
- new_obj = build_entity_from_dict(obj)
71
+ new_obj = self.from_dict(obj)
73
72
  self.metadata = new_obj.metadata
74
73
  self.spec = new_obj.spec
75
74
  self.status = new_obj.status
@@ -94,6 +93,33 @@ class Entity(Base, metaclass=ABCMeta):
94
93
  """
95
94
  return {k: v for k, v in super().to_dict().items() if k in self._obj_attr}
96
95
 
96
+ @classmethod
97
+ def from_dict(cls, obj: dict, validate: bool = True) -> Entity:
98
+ """
99
+ Create a new object from dictionary.
100
+
101
+ Parameters
102
+ ----------
103
+ obj : dict
104
+ Dictionary to create object from.
105
+ validate : bool
106
+ Flag to indicate if arguments validation against a pydantic schema must be ignored.
107
+
108
+ Returns
109
+ -------
110
+ Self
111
+ Self instance.
112
+ """
113
+ parsed_dict = cls._parse_dict(obj, validate=validate)
114
+ return cls(**parsed_dict)
115
+
116
+ @staticmethod
117
+ @abstractmethod
118
+ def _parse_dict(obj: dict, validate: bool = True) -> dict:
119
+ """
120
+ Abstract method to parse dictionary.
121
+ """
122
+
97
123
  def __repr__(self) -> str:
98
124
  """
99
125
  Return string representation of the entity object.
@@ -2,16 +2,16 @@ from __future__ import annotations
2
2
 
3
3
  import typing
4
4
 
5
- from digitalhub.context.api import get_context
6
- from digitalhub.entities._base.api_utils import create_entity_api_ctx, read_entity_api_ctx, update_entity_api_ctx
7
- from digitalhub.entities._base.entity.entity import Entity
5
+ from digitalhub.context.builder import get_context
6
+ from digitalhub.entities._base.crud import create_entity_api_ctx, read_entity_api_ctx, update_entity_api_ctx
7
+ from digitalhub.entities._base.entity.base import Entity
8
8
  from digitalhub.utils.generic_utils import get_timestamp
9
9
 
10
10
  if typing.TYPE_CHECKING:
11
11
  from digitalhub.context.context import Context
12
- from digitalhub.entities._base.entity.metadata import Metadata
13
- from digitalhub.entities._base.entity.spec import Spec
14
- from digitalhub.entities._base.entity.status import Status
12
+ from digitalhub.entities._base.metadata import Metadata
13
+ from digitalhub.entities._base.spec.base import Spec
14
+ from digitalhub.entities._base.status.base import Status
15
15
 
16
16
 
17
17
  class ContextEntity(Entity):
@@ -2,20 +2,19 @@ from __future__ import annotations
2
2
 
3
3
  import typing
4
4
 
5
- from digitalhub.entities._base.api_utils import list_entity_api_ctx
6
- from digitalhub.entities._base.versioned.entity import VersionedEntity
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
7
8
  from digitalhub.entities.run.crud import delete_run, get_run, list_runs
8
- from digitalhub.entities.task.crud import delete_task
9
- from digitalhub.entities.utils.entity_types import EntityTypes
10
- from digitalhub.factory.api import build_entity_from_dict, build_entity_from_params
9
+ from digitalhub.entities.task.crud import delete_task, task_from_dict, task_from_parameters
11
10
  from digitalhub.utils.exceptions import EntityAlreadyExistsError, EntityError
12
11
 
13
12
  if typing.TYPE_CHECKING:
14
- from digitalhub.entities._base.entity.metadata import Metadata
15
- from digitalhub.entities._base.entity.spec import Spec
16
- from digitalhub.entities._base.entity.status import Status
17
- from digitalhub.entities.run._base.entity import Run
18
- from digitalhub.entities.task._base.entity import Task
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
19
18
 
20
19
 
21
20
  class ExecutableEntity(VersionedEntity):
@@ -58,7 +57,7 @@ class ExecutableEntity(VersionedEntity):
58
57
  # Tasks
59
58
  ##############################
60
59
 
61
- def _get_or_create_task(self, kind: str) -> Task:
60
+ def _get_or_create_task(self, kind: str, **kwargs) -> Task:
62
61
  """
63
62
  Get or create task.
64
63
 
@@ -73,10 +72,7 @@ class ExecutableEntity(VersionedEntity):
73
72
  Task.
74
73
  """
75
74
  if self._tasks.get(kind) is None:
76
- try:
77
- self._tasks[kind] = self.get_task(kind)
78
- except EntityError:
79
- self._tasks[kind] = self.new_task(kind)
75
+ return self.new_task(kind)
80
76
  return self._tasks[kind]
81
77
 
82
78
  def import_tasks(self, tasks: list[dict]) -> None:
@@ -102,7 +98,7 @@ class ExecutableEntity(VersionedEntity):
102
98
  # Create a new object from dictionary.
103
99
  # the form in which tasks are stored in function
104
100
  # status
105
- task_obj = build_entity_from_dict(task)
101
+ task_obj = task_from_dict(task)
106
102
 
107
103
  # Try to save it in backend to been able to use
108
104
  # it for launching runs. In fact, tasks must be
@@ -145,40 +141,12 @@ class ExecutableEntity(VersionedEntity):
145
141
  kwargs["kind"] = task_kind
146
142
 
147
143
  # Create object instance
148
- task = build_entity_from_params(**kwargs)
144
+ task = task_from_parameters(**kwargs)
149
145
  task.save()
150
146
 
151
147
  self._tasks[task_kind] = task
152
148
  return task
153
149
 
154
- def get_task(self, kind: str) -> Task:
155
- """
156
- Get task.
157
-
158
- Parameters
159
- ----------
160
- kind : str
161
- Kind the object.
162
-
163
- Returns
164
- -------
165
- Task
166
- Task.
167
-
168
- Raises
169
- ------
170
- EntityError
171
- If task is not created.
172
- """
173
- try:
174
- return self._tasks[kind]
175
- except KeyError:
176
- resp = self._get_task_from_backend(kind)
177
- if not resp:
178
- raise EntityError(f"Task {kind} is not created")
179
- self._tasks[kind] = build_entity_from_dict(resp[0])
180
- return self._tasks[kind]
181
-
182
150
  def update_task(self, kind: str, **kwargs) -> Task:
183
151
  """
184
152
  Update task.
@@ -207,47 +175,52 @@ class ExecutableEntity(VersionedEntity):
207
175
  kwargs["uuid"] = self._tasks[kind].id
208
176
 
209
177
  # Update task
210
- task = build_entity_from_params(**kwargs)
178
+ task = task_from_parameters(**kwargs)
211
179
  task.save(update=True)
212
180
  self._tasks[kind] = task
213
181
  return task
214
182
 
215
- def delete_task(self, kind: str, cascade: bool = True) -> dict:
183
+ def get_task(self, kind: str) -> Task:
216
184
  """
217
- Delete task.
185
+ Get task.
218
186
 
219
187
  Parameters
220
188
  ----------
221
189
  kind : str
222
190
  Kind the object.
223
- cascade : bool
224
- Flag to determine if cascade deletion must be performed.
225
191
 
226
192
  Returns
227
193
  -------
228
- dict
229
- Response from backend.
194
+ Task
195
+ Task.
196
+
197
+ Raises
198
+ ------
199
+ EntityError
200
+ If task is not created.
230
201
  """
231
- resp = delete_task(self._tasks[kind].key, cascade=cascade)
232
- self._tasks.pop(kind, None)
233
- return resp
202
+ self._raise_if_not_exists(kind)
203
+ return self._tasks[kind]
234
204
 
235
- def _get_task_from_backend(self, kind: str) -> list:
205
+ def delete_task(self, kind: str, cascade: bool = True) -> dict:
236
206
  """
237
- List tasks from backend filtered by function and kind.
207
+ Delete task.
238
208
 
239
209
  Parameters
240
210
  ----------
241
211
  kind : str
242
212
  Kind the object.
213
+ cascade : bool
214
+ Flag to determine if cascade deletion must be performed.
243
215
 
244
216
  Returns
245
217
  -------
246
- list
218
+ dict
247
219
  Response from backend.
248
220
  """
249
- params = {"function": self._get_executable_string(), "kind": kind}
250
- return list_entity_api_ctx(self.project, EntityTypes.TASK.value, params=params)
221
+ resp = delete_task(self._tasks[kind].key, cascade=cascade)
222
+ self._tasks.pop(kind, None)
223
+ return resp
251
224
 
252
225
  def _check_task_in_backend(self, kind: str) -> bool:
253
226
  """
@@ -263,7 +236,9 @@ class ExecutableEntity(VersionedEntity):
263
236
  bool
264
237
  Flag to determine if task exists in backend.
265
238
  """
266
- resp = self._get_task_from_backend(kind)
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)
267
242
  if not resp:
268
243
  return False
269
244
  return True
@@ -3,14 +3,14 @@ from __future__ import annotations
3
3
  import typing
4
4
  from pathlib import Path
5
5
 
6
- from digitalhub.entities._base.api_utils import files_info_get_api, files_info_put_api
7
- from digitalhub.entities._base.versioned.entity import VersionedEntity
8
- from digitalhub.stores.api import get_store
6
+ from digitalhub.entities._base.crud import files_info_get_api, files_info_put_api
7
+ from digitalhub.entities._base.entity.versioned import VersionedEntity
8
+ from digitalhub.stores.builder import get_store
9
9
 
10
10
  if typing.TYPE_CHECKING:
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
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
14
14
 
15
15
 
16
16
  class MaterialEntity(VersionedEntity):
@@ -0,0 +1,87 @@
1
+ from __future__ import annotations
2
+
3
+ import typing
4
+
5
+ from digitalhub.entities._base.entity.context import ContextEntity
6
+ from digitalhub.entities._builders.metadata import build_metadata
7
+ from digitalhub.entities._builders.spec import build_spec
8
+ from digitalhub.entities._builders.status import build_status
9
+ from digitalhub.entities._builders.uuid import build_uuid
10
+ from digitalhub.utils.io_utils import write_yaml
11
+
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
+
17
+
18
+ class UnversionedEntity(ContextEntity):
19
+ def __init__(
20
+ self,
21
+ project: str,
22
+ uuid: str,
23
+ kind: str,
24
+ metadata: Metadata,
25
+ spec: Spec,
26
+ status: Status,
27
+ user: str | None = None,
28
+ ) -> None:
29
+ super().__init__(project, kind, metadata, spec, status, user)
30
+ self.id = uuid
31
+ self.key = f"store://{project}/{self.ENTITY_TYPE}/{kind}/{uuid}"
32
+ self._obj_attr.extend(["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.id}.yml"
51
+ pth = self._context().root / filename
52
+ write_yaml(pth, obj)
53
+ return str(pth)
54
+
55
+ @staticmethod
56
+ def _parse_dict(obj: dict, validate: bool = True) -> dict:
57
+ """
58
+ Get dictionary and parse it to a valid entity dictionary.
59
+
60
+ Parameters
61
+ ----------
62
+ entity : str
63
+ Entity type.
64
+ obj : dict
65
+ Dictionary to parse.
66
+
67
+ Returns
68
+ -------
69
+ dict
70
+ A dictionary containing the attributes of the entity instance.
71
+ """
72
+ project = obj.get("project")
73
+ kind = obj.get("kind")
74
+ uuid = build_uuid(obj.get("id"))
75
+ metadata = build_metadata(kind, **obj.get("metadata", {}))
76
+ spec = build_spec(kind, validate=validate, **obj.get("spec", {}))
77
+ status = build_status(kind, **obj.get("status", {}))
78
+ user = obj.get("user")
79
+ return {
80
+ "project": project,
81
+ "uuid": uuid,
82
+ "kind": kind,
83
+ "metadata": metadata,
84
+ "spec": spec,
85
+ "status": status,
86
+ "user": user,
87
+ }
@@ -0,0 +1,94 @@
1
+ from __future__ import annotations
2
+
3
+ import typing
4
+
5
+ from digitalhub.entities._base.entity.context import ContextEntity
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.io_utils import write_yaml
12
+
13
+ if typing.TYPE_CHECKING:
14
+ from digitalhub.entities._base.metadata import Metadata
15
+ from digitalhub.entities._base.spec.base import Spec
16
+ from digitalhub.entities._base.status.base import Status
17
+
18
+
19
+ class VersionedEntity(ContextEntity):
20
+ def __init__(
21
+ self,
22
+ project: str,
23
+ name: str,
24
+ uuid: str,
25
+ kind: str,
26
+ metadata: Metadata,
27
+ spec: Spec,
28
+ status: Status,
29
+ user: str | None = None,
30
+ ) -> None:
31
+ super().__init__(project, kind, metadata, spec, status, user)
32
+ self.name = name
33
+ self.id = uuid
34
+ self.key = f"store://{project}/{self.ENTITY_TYPE}/{kind}/{name}:{uuid}"
35
+
36
+ # Add attributes to be used in the to_dict method
37
+ self._obj_attr.extend(["name", "id"])
38
+
39
+ def export(self, filename: str | None = None) -> str:
40
+ """
41
+ Export object as a YAML file.
42
+
43
+ Parameters
44
+ ----------
45
+ filename : str
46
+ Name of the export YAML file. If not specified, the default value is used.
47
+
48
+ Returns
49
+ -------
50
+ str
51
+ Exported file.
52
+ """
53
+ obj = self.to_dict()
54
+ if filename is None:
55
+ filename = f"{self.ENTITY_TYPE}-{self.name}-{self.id}.yml"
56
+ pth = self._context().root / filename
57
+ write_yaml(pth, obj)
58
+ return str(pth)
59
+
60
+ @staticmethod
61
+ def _parse_dict(obj: dict, validate: bool = True) -> dict:
62
+ """
63
+ Get dictionary and parse it to a valid entity dictionary.
64
+
65
+ Parameters
66
+ ----------
67
+ entity : str
68
+ Entity type.
69
+ obj : dict
70
+ Dictionary to parse.
71
+
72
+ Returns
73
+ -------
74
+ dict
75
+ A dictionary containing the attributes of the entity instance.
76
+ """
77
+ project = obj.get("project")
78
+ kind = obj.get("kind")
79
+ name = build_name(obj.get("name"))
80
+ uuid = build_uuid(obj.get("id"))
81
+ metadata = build_metadata(kind, **obj.get("metadata", {}))
82
+ spec = build_spec(kind, validate=validate, **obj.get("spec", {}))
83
+ status = build_status(kind, **obj.get("status", {}))
84
+ user = obj.get("user")
85
+ return {
86
+ "project": project,
87
+ "name": name,
88
+ "uuid": uuid,
89
+ "kind": kind,
90
+ "metadata": metadata,
91
+ "spec": spec,
92
+ "status": status,
93
+ "user": user,
94
+ }
@@ -1,9 +1,9 @@
1
1
  from __future__ import annotations
2
2
 
3
- from digitalhub.entities._base._base.entity import Base
3
+ from digitalhub.entities._base.base import ModelObj
4
4
 
5
5
 
6
- class Metadata(Base):
6
+ class Metadata(ModelObj):
7
7
  """
8
8
  A class representing the metadata of an entity.
9
9
  Metadata is a collection of information about an entity thought
@@ -2,46 +2,46 @@ from __future__ import annotations
2
2
 
3
3
  from pydantic import BaseModel
4
4
 
5
- from digitalhub.entities._base._base.entity import Base
5
+ from digitalhub.entities._base.base import ModelObj
6
6
 
7
7
 
8
- class Spec(Base):
8
+ class Spec(ModelObj):
9
9
  """
10
- A class representing the specifications.of an entity.
11
- specifications.is a collection of information about an entity
10
+ A class representing the specification of an entity.
11
+ Specification is a collection of information about an entity
12
12
  thought to be immutable by the user.
13
13
  """
14
14
 
15
15
  @classmethod
16
16
  def from_dict(cls, obj: dict) -> Spec:
17
17
  """
18
- Return entity specifications.object from dictionary.
18
+ Return entity specification object from dictionary.
19
19
 
20
20
  Parameters
21
21
  ----------
22
22
  obj : dict
23
- A dictionary containing the attributes of the entity specifications.
23
+ A dictionary containing the attributes of the entity specification.
24
24
 
25
25
  Returns
26
26
  -------
27
27
  EntitySpec
28
- An entity specifications.object.
28
+ An entity specification object.
29
29
  """
30
30
  return cls(**obj)
31
31
 
32
32
 
33
- class SpecValidator(BaseModel, extra="ignore"):
33
+ class SpecParams(BaseModel, extra="ignore"):
34
34
  """
35
35
  A class representing the parameters of an entity.
36
36
  This base class is used to define the parameters of an entity
37
- specifications.and is used to validate the parameters passed
37
+ specification and is used to validate the parameters passed
38
38
  to the constructor.
39
39
  """
40
40
 
41
41
 
42
42
  class MaterialSpec(Spec):
43
43
  """
44
- Material specifications.class.
44
+ Material specification class.
45
45
  """
46
46
 
47
47
  def __init__(self, path: str, **kwargs) -> None:
@@ -49,7 +49,7 @@ class MaterialSpec(Spec):
49
49
  self.path = path
50
50
 
51
51
 
52
- class MaterialValidator(SpecValidator):
52
+ class MaterialParams(SpecParams):
53
53
  """
54
54
  Material parameters class.
55
55
  """
@@ -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 MaterialSpec(Spec):
7
7
  """
8
- Material specifications.class.
8
+ Material specification 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 MaterialValidator(SpecValidator):
16
+ class MaterialParams(SpecParams):
17
17
  """
18
18
  Material parameters class.
19
19
  """
@@ -1,29 +1,18 @@
1
1
  from __future__ import annotations
2
2
 
3
- from digitalhub.entities._base._base.entity import Base
3
+ from digitalhub.entities._base.base import ModelObj
4
4
 
5
5
 
6
- class Status(Base):
6
+ class Status(ModelObj):
7
7
  """
8
8
  Base Status class.
9
9
  The status class contains information about the state of an entity,
10
10
  for example, the state of a RUNNING run, and eventual error message.
11
11
  """
12
12
 
13
- def __init__(
14
- self,
15
- state: str,
16
- message: str | None = None,
17
- transitions: list[dict] | None = None,
18
- k8s: dict | None = None,
19
- **kwargs,
20
- ) -> None:
13
+ def __init__(self, state: str, message: str | None = None) -> None:
21
14
  self.state = state
22
15
  self.message = message
23
- self.transitions = transitions
24
- self.k8s = k8s
25
-
26
- self._any_setter(**kwargs)
27
16
 
28
17
  @classmethod
29
18
  def from_dict(cls, obj: dict) -> Status:
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from digitalhub.entities._base.entity.status import Status
3
+ from digitalhub.entities._base.status.base import Status
4
4
 
5
5
 
6
6
  class MaterialStatus(Status):
@@ -0,0 +1,60 @@
1
+ from __future__ import annotations
2
+
3
+ import typing
4
+
5
+ from digitalhub.registry.registry import registry
6
+ from digitalhub.registry.utils import import_class
7
+ from digitalhub.utils.generic_utils import get_timestamp
8
+
9
+ if typing.TYPE_CHECKING:
10
+ from digitalhub.entities._base.metadata import Metadata
11
+ from digitalhub.registry.models import RegistryEntry
12
+
13
+
14
+ def build_metadata(kind: str, **kwargs) -> Metadata:
15
+ """
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.
23
+
24
+ Parameters
25
+ ----------
26
+ kind : str
27
+ Registry entry kind.
28
+ **kwargs : dict
29
+ Keyword arguments for the constructor.
30
+
31
+ Returns
32
+ -------
33
+ Metadata
34
+ Metadata object.
35
+ """
36
+ infos: RegistryEntry = getattr(registry, kind)
37
+ metadata = import_class(infos.metadata.module, infos.metadata.class_name)
38
+ kwargs = parse_arguments(**kwargs)
39
+ return metadata(**kwargs)
40
+
41
+
42
+ def parse_arguments(**kwargs) -> dict:
43
+ """
44
+ Parse keyword arguments and add default values if necessary.
45
+
46
+ Parameters
47
+ ----------
48
+ **kwargs : dict
49
+ Keyword arguments.
50
+
51
+ Returns
52
+ -------
53
+ dict
54
+ A dictionary containing the entity metadata attributes.
55
+ """
56
+ if "created" not in kwargs or kwargs["created"] is None:
57
+ kwargs["created"] = get_timestamp()
58
+ if "updated" not in kwargs or kwargs["updated"] is None:
59
+ kwargs["updated"] = kwargs["created"]
60
+ return kwargs