digitalhub 0.11.0b7__py3-none-any.whl → 0.13.0b0__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 (270) hide show
  1. digitalhub/__init__.py +4 -1
  2. digitalhub/context/api.py +4 -0
  3. digitalhub/context/builder.py +4 -0
  4. digitalhub/context/context.py +4 -0
  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 +11 -0
  25. digitalhub/entities/_base/material/__init__.py +3 -0
  26. digitalhub/entities/_base/material/entity.py +12 -15
  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 +4 -0
  41. digitalhub/entities/_commons/types.py +4 -0
  42. digitalhub/entities/_commons/utils.py +4 -0
  43. digitalhub/entities/_processors/__init__.py +3 -0
  44. digitalhub/entities/_processors/base.py +4 -0
  45. digitalhub/entities/_processors/context.py +5 -1
  46. digitalhub/entities/_processors/utils.py +4 -0
  47. digitalhub/entities/artifact/__init__.py +3 -0
  48. digitalhub/entities/artifact/_base/__init__.py +3 -0
  49. digitalhub/entities/artifact/_base/builder.py +4 -0
  50. digitalhub/entities/artifact/_base/entity.py +4 -0
  51. digitalhub/entities/artifact/_base/spec.py +4 -0
  52. digitalhub/entities/artifact/_base/status.py +4 -0
  53. digitalhub/entities/artifact/artifact/__init__.py +3 -0
  54. digitalhub/entities/artifact/artifact/builder.py +4 -0
  55. digitalhub/entities/artifact/artifact/entity.py +4 -0
  56. digitalhub/entities/artifact/artifact/spec.py +4 -0
  57. digitalhub/entities/artifact/artifact/status.py +4 -0
  58. digitalhub/entities/artifact/crud.py +4 -0
  59. digitalhub/entities/artifact/utils.py +4 -0
  60. digitalhub/entities/builders.py +4 -0
  61. digitalhub/entities/dataitem/__init__.py +3 -0
  62. digitalhub/entities/dataitem/_base/__init__.py +3 -0
  63. digitalhub/entities/dataitem/_base/builder.py +4 -0
  64. digitalhub/entities/dataitem/_base/entity.py +4 -0
  65. digitalhub/entities/dataitem/_base/spec.py +4 -0
  66. digitalhub/entities/dataitem/_base/status.py +4 -0
  67. digitalhub/entities/dataitem/crud.py +4 -0
  68. digitalhub/entities/dataitem/dataitem/__init__.py +3 -0
  69. digitalhub/entities/dataitem/dataitem/builder.py +4 -0
  70. digitalhub/entities/dataitem/dataitem/entity.py +4 -0
  71. digitalhub/entities/dataitem/dataitem/spec.py +4 -0
  72. digitalhub/entities/dataitem/dataitem/status.py +4 -0
  73. digitalhub/entities/dataitem/iceberg/__init__.py +3 -0
  74. digitalhub/entities/dataitem/iceberg/builder.py +4 -0
  75. digitalhub/entities/dataitem/iceberg/entity.py +4 -0
  76. digitalhub/entities/dataitem/iceberg/spec.py +4 -0
  77. digitalhub/entities/dataitem/iceberg/status.py +4 -0
  78. digitalhub/entities/dataitem/table/__init__.py +3 -0
  79. digitalhub/entities/dataitem/table/builder.py +4 -0
  80. digitalhub/entities/dataitem/table/entity.py +4 -0
  81. digitalhub/entities/dataitem/table/models.py +4 -0
  82. digitalhub/entities/dataitem/table/spec.py +4 -0
  83. digitalhub/entities/dataitem/table/status.py +4 -0
  84. digitalhub/entities/dataitem/table/utils.py +4 -0
  85. digitalhub/entities/dataitem/utils.py +4 -0
  86. digitalhub/entities/function/__init__.py +3 -0
  87. digitalhub/entities/function/_base/__init__.py +3 -0
  88. digitalhub/entities/function/_base/builder.py +4 -0
  89. digitalhub/entities/function/_base/entity.py +4 -0
  90. digitalhub/entities/function/_base/spec.py +4 -0
  91. digitalhub/entities/function/_base/status.py +4 -0
  92. digitalhub/entities/function/crud.py +4 -0
  93. digitalhub/entities/model/__init__.py +3 -0
  94. digitalhub/entities/model/_base/__init__.py +3 -0
  95. digitalhub/entities/model/_base/builder.py +4 -0
  96. digitalhub/entities/model/_base/entity.py +4 -0
  97. digitalhub/entities/model/_base/spec.py +4 -0
  98. digitalhub/entities/model/_base/status.py +4 -0
  99. digitalhub/entities/model/crud.py +4 -0
  100. digitalhub/entities/model/huggingface/__init__.py +3 -0
  101. digitalhub/entities/model/huggingface/builder.py +4 -0
  102. digitalhub/entities/model/huggingface/entity.py +4 -0
  103. digitalhub/entities/model/huggingface/spec.py +4 -0
  104. digitalhub/entities/model/huggingface/status.py +4 -0
  105. digitalhub/entities/model/mlflow/__init__.py +3 -0
  106. digitalhub/entities/model/mlflow/builder.py +4 -0
  107. digitalhub/entities/model/mlflow/entity.py +4 -0
  108. digitalhub/entities/model/mlflow/models.py +4 -0
  109. digitalhub/entities/model/mlflow/spec.py +4 -0
  110. digitalhub/entities/model/mlflow/status.py +4 -0
  111. digitalhub/entities/model/mlflow/utils.py +4 -0
  112. digitalhub/entities/model/model/__init__.py +3 -0
  113. digitalhub/entities/model/model/builder.py +4 -0
  114. digitalhub/entities/model/model/entity.py +4 -0
  115. digitalhub/entities/model/model/spec.py +4 -0
  116. digitalhub/entities/model/model/status.py +4 -0
  117. digitalhub/entities/model/sklearn/__init__.py +3 -0
  118. digitalhub/entities/model/sklearn/builder.py +4 -0
  119. digitalhub/entities/model/sklearn/entity.py +4 -0
  120. digitalhub/entities/model/sklearn/spec.py +4 -0
  121. digitalhub/entities/model/sklearn/status.py +4 -0
  122. digitalhub/entities/model/utils.py +4 -0
  123. digitalhub/entities/project/__init__.py +3 -0
  124. digitalhub/entities/project/_base/__init__.py +3 -0
  125. digitalhub/entities/project/_base/builder.py +4 -0
  126. digitalhub/entities/project/_base/entity.py +4 -0
  127. digitalhub/entities/project/_base/models.py +4 -0
  128. digitalhub/entities/project/_base/spec.py +4 -0
  129. digitalhub/entities/project/_base/status.py +4 -0
  130. digitalhub/entities/project/crud.py +4 -0
  131. digitalhub/entities/project/utils.py +4 -0
  132. digitalhub/entities/run/__init__.py +3 -0
  133. digitalhub/entities/run/_base/__init__.py +3 -0
  134. digitalhub/entities/run/_base/builder.py +4 -0
  135. digitalhub/entities/run/_base/entity.py +4 -0
  136. digitalhub/entities/run/_base/spec.py +4 -0
  137. digitalhub/entities/run/_base/status.py +4 -0
  138. digitalhub/entities/run/crud.py +4 -0
  139. digitalhub/entities/secret/__init__.py +3 -0
  140. digitalhub/entities/secret/_base/__init__.py +3 -0
  141. digitalhub/entities/secret/_base/builder.py +4 -0
  142. digitalhub/entities/secret/_base/entity.py +4 -0
  143. digitalhub/entities/secret/_base/spec.py +4 -0
  144. digitalhub/entities/secret/_base/status.py +4 -0
  145. digitalhub/entities/secret/crud.py +4 -0
  146. digitalhub/entities/task/__init__.py +3 -0
  147. digitalhub/entities/task/_base/__init__.py +3 -0
  148. digitalhub/entities/task/_base/builder.py +4 -0
  149. digitalhub/entities/task/_base/entity.py +4 -0
  150. digitalhub/entities/task/_base/models.py +4 -0
  151. digitalhub/entities/task/_base/spec.py +4 -0
  152. digitalhub/entities/task/_base/status.py +4 -0
  153. digitalhub/entities/task/_base/utils.py +4 -0
  154. digitalhub/entities/task/crud.py +4 -0
  155. digitalhub/entities/trigger/__init__.py +3 -0
  156. digitalhub/entities/trigger/_base/__init__.py +3 -0
  157. digitalhub/entities/trigger/_base/builder.py +4 -0
  158. digitalhub/entities/trigger/_base/entity.py +4 -0
  159. digitalhub/entities/trigger/_base/spec.py +4 -0
  160. digitalhub/entities/trigger/_base/status.py +4 -0
  161. digitalhub/entities/trigger/crud.py +4 -0
  162. digitalhub/entities/trigger/lifecycle/__init__.py +3 -0
  163. digitalhub/entities/trigger/lifecycle/builder.py +4 -0
  164. digitalhub/entities/trigger/lifecycle/entity.py +4 -0
  165. digitalhub/entities/trigger/lifecycle/spec.py +4 -0
  166. digitalhub/entities/trigger/lifecycle/status.py +4 -0
  167. digitalhub/entities/trigger/scheduler/__init__.py +3 -0
  168. digitalhub/entities/trigger/scheduler/builder.py +4 -0
  169. digitalhub/entities/trigger/scheduler/entity.py +4 -0
  170. digitalhub/entities/trigger/scheduler/spec.py +4 -0
  171. digitalhub/entities/trigger/scheduler/status.py +4 -0
  172. digitalhub/entities/workflow/__init__.py +3 -0
  173. digitalhub/entities/workflow/_base/__init__.py +3 -0
  174. digitalhub/entities/workflow/_base/builder.py +4 -0
  175. digitalhub/entities/workflow/_base/entity.py +4 -0
  176. digitalhub/entities/workflow/_base/spec.py +4 -0
  177. digitalhub/entities/workflow/_base/status.py +4 -0
  178. digitalhub/entities/workflow/crud.py +4 -0
  179. digitalhub/factory/__init__.py +3 -0
  180. digitalhub/factory/factory.py +4 -0
  181. digitalhub/factory/utils.py +4 -0
  182. digitalhub/runtimes/__init__.py +3 -0
  183. digitalhub/runtimes/_base.py +4 -0
  184. digitalhub/runtimes/builder.py +4 -0
  185. digitalhub/runtimes/enums.py +4 -0
  186. digitalhub/stores/__init__.py +3 -0
  187. digitalhub/stores/client/__init__.py +3 -0
  188. digitalhub/stores/client/_base/__init__.py +3 -0
  189. digitalhub/stores/client/_base/api_builder.py +4 -0
  190. digitalhub/stores/client/_base/client.py +4 -0
  191. digitalhub/stores/client/_base/key_builder.py +4 -0
  192. digitalhub/stores/client/_base/params_builder.py +4 -0
  193. digitalhub/stores/client/api.py +4 -0
  194. digitalhub/stores/client/builder.py +4 -0
  195. digitalhub/stores/client/dhcore/__init__.py +3 -0
  196. digitalhub/stores/client/dhcore/api_builder.py +4 -0
  197. digitalhub/stores/client/dhcore/client.py +60 -19
  198. digitalhub/stores/client/dhcore/configurator.py +282 -183
  199. digitalhub/stores/client/dhcore/enums.py +6 -0
  200. digitalhub/stores/client/dhcore/error_parser.py +4 -0
  201. digitalhub/stores/client/dhcore/key_builder.py +4 -0
  202. digitalhub/stores/client/dhcore/models.py +4 -0
  203. digitalhub/stores/client/dhcore/params_builder.py +4 -0
  204. digitalhub/stores/client/dhcore/utils.py +12 -8
  205. digitalhub/stores/client/local/__init__.py +3 -0
  206. digitalhub/stores/client/local/api_builder.py +4 -0
  207. digitalhub/stores/client/local/client.py +4 -0
  208. digitalhub/stores/client/local/enums.py +4 -0
  209. digitalhub/stores/client/local/key_builder.py +4 -0
  210. digitalhub/stores/client/local/params_builder.py +4 -0
  211. digitalhub/stores/credentials/__init__.py +3 -0
  212. digitalhub/stores/{configurator → credentials}/api.py +7 -3
  213. digitalhub/stores/credentials/configurator.py +37 -0
  214. digitalhub/stores/credentials/enums.py +54 -0
  215. digitalhub/stores/credentials/handler.py +148 -0
  216. digitalhub/stores/{configurator → credentials}/ini_module.py +5 -1
  217. digitalhub/stores/credentials/store.py +49 -0
  218. digitalhub/stores/data/__init__.py +3 -0
  219. digitalhub/stores/data/_base/__init__.py +3 -0
  220. digitalhub/stores/data/_base/store.py +23 -6
  221. digitalhub/stores/data/api.py +41 -1
  222. digitalhub/stores/data/builder.py +50 -53
  223. digitalhub/stores/data/enums.py +4 -0
  224. digitalhub/stores/data/local/__init__.py +3 -0
  225. digitalhub/stores/data/local/store.py +8 -7
  226. digitalhub/stores/data/remote/__init__.py +3 -0
  227. digitalhub/stores/data/remote/store.py +8 -7
  228. digitalhub/stores/data/s3/__init__.py +3 -0
  229. digitalhub/stores/data/s3/configurator.py +40 -92
  230. digitalhub/stores/data/s3/store.py +46 -57
  231. digitalhub/stores/data/s3/utils.py +5 -1
  232. digitalhub/stores/data/sql/__init__.py +3 -0
  233. digitalhub/stores/data/sql/configurator.py +39 -83
  234. digitalhub/stores/data/sql/store.py +19 -15
  235. digitalhub/stores/readers/__init__.py +3 -0
  236. digitalhub/stores/readers/data/__init__.py +3 -0
  237. digitalhub/stores/readers/data/_base/__init__.py +3 -0
  238. digitalhub/stores/readers/data/_base/builder.py +4 -0
  239. digitalhub/stores/readers/data/_base/reader.py +4 -0
  240. digitalhub/stores/readers/data/api.py +4 -0
  241. digitalhub/stores/readers/data/factory.py +4 -0
  242. digitalhub/stores/readers/data/pandas/__init__.py +3 -0
  243. digitalhub/stores/readers/data/pandas/builder.py +4 -0
  244. digitalhub/stores/readers/data/pandas/reader.py +4 -0
  245. digitalhub/stores/readers/query/__init__.py +3 -0
  246. digitalhub/utils/__init__.py +3 -0
  247. digitalhub/utils/enums.py +4 -0
  248. digitalhub/utils/exceptions.py +4 -0
  249. digitalhub/utils/file_utils.py +4 -0
  250. digitalhub/utils/generic_utils.py +4 -0
  251. digitalhub/utils/git_utils.py +4 -0
  252. digitalhub/utils/io_utils.py +4 -0
  253. digitalhub/utils/logger.py +4 -0
  254. digitalhub/utils/types.py +4 -0
  255. digitalhub/utils/uri_utils.py +4 -0
  256. digitalhub-0.13.0b0.dist-info/METADATA +301 -0
  257. digitalhub-0.13.0b0.dist-info/RECORD +260 -0
  258. digitalhub-0.13.0b0.dist-info/licenses/AUTHORS +5 -0
  259. digitalhub-0.13.0b0.dist-info/licenses/LICENSE +201 -0
  260. digitalhub/stores/configurator/__init__.py +0 -0
  261. digitalhub/stores/configurator/configurator.py +0 -198
  262. digitalhub/stores/configurator/credentials_store.py +0 -65
  263. digitalhub/stores/configurator/enums.py +0 -21
  264. digitalhub/stores/data/s3/enums.py +0 -16
  265. digitalhub/stores/data/sql/enums.py +0 -16
  266. digitalhub/stores/data/utils.py +0 -34
  267. digitalhub-0.11.0b7.dist-info/METADATA +0 -259
  268. digitalhub-0.11.0b7.dist-info/RECORD +0 -261
  269. digitalhub-0.11.0b7.dist-info/licenses/LICENSE.txt +0 -216
  270. {digitalhub-0.11.0b7.dist-info → digitalhub-0.13.0b0.dist-info}/WHEEL +0 -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 BaseModel
@@ -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._commons.enums import ApiCategories, BackendOperations
@@ -1,10 +1,14 @@
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 os
4
8
  import typing
5
9
 
6
10
  from digitalhub.stores.client.api import get_client
7
- from digitalhub.stores.client.dhcore.enums import DhcoreEnvVar
11
+ from digitalhub.stores.credentials.enums import CredsEnvVar
8
12
 
9
13
  if typing.TYPE_CHECKING:
10
14
  from digitalhub.stores.client.dhcore.client import ClientDHCore
@@ -43,20 +47,20 @@ def set_dhcore_env(
43
47
  None
44
48
  """
45
49
  if endpoint is not None:
46
- os.environ[DhcoreEnvVar.ENDPOINT.value] = endpoint
50
+ os.environ[CredsEnvVar.DHCORE_ENDPOINT.value] = endpoint
47
51
  if user is not None:
48
- os.environ[DhcoreEnvVar.USER.value] = user
52
+ os.environ[CredsEnvVar.DHCORE_USER.value] = user
49
53
  if password is not None:
50
- os.environ[DhcoreEnvVar.PASSWORD.value] = password
54
+ os.environ[CredsEnvVar.DHCORE_PASSWORD.value] = password
51
55
  if access_token is not None:
52
- os.environ[DhcoreEnvVar.ACCESS_TOKEN.value] = access_token
56
+ os.environ[CredsEnvVar.DHCORE_ACCESS_TOKEN.value] = access_token
53
57
  if refresh_token is not None:
54
- os.environ[DhcoreEnvVar.REFRESH_TOKEN.value] = refresh_token
58
+ os.environ[CredsEnvVar.DHCORE_REFRESH_TOKEN.value] = refresh_token
55
59
  if client_id is not None:
56
- os.environ[DhcoreEnvVar.CLIENT_ID.value] = client_id
60
+ os.environ[CredsEnvVar.DHCORE_CLIENT_ID.value] = client_id
57
61
 
58
62
  client: ClientDHCore = get_client(local=False)
59
- client._configurator.configure()
63
+ client._configurator.load_env_vars()
60
64
 
61
65
 
62
66
  def refresh_token() -> None:
@@ -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.entities._commons.enums import ApiCategories, BackendOperations
@@ -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 copy import deepcopy
@@ -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 enum import Enum
@@ -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.stores.client._base.key_builder import ClientKeyBuilder
@@ -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._commons.enums import ApiCategories, BackendOperations
@@ -0,0 +1,3 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
@@ -1,6 +1,10 @@
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
- from digitalhub.stores.configurator.configurator import configurator
7
+ from digitalhub.stores.credentials.handler import creds_handler
4
8
 
5
9
 
6
10
  def set_current_env(environment: str) -> None:
@@ -16,7 +20,7 @@ def set_current_env(environment: str) -> None:
16
20
  -------
17
21
  None
18
22
  """
19
- configurator.set_current_env(environment)
23
+ creds_handler.set_current_env(environment)
20
24
 
21
25
 
22
26
  def get_current_env() -> str:
@@ -28,4 +32,4 @@ def get_current_env() -> str:
28
32
  str
29
33
  Credentials set name.
30
34
  """
31
- return configurator.get_current_env()
35
+ return creds_handler.get_current_env()
@@ -0,0 +1,37 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ from __future__ import annotations
6
+
7
+ from abc import abstractmethod
8
+
9
+ from digitalhub.stores.credentials.enums import CredsOrigin
10
+ from digitalhub.stores.credentials.handler import creds_handler
11
+
12
+
13
+ class Configurator:
14
+ # Must be set in implementing class
15
+ keys: list[str] = []
16
+ required_keys: list[str] = []
17
+
18
+ # Origin of the credentials
19
+ _env = CredsOrigin.ENV.value
20
+ _file = CredsOrigin.FILE.value
21
+
22
+ # Credentials handler
23
+ _creds_handler = creds_handler
24
+
25
+ def get_credentials(self, origin: str) -> dict:
26
+ return creds_handler.get_credentials(origin)
27
+
28
+ @abstractmethod
29
+ def load_configs(self) -> None:
30
+ ...
31
+
32
+ def _check_credentials(self, creds: dict) -> list[str]:
33
+ missing_keys = []
34
+ for k, v in creds.items():
35
+ if v is None and k in self.required_keys:
36
+ missing_keys.append(k)
37
+ return missing_keys
@@ -0,0 +1,54 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ from __future__ import annotations
6
+
7
+ from enum import Enum
8
+
9
+
10
+ class CredsOrigin(Enum):
11
+ """
12
+ List credential origins.
13
+ """
14
+
15
+ ENV = "env"
16
+ FILE = "file"
17
+
18
+
19
+ class SetCreds(Enum):
20
+ """
21
+ List supported environments.
22
+ """
23
+
24
+ DEFAULT = "__default"
25
+ DH_ENV = "DH_NAME"
26
+
27
+
28
+ class CredsEnvVar(Enum):
29
+ # S3
30
+ S3_ENDPOINT_URL = "AWS_ENDPOINT_URL"
31
+ S3_ACCESS_KEY_ID = "AWS_ACCESS_KEY_ID"
32
+ S3_SECRET_ACCESS_KEY = "AWS_SECRET_ACCESS_KEY"
33
+ S3_SESSION_TOKEN = "AWS_SESSION_TOKEN"
34
+ S3_REGION = "AWS_REGION"
35
+ S3_SIGNATURE_VERSION = "S3_SIGNATURE_VERSION"
36
+
37
+ # SQL
38
+ DB_HOST = "DB_HOST"
39
+ DB_PORT = "DB_PORT"
40
+ DB_USERNAME = "DB_USERNAME"
41
+ DB_PASSWORD = "DB_PASSWORD"
42
+ DB_DATABASE = "DB_DATABASE"
43
+ DB_PG_SCHEMA = "DB_SCHEMA"
44
+
45
+ # DHCORE
46
+ DHCORE_ENDPOINT = "DHCORE_ENDPOINT"
47
+ DHCORE_ISSUER = "DHCORE_ISSUER"
48
+ DHCORE_USER = "DHCORE_USER"
49
+ DHCORE_PASSWORD = "DHCORE_PASSWORD"
50
+ DHCORE_CLIENT_ID = "DHCORE_CLIENT_ID"
51
+ DHCORE_ACCESS_TOKEN = "DHCORE_ACCESS_TOKEN"
52
+ DHCORE_REFRESH_TOKEN = "DHCORE_REFRESH_TOKEN"
53
+ DHCORE_PERSONAL_ACCESS_TOKEN = "DHCORE_PERSONAL_ACCESS_TOKEN"
54
+ DHCORE_WORKFLOW_IMAGE = "DHCORE_WORKFLOW_IMAGE"
@@ -0,0 +1,148 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ from __future__ import annotations
6
+
7
+ import os
8
+
9
+ from digitalhub.stores.credentials.enums import SetCreds
10
+ from digitalhub.stores.credentials.ini_module import load_from_file, read_env_from_file, set_current_env, write_config
11
+ from digitalhub.stores.credentials.store import CredentialsStore
12
+
13
+
14
+ class CredentialHandler:
15
+ """
16
+ Configurator object used to configure clients and store credentials.
17
+ """
18
+
19
+ def __init__(self) -> None:
20
+ # Store
21
+ self._creds_store = CredentialsStore()
22
+
23
+ # Current credentials set (__default by default)
24
+ self._environment = os.getenv(SetCreds.DH_ENV.value, SetCreds.DEFAULT.value)
25
+
26
+ ##############################
27
+ # Public methods
28
+ ##############################
29
+
30
+ def set_current_env(self, creds_set: str) -> None:
31
+ """
32
+ Set the current credentials set.
33
+
34
+ Parameters
35
+ ----------
36
+ creds_set : str
37
+ Credentials set name.
38
+
39
+ Returns
40
+ -------
41
+ None
42
+ """
43
+ self._environment = creds_set
44
+ set_current_env(creds_set)
45
+
46
+ def get_current_env(self) -> str:
47
+ """
48
+ Get the current credentials set.
49
+
50
+ Returns
51
+ -------
52
+ str
53
+ Credentials set name.
54
+ """
55
+ return self._environment
56
+
57
+ def load_from_env(self, var: str) -> str | None:
58
+ """
59
+ Load variable from env.
60
+
61
+ Parameters
62
+ ----------
63
+ var : str
64
+ Environment variable name.
65
+
66
+ Returns
67
+ -------
68
+ str | None
69
+ Environment variable value.
70
+ """
71
+ env_var = os.getenv(var)
72
+ if env_var != "":
73
+ return env_var
74
+
75
+ def load_from_file(self, var: str) -> str | None:
76
+ """
77
+ Load variable from config file.
78
+
79
+ Parameters
80
+ ----------
81
+ var : str
82
+ Environment variable name.
83
+
84
+ Returns
85
+ -------
86
+ str | None
87
+ Environment variable value.
88
+ """
89
+ env_from_file = read_env_from_file()
90
+ if env_from_file is not None:
91
+ self._environment = env_from_file
92
+ return load_from_file(var)
93
+
94
+ def write_env(self, creds: dict) -> None:
95
+ """
96
+ Write the env variables to the .dhcore file.
97
+
98
+ Parameters
99
+ ----------
100
+ creds : dict
101
+ Credentials.
102
+
103
+ Returns
104
+ -------
105
+ None
106
+ """
107
+ write_config(creds, self._environment)
108
+
109
+ ##############################
110
+ # Credentials store methods
111
+ ##############################
112
+
113
+ def set_credentials(self, origin: str, creds: dict) -> None:
114
+ """
115
+ Set credentials.
116
+
117
+ Parameters
118
+ ----------
119
+ origin : str
120
+ The origin of the credentials.
121
+ creds : dict
122
+ The credentials.
123
+
124
+ Returns
125
+ -------
126
+ None
127
+ """
128
+ self._creds_store.set_credentials(self._environment, origin, creds)
129
+
130
+ def get_credentials(self, origin: str) -> dict:
131
+ """
132
+ Get credentials from origin.
133
+
134
+ Parameters
135
+ ----------
136
+ origin : str
137
+ The origin of the credentials.
138
+
139
+ Returns
140
+ -------
141
+ dict
142
+ The credentials.
143
+ """
144
+ return self._creds_store.get_credentials(self._environment, origin)
145
+
146
+
147
+ # Define global configurator
148
+ creds_handler = CredentialHandler()
@@ -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 configparser import ConfigParser
@@ -79,7 +83,7 @@ def write_config(creds: dict, environment: str) -> None:
79
83
 
80
84
  cfg["DEFAULT"]["current_environment"] = environment
81
85
  for k, v in creds.items():
82
- cfg[environment][k] = v
86
+ cfg[environment][k] = str(v)
83
87
 
84
88
  ENV_FILE.touch(exist_ok=True)
85
89
  with open(ENV_FILE, "w") as inifile:
@@ -0,0 +1,49 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ from __future__ import annotations
6
+
7
+ from typing import Any
8
+
9
+ from digitalhub.stores.credentials.enums import CredsOrigin
10
+
11
+
12
+ class CredentialsStore:
13
+ """
14
+ Credentials store to store and retrieve credentials.
15
+ """
16
+
17
+ def __init__(self) -> None:
18
+ self._file_creds: dict[str, dict[str, Any]] = {}
19
+ self._env_creds: dict[str, Any] = {}
20
+
21
+ def set_credentials(
22
+ self,
23
+ profile: str,
24
+ origin: str,
25
+ credentials: dict[str, Any],
26
+ ) -> None:
27
+ """
28
+ Set all credentials for a given profile and origin.
29
+ """
30
+ if origin == CredsOrigin.ENV.value:
31
+ for key, value in credentials.items():
32
+ self._env_creds[key] = value
33
+ return
34
+ if profile not in self._file_creds:
35
+ self._file_creds[profile] = {}
36
+ for key, value in credentials.items():
37
+ self._file_creds[profile][key] = value
38
+
39
+ def get_credentials(
40
+ self,
41
+ profile: str,
42
+ origin: str,
43
+ ) -> dict[str, Any]:
44
+ """
45
+ Get all credentials for a given profile and origin.
46
+ """
47
+ if origin == CredsOrigin.ENV.value:
48
+ return self._env_creds
49
+ return self._file_creds[profile]
@@ -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
  import typing
@@ -12,6 +16,7 @@ from digitalhub.utils.types import SourcesOrListOfSources
12
16
  from digitalhub.utils.uri_utils import has_local_scheme
13
17
 
14
18
  if typing.TYPE_CHECKING:
19
+ from digitalhub.stores.credentials.configurator import Configurator
15
20
  from digitalhub.stores.readers.data._base.reader import DataframeReader
16
21
 
17
22
 
@@ -20,6 +25,9 @@ class Store:
20
25
  Store abstract class.
21
26
  """
22
27
 
28
+ def __init__(self, configurator: Configurator | None = None) -> None:
29
+ self._configurator = configurator
30
+
23
31
  ##############################
24
32
  # I/O methods
25
33
  ##############################
@@ -27,19 +35,22 @@ class Store:
27
35
  @abstractmethod
28
36
  def download(
29
37
  self,
30
- root: str,
38
+ src: str,
31
39
  dst: Path,
32
- src: list[str],
33
40
  overwrite: bool = False,
34
41
  ) -> str:
35
42
  """
36
- Method to download artifact from storage.
43
+ Method to download material entity from storage.
37
44
  """
38
45
 
39
46
  @abstractmethod
40
- def upload(self, src: SourcesOrListOfSources, dst: str) -> list[tuple[str, str]]:
47
+ def upload(
48
+ self,
49
+ src: SourcesOrListOfSources,
50
+ dst: str,
51
+ ) -> list[tuple[str, str]]:
41
52
  """
42
- Method to upload artifact to storage.
53
+ Method to upload material entity to storage.
43
54
  """
44
55
 
45
56
  @abstractmethod
@@ -79,7 +90,13 @@ class Store:
79
90
  """
80
91
 
81
92
  @abstractmethod
82
- def write_df(self, df: Any, dst: str, extension: str | None = None, **kwargs) -> str:
93
+ def write_df(
94
+ self,
95
+ df: Any,
96
+ dst: str,
97
+ extension: str | None = None,
98
+ **kwargs,
99
+ ) -> str:
83
100
  """
84
101
  Write DataFrame as parquet or csv.
85
102
  """
@@ -1,13 +1,53 @@
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
4
8
 
9
+ from digitalhub.context.api import get_context
10
+ from digitalhub.stores.credentials.handler import creds_handler
5
11
  from digitalhub.stores.data.builder import store_builder
12
+ from digitalhub.stores.data.enums import StoreEnv
6
13
 
7
14
  if typing.TYPE_CHECKING:
8
15
  from digitalhub.stores.data._base.store import Store
9
16
 
10
17
 
18
+ def get_default_store(project: str) -> str:
19
+ """
20
+ Get default store URI.
21
+
22
+ Parameters
23
+ ----------
24
+ project : str
25
+ Project name.
26
+
27
+ Returns
28
+ -------
29
+ str
30
+ Default store URI.
31
+ """
32
+ context = get_context(project)
33
+ store = context.config.get(StoreEnv.DEFAULT_FILES_STORE.value.lower())
34
+ if store is not None:
35
+ return store
36
+
37
+ store = creds_handler.load_from_env(StoreEnv.DEFAULT_FILES_STORE.value)
38
+ if store is None:
39
+ store = creds_handler.load_from_file(StoreEnv.DEFAULT_FILES_STORE.value)
40
+
41
+ if store is None or store == "":
42
+ raise ValueError(
43
+ "No default store found. "
44
+ "Please set a default store "
45
+ f"in your environment (e.g. export {StoreEnv.DEFAULT_FILES_STORE.value}=) "
46
+ "or set it in project config."
47
+ )
48
+ return store
49
+
50
+
11
51
  def get_store(project: str, uri: str) -> Store:
12
52
  """
13
53
  Get store instance by URI.
@@ -26,4 +66,4 @@ def get_store(project: str, uri: str) -> Store:
26
66
  Store
27
67
  Store instance.
28
68
  """
29
- return store_builder.get(project, uri)
69
+ return store_builder.get(uri)