digitalhub 0.14.0b2__py3-none-any.whl → 0.14.0b4__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.
- digitalhub/context/builder.py +0 -4
- digitalhub/context/context.py +12 -8
- digitalhub/entities/_base/_base/entity.py +0 -4
- digitalhub/entities/_base/context/entity.py +1 -1
- digitalhub/entities/_base/entity/entity.py +0 -8
- digitalhub/entities/_base/executable/entity.py +161 -79
- digitalhub/entities/_base/material/entity.py +7 -23
- digitalhub/entities/_base/material/utils.py +28 -0
- digitalhub/entities/_base/unversioned/entity.py +1 -1
- digitalhub/entities/_base/versioned/entity.py +1 -1
- digitalhub/entities/_commons/enums.py +0 -31
- digitalhub/entities/_constructors/_resources.py +151 -0
- digitalhub/entities/_constructors/name.py +18 -0
- digitalhub/entities/_processors/base/__init__.py +3 -0
- digitalhub/entities/_processors/{base.py → base/crud.py} +7 -227
- digitalhub/entities/_processors/base/import_export.py +122 -0
- digitalhub/entities/_processors/base/processor.py +302 -0
- digitalhub/entities/_processors/base/special_ops.py +108 -0
- digitalhub/entities/_processors/context/__init__.py +3 -0
- digitalhub/entities/_processors/context/crud.py +654 -0
- digitalhub/entities/_processors/context/import_export.py +242 -0
- digitalhub/entities/_processors/context/material.py +123 -0
- digitalhub/entities/_processors/context/processor.py +400 -0
- digitalhub/entities/_processors/context/special_ops.py +476 -0
- digitalhub/entities/_processors/processors.py +12 -0
- digitalhub/entities/_processors/utils.py +2 -1
- digitalhub/entities/artifact/crud.py +45 -41
- digitalhub/entities/dataitem/crud.py +45 -37
- digitalhub/entities/dataitem/table/entity.py +5 -6
- digitalhub/entities/function/crud.py +47 -43
- digitalhub/entities/model/_base/entity.py +3 -23
- digitalhub/entities/model/crud.py +45 -39
- digitalhub/entities/project/_base/entity.py +45 -134
- digitalhub/entities/project/crud.py +13 -42
- digitalhub/entities/run/_base/builder.py +0 -4
- digitalhub/entities/run/_base/entity.py +4 -60
- digitalhub/entities/run/crud.py +61 -40
- digitalhub/entities/secret/_base/entity.py +1 -5
- digitalhub/entities/secret/crud.py +14 -42
- digitalhub/entities/task/_base/builder.py +0 -4
- digitalhub/entities/task/_base/entity.py +1 -1
- digitalhub/entities/task/crud.py +47 -44
- digitalhub/entities/trigger/_base/entity.py +1 -5
- digitalhub/entities/trigger/crud.py +51 -43
- digitalhub/entities/workflow/crud.py +47 -40
- digitalhub/factory/registry.py +0 -24
- digitalhub/stores/client/_base/enums.py +39 -0
- digitalhub/stores/client/_base/key_builder.py +1 -1
- digitalhub/stores/client/_base/params_builder.py +48 -0
- digitalhub/stores/client/dhcore/api_builder.py +2 -1
- digitalhub/stores/client/dhcore/client.py +67 -73
- digitalhub/stores/client/dhcore/configurator.py +5 -28
- digitalhub/stores/client/dhcore/error_parser.py +0 -4
- digitalhub/stores/client/dhcore/params_builder.py +130 -75
- digitalhub/stores/client/local/api_builder.py +1 -1
- digitalhub/stores/client/local/params_builder.py +18 -41
- digitalhub/stores/credentials/configurator.py +0 -24
- digitalhub/stores/credentials/handler.py +0 -12
- digitalhub/stores/credentials/store.py +0 -4
- digitalhub/stores/data/_base/store.py +0 -16
- digitalhub/stores/data/builder.py +0 -4
- digitalhub/stores/data/remote/store.py +0 -4
- digitalhub/stores/data/s3/configurator.py +0 -8
- digitalhub/stores/data/s3/store.py +8 -17
- digitalhub/stores/data/sql/configurator.py +0 -8
- digitalhub/stores/data/sql/store.py +0 -4
- digitalhub/stores/readers/data/factory.py +0 -8
- digitalhub/stores/readers/data/pandas/reader.py +0 -16
- digitalhub/utils/io_utils.py +0 -4
- {digitalhub-0.14.0b2.dist-info → digitalhub-0.14.0b4.dist-info}/METADATA +1 -1
- {digitalhub-0.14.0b2.dist-info → digitalhub-0.14.0b4.dist-info}/RECORD +74 -62
- digitalhub/entities/_processors/context.py +0 -1499
- {digitalhub-0.14.0b2.dist-info → digitalhub-0.14.0b4.dist-info}/WHEEL +0 -0
- {digitalhub-0.14.0b2.dist-info → digitalhub-0.14.0b4.dist-info}/licenses/AUTHORS +0 -0
- {digitalhub-0.14.0b2.dist-info → digitalhub-0.14.0b4.dist-info}/licenses/LICENSE +0 -0
|
@@ -47,10 +47,6 @@ class ClientDHCoreConfigurator(Configurator):
|
|
|
47
47
|
def __init__(self) -> None:
|
|
48
48
|
"""
|
|
49
49
|
Initialize DHCore configurator and evaluate authentication type.
|
|
50
|
-
|
|
51
|
-
Returns
|
|
52
|
-
-------
|
|
53
|
-
None
|
|
54
50
|
"""
|
|
55
51
|
super().__init__()
|
|
56
52
|
self._auth_type: str | None = None
|
|
@@ -66,10 +62,6 @@ class ClientDHCoreConfigurator(Configurator):
|
|
|
66
62
|
|
|
67
63
|
Sanitizes endpoint and issuer URLs to ensure proper HTTP/HTTPS schemes
|
|
68
64
|
and removes trailing slashes.
|
|
69
|
-
|
|
70
|
-
Returns
|
|
71
|
-
-------
|
|
72
|
-
None
|
|
73
65
|
"""
|
|
74
66
|
env_creds = self._creds_handler.load_from_env(self.keys)
|
|
75
67
|
env_creds = self._sanitize_env_vars(env_creds)
|
|
@@ -107,10 +99,6 @@ class ClientDHCoreConfigurator(Configurator):
|
|
|
107
99
|
|
|
108
100
|
Handles keys without "DHCORE_" prefix for CLI compatibility. Falls back
|
|
109
101
|
to environment variables for missing endpoint and personal access token values.
|
|
110
|
-
|
|
111
|
-
Returns
|
|
112
|
-
-------
|
|
113
|
-
None
|
|
114
102
|
"""
|
|
115
103
|
file_creds = self._creds_handler.load_from_file(self.keys)
|
|
116
104
|
|
|
@@ -119,6 +107,11 @@ class ClientDHCoreConfigurator(Configurator):
|
|
|
119
107
|
if file_creds[pat] is None:
|
|
120
108
|
file_creds[pat] = self._creds_handler.load_from_env([pat]).get(pat)
|
|
121
109
|
|
|
110
|
+
# Because in the response there is no endpoint
|
|
111
|
+
endpoint = CredsEnvVar.DHCORE_ENDPOINT.value
|
|
112
|
+
if file_creds[endpoint] is None:
|
|
113
|
+
file_creds[endpoint] = self._creds_handler.load_from_env([endpoint]).get(endpoint)
|
|
114
|
+
|
|
122
115
|
file_creds = self._sanitize_file_vars(file_creds)
|
|
123
116
|
self._creds_handler.set_credentials(self._file, file_creds)
|
|
124
117
|
|
|
@@ -208,10 +201,6 @@ class ClientDHCoreConfigurator(Configurator):
|
|
|
208
201
|
|
|
209
202
|
Changes between environment and file credential sources, then re-evaluates
|
|
210
203
|
authentication type based on the new credentials.
|
|
211
|
-
|
|
212
|
-
Returns
|
|
213
|
-
-------
|
|
214
|
-
None
|
|
215
204
|
"""
|
|
216
205
|
super().change_origin()
|
|
217
206
|
|
|
@@ -230,10 +219,6 @@ class ClientDHCoreConfigurator(Configurator):
|
|
|
230
219
|
OAUTH2 (access + refresh tokens), ACCESS_TOKEN (access only), BASIC
|
|
231
220
|
(username + password). For EXCHANGE type, automatically exchanges the
|
|
232
221
|
personal access token and switches to file-based credentials storage.
|
|
233
|
-
|
|
234
|
-
Returns
|
|
235
|
-
-------
|
|
236
|
-
None
|
|
237
222
|
"""
|
|
238
223
|
creds = creds_handler.get_credentials(self._origin)
|
|
239
224
|
self._auth_type = self._eval_auth_type(creds)
|
|
@@ -305,10 +290,6 @@ class ClientDHCoreConfigurator(Configurator):
|
|
|
305
290
|
change_origin : bool, default False
|
|
306
291
|
Whether to switch credential sources on auth failure.
|
|
307
292
|
|
|
308
|
-
Returns
|
|
309
|
-
-------
|
|
310
|
-
None
|
|
311
|
-
|
|
312
293
|
Raises
|
|
313
294
|
------
|
|
314
295
|
ClientError
|
|
@@ -462,10 +443,6 @@ class ClientDHCoreConfigurator(Configurator):
|
|
|
462
443
|
----------
|
|
463
444
|
response : dict
|
|
464
445
|
OAuth2 token response with new credentials.
|
|
465
|
-
|
|
466
|
-
Returns
|
|
467
|
-
-------
|
|
468
|
-
None
|
|
469
446
|
"""
|
|
470
447
|
for key in self.keys_to_prefix:
|
|
471
448
|
key = key.lower()
|
|
@@ -4,9 +4,13 @@
|
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
7
|
-
from digitalhub.
|
|
7
|
+
from digitalhub.stores.client._base.enums import ApiCategories, BackendOperations
|
|
8
8
|
from digitalhub.stores.client._base.params_builder import ClientParametersBuilder
|
|
9
9
|
|
|
10
|
+
DEFAULT_START_PAGE = 0
|
|
11
|
+
DEFAULT_SIZE = 25
|
|
12
|
+
DEFAULT_SORT = "metadata.updated,DESC"
|
|
13
|
+
|
|
10
14
|
|
|
11
15
|
class ClientDHCoreParametersBuilder(ClientParametersBuilder):
|
|
12
16
|
"""
|
|
@@ -33,11 +37,6 @@ class ClientDHCoreParametersBuilder(ClientParametersBuilder):
|
|
|
33
37
|
"""
|
|
34
38
|
Build HTTP request parameters for DHCore API calls.
|
|
35
39
|
|
|
36
|
-
Routes parameter building to appropriate method based on API category
|
|
37
|
-
(base or context operations) and applies operation-specific transformations.
|
|
38
|
-
Acts as dispatcher, initializing parameter dictionaries with 'params' key
|
|
39
|
-
for query parameters.
|
|
40
|
-
|
|
41
40
|
Parameters
|
|
42
41
|
----------
|
|
43
42
|
category : str
|
|
@@ -61,108 +60,105 @@ class ClientDHCoreParametersBuilder(ClientParametersBuilder):
|
|
|
61
60
|
|
|
62
61
|
def build_parameters_base(self, operation: str, **kwargs) -> dict:
|
|
63
62
|
"""
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
Constructs HTTP request parameters for project-level operations and
|
|
67
|
-
entity sharing functionality. Handles CASCADE (boolean to lowercase string),
|
|
68
|
-
SHARE (user parameter to query params), and UNSHARE (requires unshare=True
|
|
69
|
-
and entity id).
|
|
63
|
+
Constructs HTTP request parameters for project operations.
|
|
70
64
|
|
|
71
65
|
Parameters
|
|
72
66
|
----------
|
|
73
67
|
operation : str
|
|
74
|
-
API operation
|
|
75
|
-
or SHARE (entity sharing/unsharing with users).
|
|
68
|
+
API operation.
|
|
76
69
|
**kwargs : dict
|
|
77
|
-
Operation-specific parameters
|
|
78
|
-
- cascade (bool): For DELETE, whether to cascade delete
|
|
79
|
-
- user (str): For SHARE, target user for sharing
|
|
80
|
-
- unshare (bool): For SHARE, whether to unshare instead
|
|
81
|
-
- id (str): For SHARE unshare, entity ID to unshare
|
|
82
|
-
|
|
70
|
+
Operation-specific parameters.
|
|
83
71
|
Returns
|
|
84
72
|
-------
|
|
85
73
|
dict
|
|
86
74
|
Formatted parameters with 'params' containing query parameters.
|
|
87
75
|
"""
|
|
88
|
-
kwargs = self.
|
|
76
|
+
kwargs = self._ensure_params(**kwargs)
|
|
77
|
+
|
|
78
|
+
# Handle delete
|
|
89
79
|
if operation == BackendOperations.DELETE.value:
|
|
90
80
|
if (cascade := kwargs.pop("cascade", None)) is not None:
|
|
91
|
-
kwargs
|
|
81
|
+
kwargs = self._add_param("cascade", str(cascade).lower(), **kwargs)
|
|
82
|
+
|
|
83
|
+
# Handle share
|
|
92
84
|
elif operation == BackendOperations.SHARE.value:
|
|
93
|
-
kwargs
|
|
85
|
+
kwargs = self._add_param("user", kwargs.pop("user"), **kwargs)
|
|
94
86
|
if kwargs.pop("unshare", False):
|
|
95
|
-
kwargs
|
|
87
|
+
kwargs = self._add_param("id", kwargs.pop("id"), **kwargs)
|
|
96
88
|
|
|
97
89
|
return kwargs
|
|
98
90
|
|
|
99
91
|
def build_parameters_context(self, operation: str, **kwargs) -> dict:
|
|
100
92
|
"""
|
|
101
|
-
Build parameters for context-level API operations.
|
|
102
|
-
|
|
103
93
|
Constructs HTTP request parameters for entity management and search within
|
|
104
|
-
projects.
|
|
105
|
-
'page' and 'size', result ordering with 'sort' parameter. READ supports
|
|
106
|
-
embedded entity inclusion, DELETE requires entity 'id' parameter.
|
|
94
|
+
projects.
|
|
107
95
|
|
|
108
96
|
Parameters
|
|
109
97
|
----------
|
|
110
98
|
operation : str
|
|
111
|
-
API operation
|
|
112
|
-
(retrieve multiple with pagination), DELETE (delete by ID),
|
|
113
|
-
READ (read by ID with optional embedded).
|
|
99
|
+
API operation.
|
|
114
100
|
**kwargs : dict
|
|
115
|
-
Operation-specific parameters
|
|
116
|
-
- params (dict): Search filters and conditions
|
|
117
|
-
- page (int): Page number for pagination (default: 0)
|
|
118
|
-
- size (int): Items per page (default: 20)
|
|
119
|
-
- order_by (str): Field to order results by
|
|
120
|
-
- order (str): Order direction ('asc' or 'desc')
|
|
121
|
-
- embedded (bool): For READ, whether to include embedded entities
|
|
122
|
-
- id (str): For READ/DELETE, entity identifier
|
|
101
|
+
Operation-specific parameters.
|
|
123
102
|
|
|
124
103
|
Returns
|
|
125
104
|
-------
|
|
126
105
|
dict
|
|
127
|
-
Formatted parameters with 'params'
|
|
128
|
-
other request-specific parameters like 'id' for entity operations.
|
|
106
|
+
Formatted parameters with 'params'.
|
|
129
107
|
"""
|
|
130
|
-
kwargs = self.
|
|
108
|
+
kwargs = self._ensure_params(**kwargs)
|
|
131
109
|
|
|
132
110
|
# Handle read
|
|
133
111
|
if operation == BackendOperations.READ.value:
|
|
134
|
-
name
|
|
135
|
-
|
|
136
|
-
|
|
112
|
+
if (name := kwargs.pop("name", None)) is not None:
|
|
113
|
+
kwargs = self._add_param("name", name, **kwargs)
|
|
114
|
+
|
|
115
|
+
# Handle read all versions
|
|
137
116
|
elif operation == BackendOperations.READ_ALL_VERSIONS.value:
|
|
138
|
-
kwargs
|
|
139
|
-
kwargs
|
|
117
|
+
kwargs = self._add_param("versions", "all", **kwargs)
|
|
118
|
+
kwargs = self._add_param("name", kwargs.pop("name"), **kwargs)
|
|
119
|
+
|
|
120
|
+
# Handle list
|
|
121
|
+
elif operation == BackendOperations.LIST.value:
|
|
122
|
+
possible_list_params = [
|
|
123
|
+
"q",
|
|
124
|
+
"name",
|
|
125
|
+
"kind",
|
|
126
|
+
"user",
|
|
127
|
+
"state",
|
|
128
|
+
"created",
|
|
129
|
+
"updated",
|
|
130
|
+
"versions",
|
|
131
|
+
"function",
|
|
132
|
+
"workflow",
|
|
133
|
+
"action",
|
|
134
|
+
"task",
|
|
135
|
+
]
|
|
136
|
+
list_params = {k: kwargs.get(k, None) for k in possible_list_params}
|
|
137
|
+
list_params = self._filter_none_params(**list_params)
|
|
138
|
+
for k, v in list_params.items():
|
|
139
|
+
kwargs = self._add_param(k, v, **kwargs)
|
|
140
|
+
for k in possible_list_params:
|
|
141
|
+
kwargs.pop(k, None)
|
|
142
|
+
|
|
140
143
|
# Handle delete
|
|
141
144
|
elif operation == BackendOperations.DELETE.value:
|
|
142
|
-
# Handle cascade
|
|
143
145
|
if (cascade := kwargs.pop("cascade", None)) is not None:
|
|
144
|
-
kwargs
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
raise ValueError(
|
|
152
|
-
"If `delete_all_versions` is False, `entity_id` must be provided,"
|
|
153
|
-
" either as an argument or in key `identifier`.",
|
|
154
|
-
)
|
|
155
|
-
else:
|
|
156
|
-
kwargs["params"]["name"] = entity_name
|
|
146
|
+
kwargs = self._add_param("cascade", str(cascade).lower(), **kwargs)
|
|
147
|
+
|
|
148
|
+
elif operation == BackendOperations.DELETE_ALL_VERSIONS.value:
|
|
149
|
+
if (cascade := kwargs.pop("cascade", None)) is not None:
|
|
150
|
+
kwargs = self._add_param("cascade", str(cascade).lower(), **kwargs)
|
|
151
|
+
kwargs = self._add_param("name", kwargs.pop("name"), **kwargs)
|
|
152
|
+
|
|
157
153
|
# Handle search
|
|
158
154
|
elif operation == BackendOperations.SEARCH.value:
|
|
159
155
|
# Handle fq
|
|
160
156
|
if (fq := kwargs.pop("fq", None)) is not None:
|
|
161
|
-
kwargs
|
|
157
|
+
kwargs = self._add_param("fq", fq, **kwargs)
|
|
162
158
|
|
|
163
159
|
# Add search query
|
|
164
160
|
if (query := kwargs.pop("query", None)) is not None:
|
|
165
|
-
kwargs
|
|
161
|
+
kwargs = self._add_param("q", query, **kwargs)
|
|
166
162
|
|
|
167
163
|
# Add search filters
|
|
168
164
|
fq = []
|
|
@@ -205,17 +201,63 @@ class ClientDHCoreParametersBuilder(ClientParametersBuilder):
|
|
|
205
201
|
fq.append(f"metadata.labels:({labels})")
|
|
206
202
|
|
|
207
203
|
# Add filters
|
|
208
|
-
kwargs
|
|
204
|
+
kwargs = self._add_param("fq", fq, **kwargs)
|
|
205
|
+
|
|
206
|
+
return kwargs
|
|
207
|
+
|
|
208
|
+
def set_pagination(self, partial: bool = False, **kwargs) -> dict:
|
|
209
|
+
"""
|
|
210
|
+
Ensure pagination parameters are set in kwargs.
|
|
211
|
+
|
|
212
|
+
Parameters
|
|
213
|
+
----------
|
|
214
|
+
**kwargs : dict
|
|
215
|
+
Keyword arguments to format. May be empty or contain various
|
|
216
|
+
parameters for API operations.
|
|
217
|
+
|
|
218
|
+
Returns
|
|
219
|
+
-------
|
|
220
|
+
dict
|
|
221
|
+
Pagination parameters set in 'params' of kwargs.
|
|
222
|
+
"""
|
|
223
|
+
kwargs = self._ensure_params(**kwargs)
|
|
224
|
+
|
|
225
|
+
if "page" not in kwargs["params"]:
|
|
226
|
+
kwargs["params"]["page"] = DEFAULT_START_PAGE
|
|
227
|
+
|
|
228
|
+
if partial:
|
|
229
|
+
return kwargs
|
|
230
|
+
|
|
231
|
+
if "size" not in kwargs["params"]:
|
|
232
|
+
kwargs["params"]["size"] = DEFAULT_SIZE
|
|
233
|
+
|
|
234
|
+
if "sort" not in kwargs["params"]:
|
|
235
|
+
kwargs["params"]["sort"] = DEFAULT_SORT
|
|
209
236
|
|
|
210
237
|
return kwargs
|
|
211
238
|
|
|
212
239
|
@staticmethod
|
|
213
|
-
def
|
|
240
|
+
def read_page_number(**kwargs) -> int:
|
|
241
|
+
"""
|
|
242
|
+
Read current page number from kwargs.
|
|
243
|
+
|
|
244
|
+
Parameters
|
|
245
|
+
----------
|
|
246
|
+
**kwargs : dict
|
|
247
|
+
Keyword arguments to format. May be empty or contain various
|
|
248
|
+
parameters for API operations.
|
|
249
|
+
|
|
250
|
+
Returns
|
|
251
|
+
-------
|
|
252
|
+
int
|
|
253
|
+
Current page number.
|
|
214
254
|
"""
|
|
215
|
-
|
|
255
|
+
return kwargs["params"]["page"]
|
|
216
256
|
|
|
217
|
-
|
|
218
|
-
|
|
257
|
+
@staticmethod
|
|
258
|
+
def increment_page_number(**kwargs) -> dict:
|
|
259
|
+
"""
|
|
260
|
+
Increment page number in kwargs.
|
|
219
261
|
|
|
220
262
|
Parameters
|
|
221
263
|
----------
|
|
@@ -226,11 +268,24 @@ class ClientDHCoreParametersBuilder(ClientParametersBuilder):
|
|
|
226
268
|
Returns
|
|
227
269
|
-------
|
|
228
270
|
dict
|
|
229
|
-
Parameters dictionary with
|
|
230
|
-
empty dict if not already present.
|
|
271
|
+
Parameters dictionary with incremented 'page' number in 'params'.
|
|
231
272
|
"""
|
|
232
|
-
|
|
233
|
-
kwargs = {}
|
|
234
|
-
if "params" not in kwargs:
|
|
235
|
-
kwargs["params"] = {}
|
|
273
|
+
kwargs["params"]["page"] += 1
|
|
236
274
|
return kwargs
|
|
275
|
+
|
|
276
|
+
@staticmethod
|
|
277
|
+
def _filter_none_params(**kwargs) -> dict:
|
|
278
|
+
"""
|
|
279
|
+
Filter out None values from kwargs.
|
|
280
|
+
|
|
281
|
+
Parameters
|
|
282
|
+
----------
|
|
283
|
+
**kwargs : dict
|
|
284
|
+
Keyword arguments to filter.
|
|
285
|
+
|
|
286
|
+
Returns
|
|
287
|
+
-------
|
|
288
|
+
dict
|
|
289
|
+
Filtered kwargs.
|
|
290
|
+
"""
|
|
291
|
+
return {k: v for k, v in kwargs.items() if v is not None}
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
7
|
-
from digitalhub.entities._commons.enums import ApiCategories, BackendOperations
|
|
8
7
|
from digitalhub.stores.client._base.api_builder import ClientApiBuilder
|
|
8
|
+
from digitalhub.stores.client._base.enums import ApiCategories, BackendOperations
|
|
9
9
|
from digitalhub.stores.client.local.enums import LocalClientVar
|
|
10
10
|
from digitalhub.utils.exceptions import BackendError
|
|
11
11
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
7
|
-
from digitalhub.
|
|
7
|
+
from digitalhub.stores.client._base.enums import ApiCategories, BackendOperations
|
|
8
8
|
from digitalhub.stores.client._base.params_builder import ClientParametersBuilder
|
|
9
9
|
|
|
10
10
|
|
|
@@ -51,10 +51,13 @@ class ClientLocalParametersBuilder(ClientParametersBuilder):
|
|
|
51
51
|
dict
|
|
52
52
|
Parameters formatted.
|
|
53
53
|
"""
|
|
54
|
-
kwargs = self.
|
|
54
|
+
kwargs = self._ensure_params(**kwargs)
|
|
55
|
+
|
|
56
|
+
# Handle delete
|
|
55
57
|
if operation == BackendOperations.DELETE.value:
|
|
56
58
|
if (cascade := kwargs.pop("cascade", None)) is not None:
|
|
57
|
-
kwargs
|
|
59
|
+
kwargs = self._add_param("cascade", str(cascade).lower(), **kwargs)
|
|
60
|
+
|
|
58
61
|
return kwargs
|
|
59
62
|
|
|
60
63
|
def build_parameters_context(self, operation: str, **kwargs) -> dict:
|
|
@@ -73,48 +76,22 @@ class ClientLocalParametersBuilder(ClientParametersBuilder):
|
|
|
73
76
|
dict
|
|
74
77
|
Parameters formatted.
|
|
75
78
|
"""
|
|
76
|
-
kwargs = self.
|
|
79
|
+
kwargs = self._ensure_params(**kwargs)
|
|
77
80
|
|
|
78
|
-
# Handle read
|
|
81
|
+
# Handle read all versions
|
|
79
82
|
if operation == BackendOperations.READ_ALL_VERSIONS.value:
|
|
80
|
-
kwargs
|
|
81
|
-
kwargs
|
|
83
|
+
kwargs = self._add_param("versions", "all", **kwargs)
|
|
84
|
+
kwargs = self._add_param("name", kwargs.pop("name"), **kwargs)
|
|
85
|
+
|
|
82
86
|
# Handle delete
|
|
83
87
|
elif operation == BackendOperations.DELETE.value:
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
kwargs["params"]["cascade"] = str(cascade).lower()
|
|
87
|
-
|
|
88
|
-
# Handle delete all versions
|
|
89
|
-
entity_id = kwargs.pop("entity_id")
|
|
90
|
-
entity_name = kwargs.pop("entity_name")
|
|
91
|
-
if not kwargs.pop("delete_all_versions", False):
|
|
92
|
-
if entity_id is None:
|
|
93
|
-
raise ValueError(
|
|
94
|
-
"If `delete_all_versions` is False, `entity_id` must be provided,"
|
|
95
|
-
" either as an argument or in key `identifier`.",
|
|
96
|
-
)
|
|
97
|
-
else:
|
|
98
|
-
kwargs["params"]["name"] = entity_name
|
|
99
|
-
return kwargs
|
|
100
|
-
|
|
101
|
-
@staticmethod
|
|
102
|
-
def _set_params(**kwargs) -> dict:
|
|
103
|
-
"""
|
|
104
|
-
Format params parameter.
|
|
88
|
+
if (cascade := kwargs.pop("cascade", None)) is not None:
|
|
89
|
+
kwargs = self._add_param("cascade", str(cascade).lower(), **kwargs)
|
|
105
90
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
91
|
+
# Handle delete all versions
|
|
92
|
+
elif operation == BackendOperations.DELETE_ALL_VERSIONS.value:
|
|
93
|
+
if (cascade := kwargs.pop("cascade", None)) is not None:
|
|
94
|
+
kwargs = self._add_param("cascade", str(cascade).lower(), **kwargs)
|
|
95
|
+
kwargs = self._add_param("name", kwargs.pop("name"), **kwargs)
|
|
110
96
|
|
|
111
|
-
Returns
|
|
112
|
-
-------
|
|
113
|
-
dict
|
|
114
|
-
Parameters with initialized params.
|
|
115
|
-
"""
|
|
116
|
-
if not kwargs:
|
|
117
|
-
kwargs = {}
|
|
118
|
-
if "params" not in kwargs:
|
|
119
|
-
kwargs["params"] = {}
|
|
120
97
|
return kwargs
|
|
@@ -53,10 +53,6 @@ class Configurator:
|
|
|
53
53
|
def load_configs(self) -> None:
|
|
54
54
|
"""
|
|
55
55
|
Load the configuration from both environment and file sources.
|
|
56
|
-
|
|
57
|
-
Returns
|
|
58
|
-
-------
|
|
59
|
-
None
|
|
60
56
|
"""
|
|
61
57
|
self.load_env_vars()
|
|
62
58
|
self.load_file_vars()
|
|
@@ -71,10 +67,6 @@ class Configurator:
|
|
|
71
67
|
"""
|
|
72
68
|
Check if the current profile has changed and reload
|
|
73
69
|
the file credentials if needed.
|
|
74
|
-
|
|
75
|
-
Returns
|
|
76
|
-
-------
|
|
77
|
-
None
|
|
78
70
|
"""
|
|
79
71
|
if (current := self._creds_handler.get_current_profile()) != self._current_profile:
|
|
80
72
|
self.load_file_vars()
|
|
@@ -119,10 +111,6 @@ class Configurator:
|
|
|
119
111
|
"""
|
|
120
112
|
Attempt to change the origin of credentials.
|
|
121
113
|
Raise error if already evaluated.
|
|
122
|
-
|
|
123
|
-
Returns
|
|
124
|
-
-------
|
|
125
|
-
None
|
|
126
114
|
"""
|
|
127
115
|
try:
|
|
128
116
|
self.change_origin()
|
|
@@ -132,10 +120,6 @@ class Configurator:
|
|
|
132
120
|
def change_origin(self) -> None:
|
|
133
121
|
"""
|
|
134
122
|
Change the origin of credentials from env to file or vice versa.
|
|
135
|
-
|
|
136
|
-
Returns
|
|
137
|
-
-------
|
|
138
|
-
None
|
|
139
123
|
"""
|
|
140
124
|
if self._changed_origin:
|
|
141
125
|
raise ConfigError("Origin has already been changed.")
|
|
@@ -147,10 +131,6 @@ class Configurator:
|
|
|
147
131
|
def change_to_file(self) -> None:
|
|
148
132
|
"""
|
|
149
133
|
Set the credentials origin to file.
|
|
150
|
-
|
|
151
|
-
Returns
|
|
152
|
-
-------
|
|
153
|
-
None
|
|
154
134
|
"""
|
|
155
135
|
if self._origin == self._env:
|
|
156
136
|
self._changed_origin = True
|
|
@@ -159,10 +139,6 @@ class Configurator:
|
|
|
159
139
|
def change_to_env(self) -> None:
|
|
160
140
|
"""
|
|
161
141
|
Set the credentials origin to environment.
|
|
162
|
-
|
|
163
|
-
Returns
|
|
164
|
-
-------
|
|
165
|
-
None
|
|
166
142
|
"""
|
|
167
143
|
if self._origin == self._file:
|
|
168
144
|
self._changed_origin = True
|
|
@@ -64,10 +64,6 @@ class CredentialHandler:
|
|
|
64
64
|
----------
|
|
65
65
|
creds_set : str
|
|
66
66
|
Name of the credentials profile to set.
|
|
67
|
-
|
|
68
|
-
Returns
|
|
69
|
-
-------
|
|
70
|
-
None
|
|
71
67
|
"""
|
|
72
68
|
self._profile = creds_set
|
|
73
69
|
set_current_profile(creds_set)
|
|
@@ -127,10 +123,6 @@ class CredentialHandler:
|
|
|
127
123
|
----------
|
|
128
124
|
creds : dict
|
|
129
125
|
Credentials to write.
|
|
130
|
-
|
|
131
|
-
Returns
|
|
132
|
-
-------
|
|
133
|
-
None
|
|
134
126
|
"""
|
|
135
127
|
write_config(creds, self._profile)
|
|
136
128
|
|
|
@@ -148,10 +140,6 @@ class CredentialHandler:
|
|
|
148
140
|
The origin of the credentials ('env' or 'file').
|
|
149
141
|
creds : dict
|
|
150
142
|
Credentials to set.
|
|
151
|
-
|
|
152
|
-
Returns
|
|
153
|
-
-------
|
|
154
|
-
None
|
|
155
143
|
"""
|
|
156
144
|
self._creds_store.set_credentials(self._profile, origin, creds)
|
|
157
145
|
|
|
@@ -42,10 +42,6 @@ class CredentialsStore:
|
|
|
42
42
|
Origin of the credentials ('env' or 'file').
|
|
43
43
|
credentials : dict of str to Any
|
|
44
44
|
Dictionary of credentials to set.
|
|
45
|
-
|
|
46
|
-
Returns
|
|
47
|
-
-------
|
|
48
|
-
None
|
|
49
45
|
"""
|
|
50
46
|
if origin == CredsOrigin.ENV.value:
|
|
51
47
|
for key, value in credentials.items():
|
|
@@ -114,10 +114,6 @@ class Store:
|
|
|
114
114
|
src : str
|
|
115
115
|
The source path.
|
|
116
116
|
|
|
117
|
-
Returns
|
|
118
|
-
-------
|
|
119
|
-
None
|
|
120
|
-
|
|
121
117
|
Raises
|
|
122
118
|
------
|
|
123
119
|
StoreError
|
|
@@ -135,10 +131,6 @@ class Store:
|
|
|
135
131
|
dst : str
|
|
136
132
|
The destination path.
|
|
137
133
|
|
|
138
|
-
Returns
|
|
139
|
-
-------
|
|
140
|
-
None
|
|
141
|
-
|
|
142
134
|
Raises
|
|
143
135
|
------
|
|
144
136
|
StoreError
|
|
@@ -158,10 +150,6 @@ class Store:
|
|
|
158
150
|
overwrite : bool
|
|
159
151
|
Specify if overwrite an existing file.
|
|
160
152
|
|
|
161
|
-
Returns
|
|
162
|
-
-------
|
|
163
|
-
None
|
|
164
|
-
|
|
165
153
|
Raises
|
|
166
154
|
------
|
|
167
155
|
StoreError
|
|
@@ -179,10 +167,6 @@ class Store:
|
|
|
179
167
|
----------
|
|
180
168
|
path : str | Path
|
|
181
169
|
The path to build.
|
|
182
|
-
|
|
183
|
-
Returns
|
|
184
|
-
-------
|
|
185
|
-
None
|
|
186
170
|
"""
|
|
187
171
|
if not isinstance(path, Path):
|
|
188
172
|
path = Path(path)
|
|
@@ -46,10 +46,6 @@ class S3StoreConfigurator(Configurator):
|
|
|
46
46
|
def load_env_vars(self) -> None:
|
|
47
47
|
"""
|
|
48
48
|
Loads the credentials from the environment variables.
|
|
49
|
-
|
|
50
|
-
Returns
|
|
51
|
-
-------
|
|
52
|
-
None
|
|
53
49
|
"""
|
|
54
50
|
env_creds = self._creds_handler.load_from_env(self.keys)
|
|
55
51
|
self._creds_handler.set_credentials(self._env, env_creds)
|
|
@@ -57,10 +53,6 @@ class S3StoreConfigurator(Configurator):
|
|
|
57
53
|
def load_file_vars(self) -> None:
|
|
58
54
|
"""
|
|
59
55
|
Loads the credentials from a file.
|
|
60
|
-
|
|
61
|
-
Returns
|
|
62
|
-
-------
|
|
63
|
-
None
|
|
64
56
|
"""
|
|
65
57
|
file_creds = self._creds_handler.load_from_file(self.keys)
|
|
66
58
|
self._creds_handler.set_credentials(self._file, file_creds)
|