digitalhub 0.13.0b3__py3-none-any.whl → 0.14.9__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.
- digitalhub/__init__.py +3 -8
- digitalhub/context/api.py +43 -6
- digitalhub/context/builder.py +1 -5
- digitalhub/context/context.py +28 -13
- digitalhub/entities/_base/_base/entity.py +0 -15
- digitalhub/entities/_base/context/entity.py +1 -4
- digitalhub/entities/_base/entity/builder.py +5 -5
- digitalhub/entities/_base/entity/entity.py +0 -8
- digitalhub/entities/_base/executable/entity.py +195 -87
- digitalhub/entities/_base/material/entity.py +11 -23
- digitalhub/entities/_base/material/utils.py +28 -4
- digitalhub/entities/_base/runtime_entity/builder.py +53 -18
- digitalhub/entities/_base/unversioned/entity.py +1 -1
- digitalhub/entities/_base/versioned/entity.py +1 -1
- digitalhub/entities/_commons/enums.py +1 -31
- digitalhub/entities/_commons/metrics.py +64 -30
- digitalhub/entities/_commons/utils.py +119 -30
- digitalhub/entities/_constructors/_resources.py +151 -0
- digitalhub/entities/{_base/entity/_constructors → _constructors}/name.py +18 -0
- digitalhub/entities/_processors/base/crud.py +381 -0
- digitalhub/entities/_processors/base/import_export.py +118 -0
- digitalhub/entities/_processors/base/processor.py +299 -0
- digitalhub/entities/_processors/base/special_ops.py +104 -0
- digitalhub/entities/_processors/context/crud.py +652 -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 +38 -102
- digitalhub/entities/artifact/crud.py +58 -22
- digitalhub/entities/artifact/utils.py +28 -13
- digitalhub/entities/builders.py +2 -0
- digitalhub/entities/dataitem/crud.py +63 -20
- digitalhub/entities/dataitem/table/entity.py +27 -22
- digitalhub/entities/dataitem/utils.py +82 -32
- digitalhub/entities/function/_base/entity.py +3 -6
- digitalhub/entities/function/crud.py +55 -24
- digitalhub/entities/model/_base/entity.py +62 -20
- digitalhub/entities/model/crud.py +59 -23
- digitalhub/entities/model/mlflow/utils.py +29 -20
- digitalhub/entities/model/utils.py +28 -13
- digitalhub/entities/project/_base/builder.py +0 -6
- digitalhub/entities/project/_base/entity.py +337 -164
- digitalhub/entities/project/_base/spec.py +4 -4
- digitalhub/entities/project/crud.py +28 -71
- digitalhub/entities/project/utils.py +7 -3
- digitalhub/entities/run/_base/builder.py +0 -4
- digitalhub/entities/run/_base/entity.py +70 -63
- digitalhub/entities/run/crud.py +79 -26
- digitalhub/entities/secret/_base/entity.py +1 -5
- digitalhub/entities/secret/crud.py +31 -28
- digitalhub/entities/task/_base/builder.py +0 -4
- digitalhub/entities/task/_base/entity.py +5 -5
- digitalhub/entities/task/_base/models.py +13 -16
- digitalhub/entities/task/crud.py +61 -29
- digitalhub/entities/trigger/_base/entity.py +1 -5
- digitalhub/entities/trigger/crud.py +89 -30
- digitalhub/entities/workflow/_base/entity.py +3 -8
- digitalhub/entities/workflow/crud.py +55 -24
- digitalhub/factory/entity.py +283 -0
- digitalhub/factory/enums.py +18 -0
- digitalhub/factory/registry.py +197 -0
- digitalhub/factory/runtime.py +44 -0
- digitalhub/factory/utils.py +3 -54
- digitalhub/runtimes/_base.py +2 -2
- digitalhub/stores/client/{dhcore/api_builder.py → api_builder.py} +3 -3
- digitalhub/stores/client/builder.py +19 -31
- digitalhub/stores/client/client.py +322 -0
- digitalhub/stores/client/configurator.py +408 -0
- digitalhub/stores/client/enums.py +50 -0
- digitalhub/stores/client/{dhcore/error_parser.py → error_parser.py} +0 -4
- digitalhub/stores/client/header_manager.py +61 -0
- digitalhub/stores/client/http_handler.py +152 -0
- digitalhub/stores/client/{_base/key_builder.py → key_builder.py} +14 -14
- digitalhub/stores/client/params_builder.py +330 -0
- digitalhub/stores/client/response_processor.py +102 -0
- digitalhub/stores/client/utils.py +35 -0
- digitalhub/stores/{credentials → configurator}/api.py +5 -9
- digitalhub/stores/configurator/configurator.py +123 -0
- digitalhub/stores/{credentials → configurator}/enums.py +27 -10
- digitalhub/stores/configurator/handler.py +213 -0
- digitalhub/stores/{credentials → configurator}/ini_module.py +31 -22
- digitalhub/stores/data/_base/store.py +0 -20
- digitalhub/stores/data/api.py +5 -7
- digitalhub/stores/data/builder.py +53 -27
- digitalhub/stores/data/local/store.py +0 -103
- digitalhub/stores/data/remote/store.py +0 -4
- digitalhub/stores/data/s3/configurator.py +39 -77
- digitalhub/stores/data/s3/store.py +57 -37
- digitalhub/stores/data/sql/configurator.py +66 -46
- digitalhub/stores/data/sql/store.py +171 -104
- digitalhub/stores/readers/data/factory.py +0 -8
- digitalhub/stores/readers/data/pandas/reader.py +9 -19
- digitalhub/utils/file_utils.py +0 -17
- digitalhub/utils/generic_utils.py +1 -14
- digitalhub/utils/git_utils.py +0 -8
- digitalhub/utils/io_utils.py +0 -12
- digitalhub/utils/store_utils.py +44 -0
- {digitalhub-0.13.0b3.dist-info → digitalhub-0.14.9.dist-info}/METADATA +5 -4
- {digitalhub-0.13.0b3.dist-info → digitalhub-0.14.9.dist-info}/RECORD +112 -113
- {digitalhub-0.13.0b3.dist-info → digitalhub-0.14.9.dist-info}/WHEEL +1 -1
- digitalhub/entities/_commons/types.py +0 -9
- digitalhub/entities/_processors/base.py +0 -531
- digitalhub/entities/_processors/context.py +0 -1299
- digitalhub/entities/task/_base/utils.py +0 -22
- digitalhub/factory/factory.py +0 -381
- digitalhub/stores/client/_base/api_builder.py +0 -34
- digitalhub/stores/client/_base/client.py +0 -243
- digitalhub/stores/client/_base/params_builder.py +0 -34
- digitalhub/stores/client/api.py +0 -36
- digitalhub/stores/client/dhcore/client.py +0 -613
- digitalhub/stores/client/dhcore/configurator.py +0 -675
- digitalhub/stores/client/dhcore/enums.py +0 -34
- digitalhub/stores/client/dhcore/key_builder.py +0 -62
- digitalhub/stores/client/dhcore/models.py +0 -40
- digitalhub/stores/client/dhcore/params_builder.py +0 -278
- digitalhub/stores/client/dhcore/utils.py +0 -94
- digitalhub/stores/client/local/api_builder.py +0 -116
- digitalhub/stores/client/local/client.py +0 -573
- digitalhub/stores/client/local/enums.py +0 -15
- digitalhub/stores/client/local/key_builder.py +0 -62
- digitalhub/stores/client/local/params_builder.py +0 -120
- digitalhub/stores/credentials/__init__.py +0 -3
- digitalhub/stores/credentials/configurator.py +0 -210
- digitalhub/stores/credentials/handler.py +0 -176
- digitalhub/stores/credentials/store.py +0 -81
- digitalhub/stores/data/enums.py +0 -15
- digitalhub/stores/data/s3/utils.py +0 -78
- /digitalhub/entities/{_base/entity/_constructors → _constructors}/__init__.py +0 -0
- /digitalhub/entities/{_base/entity/_constructors → _constructors}/metadata.py +0 -0
- /digitalhub/entities/{_base/entity/_constructors → _constructors}/spec.py +0 -0
- /digitalhub/entities/{_base/entity/_constructors → _constructors}/status.py +0 -0
- /digitalhub/entities/{_base/entity/_constructors → _constructors}/uuid.py +0 -0
- /digitalhub/{stores/client/_base → entities/_processors/base}/__init__.py +0 -0
- /digitalhub/{stores/client/dhcore → entities/_processors/context}/__init__.py +0 -0
- /digitalhub/stores/{client/local → configurator}/__init__.py +0 -0
- {digitalhub-0.13.0b3.dist-info → digitalhub-0.14.9.dist-info}/licenses/AUTHORS +0 -0
- {digitalhub-0.13.0b3.dist-info → digitalhub-0.14.9.dist-info}/licenses/LICENSE +0 -0
|
@@ -9,11 +9,11 @@ from abc import abstractmethod
|
|
|
9
9
|
|
|
10
10
|
from digitalhub.entities._base.versioned.entity import VersionedEntity
|
|
11
11
|
from digitalhub.entities._commons.enums import EntityTypes
|
|
12
|
-
from digitalhub.entities._processors.
|
|
12
|
+
from digitalhub.entities._processors.processors import context_processor
|
|
13
13
|
from digitalhub.entities.run.crud import list_runs
|
|
14
14
|
from digitalhub.entities.task.crud import delete_task, list_tasks
|
|
15
15
|
from digitalhub.entities.trigger.crud import list_triggers
|
|
16
|
-
from digitalhub.factory.
|
|
16
|
+
from digitalhub.factory.entity import entity_factory
|
|
17
17
|
from digitalhub.utils.exceptions import EntityAlreadyExistsError, EntityError
|
|
18
18
|
|
|
19
19
|
if typing.TYPE_CHECKING:
|
|
@@ -94,10 +94,6 @@ class ExecutableEntity(VersionedEntity):
|
|
|
94
94
|
----------
|
|
95
95
|
tasks : list[dict]
|
|
96
96
|
List of tasks to import.
|
|
97
|
-
|
|
98
|
-
Returns
|
|
99
|
-
-------
|
|
100
|
-
None
|
|
101
97
|
"""
|
|
102
98
|
# Loop over tasks list, in the case where the function
|
|
103
99
|
# is imported from local file.
|
|
@@ -109,7 +105,7 @@ class ExecutableEntity(VersionedEntity):
|
|
|
109
105
|
# Create a new object from dictionary.
|
|
110
106
|
# the form in which tasks are stored in function
|
|
111
107
|
# status
|
|
112
|
-
task_obj: Task =
|
|
108
|
+
task_obj: Task = entity_factory.build_entity_from_dict(task)
|
|
113
109
|
|
|
114
110
|
# Try to save it in backend to been able to use
|
|
115
111
|
# it for launching runs. In fact, tasks must be
|
|
@@ -149,7 +145,7 @@ class ExecutableEntity(VersionedEntity):
|
|
|
149
145
|
kwargs["kind"] = kind
|
|
150
146
|
|
|
151
147
|
# Create object instance
|
|
152
|
-
task: Task =
|
|
148
|
+
task: Task = entity_factory.build_entity_from_params(**kwargs)
|
|
153
149
|
task.save()
|
|
154
150
|
|
|
155
151
|
self._tasks[kind] = task
|
|
@@ -183,21 +179,62 @@ class ExecutableEntity(VersionedEntity):
|
|
|
183
179
|
self._tasks[kind] = resp[0]
|
|
184
180
|
return self._tasks[kind]
|
|
185
181
|
|
|
186
|
-
def list_task(
|
|
182
|
+
def list_task(
|
|
183
|
+
self,
|
|
184
|
+
q: str | None = None,
|
|
185
|
+
name: str | None = None,
|
|
186
|
+
kind: str | None = None,
|
|
187
|
+
user: str | None = None,
|
|
188
|
+
state: str | None = None,
|
|
189
|
+
created: str | None = None,
|
|
190
|
+
updated: str | None = None,
|
|
191
|
+
) -> list[Task]:
|
|
187
192
|
"""
|
|
188
|
-
List tasks.
|
|
193
|
+
List tasks of the executable entity from backend.
|
|
189
194
|
|
|
190
195
|
Parameters
|
|
191
196
|
----------
|
|
192
|
-
|
|
193
|
-
|
|
197
|
+
q : str
|
|
198
|
+
Query string to filter objects.
|
|
199
|
+
name : str
|
|
200
|
+
Object name.
|
|
201
|
+
kind : str
|
|
202
|
+
Kind of the object.
|
|
203
|
+
user : str
|
|
204
|
+
User that created the object.
|
|
205
|
+
state : str
|
|
206
|
+
Object state.
|
|
207
|
+
created : str
|
|
208
|
+
Creation date filter.
|
|
209
|
+
updated : str
|
|
210
|
+
Update date filter.
|
|
194
211
|
|
|
195
212
|
Returns
|
|
196
213
|
-------
|
|
197
|
-
list
|
|
198
|
-
List of
|
|
214
|
+
list[Task]
|
|
215
|
+
List of object instances.
|
|
199
216
|
"""
|
|
200
|
-
|
|
217
|
+
return self._list_tasks(
|
|
218
|
+
self.project,
|
|
219
|
+
q=q,
|
|
220
|
+
name=name,
|
|
221
|
+
kind=kind,
|
|
222
|
+
user=user,
|
|
223
|
+
state=state,
|
|
224
|
+
created=created,
|
|
225
|
+
updated=updated,
|
|
226
|
+
)
|
|
227
|
+
|
|
228
|
+
def _list_tasks(self, **kwargs) -> list[Task]:
|
|
229
|
+
"""
|
|
230
|
+
List all tasks of the executable entity from backend.
|
|
231
|
+
|
|
232
|
+
Returns
|
|
233
|
+
-------
|
|
234
|
+
list[Task]
|
|
235
|
+
List of object instances.
|
|
236
|
+
"""
|
|
237
|
+
kwargs[self.ENTITY_TYPE] = self._get_executable_string()
|
|
201
238
|
return list_tasks(self.project, **kwargs)
|
|
202
239
|
|
|
203
240
|
def update_task(self, kind: str, **kwargs) -> Task:
|
|
@@ -225,7 +262,7 @@ class ExecutableEntity(VersionedEntity):
|
|
|
225
262
|
kwargs["uuid"] = self._tasks[kind].id
|
|
226
263
|
|
|
227
264
|
# Update task
|
|
228
|
-
task: Task =
|
|
265
|
+
task: Task = entity_factory.build_entity_from_params(**kwargs)
|
|
229
266
|
task.save(update=True)
|
|
230
267
|
self._tasks[kind] = task
|
|
231
268
|
return task
|
|
@@ -265,7 +302,7 @@ class ExecutableEntity(VersionedEntity):
|
|
|
265
302
|
Response from backend.
|
|
266
303
|
"""
|
|
267
304
|
params = {self.ENTITY_TYPE: self._get_executable_string(), "kind": kind}
|
|
268
|
-
return context_processor.list_context_entities(self.project, EntityTypes.TASK.value, params
|
|
305
|
+
return context_processor.list_context_entities(self.project, EntityTypes.TASK.value, **params)
|
|
269
306
|
|
|
270
307
|
def _check_task_in_backend(self, kind: str) -> bool:
|
|
271
308
|
"""
|
|
@@ -295,10 +332,6 @@ class ExecutableEntity(VersionedEntity):
|
|
|
295
332
|
kind : str
|
|
296
333
|
Kind the object.
|
|
297
334
|
|
|
298
|
-
Returns
|
|
299
|
-
-------
|
|
300
|
-
None
|
|
301
|
-
|
|
302
335
|
Raises
|
|
303
336
|
------
|
|
304
337
|
EntityError
|
|
@@ -316,10 +349,6 @@ class ExecutableEntity(VersionedEntity):
|
|
|
316
349
|
kind : str
|
|
317
350
|
Kind the object.
|
|
318
351
|
|
|
319
|
-
Returns
|
|
320
|
-
-------
|
|
321
|
-
None
|
|
322
|
-
|
|
323
352
|
Raises
|
|
324
353
|
------
|
|
325
354
|
EntityError
|
|
@@ -338,35 +367,21 @@ class ExecutableEntity(VersionedEntity):
|
|
|
338
367
|
Create and execute a new run.
|
|
339
368
|
"""
|
|
340
369
|
|
|
341
|
-
def get_run(
|
|
342
|
-
self,
|
|
343
|
-
identifier: str,
|
|
344
|
-
**kwargs,
|
|
345
|
-
) -> Run:
|
|
370
|
+
def get_run(self, identifier: str) -> Run:
|
|
346
371
|
"""
|
|
347
|
-
Get object from backend.
|
|
372
|
+
Get specific run object of the executable from backend.
|
|
348
373
|
|
|
349
374
|
Parameters
|
|
350
375
|
----------
|
|
351
376
|
identifier : str
|
|
352
377
|
Entity key (store://...) or entity ID.
|
|
353
|
-
**kwargs : dict
|
|
354
|
-
Parameters to pass to the API call.
|
|
355
378
|
|
|
356
379
|
Returns
|
|
357
380
|
-------
|
|
358
381
|
Run
|
|
359
382
|
Object instance.
|
|
360
|
-
|
|
361
|
-
Examples
|
|
362
|
-
--------
|
|
363
|
-
Using entity key:
|
|
364
|
-
>>> obj = executable.get_run("store://my-secret-key")
|
|
365
|
-
|
|
366
|
-
Using entity ID:
|
|
367
|
-
>>> obj = executable.get_run("123")
|
|
368
383
|
"""
|
|
369
|
-
entities = self.
|
|
384
|
+
entities = self._list_runs()
|
|
370
385
|
for entity in entities:
|
|
371
386
|
if getattr(entity.spec, self.ENTITY_TYPE) == self._get_executable_string():
|
|
372
387
|
if entity.id == identifier:
|
|
@@ -375,25 +390,69 @@ class ExecutableEntity(VersionedEntity):
|
|
|
375
390
|
return entity
|
|
376
391
|
raise EntityError(f"Run '{identifier}' does not exist or does not belong to this executable.")
|
|
377
392
|
|
|
378
|
-
def list_runs(
|
|
393
|
+
def list_runs(
|
|
394
|
+
self,
|
|
395
|
+
q: str | None = None,
|
|
396
|
+
name: str | None = None,
|
|
397
|
+
kind: str | None = None,
|
|
398
|
+
user: str | None = None,
|
|
399
|
+
state: str | None = None,
|
|
400
|
+
created: str | None = None,
|
|
401
|
+
updated: str | None = None,
|
|
402
|
+
task: str | None = None,
|
|
403
|
+
action: str | None = None,
|
|
404
|
+
) -> list[Run]:
|
|
379
405
|
"""
|
|
380
|
-
List
|
|
406
|
+
List runs of the executable entity from backend.
|
|
381
407
|
|
|
382
408
|
Parameters
|
|
383
409
|
----------
|
|
384
|
-
|
|
385
|
-
|
|
410
|
+
q : str
|
|
411
|
+
Query string to filter objects.
|
|
412
|
+
name : str
|
|
413
|
+
Object name.
|
|
414
|
+
kind : str
|
|
415
|
+
Kind of the object.
|
|
416
|
+
user : str
|
|
417
|
+
User that created the object.
|
|
418
|
+
state : str
|
|
419
|
+
Object state.
|
|
420
|
+
created : str
|
|
421
|
+
Creation date filter.
|
|
422
|
+
updated : str
|
|
423
|
+
Update date filter.
|
|
424
|
+
task : str
|
|
425
|
+
Task string filter.
|
|
426
|
+
action : str
|
|
427
|
+
Action name filter.
|
|
386
428
|
|
|
387
429
|
Returns
|
|
388
430
|
-------
|
|
389
431
|
list[Run]
|
|
390
432
|
List of object instances.
|
|
433
|
+
"""
|
|
434
|
+
return self._list_runs(
|
|
435
|
+
q=q,
|
|
436
|
+
name=name,
|
|
437
|
+
kind=kind,
|
|
438
|
+
user=user,
|
|
439
|
+
state=state,
|
|
440
|
+
created=created,
|
|
441
|
+
updated=updated,
|
|
442
|
+
task=task,
|
|
443
|
+
action=action,
|
|
444
|
+
)
|
|
445
|
+
|
|
446
|
+
def _list_runs(self, **kwargs) -> list[Run]:
|
|
447
|
+
"""
|
|
448
|
+
List all runs of the executable entity from backend.
|
|
391
449
|
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
450
|
+
Returns
|
|
451
|
+
-------
|
|
452
|
+
list[Run]
|
|
453
|
+
List of object instances.
|
|
395
454
|
"""
|
|
396
|
-
kwargs[
|
|
455
|
+
kwargs[self.ENTITY_TYPE] = self._get_executable_string()
|
|
397
456
|
return list_runs(self.project, **kwargs)
|
|
398
457
|
|
|
399
458
|
##############################
|
|
@@ -403,8 +462,9 @@ class ExecutableEntity(VersionedEntity):
|
|
|
403
462
|
def trigger(
|
|
404
463
|
self,
|
|
405
464
|
action: str,
|
|
406
|
-
|
|
407
|
-
|
|
465
|
+
kind: str,
|
|
466
|
+
name: str,
|
|
467
|
+
template: dict | None = None,
|
|
408
468
|
**kwargs,
|
|
409
469
|
) -> Trigger:
|
|
410
470
|
"""
|
|
@@ -414,42 +474,55 @@ class ExecutableEntity(VersionedEntity):
|
|
|
414
474
|
----------
|
|
415
475
|
action : str
|
|
416
476
|
Action to execute.
|
|
417
|
-
|
|
477
|
+
kind : str
|
|
418
478
|
Trigger kind.
|
|
479
|
+
name : str
|
|
480
|
+
Trigger name.
|
|
481
|
+
template : dict
|
|
482
|
+
Template for the trigger.
|
|
419
483
|
**kwargs : dict
|
|
420
|
-
Keyword arguments passed to
|
|
484
|
+
Keyword arguments passed to trigger builder.
|
|
421
485
|
|
|
422
486
|
Returns
|
|
423
487
|
-------
|
|
424
|
-
|
|
425
|
-
|
|
488
|
+
Trigger
|
|
489
|
+
Object instance.
|
|
426
490
|
"""
|
|
427
491
|
# Get task
|
|
428
|
-
task_kind =
|
|
492
|
+
task_kind = entity_factory.get_task_kind_from_action(self.kind, action)
|
|
429
493
|
task = self._get_or_create_task(task_kind)
|
|
430
494
|
task_string = task._get_task_string()
|
|
495
|
+
exec_string = self._get_executable_string()
|
|
431
496
|
|
|
432
497
|
# Get run validator for building trigger template
|
|
433
|
-
run_kind =
|
|
434
|
-
run_validator: SpecValidator =
|
|
498
|
+
run_kind = entity_factory.get_run_kind_from_action(self.kind, action)
|
|
499
|
+
run_validator: SpecValidator = entity_factory.get_spec_validator(run_kind)
|
|
500
|
+
|
|
435
501
|
# Override kwargs
|
|
436
502
|
kwargs["project"] = self.project
|
|
437
|
-
kwargs["kind"] =
|
|
438
|
-
kwargs["name"] =
|
|
439
|
-
|
|
503
|
+
kwargs["kind"] = kind
|
|
504
|
+
kwargs["name"] = name
|
|
505
|
+
|
|
506
|
+
# Template handling
|
|
507
|
+
if template is None:
|
|
508
|
+
template = {}
|
|
509
|
+
if not isinstance(template, dict):
|
|
510
|
+
raise EntityError("Template must be a dictionary")
|
|
511
|
+
|
|
512
|
+
template["task"] = task_string
|
|
513
|
+
template[self.ENTITY_TYPE] = exec_string
|
|
514
|
+
template = run_validator(**template).to_dict()
|
|
515
|
+
|
|
516
|
+
kwargs[self.ENTITY_TYPE] = exec_string
|
|
440
517
|
kwargs["task"] = task_string
|
|
441
|
-
kwargs["template"] =
|
|
518
|
+
kwargs["template"] = template
|
|
442
519
|
|
|
443
520
|
# Create object instance
|
|
444
|
-
trigger: Trigger =
|
|
521
|
+
trigger: Trigger = entity_factory.build_entity_from_params(**kwargs)
|
|
445
522
|
trigger.save()
|
|
446
523
|
return trigger
|
|
447
524
|
|
|
448
|
-
def get_trigger(
|
|
449
|
-
self,
|
|
450
|
-
identifier: str,
|
|
451
|
-
**kwargs,
|
|
452
|
-
) -> Trigger:
|
|
525
|
+
def get_trigger(self, identifier: str) -> Trigger:
|
|
453
526
|
"""
|
|
454
527
|
Get object from backend.
|
|
455
528
|
|
|
@@ -457,23 +530,13 @@ class ExecutableEntity(VersionedEntity):
|
|
|
457
530
|
----------
|
|
458
531
|
identifier : str
|
|
459
532
|
Entity key (store://...) or entity ID.
|
|
460
|
-
**kwargs : dict
|
|
461
|
-
Parameters to pass to the API call.
|
|
462
533
|
|
|
463
534
|
Returns
|
|
464
535
|
-------
|
|
465
536
|
Trigger
|
|
466
537
|
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
538
|
"""
|
|
476
|
-
entities = self.
|
|
539
|
+
entities = self._list_triggers()
|
|
477
540
|
for entity in entities:
|
|
478
541
|
if getattr(entity.spec, self.ENTITY_TYPE) == self._get_executable_string():
|
|
479
542
|
if entity.id == identifier:
|
|
@@ -482,9 +545,58 @@ class ExecutableEntity(VersionedEntity):
|
|
|
482
545
|
return entity
|
|
483
546
|
raise EntityError(f"Trigger '{identifier}' does not exist or does not belong to this executable.")
|
|
484
547
|
|
|
485
|
-
def list_triggers(
|
|
548
|
+
def list_triggers(
|
|
549
|
+
self,
|
|
550
|
+
q: str | None = None,
|
|
551
|
+
name: str | None = None,
|
|
552
|
+
kind: str | None = None,
|
|
553
|
+
user: str | None = None,
|
|
554
|
+
created: str | None = None,
|
|
555
|
+
updated: str | None = None,
|
|
556
|
+
versions: str | None = None,
|
|
557
|
+
task: str | None = None,
|
|
558
|
+
) -> list[Trigger]:
|
|
559
|
+
"""
|
|
560
|
+
List triggers of the executable entity from backend.
|
|
561
|
+
|
|
562
|
+
Parameters
|
|
563
|
+
----------
|
|
564
|
+
q : str
|
|
565
|
+
Query string to filter objects.
|
|
566
|
+
name : str
|
|
567
|
+
Object name.
|
|
568
|
+
kind : str
|
|
569
|
+
Kind of the object.
|
|
570
|
+
user : str
|
|
571
|
+
User that created the object.
|
|
572
|
+
created : str
|
|
573
|
+
Creation date filter.
|
|
574
|
+
updated : str
|
|
575
|
+
Update date filter.
|
|
576
|
+
versions : str
|
|
577
|
+
Object version, default is latest.
|
|
578
|
+
task : str
|
|
579
|
+
Task string filter.
|
|
580
|
+
|
|
581
|
+
Returns
|
|
582
|
+
-------
|
|
583
|
+
list[Trigger]
|
|
584
|
+
List of object instances.
|
|
585
|
+
"""
|
|
586
|
+
return self._list_triggers(
|
|
587
|
+
q=q,
|
|
588
|
+
name=name,
|
|
589
|
+
kind=kind,
|
|
590
|
+
user=user,
|
|
591
|
+
created=created,
|
|
592
|
+
updated=updated,
|
|
593
|
+
versions=versions,
|
|
594
|
+
task=task,
|
|
595
|
+
)
|
|
596
|
+
|
|
597
|
+
def _list_triggers(self, **kwargs) -> list[Trigger]:
|
|
486
598
|
"""
|
|
487
|
-
List
|
|
599
|
+
List triggers of the executable from backend.
|
|
488
600
|
|
|
489
601
|
Parameters
|
|
490
602
|
----------
|
|
@@ -495,10 +607,6 @@ class ExecutableEntity(VersionedEntity):
|
|
|
495
607
|
-------
|
|
496
608
|
list[Trigger]
|
|
497
609
|
List of object instances.
|
|
498
|
-
|
|
499
|
-
Examples
|
|
500
|
-
--------
|
|
501
|
-
>>> objs = executable.list_triggers()
|
|
502
610
|
"""
|
|
503
|
-
kwargs[
|
|
611
|
+
kwargs[self.ENTITY_TYPE] = self._get_executable_string()
|
|
504
612
|
return list_triggers(self.project, **kwargs)
|
|
@@ -7,8 +7,9 @@ from __future__ import annotations
|
|
|
7
7
|
import typing
|
|
8
8
|
from pathlib import Path
|
|
9
9
|
|
|
10
|
+
from digitalhub.entities._base.material.utils import refresh_decorator
|
|
10
11
|
from digitalhub.entities._base.versioned.entity import VersionedEntity
|
|
11
|
-
from digitalhub.entities._processors.
|
|
12
|
+
from digitalhub.entities._processors.processors import context_processor
|
|
12
13
|
from digitalhub.stores.data.api import get_store
|
|
13
14
|
from digitalhub.utils.types import SourcesOrListOfSources
|
|
14
15
|
|
|
@@ -55,7 +56,7 @@ class MaterialEntity(VersionedEntity):
|
|
|
55
56
|
"""
|
|
56
57
|
# Evaluate files info list length
|
|
57
58
|
files = None
|
|
58
|
-
if self.status.files is not None and len(self.status.files) > 5
|
|
59
|
+
if self.status.files is not None and len(self.status.files) > 5:
|
|
59
60
|
files = self.status.files
|
|
60
61
|
self.status.files = []
|
|
61
62
|
|
|
@@ -72,6 +73,7 @@ class MaterialEntity(VersionedEntity):
|
|
|
72
73
|
# I/O Methods
|
|
73
74
|
##############################
|
|
74
75
|
|
|
76
|
+
@refresh_decorator
|
|
75
77
|
def as_file(self) -> list[str]:
|
|
76
78
|
"""
|
|
77
79
|
Get object as file(s). It downloads the object from storage in
|
|
@@ -86,6 +88,7 @@ class MaterialEntity(VersionedEntity):
|
|
|
86
88
|
dst = store._build_temp()
|
|
87
89
|
return store.download(self.spec.path, dst=dst)
|
|
88
90
|
|
|
91
|
+
@refresh_decorator
|
|
89
92
|
def download(
|
|
90
93
|
self,
|
|
91
94
|
destination: str | None = None,
|
|
@@ -130,6 +133,7 @@ class MaterialEntity(VersionedEntity):
|
|
|
130
133
|
|
|
131
134
|
return store.download(self.spec.path, dst, overwrite=overwrite)
|
|
132
135
|
|
|
136
|
+
@refresh_decorator
|
|
133
137
|
def upload(self, source: SourcesOrListOfSources) -> None:
|
|
134
138
|
"""
|
|
135
139
|
Upload object from given local path to spec path destination.
|
|
@@ -142,20 +146,16 @@ class MaterialEntity(VersionedEntity):
|
|
|
142
146
|
source : str | list[str]
|
|
143
147
|
Local filepath, directory or list of filepaths.
|
|
144
148
|
|
|
145
|
-
Returns
|
|
146
|
-
-------
|
|
147
|
-
None
|
|
148
|
-
|
|
149
149
|
Examples
|
|
150
150
|
--------
|
|
151
151
|
Upload a single file:
|
|
152
152
|
|
|
153
|
-
>>> entity.spec.path =
|
|
154
|
-
>>> entity.upload(
|
|
153
|
+
>>> entity.spec.path = "s3://bucket/data.csv"
|
|
154
|
+
>>> entity.upload("./data.csv")
|
|
155
155
|
|
|
156
156
|
Upload a folder:
|
|
157
|
-
>>> entity.spec.path =
|
|
158
|
-
>>> entity.upload(
|
|
157
|
+
>>> entity.spec.path = "s3://bucket/data/"
|
|
158
|
+
>>> entity.upload("./data")
|
|
159
159
|
"""
|
|
160
160
|
# Get store and upload object
|
|
161
161
|
store = get_store(self.spec.path)
|
|
@@ -177,10 +177,6 @@ class MaterialEntity(VersionedEntity):
|
|
|
177
177
|
----------
|
|
178
178
|
files : list[dict]
|
|
179
179
|
Files to add.
|
|
180
|
-
|
|
181
|
-
Returns
|
|
182
|
-
-------
|
|
183
|
-
None
|
|
184
180
|
"""
|
|
185
181
|
available = 100 - len(self.status.files)
|
|
186
182
|
if len(files) > available:
|
|
@@ -214,10 +210,6 @@ class MaterialEntity(VersionedEntity):
|
|
|
214
210
|
----------
|
|
215
211
|
files_info : list[dict] | None
|
|
216
212
|
Files info.
|
|
217
|
-
|
|
218
|
-
Returns
|
|
219
|
-
-------
|
|
220
|
-
None
|
|
221
213
|
"""
|
|
222
214
|
if files_info is None:
|
|
223
215
|
return
|
|
@@ -229,12 +221,8 @@ class MaterialEntity(VersionedEntity):
|
|
|
229
221
|
def _get_files_info(self) -> None:
|
|
230
222
|
"""
|
|
231
223
|
Get files info from backend.
|
|
232
|
-
|
|
233
|
-
Returns
|
|
234
|
-
-------
|
|
235
|
-
None
|
|
236
224
|
"""
|
|
237
|
-
if not self.
|
|
225
|
+
if not self.status.files:
|
|
238
226
|
files = context_processor.read_files_info(
|
|
239
227
|
project=self.project,
|
|
240
228
|
entity_type=self.ENTITY_TYPE,
|
|
@@ -4,9 +4,11 @@
|
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
7
|
+
import typing
|
|
7
8
|
from pathlib import Path
|
|
8
9
|
|
|
9
10
|
from digitalhub.stores.data.api import get_default_store
|
|
11
|
+
from digitalhub.utils.exceptions import BackendError
|
|
10
12
|
from digitalhub.utils.file_utils import eval_zip_type
|
|
11
13
|
from digitalhub.utils.uri_utils import has_local_scheme
|
|
12
14
|
|
|
@@ -19,10 +21,6 @@ def eval_local_source(source: str | list[str]) -> None:
|
|
|
19
21
|
----------
|
|
20
22
|
source : str | list[str]
|
|
21
23
|
Source(s).
|
|
22
|
-
|
|
23
|
-
Returns
|
|
24
|
-
-------
|
|
25
|
-
None
|
|
26
24
|
"""
|
|
27
25
|
if isinstance(source, list):
|
|
28
26
|
if not source:
|
|
@@ -108,3 +106,29 @@ def build_log_path_from_source(
|
|
|
108
106
|
path += f"/{Path(source).name}"
|
|
109
107
|
|
|
110
108
|
return path
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def refresh_decorator(fn: typing.Callable) -> typing.Callable:
|
|
112
|
+
"""
|
|
113
|
+
Refresh decorator.
|
|
114
|
+
|
|
115
|
+
Parameters
|
|
116
|
+
----------
|
|
117
|
+
fn : Callable
|
|
118
|
+
Function to decorate.
|
|
119
|
+
|
|
120
|
+
Returns
|
|
121
|
+
-------
|
|
122
|
+
Callable
|
|
123
|
+
Decorated function.
|
|
124
|
+
"""
|
|
125
|
+
|
|
126
|
+
def wrapper(self, *args, **kwargs):
|
|
127
|
+
# Prevent rising error if entity is not yet created in backend
|
|
128
|
+
try:
|
|
129
|
+
self.refresh()
|
|
130
|
+
except BackendError:
|
|
131
|
+
pass
|
|
132
|
+
return fn(self, *args, **kwargs)
|
|
133
|
+
|
|
134
|
+
return wrapper
|