digitalhub 0.7.0b2__py3-none-any.whl → 0.8.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of digitalhub might be problematic. Click here for more details.

Files changed (232) hide show
  1. digitalhub/__init__.py +63 -93
  2. digitalhub/client/__init__.py +0 -0
  3. digitalhub/client/_base/__init__.py +0 -0
  4. digitalhub/client/_base/client.py +56 -0
  5. digitalhub/client/api.py +63 -0
  6. digitalhub/client/builder.py +50 -0
  7. digitalhub/client/dhcore/__init__.py +0 -0
  8. digitalhub/client/dhcore/client.py +669 -0
  9. digitalhub/client/dhcore/env.py +21 -0
  10. digitalhub/client/dhcore/models.py +46 -0
  11. digitalhub/client/dhcore/utils.py +111 -0
  12. digitalhub/client/local/__init__.py +0 -0
  13. digitalhub/client/local/client.py +533 -0
  14. digitalhub/context/__init__.py +0 -0
  15. digitalhub/context/api.py +93 -0
  16. digitalhub/context/builder.py +94 -0
  17. digitalhub/context/context.py +136 -0
  18. digitalhub/datastores/__init__.py +0 -0
  19. digitalhub/datastores/_base/__init__.py +0 -0
  20. digitalhub/datastores/_base/datastore.py +85 -0
  21. digitalhub/datastores/api.py +37 -0
  22. digitalhub/datastores/builder.py +110 -0
  23. digitalhub/datastores/local/__init__.py +0 -0
  24. digitalhub/datastores/local/datastore.py +50 -0
  25. digitalhub/datastores/remote/__init__.py +0 -0
  26. digitalhub/datastores/remote/datastore.py +31 -0
  27. digitalhub/datastores/s3/__init__.py +0 -0
  28. digitalhub/datastores/s3/datastore.py +46 -0
  29. digitalhub/datastores/sql/__init__.py +0 -0
  30. digitalhub/datastores/sql/datastore.py +68 -0
  31. digitalhub/entities/__init__.py +0 -0
  32. digitalhub/entities/_base/__init__.py +0 -0
  33. digitalhub/entities/_base/_base/__init__.py +0 -0
  34. digitalhub/entities/_base/_base/entity.py +82 -0
  35. digitalhub/entities/_base/api_utils.py +620 -0
  36. digitalhub/entities/_base/context/__init__.py +0 -0
  37. digitalhub/entities/_base/context/entity.py +118 -0
  38. digitalhub/entities/_base/crud.py +468 -0
  39. digitalhub/entities/_base/entity/__init__.py +0 -0
  40. digitalhub/entities/_base/entity/_constructors/__init__.py +0 -0
  41. digitalhub/entities/_base/entity/_constructors/metadata.py +44 -0
  42. digitalhub/entities/_base/entity/_constructors/name.py +31 -0
  43. digitalhub/entities/_base/entity/_constructors/spec.py +33 -0
  44. digitalhub/entities/_base/entity/_constructors/status.py +52 -0
  45. digitalhub/entities/_base/entity/_constructors/uuid.py +26 -0
  46. digitalhub/entities/_base/entity/builder.py +175 -0
  47. digitalhub/entities/_base/entity/entity.py +106 -0
  48. digitalhub/entities/_base/entity/metadata.py +59 -0
  49. digitalhub/entities/_base/entity/spec.py +58 -0
  50. digitalhub/entities/_base/entity/status.py +43 -0
  51. digitalhub/entities/_base/executable/__init__.py +0 -0
  52. digitalhub/entities/_base/executable/entity.py +405 -0
  53. digitalhub/entities/_base/material/__init__.py +0 -0
  54. digitalhub/entities/_base/material/entity.py +214 -0
  55. digitalhub/entities/_base/material/spec.py +22 -0
  56. digitalhub/entities/_base/material/status.py +49 -0
  57. digitalhub/entities/_base/runtime_entity/__init__.py +0 -0
  58. digitalhub/entities/_base/runtime_entity/builder.py +106 -0
  59. digitalhub/entities/_base/unversioned/__init__.py +0 -0
  60. digitalhub/entities/_base/unversioned/builder.py +66 -0
  61. digitalhub/entities/_base/unversioned/entity.py +49 -0
  62. digitalhub/entities/_base/versioned/__init__.py +0 -0
  63. digitalhub/entities/_base/versioned/builder.py +68 -0
  64. digitalhub/entities/_base/versioned/entity.py +53 -0
  65. digitalhub/entities/artifact/__init__.py +0 -0
  66. digitalhub/entities/artifact/_base/__init__.py +0 -0
  67. digitalhub/entities/artifact/_base/builder.py +86 -0
  68. digitalhub/entities/artifact/_base/entity.py +39 -0
  69. digitalhub/entities/artifact/_base/spec.py +15 -0
  70. digitalhub/entities/artifact/_base/status.py +9 -0
  71. digitalhub/entities/artifact/artifact/__init__.py +0 -0
  72. digitalhub/entities/artifact/artifact/builder.py +18 -0
  73. digitalhub/entities/artifact/artifact/entity.py +32 -0
  74. digitalhub/entities/artifact/artifact/spec.py +27 -0
  75. digitalhub/entities/artifact/artifact/status.py +15 -0
  76. digitalhub/entities/artifact/crud.py +332 -0
  77. digitalhub/entities/builders.py +63 -0
  78. digitalhub/entities/dataitem/__init__.py +0 -0
  79. digitalhub/entities/dataitem/_base/__init__.py +0 -0
  80. digitalhub/entities/dataitem/_base/builder.py +86 -0
  81. digitalhub/entities/dataitem/_base/entity.py +75 -0
  82. digitalhub/entities/dataitem/_base/spec.py +15 -0
  83. digitalhub/entities/dataitem/_base/status.py +20 -0
  84. digitalhub/entities/dataitem/crud.py +372 -0
  85. digitalhub/entities/dataitem/dataitem/__init__.py +0 -0
  86. digitalhub/entities/dataitem/dataitem/builder.py +18 -0
  87. digitalhub/entities/dataitem/dataitem/entity.py +32 -0
  88. digitalhub/entities/dataitem/dataitem/spec.py +15 -0
  89. digitalhub/entities/dataitem/dataitem/status.py +9 -0
  90. digitalhub/entities/dataitem/iceberg/__init__.py +0 -0
  91. digitalhub/entities/dataitem/iceberg/builder.py +18 -0
  92. digitalhub/entities/dataitem/iceberg/entity.py +32 -0
  93. digitalhub/entities/dataitem/iceberg/spec.py +15 -0
  94. digitalhub/entities/dataitem/iceberg/status.py +9 -0
  95. digitalhub/entities/dataitem/table/__init__.py +0 -0
  96. digitalhub/entities/dataitem/table/builder.py +18 -0
  97. digitalhub/entities/dataitem/table/entity.py +146 -0
  98. digitalhub/entities/dataitem/table/models.py +62 -0
  99. digitalhub/entities/dataitem/table/spec.py +25 -0
  100. digitalhub/entities/dataitem/table/status.py +9 -0
  101. digitalhub/entities/function/__init__.py +0 -0
  102. digitalhub/entities/function/_base/__init__.py +0 -0
  103. digitalhub/entities/function/_base/builder.py +79 -0
  104. digitalhub/entities/function/_base/entity.py +98 -0
  105. digitalhub/entities/function/_base/models.py +118 -0
  106. digitalhub/entities/function/_base/spec.py +15 -0
  107. digitalhub/entities/function/_base/status.py +9 -0
  108. digitalhub/entities/function/crud.py +279 -0
  109. digitalhub/entities/model/__init__.py +0 -0
  110. digitalhub/entities/model/_base/__init__.py +0 -0
  111. digitalhub/entities/model/_base/builder.py +86 -0
  112. digitalhub/entities/model/_base/entity.py +34 -0
  113. digitalhub/entities/model/_base/spec.py +49 -0
  114. digitalhub/entities/model/_base/status.py +9 -0
  115. digitalhub/entities/model/crud.py +331 -0
  116. digitalhub/entities/model/huggingface/__init__.py +0 -0
  117. digitalhub/entities/model/huggingface/builder.py +18 -0
  118. digitalhub/entities/model/huggingface/entity.py +32 -0
  119. digitalhub/entities/model/huggingface/spec.py +36 -0
  120. digitalhub/entities/model/huggingface/status.py +9 -0
  121. digitalhub/entities/model/mlflow/__init__.py +0 -0
  122. digitalhub/entities/model/mlflow/builder.py +18 -0
  123. digitalhub/entities/model/mlflow/entity.py +32 -0
  124. digitalhub/entities/model/mlflow/models.py +26 -0
  125. digitalhub/entities/model/mlflow/spec.py +44 -0
  126. digitalhub/entities/model/mlflow/status.py +9 -0
  127. digitalhub/entities/model/mlflow/utils.py +81 -0
  128. digitalhub/entities/model/model/__init__.py +0 -0
  129. digitalhub/entities/model/model/builder.py +18 -0
  130. digitalhub/entities/model/model/entity.py +32 -0
  131. digitalhub/entities/model/model/spec.py +15 -0
  132. digitalhub/entities/model/model/status.py +9 -0
  133. digitalhub/entities/model/sklearn/__init__.py +0 -0
  134. digitalhub/entities/model/sklearn/builder.py +18 -0
  135. digitalhub/entities/model/sklearn/entity.py +32 -0
  136. digitalhub/entities/model/sklearn/spec.py +15 -0
  137. digitalhub/entities/model/sklearn/status.py +9 -0
  138. digitalhub/entities/project/__init__.py +0 -0
  139. digitalhub/entities/project/_base/__init__.py +0 -0
  140. digitalhub/entities/project/_base/builder.py +128 -0
  141. digitalhub/entities/project/_base/entity.py +2078 -0
  142. digitalhub/entities/project/_base/spec.py +50 -0
  143. digitalhub/entities/project/_base/status.py +9 -0
  144. digitalhub/entities/project/crud.py +357 -0
  145. digitalhub/entities/run/__init__.py +0 -0
  146. digitalhub/entities/run/_base/__init__.py +0 -0
  147. digitalhub/entities/run/_base/builder.py +94 -0
  148. digitalhub/entities/run/_base/entity.py +307 -0
  149. digitalhub/entities/run/_base/spec.py +50 -0
  150. digitalhub/entities/run/_base/status.py +9 -0
  151. digitalhub/entities/run/crud.py +219 -0
  152. digitalhub/entities/secret/__init__.py +0 -0
  153. digitalhub/entities/secret/_base/__init__.py +0 -0
  154. digitalhub/entities/secret/_base/builder.py +81 -0
  155. digitalhub/entities/secret/_base/entity.py +74 -0
  156. digitalhub/entities/secret/_base/spec.py +35 -0
  157. digitalhub/entities/secret/_base/status.py +9 -0
  158. digitalhub/entities/secret/crud.py +290 -0
  159. digitalhub/entities/task/__init__.py +0 -0
  160. digitalhub/entities/task/_base/__init__.py +0 -0
  161. digitalhub/entities/task/_base/builder.py +91 -0
  162. digitalhub/entities/task/_base/entity.py +136 -0
  163. digitalhub/entities/task/_base/models.py +208 -0
  164. digitalhub/entities/task/_base/spec.py +53 -0
  165. digitalhub/entities/task/_base/status.py +9 -0
  166. digitalhub/entities/task/crud.py +228 -0
  167. digitalhub/entities/utils/__init__.py +0 -0
  168. digitalhub/entities/utils/api.py +346 -0
  169. digitalhub/entities/utils/entity_types.py +19 -0
  170. digitalhub/entities/utils/state.py +31 -0
  171. digitalhub/entities/utils/utils.py +202 -0
  172. digitalhub/entities/workflow/__init__.py +0 -0
  173. digitalhub/entities/workflow/_base/__init__.py +0 -0
  174. digitalhub/entities/workflow/_base/builder.py +79 -0
  175. digitalhub/entities/workflow/_base/entity.py +74 -0
  176. digitalhub/entities/workflow/_base/spec.py +15 -0
  177. digitalhub/entities/workflow/_base/status.py +9 -0
  178. digitalhub/entities/workflow/crud.py +278 -0
  179. digitalhub/factory/__init__.py +0 -0
  180. digitalhub/factory/api.py +277 -0
  181. digitalhub/factory/factory.py +268 -0
  182. digitalhub/factory/utils.py +90 -0
  183. digitalhub/readers/__init__.py +0 -0
  184. digitalhub/readers/_base/__init__.py +0 -0
  185. digitalhub/readers/_base/builder.py +26 -0
  186. digitalhub/readers/_base/reader.py +70 -0
  187. digitalhub/readers/api.py +80 -0
  188. digitalhub/readers/factory.py +133 -0
  189. digitalhub/readers/pandas/__init__.py +0 -0
  190. digitalhub/readers/pandas/builder.py +29 -0
  191. digitalhub/readers/pandas/reader.py +207 -0
  192. digitalhub/runtimes/__init__.py +0 -0
  193. digitalhub/runtimes/_base.py +102 -0
  194. digitalhub/runtimes/builder.py +32 -0
  195. digitalhub/stores/__init__.py +0 -0
  196. digitalhub/stores/_base/__init__.py +0 -0
  197. digitalhub/stores/_base/store.py +189 -0
  198. digitalhub/stores/api.py +54 -0
  199. digitalhub/stores/builder.py +211 -0
  200. digitalhub/stores/local/__init__.py +0 -0
  201. digitalhub/stores/local/store.py +230 -0
  202. digitalhub/stores/remote/__init__.py +0 -0
  203. digitalhub/stores/remote/store.py +143 -0
  204. digitalhub/stores/s3/__init__.py +0 -0
  205. digitalhub/stores/s3/store.py +563 -0
  206. digitalhub/stores/sql/__init__.py +0 -0
  207. digitalhub/stores/sql/store.py +328 -0
  208. digitalhub/utils/__init__.py +0 -0
  209. digitalhub/utils/data_utils.py +127 -0
  210. digitalhub/utils/exceptions.py +67 -0
  211. digitalhub/utils/file_utils.py +204 -0
  212. digitalhub/utils/generic_utils.py +183 -0
  213. digitalhub/utils/git_utils.py +148 -0
  214. digitalhub/utils/io_utils.py +116 -0
  215. digitalhub/utils/logger.py +17 -0
  216. digitalhub/utils/s3_utils.py +58 -0
  217. digitalhub/utils/uri_utils.py +56 -0
  218. {digitalhub-0.7.0b2.dist-info → digitalhub-0.8.0.dist-info}/METADATA +30 -13
  219. digitalhub-0.8.0.dist-info/RECORD +231 -0
  220. {digitalhub-0.7.0b2.dist-info → digitalhub-0.8.0.dist-info}/WHEEL +1 -1
  221. test/local/CRUD/test_artifacts.py +96 -0
  222. test/local/CRUD/test_dataitems.py +96 -0
  223. test/local/CRUD/test_models.py +95 -0
  224. test/test_crud_functions.py +1 -1
  225. test/test_crud_runs.py +1 -1
  226. test/test_crud_tasks.py +1 -1
  227. digitalhub-0.7.0b2.dist-info/RECORD +0 -14
  228. test/test_crud_artifacts.py +0 -96
  229. test/test_crud_dataitems.py +0 -96
  230. {digitalhub-0.7.0b2.dist-info → digitalhub-0.8.0.dist-info}/LICENSE.txt +0 -0
  231. {digitalhub-0.7.0b2.dist-info → digitalhub-0.8.0.dist-info}/top_level.txt +0 -0
  232. /test/{test_imports.py → local/imports/test_imports.py} +0 -0
@@ -0,0 +1,118 @@
1
+ from __future__ import annotations
2
+
3
+ import typing
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
8
+ from digitalhub.utils.generic_utils import get_timestamp
9
+
10
+ if typing.TYPE_CHECKING:
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
15
+
16
+
17
+ class ContextEntity(Entity):
18
+ def __init__(
19
+ self,
20
+ project: str,
21
+ kind: str,
22
+ metadata: Metadata,
23
+ spec: Spec,
24
+ status: Status,
25
+ user: str | None = None,
26
+ ) -> None:
27
+ super().__init__(kind, metadata, spec, status, user)
28
+ self.project = project
29
+ self._obj_attr.extend(["project"])
30
+
31
+ ##############################
32
+ # Save / Refresh / Export
33
+ ##############################
34
+
35
+ def save(self, update: bool = False) -> ContextEntity:
36
+ """
37
+ Save or update the entity into the backend.
38
+
39
+ Parameters
40
+ ----------
41
+ update : bool
42
+ Flag to indicate update.
43
+
44
+ Returns
45
+ -------
46
+ ContextEntity
47
+ Entity saved.
48
+ """
49
+ obj = self.to_dict()
50
+ if not update:
51
+ return self._save(obj)
52
+ return self._update(obj)
53
+
54
+ def _save(self, obj: dict) -> ContextEntity:
55
+ """
56
+ Save entity into backend.
57
+
58
+ Parameters
59
+ ----------
60
+ obj : dict
61
+ Object instance as dictionary.
62
+
63
+ Returns
64
+ -------
65
+ ContextEntity
66
+ Entity saved.
67
+ """
68
+ new_obj = create_entity_api_ctx(self.project, self.ENTITY_TYPE, obj)
69
+ self._update_attributes(new_obj)
70
+ return self
71
+
72
+ def _update(self, obj: dict) -> ContextEntity:
73
+ """
74
+ Update entity in backend.
75
+
76
+ Parameters
77
+ ----------
78
+ obj : dict
79
+ Object instance as dictionary.
80
+
81
+ Returns
82
+ -------
83
+ ContextEntity
84
+ Entity updated.
85
+ """
86
+ if self._context().local:
87
+ self.metadata.updated = obj["metadata"]["updated"] = get_timestamp()
88
+ new_obj = update_entity_api_ctx(self.project, self.ENTITY_TYPE, self.id, obj)
89
+ self._update_attributes(new_obj)
90
+ return self
91
+
92
+ def refresh(self) -> ContextEntity:
93
+ """
94
+ Refresh object from backend.
95
+
96
+ Returns
97
+ -------
98
+ ContextEntity
99
+ Entity refreshed.
100
+ """
101
+ new_obj = read_entity_api_ctx(self.key)
102
+ self._update_attributes(new_obj)
103
+ return self
104
+
105
+ ##############################
106
+ # Context
107
+ ##############################
108
+
109
+ def _context(self) -> Context:
110
+ """
111
+ Get context.
112
+
113
+ Returns
114
+ -------
115
+ Context
116
+ Context object.
117
+ """
118
+ return get_context(self.project)
@@ -0,0 +1,468 @@
1
+ from __future__ import annotations
2
+
3
+ import typing
4
+
5
+ from digitalhub.client.api import build_client, get_client
6
+ from digitalhub.context.api import check_context
7
+ from digitalhub.entities._base.api_utils import (
8
+ delete_entity_api_ctx,
9
+ list_entity_api_ctx,
10
+ read_entity_api_base,
11
+ read_entity_api_ctx,
12
+ read_entity_api_ctx_versions,
13
+ )
14
+ from digitalhub.entities.utils.entity_types import EntityTypes
15
+ from digitalhub.entities.utils.utils import parse_entity_key
16
+ from digitalhub.factory.api import build_entity_from_dict, build_entity_from_params
17
+ from digitalhub.utils.exceptions import ContextError, EntityAlreadyExistsError, EntityError, EntityNotExistsError
18
+ from digitalhub.utils.io_utils import read_yaml
19
+
20
+ if typing.TYPE_CHECKING:
21
+ from digitalhub.entities._base.context.entity import ContextEntity
22
+ from digitalhub.entities._base.executable.entity import ExecutableEntity
23
+ from digitalhub.entities._base.material.entity import MaterialEntity
24
+ from digitalhub.entities._base.unversioned.entity import UnversionedEntity
25
+ from digitalhub.entities._base.versioned.entity import VersionedEntity
26
+
27
+
28
+ def _check_context(project: str) -> None:
29
+ """
30
+ Check if the given project is in the context.
31
+ Otherwise try to get the project from remote.
32
+
33
+ Parameters
34
+ ----------
35
+ project : str
36
+ Project name.
37
+
38
+ Returns
39
+ -------
40
+ None
41
+ """
42
+ try:
43
+ check_context(project)
44
+ except ContextError:
45
+ try:
46
+ build_client()
47
+ client = get_client()
48
+ obj = read_entity_api_base(client, EntityTypes.PROJECT.value, project)
49
+ build_entity_from_dict(obj)
50
+ except EntityNotExistsError:
51
+ raise ContextError(f"Project '{project}' not found.")
52
+
53
+
54
+ def _check_project_from_identifier(identifier: str, project: str | None = None) -> None:
55
+ """
56
+ Check if the given project is in the context.
57
+ Otherwise try to get the project from remote.
58
+
59
+ Parameters
60
+ ----------
61
+ identifier : str
62
+ Entity key (store://...) or entity name.
63
+ project : str
64
+ Project name.
65
+
66
+ Returns
67
+ -------
68
+ None
69
+ """
70
+ if not identifier.startswith("store://"):
71
+ if project is None:
72
+ raise EntityError("Specify project if you do not specify entity key.")
73
+
74
+ else:
75
+ project, _, _, _, _ = parse_entity_key(identifier)
76
+
77
+ _check_context(project)
78
+
79
+
80
+ def new_context_entity(**kwargs) -> ContextEntity:
81
+ """
82
+ Create a new object.
83
+
84
+ Parameters
85
+ ----------
86
+ project : str
87
+ Project name.
88
+ kind : str
89
+ Kind the object.
90
+ uuid : str
91
+ ID of the object.
92
+ description : str
93
+ Description of the object (human readable).
94
+ labels : list[str]
95
+ List of labels.
96
+ embedded : bool
97
+ Flag to determine if object spec must be embedded in project spec.
98
+
99
+ Returns
100
+ -------
101
+ ContextEntity
102
+ Object instance.
103
+ """
104
+ _check_context(kwargs["project"])
105
+ obj = build_entity_from_params(**kwargs)
106
+ obj.save()
107
+ return obj
108
+
109
+
110
+ def get_versioned_entity(
111
+ identifier: str,
112
+ entity_type: str | None = None,
113
+ project: str | None = None,
114
+ entity_id: str | None = None,
115
+ **kwargs,
116
+ ) -> VersionedEntity:
117
+ """
118
+ Get object from backend.
119
+
120
+ Parameters
121
+ ----------
122
+ identifier : str
123
+ Entity key (store://...) or entity name.
124
+ entity_type : str
125
+ Entity type.
126
+ project : str
127
+ Project name.
128
+ entity_id : str
129
+ Entity ID.
130
+ **kwargs : dict
131
+ Parameters to pass to the API call.
132
+
133
+ Returns
134
+ -------
135
+ VersionedEntity
136
+ Object instance.
137
+ """
138
+ _check_project_from_identifier(identifier, project)
139
+ obj = read_entity_api_ctx(
140
+ identifier,
141
+ entity_type=entity_type,
142
+ project=project,
143
+ entity_id=entity_id,
144
+ **kwargs,
145
+ )
146
+ return build_entity_from_dict(obj)
147
+
148
+
149
+ def get_unversioned_entity(
150
+ identifier: str,
151
+ entity_type: str | None = None,
152
+ project: str | None = None,
153
+ **kwargs,
154
+ ) -> UnversionedEntity:
155
+ """
156
+ Get object from backend.
157
+
158
+ Parameters
159
+ ----------
160
+ entity_type : str
161
+ Entity type.
162
+ identifier : str
163
+ Entity key (store://...) or entity name.
164
+ project : str
165
+ Project name.
166
+ entity_id : str
167
+ Entity ID.
168
+ **kwargs : dict
169
+ Parameters to pass to the API call.
170
+
171
+ Returns
172
+ -------
173
+ UnversionedEntity
174
+ Object instance.
175
+ """
176
+ _check_project_from_identifier(identifier, project)
177
+
178
+ obj = read_entity_api_ctx(
179
+ identifier,
180
+ entity_type=entity_type,
181
+ project=project,
182
+ **kwargs,
183
+ )
184
+ return build_entity_from_dict(obj)
185
+
186
+
187
+ def get_material_entity(
188
+ identifier: str,
189
+ entity_type: str | None = None,
190
+ project: str | None = None,
191
+ entity_id: str | None = None,
192
+ **kwargs,
193
+ ) -> MaterialEntity:
194
+ """
195
+ Get object from backend.
196
+
197
+ Parameters
198
+ ----------
199
+ identifier : str
200
+ Entity key (store://...) or entity name.
201
+ entity_type : str
202
+ Entity type.
203
+ project : str
204
+ Project name.
205
+ entity_id : str
206
+ Entity ID.
207
+ **kwargs : dict
208
+ Parameters to pass to the API call.
209
+
210
+ Returns
211
+ -------
212
+ MaterialEntity
213
+ Object instance.
214
+ """
215
+ obj: MaterialEntity = get_versioned_entity(
216
+ identifier,
217
+ entity_type=entity_type,
218
+ project=project,
219
+ entity_id=entity_id,
220
+ **kwargs,
221
+ )
222
+ obj._get_files_info()
223
+ return obj
224
+
225
+
226
+ def get_context_entity_versions(
227
+ identifier: str,
228
+ entity_type: str | None = None,
229
+ project: str | None = None,
230
+ **kwargs,
231
+ ) -> list[ContextEntity]:
232
+ """
233
+ Get object versions from backend.
234
+
235
+ Parameters
236
+ ----------
237
+ identifier : str
238
+ Entity key (store://...) or entity name.
239
+ entity_type : str
240
+ Entity type.
241
+ project : str
242
+ Project name.
243
+ **kwargs : dict
244
+ Parameters to pass to the API call.
245
+
246
+ Returns
247
+ -------
248
+ list[ContextEntity]
249
+ List of object instances.
250
+ """
251
+ _check_project_from_identifier(identifier, project)
252
+ obj = read_entity_api_ctx_versions(
253
+ identifier,
254
+ entity_type=entity_type,
255
+ project=project,
256
+ **kwargs,
257
+ )
258
+ return [build_entity_from_dict(o) for o in obj]
259
+
260
+
261
+ def get_material_entity_versions(
262
+ identifier: str,
263
+ entity_type: str | None = None,
264
+ project: str | None = None,
265
+ **kwargs,
266
+ ) -> list[MaterialEntity]:
267
+ """
268
+ Get object versions from backend.
269
+
270
+ Parameters
271
+ ----------
272
+ identifier : str
273
+ Entity key (store://...) or entity name.
274
+ entity_type : str
275
+ Entity type.
276
+ project : str
277
+ Project name.
278
+ **kwargs : dict
279
+ Parameters to pass to the API call.
280
+
281
+ Returns
282
+ -------
283
+ list[MaterialEntity]
284
+ List of object instances.
285
+ """
286
+ _check_project_from_identifier(identifier, project)
287
+ objs = read_entity_api_ctx_versions(
288
+ identifier,
289
+ entity_type=entity_type,
290
+ project=project,
291
+ **kwargs,
292
+ )
293
+ objects = []
294
+ for o in objs:
295
+ entity: MaterialEntity = build_entity_from_dict(o)
296
+ entity._get_files_info()
297
+ objects.append(entity)
298
+ return objects
299
+
300
+
301
+ def list_context_entities(project: str, entity_type: str, **kwargs) -> list[ContextEntity]:
302
+ """
303
+ List all latest version objects from backend.
304
+
305
+ Parameters
306
+ ----------
307
+ project : str
308
+ Project name.
309
+ entity_type : str
310
+ Entity type.
311
+ **kwargs : dict
312
+ Parameters to pass to the API call.
313
+
314
+ Returns
315
+ -------
316
+ list[ContextEntity]
317
+ List of object instances.
318
+ """
319
+ _check_context(project)
320
+ objs = list_entity_api_ctx(
321
+ project=project,
322
+ entity_type=entity_type,
323
+ **kwargs,
324
+ )
325
+ return [build_entity_from_dict(obj) for obj in objs]
326
+
327
+
328
+ def list_material_entities(
329
+ project: str,
330
+ entity_type: str,
331
+ **kwargs,
332
+ ) -> list[MaterialEntity]:
333
+ """
334
+ List all latest version objects from backend.
335
+
336
+ Parameters
337
+ ----------
338
+ project : str
339
+ Project name.
340
+ entity_type : str
341
+ Entity type.
342
+ **kwargs : dict
343
+ Parameters to pass to the API call.
344
+
345
+ Returns
346
+ -------
347
+ list[MaterialEntity]
348
+ List of object instances.
349
+ """
350
+ _check_context(project)
351
+ objs = list_entity_api_ctx(
352
+ project=project,
353
+ entity_type=entity_type,
354
+ **kwargs,
355
+ )
356
+ objects = []
357
+ for o in objs:
358
+ entity: MaterialEntity = build_entity_from_dict(o)
359
+ entity._get_files_info()
360
+ objects.append(entity)
361
+ return objects
362
+
363
+
364
+ def import_context_entity(file: str) -> ContextEntity:
365
+ """
366
+ Get object from file.
367
+
368
+ Parameters
369
+ ----------
370
+ file : str
371
+ Path to YAML file.
372
+
373
+ Returns
374
+ -------
375
+ ContextEntity
376
+ Object instance.
377
+ """
378
+ dict_obj: dict = read_yaml(file)
379
+
380
+ _check_context(dict_obj["project"])
381
+
382
+ obj = build_entity_from_dict(dict_obj)
383
+ try:
384
+ obj.save()
385
+ except EntityAlreadyExistsError:
386
+ pass
387
+ return obj
388
+
389
+
390
+ def import_executable_entity(file: str) -> ExecutableEntity:
391
+ """
392
+ Get object from file.
393
+
394
+ Parameters
395
+ ----------
396
+ file : str
397
+ Path to YAML file.
398
+
399
+ Returns
400
+ -------
401
+ ExecutableEntity
402
+ Object instance.
403
+ """
404
+ dict_obj: dict | list[dict] = read_yaml(file)
405
+ if isinstance(dict_obj, list):
406
+ exec_dict = dict_obj[0]
407
+ tsk_dicts = dict_obj[1:]
408
+ else:
409
+ exec_dict = dict_obj
410
+ tsk_dicts = []
411
+
412
+ _check_context(exec_dict["project"])
413
+
414
+ obj: ExecutableEntity = build_entity_from_dict(exec_dict)
415
+
416
+ obj.import_tasks(tsk_dicts)
417
+
418
+ try:
419
+ obj.save()
420
+ except EntityAlreadyExistsError:
421
+ pass
422
+ return obj
423
+
424
+
425
+ def delete_entity(
426
+ identifier: str,
427
+ entity_type: str | None = None,
428
+ project: str | None = None,
429
+ entity_id: str | None = None,
430
+ delete_all_versions: bool = False,
431
+ cascade: bool = True,
432
+ **kwargs,
433
+ ) -> dict:
434
+ """
435
+ Delete object from backend.
436
+
437
+ Parameters
438
+ ----------
439
+ identifier : str
440
+ Entity key (store://...) or entity name.
441
+ entity_type : str
442
+ Entity type.
443
+ project : str
444
+ Project name.
445
+ entity_id : str
446
+ Entity ID.
447
+ delete_all_versions : bool
448
+ Delete all versions of the named entity. If True, use entity name instead of entity key as identifier.
449
+ cascade : bool
450
+ Cascade delete.
451
+ **kwargs : dict
452
+ Parameters to pass to the API call.
453
+
454
+ Returns
455
+ -------
456
+ dict
457
+ Response from backend.
458
+ """
459
+ _check_project_from_identifier(identifier, project)
460
+ return delete_entity_api_ctx(
461
+ identifier=identifier,
462
+ entity_type=entity_type,
463
+ project=project,
464
+ entity_id=entity_id,
465
+ delete_all_versions=delete_all_versions,
466
+ cascade=cascade,
467
+ **kwargs,
468
+ )
File without changes
@@ -0,0 +1,44 @@
1
+ from __future__ import annotations
2
+
3
+ from digitalhub.entities._base.entity.metadata import Metadata
4
+ from digitalhub.utils.generic_utils import get_timestamp
5
+
6
+
7
+ def build_metadata(**kwargs) -> Metadata:
8
+ """
9
+ Build entity metadata object. This method is used to build entity
10
+ metadata.
11
+
12
+ Parameters
13
+ ----------
14
+ **kwargs : dict
15
+ Keyword arguments for the constructor.
16
+
17
+ Returns
18
+ -------
19
+ Metadata
20
+ Metadata object.
21
+ """
22
+ kwargs = parse_arguments(**kwargs)
23
+ return Metadata(**kwargs)
24
+
25
+
26
+ def parse_arguments(**kwargs) -> dict:
27
+ """
28
+ Parse keyword arguments and add default values if necessary.
29
+
30
+ Parameters
31
+ ----------
32
+ **kwargs : dict
33
+ Keyword arguments.
34
+
35
+ Returns
36
+ -------
37
+ dict
38
+ A dictionary containing the entity metadata attributes.
39
+ """
40
+ if "created" not in kwargs or kwargs["created"] is None:
41
+ kwargs["created"] = get_timestamp()
42
+ if "updated" not in kwargs or kwargs["updated"] is None:
43
+ kwargs["updated"] = kwargs["created"]
44
+ return kwargs
@@ -0,0 +1,31 @@
1
+ from __future__ import annotations
2
+
3
+ from pydantic import BaseModel, Field
4
+
5
+ NAME_REGEX = r"^[a-zA-Z0-9._+-]+$"
6
+
7
+
8
+ class NameValidator(BaseModel):
9
+ """
10
+ Validate name format.
11
+ """
12
+
13
+ name: str = Field(min_length=1, max_length=256, regex=NAME_REGEX)
14
+
15
+
16
+ def build_name(name: str) -> str:
17
+ """
18
+ Build name.
19
+
20
+ Parameters
21
+ ----------
22
+ name : str
23
+ The name.
24
+
25
+ Returns
26
+ -------
27
+ str
28
+ The name.
29
+ """
30
+ NameValidator(name=name)
31
+ return name
@@ -0,0 +1,33 @@
1
+ from __future__ import annotations
2
+
3
+ import typing
4
+
5
+ if typing.TYPE_CHECKING:
6
+ from digitalhub.entities._base.entity.spec import Spec, SpecValidator
7
+
8
+
9
+ def build_spec(spec_cls: Spec, spec_validator: SpecValidator, validate: bool = True, **kwargs) -> Spec:
10
+ """
11
+ Build entity spec object. This method is used to build entity
12
+ specifications and is used to validate the parameters passed
13
+ to the constructor.
14
+
15
+ Parameters
16
+ ----------
17
+ spec_cls : Spec
18
+ Spec class.
19
+ spec_validator : SpecValidator
20
+ Spec validator class.
21
+ validate : bool
22
+ Flag to determine if validate kwargs.
23
+ **kwargs : dict
24
+ Keyword arguments for the constructor.
25
+
26
+ Returns
27
+ -------
28
+ Spec
29
+ Spec object.
30
+ """
31
+ if validate:
32
+ kwargs = spec_validator(**kwargs).dict(by_alias=True, exclude_none=True)
33
+ return spec_cls(**kwargs)