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.
Files changed (139) hide show
  1. digitalhub/__init__.py +3 -8
  2. digitalhub/context/api.py +43 -6
  3. digitalhub/context/builder.py +1 -5
  4. digitalhub/context/context.py +28 -13
  5. digitalhub/entities/_base/_base/entity.py +0 -15
  6. digitalhub/entities/_base/context/entity.py +1 -4
  7. digitalhub/entities/_base/entity/builder.py +5 -5
  8. digitalhub/entities/_base/entity/entity.py +0 -8
  9. digitalhub/entities/_base/executable/entity.py +195 -87
  10. digitalhub/entities/_base/material/entity.py +11 -23
  11. digitalhub/entities/_base/material/utils.py +28 -4
  12. digitalhub/entities/_base/runtime_entity/builder.py +53 -18
  13. digitalhub/entities/_base/unversioned/entity.py +1 -1
  14. digitalhub/entities/_base/versioned/entity.py +1 -1
  15. digitalhub/entities/_commons/enums.py +1 -31
  16. digitalhub/entities/_commons/metrics.py +64 -30
  17. digitalhub/entities/_commons/utils.py +119 -30
  18. digitalhub/entities/_constructors/_resources.py +151 -0
  19. digitalhub/entities/{_base/entity/_constructors → _constructors}/name.py +18 -0
  20. digitalhub/entities/_processors/base/crud.py +381 -0
  21. digitalhub/entities/_processors/base/import_export.py +118 -0
  22. digitalhub/entities/_processors/base/processor.py +299 -0
  23. digitalhub/entities/_processors/base/special_ops.py +104 -0
  24. digitalhub/entities/_processors/context/crud.py +652 -0
  25. digitalhub/entities/_processors/context/import_export.py +242 -0
  26. digitalhub/entities/_processors/context/material.py +123 -0
  27. digitalhub/entities/_processors/context/processor.py +400 -0
  28. digitalhub/entities/_processors/context/special_ops.py +476 -0
  29. digitalhub/entities/_processors/processors.py +12 -0
  30. digitalhub/entities/_processors/utils.py +38 -102
  31. digitalhub/entities/artifact/crud.py +58 -22
  32. digitalhub/entities/artifact/utils.py +28 -13
  33. digitalhub/entities/builders.py +2 -0
  34. digitalhub/entities/dataitem/crud.py +63 -20
  35. digitalhub/entities/dataitem/table/entity.py +27 -22
  36. digitalhub/entities/dataitem/utils.py +82 -32
  37. digitalhub/entities/function/_base/entity.py +3 -6
  38. digitalhub/entities/function/crud.py +55 -24
  39. digitalhub/entities/model/_base/entity.py +62 -20
  40. digitalhub/entities/model/crud.py +59 -23
  41. digitalhub/entities/model/mlflow/utils.py +29 -20
  42. digitalhub/entities/model/utils.py +28 -13
  43. digitalhub/entities/project/_base/builder.py +0 -6
  44. digitalhub/entities/project/_base/entity.py +337 -164
  45. digitalhub/entities/project/_base/spec.py +4 -4
  46. digitalhub/entities/project/crud.py +28 -71
  47. digitalhub/entities/project/utils.py +7 -3
  48. digitalhub/entities/run/_base/builder.py +0 -4
  49. digitalhub/entities/run/_base/entity.py +70 -63
  50. digitalhub/entities/run/crud.py +79 -26
  51. digitalhub/entities/secret/_base/entity.py +1 -5
  52. digitalhub/entities/secret/crud.py +31 -28
  53. digitalhub/entities/task/_base/builder.py +0 -4
  54. digitalhub/entities/task/_base/entity.py +5 -5
  55. digitalhub/entities/task/_base/models.py +13 -16
  56. digitalhub/entities/task/crud.py +61 -29
  57. digitalhub/entities/trigger/_base/entity.py +1 -5
  58. digitalhub/entities/trigger/crud.py +89 -30
  59. digitalhub/entities/workflow/_base/entity.py +3 -8
  60. digitalhub/entities/workflow/crud.py +55 -24
  61. digitalhub/factory/entity.py +283 -0
  62. digitalhub/factory/enums.py +18 -0
  63. digitalhub/factory/registry.py +197 -0
  64. digitalhub/factory/runtime.py +44 -0
  65. digitalhub/factory/utils.py +3 -54
  66. digitalhub/runtimes/_base.py +2 -2
  67. digitalhub/stores/client/{dhcore/api_builder.py → api_builder.py} +3 -3
  68. digitalhub/stores/client/builder.py +19 -31
  69. digitalhub/stores/client/client.py +322 -0
  70. digitalhub/stores/client/configurator.py +408 -0
  71. digitalhub/stores/client/enums.py +50 -0
  72. digitalhub/stores/client/{dhcore/error_parser.py → error_parser.py} +0 -4
  73. digitalhub/stores/client/header_manager.py +61 -0
  74. digitalhub/stores/client/http_handler.py +152 -0
  75. digitalhub/stores/client/{_base/key_builder.py → key_builder.py} +14 -14
  76. digitalhub/stores/client/params_builder.py +330 -0
  77. digitalhub/stores/client/response_processor.py +102 -0
  78. digitalhub/stores/client/utils.py +35 -0
  79. digitalhub/stores/{credentials → configurator}/api.py +5 -9
  80. digitalhub/stores/configurator/configurator.py +123 -0
  81. digitalhub/stores/{credentials → configurator}/enums.py +27 -10
  82. digitalhub/stores/configurator/handler.py +213 -0
  83. digitalhub/stores/{credentials → configurator}/ini_module.py +31 -22
  84. digitalhub/stores/data/_base/store.py +0 -20
  85. digitalhub/stores/data/api.py +5 -7
  86. digitalhub/stores/data/builder.py +53 -27
  87. digitalhub/stores/data/local/store.py +0 -103
  88. digitalhub/stores/data/remote/store.py +0 -4
  89. digitalhub/stores/data/s3/configurator.py +39 -77
  90. digitalhub/stores/data/s3/store.py +57 -37
  91. digitalhub/stores/data/sql/configurator.py +66 -46
  92. digitalhub/stores/data/sql/store.py +171 -104
  93. digitalhub/stores/readers/data/factory.py +0 -8
  94. digitalhub/stores/readers/data/pandas/reader.py +9 -19
  95. digitalhub/utils/file_utils.py +0 -17
  96. digitalhub/utils/generic_utils.py +1 -14
  97. digitalhub/utils/git_utils.py +0 -8
  98. digitalhub/utils/io_utils.py +0 -12
  99. digitalhub/utils/store_utils.py +44 -0
  100. {digitalhub-0.13.0b3.dist-info → digitalhub-0.14.9.dist-info}/METADATA +5 -4
  101. {digitalhub-0.13.0b3.dist-info → digitalhub-0.14.9.dist-info}/RECORD +112 -113
  102. {digitalhub-0.13.0b3.dist-info → digitalhub-0.14.9.dist-info}/WHEEL +1 -1
  103. digitalhub/entities/_commons/types.py +0 -9
  104. digitalhub/entities/_processors/base.py +0 -531
  105. digitalhub/entities/_processors/context.py +0 -1299
  106. digitalhub/entities/task/_base/utils.py +0 -22
  107. digitalhub/factory/factory.py +0 -381
  108. digitalhub/stores/client/_base/api_builder.py +0 -34
  109. digitalhub/stores/client/_base/client.py +0 -243
  110. digitalhub/stores/client/_base/params_builder.py +0 -34
  111. digitalhub/stores/client/api.py +0 -36
  112. digitalhub/stores/client/dhcore/client.py +0 -613
  113. digitalhub/stores/client/dhcore/configurator.py +0 -675
  114. digitalhub/stores/client/dhcore/enums.py +0 -34
  115. digitalhub/stores/client/dhcore/key_builder.py +0 -62
  116. digitalhub/stores/client/dhcore/models.py +0 -40
  117. digitalhub/stores/client/dhcore/params_builder.py +0 -278
  118. digitalhub/stores/client/dhcore/utils.py +0 -94
  119. digitalhub/stores/client/local/api_builder.py +0 -116
  120. digitalhub/stores/client/local/client.py +0 -573
  121. digitalhub/stores/client/local/enums.py +0 -15
  122. digitalhub/stores/client/local/key_builder.py +0 -62
  123. digitalhub/stores/client/local/params_builder.py +0 -120
  124. digitalhub/stores/credentials/__init__.py +0 -3
  125. digitalhub/stores/credentials/configurator.py +0 -210
  126. digitalhub/stores/credentials/handler.py +0 -176
  127. digitalhub/stores/credentials/store.py +0 -81
  128. digitalhub/stores/data/enums.py +0 -15
  129. digitalhub/stores/data/s3/utils.py +0 -78
  130. /digitalhub/entities/{_base/entity/_constructors → _constructors}/__init__.py +0 -0
  131. /digitalhub/entities/{_base/entity/_constructors → _constructors}/metadata.py +0 -0
  132. /digitalhub/entities/{_base/entity/_constructors → _constructors}/spec.py +0 -0
  133. /digitalhub/entities/{_base/entity/_constructors → _constructors}/status.py +0 -0
  134. /digitalhub/entities/{_base/entity/_constructors → _constructors}/uuid.py +0 -0
  135. /digitalhub/{stores/client/_base → entities/_processors/base}/__init__.py +0 -0
  136. /digitalhub/{stores/client/dhcore → entities/_processors/context}/__init__.py +0 -0
  137. /digitalhub/stores/{client/local → configurator}/__init__.py +0 -0
  138. {digitalhub-0.13.0b3.dist-info → digitalhub-0.14.9.dist-info}/licenses/AUTHORS +0 -0
  139. {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.context import context_processor
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.factory import 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 = factory.build_entity_from_dict(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 = factory.build_entity_from_params(**kwargs)
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(self, **kwargs) -> 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
- **kwargs : dict
193
- Keyword arguments.
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 tasks.
214
+ list[Task]
215
+ List of object instances.
199
216
  """
200
- kwargs["params"] = {self.ENTITY_TYPE: self._get_executable_string()}
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 = factory.build_entity_from_params(**kwargs)
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=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.list_runs(**kwargs)
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(self, **kwargs) -> list[Run]:
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 all runs from backend.
406
+ List runs of the executable entity from backend.
381
407
 
382
408
  Parameters
383
409
  ----------
384
- **kwargs : dict
385
- Parameters to pass to the API call.
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
- Examples
393
- --------
394
- >>> objs = executable.list_runs()
450
+ Returns
451
+ -------
452
+ list[Run]
453
+ List of object instances.
395
454
  """
396
- kwargs["params"] = {self.ENTITY_TYPE: self._get_executable_string()}
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
- trigger_kind: str,
407
- trigger_name: str,
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
- trigger_kind : str
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 Run builder.
484
+ Keyword arguments passed to trigger builder.
421
485
 
422
486
  Returns
423
487
  -------
424
- Run
425
- Run instance.
488
+ Trigger
489
+ Object instance.
426
490
  """
427
491
  # Get task
428
- task_kind = factory.get_task_kind_from_action(self.kind, action)
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 = factory.get_run_kind(self.kind)
434
- run_validator: SpecValidator = factory.get_spec_validator(run_kind)
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"] = trigger_kind
438
- kwargs["name"] = trigger_name
439
- kwargs[self.ENTITY_TYPE] = self._get_executable_string()
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"] = run_validator(**kwargs).to_dict()
518
+ kwargs["template"] = template
442
519
 
443
520
  # Create object instance
444
- trigger: Trigger = factory.build_entity_from_params(**kwargs)
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.list_triggers(**kwargs)
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(self, **kwargs) -> list[Trigger]:
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 all triggers from backend.
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["params"] = {self.ENTITY_TYPE: self._get_executable_string()}
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.context import context_processor
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 and not self._context().local:
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 = 's3://bucket/data.csv'
154
- >>> entity.upload('./data.csv')
153
+ >>> entity.spec.path = "s3://bucket/data.csv"
154
+ >>> entity.upload("./data.csv")
155
155
 
156
156
  Upload a folder:
157
- >>> entity.spec.path = 's3://bucket/data/'
158
- >>> entity.upload('./data')
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._context().local and not self.status.files:
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