digitalhub 0.11.0b7__py3-none-any.whl → 0.13.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 (272) hide show
  1. digitalhub/__init__.py +4 -1
  2. digitalhub/context/api.py +9 -5
  3. digitalhub/context/builder.py +7 -5
  4. digitalhub/context/context.py +13 -1
  5. digitalhub/entities/__init__.py +3 -0
  6. digitalhub/entities/_base/__init__.py +3 -0
  7. digitalhub/entities/_base/_base/__init__.py +3 -0
  8. digitalhub/entities/_base/_base/entity.py +4 -0
  9. digitalhub/entities/_base/context/__init__.py +3 -0
  10. digitalhub/entities/_base/context/entity.py +4 -0
  11. digitalhub/entities/_base/entity/__init__.py +3 -0
  12. digitalhub/entities/_base/entity/_constructors/__init__.py +3 -0
  13. digitalhub/entities/_base/entity/_constructors/metadata.py +4 -0
  14. digitalhub/entities/_base/entity/_constructors/name.py +4 -0
  15. digitalhub/entities/_base/entity/_constructors/spec.py +4 -0
  16. digitalhub/entities/_base/entity/_constructors/status.py +4 -0
  17. digitalhub/entities/_base/entity/_constructors/uuid.py +4 -0
  18. digitalhub/entities/_base/entity/builder.py +4 -0
  19. digitalhub/entities/_base/entity/entity.py +4 -0
  20. digitalhub/entities/_base/entity/metadata.py +4 -0
  21. digitalhub/entities/_base/entity/spec.py +4 -0
  22. digitalhub/entities/_base/entity/status.py +4 -0
  23. digitalhub/entities/_base/executable/__init__.py +3 -0
  24. digitalhub/entities/_base/executable/entity.py +109 -57
  25. digitalhub/entities/_base/material/__init__.py +3 -0
  26. digitalhub/entities/_base/material/entity.py +15 -18
  27. digitalhub/entities/_base/material/spec.py +4 -0
  28. digitalhub/entities/_base/material/status.py +4 -0
  29. digitalhub/entities/_base/material/utils.py +5 -1
  30. digitalhub/entities/_base/runtime_entity/__init__.py +3 -0
  31. digitalhub/entities/_base/runtime_entity/builder.py +4 -0
  32. digitalhub/entities/_base/unversioned/__init__.py +3 -0
  33. digitalhub/entities/_base/unversioned/builder.py +4 -0
  34. digitalhub/entities/_base/unversioned/entity.py +4 -0
  35. digitalhub/entities/_base/versioned/__init__.py +3 -0
  36. digitalhub/entities/_base/versioned/builder.py +4 -0
  37. digitalhub/entities/_base/versioned/entity.py +4 -0
  38. digitalhub/entities/_commons/__init__.py +3 -0
  39. digitalhub/entities/_commons/enums.py +4 -0
  40. digitalhub/entities/_commons/metrics.py +68 -30
  41. digitalhub/entities/_commons/utils.py +40 -9
  42. digitalhub/entities/_processors/__init__.py +3 -0
  43. digitalhub/entities/_processors/base.py +154 -79
  44. digitalhub/entities/_processors/context.py +370 -215
  45. digitalhub/entities/_processors/utils.py +78 -30
  46. digitalhub/entities/artifact/__init__.py +3 -0
  47. digitalhub/entities/artifact/_base/__init__.py +3 -0
  48. digitalhub/entities/artifact/_base/builder.py +4 -0
  49. digitalhub/entities/artifact/_base/entity.py +4 -0
  50. digitalhub/entities/artifact/_base/spec.py +4 -0
  51. digitalhub/entities/artifact/_base/status.py +4 -0
  52. digitalhub/entities/artifact/artifact/__init__.py +3 -0
  53. digitalhub/entities/artifact/artifact/builder.py +4 -0
  54. digitalhub/entities/artifact/artifact/entity.py +4 -0
  55. digitalhub/entities/artifact/artifact/spec.py +4 -0
  56. digitalhub/entities/artifact/artifact/status.py +4 -0
  57. digitalhub/entities/artifact/crud.py +8 -0
  58. digitalhub/entities/artifact/utils.py +32 -13
  59. digitalhub/entities/builders.py +4 -0
  60. digitalhub/entities/dataitem/__init__.py +3 -0
  61. digitalhub/entities/dataitem/_base/__init__.py +3 -0
  62. digitalhub/entities/dataitem/_base/builder.py +4 -0
  63. digitalhub/entities/dataitem/_base/entity.py +4 -0
  64. digitalhub/entities/dataitem/_base/spec.py +4 -0
  65. digitalhub/entities/dataitem/_base/status.py +4 -0
  66. digitalhub/entities/dataitem/crud.py +18 -2
  67. digitalhub/entities/dataitem/dataitem/__init__.py +3 -0
  68. digitalhub/entities/dataitem/dataitem/builder.py +4 -0
  69. digitalhub/entities/dataitem/dataitem/entity.py +4 -0
  70. digitalhub/entities/dataitem/dataitem/spec.py +4 -0
  71. digitalhub/entities/dataitem/dataitem/status.py +4 -0
  72. digitalhub/entities/dataitem/iceberg/__init__.py +3 -0
  73. digitalhub/entities/dataitem/iceberg/builder.py +4 -0
  74. digitalhub/entities/dataitem/iceberg/entity.py +4 -0
  75. digitalhub/entities/dataitem/iceberg/spec.py +4 -0
  76. digitalhub/entities/dataitem/iceberg/status.py +4 -0
  77. digitalhub/entities/dataitem/table/__init__.py +3 -0
  78. digitalhub/entities/dataitem/table/builder.py +4 -0
  79. digitalhub/entities/dataitem/table/entity.py +7 -3
  80. digitalhub/entities/dataitem/table/models.py +4 -0
  81. digitalhub/entities/dataitem/table/spec.py +4 -0
  82. digitalhub/entities/dataitem/table/status.py +4 -0
  83. digitalhub/entities/dataitem/table/utils.py +4 -0
  84. digitalhub/entities/dataitem/utils.py +88 -35
  85. digitalhub/entities/function/__init__.py +3 -0
  86. digitalhub/entities/function/_base/__init__.py +3 -0
  87. digitalhub/entities/function/_base/builder.py +4 -0
  88. digitalhub/entities/function/_base/entity.py +4 -0
  89. digitalhub/entities/function/_base/spec.py +4 -0
  90. digitalhub/entities/function/_base/status.py +4 -0
  91. digitalhub/entities/function/crud.py +4 -0
  92. digitalhub/entities/model/__init__.py +3 -0
  93. digitalhub/entities/model/_base/__init__.py +3 -0
  94. digitalhub/entities/model/_base/builder.py +4 -0
  95. digitalhub/entities/model/_base/entity.py +4 -0
  96. digitalhub/entities/model/_base/spec.py +4 -0
  97. digitalhub/entities/model/_base/status.py +4 -0
  98. digitalhub/entities/model/crud.py +8 -0
  99. digitalhub/entities/model/huggingface/__init__.py +3 -0
  100. digitalhub/entities/model/huggingface/builder.py +4 -0
  101. digitalhub/entities/model/huggingface/entity.py +4 -0
  102. digitalhub/entities/model/huggingface/spec.py +4 -0
  103. digitalhub/entities/model/huggingface/status.py +4 -0
  104. digitalhub/entities/model/mlflow/__init__.py +3 -0
  105. digitalhub/entities/model/mlflow/builder.py +4 -0
  106. digitalhub/entities/model/mlflow/entity.py +4 -0
  107. digitalhub/entities/model/mlflow/models.py +4 -0
  108. digitalhub/entities/model/mlflow/spec.py +4 -0
  109. digitalhub/entities/model/mlflow/status.py +4 -0
  110. digitalhub/entities/model/mlflow/utils.py +4 -0
  111. digitalhub/entities/model/model/__init__.py +3 -0
  112. digitalhub/entities/model/model/builder.py +4 -0
  113. digitalhub/entities/model/model/entity.py +4 -0
  114. digitalhub/entities/model/model/spec.py +4 -0
  115. digitalhub/entities/model/model/status.py +4 -0
  116. digitalhub/entities/model/sklearn/__init__.py +3 -0
  117. digitalhub/entities/model/sklearn/builder.py +4 -0
  118. digitalhub/entities/model/sklearn/entity.py +4 -0
  119. digitalhub/entities/model/sklearn/spec.py +4 -0
  120. digitalhub/entities/model/sklearn/status.py +4 -0
  121. digitalhub/entities/model/utils.py +32 -13
  122. digitalhub/entities/project/__init__.py +3 -0
  123. digitalhub/entities/project/_base/__init__.py +3 -0
  124. digitalhub/entities/project/_base/builder.py +4 -0
  125. digitalhub/entities/project/_base/entity.py +4 -2
  126. digitalhub/entities/project/_base/models.py +4 -0
  127. digitalhub/entities/project/_base/spec.py +4 -0
  128. digitalhub/entities/project/_base/status.py +4 -0
  129. digitalhub/entities/project/crud.py +4 -0
  130. digitalhub/entities/project/utils.py +4 -0
  131. digitalhub/entities/run/__init__.py +3 -0
  132. digitalhub/entities/run/_base/__init__.py +3 -0
  133. digitalhub/entities/run/_base/builder.py +4 -0
  134. digitalhub/entities/run/_base/entity.py +6 -2
  135. digitalhub/entities/run/_base/spec.py +4 -0
  136. digitalhub/entities/run/_base/status.py +4 -0
  137. digitalhub/entities/run/crud.py +4 -0
  138. digitalhub/entities/secret/__init__.py +3 -0
  139. digitalhub/entities/secret/_base/__init__.py +3 -0
  140. digitalhub/entities/secret/_base/builder.py +4 -0
  141. digitalhub/entities/secret/_base/entity.py +4 -0
  142. digitalhub/entities/secret/_base/spec.py +4 -0
  143. digitalhub/entities/secret/_base/status.py +4 -0
  144. digitalhub/entities/secret/crud.py +4 -0
  145. digitalhub/entities/task/__init__.py +3 -0
  146. digitalhub/entities/task/_base/__init__.py +3 -0
  147. digitalhub/entities/task/_base/builder.py +4 -0
  148. digitalhub/entities/task/_base/entity.py +4 -0
  149. digitalhub/entities/task/_base/models.py +16 -3
  150. digitalhub/entities/task/_base/spec.py +4 -0
  151. digitalhub/entities/task/_base/status.py +4 -0
  152. digitalhub/entities/task/_base/utils.py +4 -0
  153. digitalhub/entities/task/crud.py +4 -0
  154. digitalhub/entities/trigger/__init__.py +3 -0
  155. digitalhub/entities/trigger/_base/__init__.py +3 -0
  156. digitalhub/entities/trigger/_base/builder.py +4 -0
  157. digitalhub/entities/trigger/_base/entity.py +15 -0
  158. digitalhub/entities/trigger/_base/spec.py +4 -0
  159. digitalhub/entities/trigger/_base/status.py +4 -0
  160. digitalhub/entities/trigger/crud.py +4 -0
  161. digitalhub/entities/trigger/lifecycle/__init__.py +3 -0
  162. digitalhub/entities/trigger/lifecycle/builder.py +4 -0
  163. digitalhub/entities/trigger/lifecycle/entity.py +4 -0
  164. digitalhub/entities/trigger/lifecycle/spec.py +4 -0
  165. digitalhub/entities/trigger/lifecycle/status.py +4 -0
  166. digitalhub/entities/trigger/scheduler/__init__.py +3 -0
  167. digitalhub/entities/trigger/scheduler/builder.py +4 -0
  168. digitalhub/entities/trigger/scheduler/entity.py +4 -0
  169. digitalhub/entities/trigger/scheduler/spec.py +4 -0
  170. digitalhub/entities/trigger/scheduler/status.py +4 -0
  171. digitalhub/entities/workflow/__init__.py +3 -0
  172. digitalhub/entities/workflow/_base/__init__.py +3 -0
  173. digitalhub/entities/workflow/_base/builder.py +4 -0
  174. digitalhub/entities/workflow/_base/entity.py +4 -0
  175. digitalhub/entities/workflow/_base/spec.py +4 -0
  176. digitalhub/entities/workflow/_base/status.py +4 -0
  177. digitalhub/entities/workflow/crud.py +4 -0
  178. digitalhub/factory/__init__.py +3 -0
  179. digitalhub/factory/factory.py +29 -3
  180. digitalhub/factory/utils.py +15 -3
  181. digitalhub/runtimes/__init__.py +3 -0
  182. digitalhub/runtimes/_base.py +5 -1
  183. digitalhub/runtimes/builder.py +22 -1
  184. digitalhub/runtimes/enums.py +4 -0
  185. digitalhub/stores/__init__.py +3 -0
  186. digitalhub/stores/client/__init__.py +15 -0
  187. digitalhub/stores/client/_base/__init__.py +3 -0
  188. digitalhub/stores/client/_base/api_builder.py +18 -0
  189. digitalhub/stores/client/_base/client.py +97 -0
  190. digitalhub/stores/client/_base/key_builder.py +32 -0
  191. digitalhub/stores/client/_base/params_builder.py +18 -0
  192. digitalhub/stores/client/api.py +14 -5
  193. digitalhub/stores/client/builder.py +7 -1
  194. digitalhub/stores/client/dhcore/__init__.py +3 -0
  195. digitalhub/stores/client/dhcore/api_builder.py +21 -0
  196. digitalhub/stores/client/dhcore/client.py +329 -70
  197. digitalhub/stores/client/dhcore/configurator.py +489 -193
  198. digitalhub/stores/client/dhcore/enums.py +7 -0
  199. digitalhub/stores/client/dhcore/error_parser.py +39 -1
  200. digitalhub/stores/client/dhcore/key_builder.py +4 -0
  201. digitalhub/stores/client/dhcore/models.py +4 -0
  202. digitalhub/stores/client/dhcore/params_builder.py +117 -17
  203. digitalhub/stores/client/dhcore/utils.py +44 -22
  204. digitalhub/stores/client/local/__init__.py +3 -0
  205. digitalhub/stores/client/local/api_builder.py +21 -0
  206. digitalhub/stores/client/local/client.py +10 -8
  207. digitalhub/stores/client/local/enums.py +4 -0
  208. digitalhub/stores/client/local/key_builder.py +4 -0
  209. digitalhub/stores/client/local/params_builder.py +4 -0
  210. digitalhub/stores/credentials/__init__.py +3 -0
  211. digitalhub/stores/credentials/api.py +35 -0
  212. digitalhub/stores/credentials/configurator.py +210 -0
  213. digitalhub/stores/credentials/enums.py +68 -0
  214. digitalhub/stores/credentials/handler.py +176 -0
  215. digitalhub/stores/credentials/ini_module.py +164 -0
  216. digitalhub/stores/credentials/store.py +81 -0
  217. digitalhub/stores/data/__init__.py +3 -0
  218. digitalhub/stores/data/_base/__init__.py +3 -0
  219. digitalhub/stores/data/_base/store.py +31 -9
  220. digitalhub/stores/data/api.py +53 -9
  221. digitalhub/stores/data/builder.py +94 -41
  222. digitalhub/stores/data/enums.py +4 -0
  223. digitalhub/stores/data/local/__init__.py +3 -0
  224. digitalhub/stores/data/local/store.py +8 -7
  225. digitalhub/stores/data/remote/__init__.py +3 -0
  226. digitalhub/stores/data/remote/store.py +8 -7
  227. digitalhub/stores/data/s3/__init__.py +3 -0
  228. digitalhub/stores/data/s3/configurator.py +69 -80
  229. digitalhub/stores/data/s3/store.py +73 -81
  230. digitalhub/stores/data/s3/utils.py +14 -10
  231. digitalhub/stores/data/sql/__init__.py +3 -0
  232. digitalhub/stores/data/sql/configurator.py +80 -73
  233. digitalhub/stores/data/sql/store.py +195 -102
  234. digitalhub/stores/readers/__init__.py +3 -0
  235. digitalhub/stores/readers/data/__init__.py +3 -0
  236. digitalhub/stores/readers/data/_base/__init__.py +3 -0
  237. digitalhub/stores/readers/data/_base/builder.py +4 -0
  238. digitalhub/stores/readers/data/_base/reader.py +4 -0
  239. digitalhub/stores/readers/data/api.py +4 -0
  240. digitalhub/stores/readers/data/factory.py +4 -0
  241. digitalhub/stores/readers/data/pandas/__init__.py +3 -0
  242. digitalhub/stores/readers/data/pandas/builder.py +4 -0
  243. digitalhub/stores/readers/data/pandas/reader.py +4 -0
  244. digitalhub/stores/readers/query/__init__.py +3 -0
  245. digitalhub/utils/__init__.py +3 -0
  246. digitalhub/utils/enums.py +4 -0
  247. digitalhub/utils/exceptions.py +10 -0
  248. digitalhub/utils/file_utils.py +57 -30
  249. digitalhub/utils/generic_utils.py +45 -33
  250. digitalhub/utils/git_utils.py +28 -14
  251. digitalhub/utils/io_utils.py +23 -18
  252. digitalhub/utils/logger.py +4 -0
  253. digitalhub/utils/types.py +4 -0
  254. digitalhub/utils/uri_utils.py +35 -31
  255. digitalhub-0.13.0.dist-info/METADATA +301 -0
  256. digitalhub-0.13.0.dist-info/RECORD +259 -0
  257. digitalhub-0.13.0.dist-info/licenses/AUTHORS +5 -0
  258. digitalhub-0.13.0.dist-info/licenses/LICENSE +201 -0
  259. digitalhub/entities/_commons/types.py +0 -5
  260. digitalhub/stores/configurator/__init__.py +0 -0
  261. digitalhub/stores/configurator/api.py +0 -31
  262. digitalhub/stores/configurator/configurator.py +0 -198
  263. digitalhub/stores/configurator/credentials_store.py +0 -65
  264. digitalhub/stores/configurator/enums.py +0 -21
  265. digitalhub/stores/configurator/ini_module.py +0 -128
  266. digitalhub/stores/data/s3/enums.py +0 -16
  267. digitalhub/stores/data/sql/enums.py +0 -16
  268. digitalhub/stores/data/utils.py +0 -34
  269. digitalhub-0.11.0b7.dist-info/METADATA +0 -259
  270. digitalhub-0.11.0b7.dist-info/RECORD +0 -261
  271. digitalhub-0.11.0b7.dist-info/licenses/LICENSE.txt +0 -216
  272. {digitalhub-0.11.0b7.dist-info → digitalhub-0.13.0.dist-info}/WHEEL +0 -0
digitalhub/__init__.py CHANGED
@@ -1,3 +1,6 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
1
4
  from digitalhub.entities.artifact.crud import (
2
5
  delete_artifact,
3
6
  get_artifact,
@@ -101,7 +104,7 @@ except ImportError:
101
104
  # Register entities into registry
102
105
  from digitalhub.factory.utils import register_entities, register_runtimes_entities
103
106
  from digitalhub.stores.client.dhcore.utils import refresh_token, set_dhcore_env
104
- from digitalhub.stores.configurator.api import get_current_env, set_current_env
107
+ from digitalhub.stores.credentials.api import get_current_profile, set_current_profile
105
108
 
106
109
  register_entities()
107
110
  register_runtimes_entities()
digitalhub/context/api.py CHANGED
@@ -1,3 +1,7 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
1
5
  from __future__ import annotations
2
6
 
3
7
  import typing
@@ -13,15 +17,15 @@ def build_context(project: Project, overwrite: bool = False) -> Context:
13
17
  """
14
18
  Build a new context for a project.
15
19
 
16
- Creates or updates a context instance for the given project in the global
17
- context registry.
20
+ Creates or updates a context instance for the given project
21
+ in the global context registry.
18
22
 
19
23
  Parameters
20
24
  ----------
21
25
  project : Project
22
26
  The project object used to build the context.
23
27
  overwrite : bool, optional
24
- If True, overwrites existing context if it exists, by default False.
28
+ If True, overwrites existing context if it exists. Default is False.
25
29
 
26
30
  Returns
27
31
  -------
@@ -33,7 +37,7 @@ def build_context(project: Project, overwrite: bool = False) -> Context:
33
37
 
34
38
  def get_context(project: str) -> Context:
35
39
  """
36
- Wrapper for ContextBuilder.get().
40
+ Get the context for a given project name.
37
41
 
38
42
  Parameters
39
43
  ----------
@@ -50,7 +54,7 @@ def get_context(project: str) -> Context:
50
54
 
51
55
  def delete_context(project: str) -> None:
52
56
  """
53
- Wrapper for ContextBuilder.remove().
57
+ Delete the context for a given project name.
54
58
 
55
59
  Parameters
56
60
  ----------
@@ -1,3 +1,7 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
1
5
  from __future__ import annotations
2
6
 
3
7
  import typing
@@ -35,8 +39,7 @@ class ContextBuilder:
35
39
  project : Project
36
40
  The project instance to create a context for.
37
41
  overwrite : bool, optional
38
- If True, overwrites existing context if project name already exists,
39
- by default False.
42
+ If True, overwrites existing context if project name already exists. Default is False.
40
43
 
41
44
  Returns
42
45
  -------
@@ -83,12 +86,11 @@ class ContextBuilder:
83
86
  Returns
84
87
  -------
85
88
  None
86
- This method doesn't return anything.
89
+ This method does not return anything.
87
90
 
88
91
  Notes
89
92
  -----
90
- If the project doesn't exist in the registry, this method
91
- silently does nothing.
93
+ If the project does not exist in the registry, this method silently does nothing.
92
94
  """
93
95
  self._instances.pop(project, None)
94
96
 
@@ -1,3 +1,7 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
1
5
  from __future__ import annotations
2
6
 
3
7
  import typing
@@ -52,6 +56,10 @@ class Context:
52
56
  ----------
53
57
  run_ctx : str
54
58
  The run key to set.
59
+
60
+ Returns
61
+ -------
62
+ None
55
63
  """
56
64
  self.is_running = True
57
65
  self._run_ctx = run_ctx
@@ -59,6 +67,10 @@ class Context:
59
67
  def unset_run(self) -> None:
60
68
  """
61
69
  Clear the current run key and reset running state.
70
+
71
+ Returns
72
+ -------
73
+ None
62
74
  """
63
75
  self.is_running = False
64
76
  self._run_ctx = None
@@ -69,7 +81,7 @@ class Context:
69
81
 
70
82
  Returns
71
83
  -------
72
- str | None
84
+ str or None
73
85
  The current run key if set, None otherwise.
74
86
  """
75
87
  return self._run_ctx
@@ -0,0 +1,3 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
@@ -0,0 +1,3 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
@@ -0,0 +1,3 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
@@ -1,3 +1,7 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
1
5
  from __future__ import annotations
2
6
 
3
7
  from digitalhub.utils.generic_utils import dump_json
@@ -0,0 +1,3 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
@@ -1,3 +1,7 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
1
5
  from __future__ import annotations
2
6
 
3
7
  import typing
@@ -0,0 +1,3 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
@@ -0,0 +1,3 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
@@ -1,3 +1,7 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
1
5
  from __future__ import annotations
2
6
 
3
7
  from pydantic import ValidationError
@@ -1,3 +1,7 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
1
5
  from __future__ import annotations
2
6
 
3
7
  from pydantic import BaseModel, Field
@@ -1,3 +1,7 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
1
5
  from __future__ import annotations
2
6
 
3
7
  import typing
@@ -1,3 +1,7 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
1
5
  from __future__ import annotations
2
6
 
3
7
  import typing
@@ -1,3 +1,7 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
1
5
  from __future__ import annotations
2
6
 
3
7
  from uuid import uuid4
@@ -1,3 +1,7 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
1
5
  from __future__ import annotations
2
6
 
3
7
  import typing
@@ -1,3 +1,7 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
1
5
  from __future__ import annotations
2
6
 
3
7
  import typing
@@ -1,3 +1,7 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
1
5
  from __future__ import annotations
2
6
 
3
7
  from pydantic import BaseModel, ConfigDict, Field
@@ -1,3 +1,7 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
1
5
  from __future__ import annotations
2
6
 
3
7
  from pydantic import BaseModel, ConfigDict
@@ -1,3 +1,7 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
1
5
  from __future__ import annotations
2
6
 
3
7
  from digitalhub.entities._base._base.entity import Base
@@ -0,0 +1,3 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
@@ -1,12 +1,18 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
1
5
  from __future__ import annotations
2
6
 
3
7
  import typing
8
+ from abc import abstractmethod
4
9
 
5
10
  from digitalhub.entities._base.versioned.entity import VersionedEntity
6
11
  from digitalhub.entities._commons.enums import EntityTypes
7
12
  from digitalhub.entities._processors.context import context_processor
8
- from digitalhub.entities.run.crud import delete_run, get_run, list_runs
9
- from digitalhub.entities.task.crud import delete_task
13
+ from digitalhub.entities.run.crud import list_runs
14
+ from digitalhub.entities.task.crud import delete_task, list_tasks
15
+ from digitalhub.entities.trigger.crud import list_triggers
10
16
  from digitalhub.factory.factory import factory
11
17
  from digitalhub.utils.exceptions import EntityAlreadyExistsError, EntityError
12
18
 
@@ -119,13 +125,13 @@ class ExecutableEntity(VersionedEntity):
119
125
  if task_obj.spec.function == self._get_executable_string():
120
126
  self._tasks[task_obj.kind] = task_obj
121
127
 
122
- def new_task(self, task_kind: str, **kwargs) -> Task:
128
+ def new_task(self, kind: str, **kwargs) -> Task:
123
129
  """
124
130
  Create new task. If the task already exists, update it.
125
131
 
126
132
  Parameters
127
133
  ----------
128
- task_kind : str
134
+ kind : str
129
135
  Kind the object.
130
136
  **kwargs : dict
131
137
  Keyword arguments.
@@ -135,21 +141,18 @@ class ExecutableEntity(VersionedEntity):
135
141
  Task
136
142
  New task.
137
143
  """
138
- self._raise_if_exists(task_kind)
139
-
140
- if kwargs is None:
141
- kwargs = {}
144
+ self._raise_if_exists(kind)
142
145
 
143
146
  # Override kwargs
144
147
  kwargs["project"] = self.project
145
148
  kwargs[self.ENTITY_TYPE] = self._get_executable_string()
146
- kwargs["kind"] = task_kind
149
+ kwargs["kind"] = kind
147
150
 
148
151
  # Create object instance
149
152
  task: Task = factory.build_entity_from_params(**kwargs)
150
153
  task.save()
151
154
 
152
- self._tasks[task_kind] = task
155
+ self._tasks[kind] = task
153
156
  return task
154
157
 
155
158
  def get_task(self, kind: str) -> Task:
@@ -180,6 +183,23 @@ class ExecutableEntity(VersionedEntity):
180
183
  self._tasks[kind] = resp[0]
181
184
  return self._tasks[kind]
182
185
 
186
+ def list_task(self, **kwargs) -> list[Task]:
187
+ """
188
+ List tasks.
189
+
190
+ Parameters
191
+ ----------
192
+ **kwargs : dict
193
+ Keyword arguments.
194
+
195
+ Returns
196
+ -------
197
+ list
198
+ List of tasks.
199
+ """
200
+ kwargs["params"] = {self.ENTITY_TYPE: self._get_executable_string()}
201
+ return list_tasks(self.project, **kwargs)
202
+
183
203
  def update_task(self, kind: str, **kwargs) -> Task:
184
204
  """
185
205
  Update task.
@@ -198,9 +218,6 @@ class ExecutableEntity(VersionedEntity):
198
218
  """
199
219
  self._raise_if_not_exists(kind)
200
220
 
201
- if kwargs is None:
202
- kwargs = {}
203
-
204
221
  # Update kwargs
205
222
  kwargs["project"] = self.project
206
223
  kwargs["kind"] = kind
@@ -315,6 +332,12 @@ class ExecutableEntity(VersionedEntity):
315
332
  # Runs
316
333
  ##############################
317
334
 
335
+ @abstractmethod
336
+ def run(self, *args, **kwargs) -> Run:
337
+ """
338
+ Create and execute a new run.
339
+ """
340
+
318
341
  def get_run(
319
342
  self,
320
343
  identifier: str,
@@ -343,13 +366,14 @@ class ExecutableEntity(VersionedEntity):
343
366
  Using entity ID:
344
367
  >>> obj = executable.get_run("123")
345
368
  """
346
- obj = get_run(
347
- identifier=identifier,
348
- project=self.project,
349
- **kwargs,
350
- )
351
- self.refresh()
352
- return obj
369
+ entities = self.list_runs(**kwargs)
370
+ for entity in entities:
371
+ if getattr(entity.spec, self.ENTITY_TYPE) == self._get_executable_string():
372
+ if entity.id == identifier:
373
+ return entity
374
+ if entity.key == identifier:
375
+ return entity
376
+ raise EntityError(f"Run '{identifier}' does not exist or does not belong to this executable.")
353
377
 
354
378
  def list_runs(self, **kwargs) -> list[Run]:
355
379
  """
@@ -369,47 +393,20 @@ class ExecutableEntity(VersionedEntity):
369
393
  --------
370
394
  >>> objs = executable.list_runs()
371
395
  """
372
- if kwargs is None:
373
- kwargs = {}
374
396
  kwargs["params"] = {self.ENTITY_TYPE: self._get_executable_string()}
375
397
  return list_runs(self.project, **kwargs)
376
398
 
377
- def delete_run(
378
- self,
379
- identifier: str,
380
- **kwargs,
381
- ) -> None:
382
- """
383
- Delete run from backend.
384
-
385
- Parameters
386
- ----------
387
- identifier : str
388
- Entity key (store://...) or entity ID.
389
- **kwargs : dict
390
- Parameters to pass to the API call.
391
-
392
- Returns
393
- -------
394
- dict
395
- Response from backend.
396
-
397
- Examples
398
- --------
399
- >>> executable.delete_run("store://my-run-key")
400
-
401
- """
402
- delete_run(
403
- identifier=identifier,
404
- project=self.project,
405
- **kwargs,
406
- )
407
-
408
399
  ##############################
409
400
  # Trigger
410
401
  ##############################
411
402
 
412
- def trigger(self, action: str, trigger_kind: str, trigger_name: str, **kwargs) -> Trigger:
403
+ def trigger(
404
+ self,
405
+ action: str,
406
+ trigger_kind: str,
407
+ trigger_name: str,
408
+ **kwargs,
409
+ ) -> Trigger:
413
410
  """
414
411
  Trigger function.
415
412
 
@@ -435,9 +432,6 @@ class ExecutableEntity(VersionedEntity):
435
432
  # Get run validator for building trigger template
436
433
  run_kind = factory.get_run_kind(self.kind)
437
434
  run_validator: SpecValidator = factory.get_spec_validator(run_kind)
438
- if kwargs is None:
439
- kwargs = {}
440
-
441
435
  # Override kwargs
442
436
  kwargs["project"] = self.project
443
437
  kwargs["kind"] = trigger_kind
@@ -450,3 +444,61 @@ class ExecutableEntity(VersionedEntity):
450
444
  trigger: Trigger = factory.build_entity_from_params(**kwargs)
451
445
  trigger.save()
452
446
  return trigger
447
+
448
+ def get_trigger(
449
+ self,
450
+ identifier: str,
451
+ **kwargs,
452
+ ) -> Trigger:
453
+ """
454
+ Get object from backend.
455
+
456
+ Parameters
457
+ ----------
458
+ identifier : str
459
+ Entity key (store://...) or entity ID.
460
+ **kwargs : dict
461
+ Parameters to pass to the API call.
462
+
463
+ Returns
464
+ -------
465
+ Trigger
466
+ Object instance.
467
+
468
+ Examples
469
+ --------
470
+ Using entity key:
471
+ >>> obj = executable.get_trigger("store://my-trigger-key")
472
+
473
+ Using entity ID:
474
+ >>> obj = executable.get_trigger("123")
475
+ """
476
+ entities = self.list_triggers(**kwargs)
477
+ for entity in entities:
478
+ if getattr(entity.spec, self.ENTITY_TYPE) == self._get_executable_string():
479
+ if entity.id == identifier:
480
+ return entity
481
+ if entity.key == identifier:
482
+ return entity
483
+ raise EntityError(f"Trigger '{identifier}' does not exist or does not belong to this executable.")
484
+
485
+ def list_triggers(self, **kwargs) -> list[Trigger]:
486
+ """
487
+ List all triggers from backend.
488
+
489
+ Parameters
490
+ ----------
491
+ **kwargs : dict
492
+ Parameters to pass to the API call.
493
+
494
+ Returns
495
+ -------
496
+ list[Trigger]
497
+ List of object instances.
498
+
499
+ Examples
500
+ --------
501
+ >>> objs = executable.list_triggers()
502
+ """
503
+ kwargs["params"] = {self.ENTITY_TYPE: self._get_executable_string()}
504
+ return list_triggers(self.project, **kwargs)
@@ -0,0 +1,3 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
@@ -1,3 +1,7 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
1
5
  from __future__ import annotations
2
6
 
3
7
  import typing
@@ -78,10 +82,9 @@ class MaterialEntity(VersionedEntity):
78
82
  list[str]
79
83
  List of file paths.
80
84
  """
81
- store = get_store(self.project, self.spec.path)
82
- paths = self.get_file_paths()
85
+ store = get_store(self.spec.path)
83
86
  dst = store._build_temp()
84
- return store.download(self.spec.path, dst=dst, src=paths)
87
+ return store.download(self.spec.path, dst=dst)
85
88
 
86
89
  def download(
87
90
  self,
@@ -90,10 +93,7 @@ class MaterialEntity(VersionedEntity):
90
93
  ) -> str:
91
94
  """
92
95
  This function downloads one or more file from storage on local
93
- machine.
94
- It looks inside the object's status for the file(s) path under
95
- files attribute. If it does not find it, it will try to download
96
- what it can from spec.path.
96
+ machine from spec.path.
97
97
  The files are downloaded into a destination folder. If the destination
98
98
  is not specified, it will set by default under the context path
99
99
  as '<ctx-root>/<entity_type>', e.g. './dataitem'.
@@ -111,31 +111,24 @@ class MaterialEntity(VersionedEntity):
111
111
  Returns
112
112
  -------
113
113
  str
114
- Downloaded path.
114
+ Download path.
115
115
 
116
116
  Examples
117
117
  --------
118
118
  Download a single file:
119
119
 
120
- >>> entity.status.files[0]
121
- {
122
- "path ": "data.csv",
123
- "name ": "data.csv",
124
- "content_type ": "text/csv;charset=utf-8 "
125
- }
126
120
  >>> path = entity.download()
127
121
  >>> print(path)
128
122
  dataitem/data.csv
129
123
  """
130
- store = get_store(self.project, self.spec.path)
131
- paths = self.get_file_paths()
124
+ store = get_store(self.spec.path)
132
125
 
133
126
  if destination is None:
134
127
  dst = self._context().root / self.ENTITY_TYPE
135
128
  else:
136
129
  dst = Path(destination)
137
130
 
138
- return store.download(self.spec.path, dst=dst, src=paths, overwrite=overwrite)
131
+ return store.download(self.spec.path, dst, overwrite=overwrite)
139
132
 
140
133
  def upload(self, source: SourcesOrListOfSources) -> None:
141
134
  """
@@ -165,7 +158,7 @@ class MaterialEntity(VersionedEntity):
165
158
  >>> entity.upload('./data')
166
159
  """
167
160
  # Get store and upload object
168
- store = get_store(self.project, self.spec.path)
161
+ store = get_store(self.spec.path)
169
162
  paths = store.upload(source, self.spec.path)
170
163
 
171
164
  # Update files info
@@ -189,6 +182,10 @@ class MaterialEntity(VersionedEntity):
189
182
  -------
190
183
  None
191
184
  """
185
+ available = 100 - len(self.status.files)
186
+ if len(files) > available:
187
+ files = files[:available]
188
+
192
189
  path_list = self.get_file_paths()
193
190
  for f in files:
194
191
  if f.get("path") not in path_list:
@@ -1,3 +1,7 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
1
5
  from __future__ import annotations
2
6
 
3
7
  from digitalhub.entities._base.entity.spec import Spec, SpecValidator
@@ -1,3 +1,7 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
1
5
  from __future__ import annotations
2
6
 
3
7
  from digitalhub.entities._base.entity.status import Status
@@ -1,8 +1,12 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
1
5
  from __future__ import annotations
2
6
 
3
7
  from pathlib import Path
4
8
 
5
- from digitalhub.stores.data.utils import get_default_store
9
+ from digitalhub.stores.data.api import get_default_store
6
10
  from digitalhub.utils.file_utils import eval_zip_type
7
11
  from digitalhub.utils.uri_utils import has_local_scheme
8
12
 
@@ -0,0 +1,3 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
@@ -1,3 +1,7 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
1
5
  from __future__ import annotations
2
6
 
3
7
  from digitalhub.utils.exceptions import EntityError
@@ -0,0 +1,3 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0