digitalhub 0.10.2__py3-none-any.whl → 0.11.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of digitalhub might be problematic. Click here for more details.

Files changed (72) hide show
  1. digitalhub/__init__.py +10 -0
  2. digitalhub/context/api.py +10 -4
  3. digitalhub/context/builder.py +35 -20
  4. digitalhub/context/context.py +35 -24
  5. digitalhub/entities/_base/entity/builder.py +11 -0
  6. digitalhub/entities/_base/executable/entity.py +52 -5
  7. digitalhub/entities/_base/material/utils.py +11 -11
  8. digitalhub/entities/_commons/enums.py +4 -0
  9. digitalhub/entities/_processors/base.py +15 -15
  10. digitalhub/entities/_processors/context.py +62 -15
  11. digitalhub/entities/_processors/utils.py +2 -2
  12. digitalhub/entities/builders.py +2 -0
  13. digitalhub/entities/function/_base/entity.py +3 -3
  14. digitalhub/entities/project/_base/builder.py +4 -0
  15. digitalhub/entities/project/_base/entity.py +5 -2
  16. digitalhub/entities/project/_base/models.py +18 -0
  17. digitalhub/entities/project/_base/spec.py +6 -0
  18. digitalhub/entities/project/crud.py +2 -13
  19. digitalhub/entities/run/_base/entity.py +6 -12
  20. digitalhub/entities/task/_base/entity.py +4 -4
  21. digitalhub/entities/task/_base/models.py +20 -2
  22. digitalhub/entities/trigger/__init__.py +0 -0
  23. digitalhub/entities/trigger/_base/__init__.py +0 -0
  24. digitalhub/entities/trigger/_base/builder.py +70 -0
  25. digitalhub/entities/trigger/_base/entity.py +34 -0
  26. digitalhub/entities/trigger/_base/spec.py +40 -0
  27. digitalhub/entities/trigger/_base/status.py +9 -0
  28. digitalhub/entities/trigger/crud.py +309 -0
  29. digitalhub/entities/trigger/lifecycle/__init__.py +0 -0
  30. digitalhub/entities/trigger/lifecycle/builder.py +19 -0
  31. digitalhub/entities/trigger/lifecycle/entity.py +32 -0
  32. digitalhub/entities/trigger/lifecycle/spec.py +38 -0
  33. digitalhub/entities/trigger/lifecycle/status.py +9 -0
  34. digitalhub/entities/trigger/scheduler/__init__.py +0 -0
  35. digitalhub/entities/trigger/scheduler/builder.py +19 -0
  36. digitalhub/entities/trigger/scheduler/entity.py +32 -0
  37. digitalhub/entities/trigger/scheduler/spec.py +29 -0
  38. digitalhub/entities/trigger/scheduler/status.py +9 -0
  39. digitalhub/entities/workflow/_base/entity.py +3 -3
  40. digitalhub/factory/factory.py +113 -26
  41. digitalhub/factory/utils.py +31 -14
  42. digitalhub/runtimes/_base.py +22 -11
  43. digitalhub/runtimes/builder.py +16 -3
  44. digitalhub/runtimes/enums.py +11 -1
  45. digitalhub/stores/client/dhcore/client.py +1 -0
  46. digitalhub/stores/client/dhcore/configurator.py +80 -11
  47. digitalhub/stores/client/dhcore/utils.py +1 -0
  48. digitalhub/stores/configurator/configurator.py +5 -2
  49. digitalhub/stores/configurator/enums.py +9 -0
  50. digitalhub/stores/configurator/ini_module.py +58 -4
  51. digitalhub/stores/data/api.py +2 -2
  52. digitalhub/stores/data/builder.py +5 -6
  53. digitalhub/stores/data/enums.py +11 -0
  54. digitalhub/stores/data/local/store.py +0 -3
  55. digitalhub/stores/data/remote/store.py +0 -3
  56. digitalhub/stores/data/s3/configurator.py +0 -20
  57. digitalhub/stores/data/s3/enums.py +2 -3
  58. digitalhub/stores/data/s3/store.py +4 -10
  59. digitalhub/stores/data/s3/utils.py +13 -18
  60. digitalhub/stores/data/sql/configurator.py +9 -22
  61. digitalhub/stores/data/sql/store.py +1 -3
  62. digitalhub/stores/data/utils.py +34 -0
  63. digitalhub/utils/file_utils.py +1 -1
  64. digitalhub/utils/generic_utils.py +37 -0
  65. digitalhub/utils/uri_utils.py +5 -0
  66. {digitalhub-0.10.2.dist-info → digitalhub-0.11.0.dist-info}/METADATA +1 -1
  67. {digitalhub-0.10.2.dist-info → digitalhub-0.11.0.dist-info}/RECORD +69 -52
  68. digitalhub/factory/api.py +0 -277
  69. digitalhub/stores/data/s3/models.py +0 -21
  70. digitalhub/stores/data/sql/models.py +0 -24
  71. {digitalhub-0.10.2.dist-info → digitalhub-0.11.0.dist-info}/WHEEL +0 -0
  72. {digitalhub-0.10.2.dist-info → digitalhub-0.11.0.dist-info}/licenses/LICENSE.txt +0 -0
@@ -0,0 +1,9 @@
1
+ from __future__ import annotations
2
+
3
+ from digitalhub.entities._base.entity.status import Status
4
+
5
+
6
+ class TriggerStatus(Status):
7
+ """
8
+ TriggerStatus status.
9
+ """
@@ -0,0 +1,309 @@
1
+ from __future__ import annotations
2
+
3
+ import typing
4
+
5
+ from digitalhub.entities._commons.enums import EntityTypes
6
+ from digitalhub.entities._processors.context import context_processor
7
+
8
+ if typing.TYPE_CHECKING:
9
+ from digitalhub.entities.trigger._base.entity import Trigger
10
+
11
+
12
+ ENTITY_TYPE = EntityTypes.TRIGGER.value
13
+
14
+
15
+ def new_trigger(
16
+ project: str,
17
+ name: str,
18
+ kind: str,
19
+ task: str,
20
+ function: str | None = None,
21
+ workflow: str | None = None,
22
+ uuid: str | None = None,
23
+ description: str | None = None,
24
+ labels: list[str] | None = None,
25
+ embedded: bool = False,
26
+ template: dict | None = None,
27
+ **kwargs,
28
+ ) -> Trigger:
29
+ """
30
+ Create a new object.
31
+
32
+ Parameters
33
+ ----------
34
+ project : str
35
+ Project name.
36
+ name : str
37
+ Object name.
38
+ kind : str
39
+ Kind the object.
40
+ uuid : str
41
+ ID of the object.
42
+ description : str
43
+ Description of the object (human readable).
44
+ labels : list[str]
45
+ List of labels.
46
+ embedded : bool
47
+ Flag to determine if object spec must be embedded in project spec.
48
+ **kwargs : dict
49
+ Spec keyword arguments.
50
+
51
+ Returns
52
+ -------
53
+ Trigger
54
+ Object instance.
55
+
56
+ Examples
57
+ --------
58
+ >>> obj = new_trigger(project="my-project",
59
+ >>> kind="trigger",
60
+ >>> name="my-trigger",)
61
+ """
62
+ if workflow is None and function is None:
63
+ raise ValueError("Workflow or function must be provided")
64
+ if kwargs is None:
65
+ kwargs = {}
66
+ if template is None:
67
+ template = {}
68
+ template["task"] = task
69
+ if workflow is not None:
70
+ template["workflow"] = workflow
71
+ if function is not None:
72
+ template["function"] = function
73
+ kwargs["template"] = template
74
+ return context_processor.create_context_entity(
75
+ project=project,
76
+ name=name,
77
+ kind=kind,
78
+ uuid=uuid,
79
+ description=description,
80
+ labels=labels,
81
+ embedded=embedded,
82
+ **kwargs,
83
+ )
84
+
85
+
86
+ def get_trigger(
87
+ identifier: str,
88
+ project: str | None = None,
89
+ entity_id: str | None = None,
90
+ **kwargs,
91
+ ) -> Trigger:
92
+ """
93
+ Get object from backend.
94
+
95
+ Parameters
96
+ ----------
97
+ identifier : str
98
+ Entity key (store://...) or entity name.
99
+ project : str
100
+ Project name.
101
+ entity_id : str
102
+ Entity ID.
103
+ **kwargs : dict
104
+ Parameters to pass to the API call.
105
+
106
+ Returns
107
+ -------
108
+ Trigger
109
+ Object instance.
110
+
111
+ Examples
112
+ --------
113
+ Using entity key:
114
+ >>> obj = get_trigger("store://my-trigger-key")
115
+
116
+ Using entity name:
117
+ >>> obj = get_trigger("my-trigger-name"
118
+ >>> project="my-project",
119
+ >>> entity_id="my-trigger-id")
120
+ """
121
+ return context_processor.read_context_entity(
122
+ identifier,
123
+ entity_type=ENTITY_TYPE,
124
+ project=project,
125
+ entity_id=entity_id,
126
+ **kwargs,
127
+ )
128
+
129
+
130
+ def get_trigger_versions(
131
+ identifier: str,
132
+ project: str | None = None,
133
+ **kwargs,
134
+ ) -> list[Trigger]:
135
+ """
136
+ Get object versions from backend.
137
+
138
+ Parameters
139
+ ----------
140
+ identifier : str
141
+ Entity key (store://...) or entity name.
142
+ project : str
143
+ Project name.
144
+ **kwargs : dict
145
+ Parameters to pass to the API call.
146
+
147
+ Returns
148
+ -------
149
+ list[Trigger]
150
+ List of object instances.
151
+
152
+ Examples
153
+ --------
154
+ Using entity key:
155
+ >>> objs = get_trigger_versions("store://my-trigger-key")
156
+
157
+ Using entity name:
158
+ >>> objs = get_trigger_versions("my-trigger-name",
159
+ >>> project="my-project")
160
+ """
161
+ return context_processor.read_context_entity_versions(
162
+ identifier,
163
+ entity_type=ENTITY_TYPE,
164
+ project=project,
165
+ **kwargs,
166
+ )
167
+
168
+
169
+ def list_triggers(project: str, **kwargs) -> list[Trigger]:
170
+ """
171
+ List all latest version objects from backend.
172
+
173
+ Parameters
174
+ ----------
175
+ project : str
176
+ Project name.
177
+ **kwargs : dict
178
+ Parameters to pass to the API call.
179
+
180
+ Returns
181
+ -------
182
+ list[Trigger]
183
+ List of object instances.
184
+
185
+ Examples
186
+ --------
187
+ >>> objs = list_triggers(project="my-project")
188
+ """
189
+ return context_processor.list_context_entities(
190
+ project=project,
191
+ entity_type=ENTITY_TYPE,
192
+ **kwargs,
193
+ )
194
+
195
+
196
+ def import_trigger(file: str) -> Trigger:
197
+ """
198
+ Import object from a YAML file and create a new object into the backend.
199
+
200
+ Parameters
201
+ ----------
202
+ file : str
203
+ Path to YAML file.
204
+
205
+ Returns
206
+ -------
207
+ Trigger
208
+ Object instance.
209
+
210
+ Examples
211
+ --------
212
+ >>> obj = import_trigger("my-trigger.yaml")
213
+ """
214
+ return context_processor.import_context_entity(file)
215
+
216
+
217
+ def load_trigger(file: str) -> Trigger:
218
+ """
219
+ Load object from a YAML file and update an existing object into the backend.
220
+
221
+ Parameters
222
+ ----------
223
+ file : str
224
+ Path to YAML file.
225
+
226
+ Returns
227
+ -------
228
+ Trigger
229
+ Object instance.
230
+
231
+ Examples
232
+ --------
233
+ >>> obj = load_trigger("my-trigger.yaml")
234
+ """
235
+ return context_processor.load_context_entity(file)
236
+
237
+
238
+ def update_trigger(entity: Trigger) -> Trigger:
239
+ """
240
+ Update object. Note that object spec are immutable.
241
+
242
+ Parameters
243
+ ----------
244
+ entity : Trigger
245
+ Object to update.
246
+
247
+ Returns
248
+ -------
249
+ Trigger
250
+ Entity updated.
251
+
252
+ Examples
253
+ --------
254
+ >>> obj = update_trigger(obj)
255
+ """
256
+ return context_processor.update_context_entity(
257
+ project=entity.project,
258
+ entity_type=entity.ENTITY_TYPE,
259
+ entity_id=entity.id,
260
+ entity_dict=entity.to_dict(),
261
+ )
262
+
263
+
264
+ def delete_trigger(
265
+ identifier: str,
266
+ project: str | None = None,
267
+ entity_id: str | None = None,
268
+ delete_all_versions: bool = False,
269
+ **kwargs,
270
+ ) -> dict:
271
+ """
272
+ Delete object from backend.
273
+
274
+ Parameters
275
+ ----------
276
+ identifier : str
277
+ Entity key (store://...) or entity name.
278
+ project : str
279
+ Project name.
280
+ entity_id : str
281
+ Entity ID.
282
+ delete_all_versions : bool
283
+ Delete all versions of the named entity. If True, use entity name instead of entity key as identifier.
284
+ **kwargs : dict
285
+ Parameters to pass to the API call.
286
+
287
+ Returns
288
+ -------
289
+ dict
290
+ Response from backend.
291
+
292
+ Examples
293
+ --------
294
+ If delete_all_versions is False:
295
+ >>> obj = delete_trigger("store://my-trigger-key")
296
+
297
+ Otherwise:
298
+ >>> obj = delete_trigger("my-trigger-name"
299
+ >>> project="my-project",
300
+ >>> delete_all_versions=True)
301
+ """
302
+ return context_processor.delete_context_entity(
303
+ identifier=identifier,
304
+ entity_type=ENTITY_TYPE,
305
+ project=project,
306
+ entity_id=entity_id,
307
+ delete_all_versions=delete_all_versions,
308
+ **kwargs,
309
+ )
File without changes
@@ -0,0 +1,19 @@
1
+ from __future__ import annotations
2
+
3
+ from digitalhub.entities._commons.enums import EntityKinds
4
+ from digitalhub.entities.trigger._base.builder import TriggerBuilder
5
+ from digitalhub.entities.trigger.lifecycle.entity import TriggerLifecycle
6
+ from digitalhub.entities.trigger.lifecycle.spec import TriggerSpecLifecycle, TriggerValidatorLifecycle
7
+ from digitalhub.entities.trigger.lifecycle.status import TriggerStatusLifecycle
8
+
9
+
10
+ class TriggerLifecycleBuilder(TriggerBuilder):
11
+ """
12
+ TriggerLifecycle builder.
13
+ """
14
+
15
+ ENTITY_CLASS = TriggerLifecycle
16
+ ENTITY_SPEC_CLASS = TriggerSpecLifecycle
17
+ ENTITY_SPEC_VALIDATOR = TriggerValidatorLifecycle
18
+ ENTITY_STATUS_CLASS = TriggerStatusLifecycle
19
+ ENTITY_KIND = EntityKinds.TRIGGER_LIFECYCLE.value
@@ -0,0 +1,32 @@
1
+ from __future__ import annotations
2
+
3
+ import typing
4
+
5
+ from digitalhub.entities.trigger._base.entity import Trigger
6
+
7
+ if typing.TYPE_CHECKING:
8
+ from digitalhub.entities._base.entity.metadata import Metadata
9
+ from digitalhub.entities.trigger.lifecycle.spec import TriggerSpecLifecycle
10
+ from digitalhub.entities.trigger.lifecycle.status import TriggerStatusLifecycle
11
+
12
+
13
+ class TriggerLifecycle(Trigger):
14
+ """
15
+ TriggerLifecycle class.
16
+ """
17
+
18
+ def __init__(
19
+ self,
20
+ project: str,
21
+ name: str,
22
+ uuid: str,
23
+ kind: str,
24
+ metadata: Metadata,
25
+ spec: TriggerSpecLifecycle,
26
+ status: TriggerStatusLifecycle,
27
+ user: str | None = None,
28
+ ) -> None:
29
+ super().__init__(project, name, uuid, kind, metadata, spec, status, user)
30
+
31
+ self.spec: TriggerSpecLifecycle
32
+ self.status: TriggerStatusLifecycle
@@ -0,0 +1,38 @@
1
+ from __future__ import annotations
2
+
3
+ from pydantic import Field
4
+
5
+ from digitalhub.entities.trigger._base.spec import TriggerSpec, TriggerValidator
6
+
7
+ regexp = r"store://([^/]+)/(.+)"
8
+
9
+
10
+ class TriggerSpecLifecycle(TriggerSpec):
11
+ """
12
+ TriggerSpecLifecycle specifications.
13
+ """
14
+
15
+ def __init__(
16
+ self,
17
+ task: str,
18
+ template: dict,
19
+ function: str | None = None,
20
+ workflow: str | None = None,
21
+ key: str | None = None,
22
+ states: list[str] | None = None,
23
+ ) -> None:
24
+ super().__init__(task, template, function, workflow)
25
+ self.key = key
26
+ self.states = states
27
+
28
+
29
+ class TriggerValidatorLifecycle(TriggerValidator):
30
+ """
31
+ TriggerValidatorLifecycle validator.
32
+ """
33
+
34
+ key: str = Field(pattern=regexp)
35
+ """Entity key."""
36
+
37
+ states: list[str] = None
38
+ """List of entity states."""
@@ -0,0 +1,9 @@
1
+ from __future__ import annotations
2
+
3
+ from digitalhub.entities.trigger._base.status import TriggerStatus
4
+
5
+
6
+ class TriggerStatusLifecycle(TriggerStatus):
7
+ """
8
+ TriggerStatusLifecycle status.
9
+ """
File without changes
@@ -0,0 +1,19 @@
1
+ from __future__ import annotations
2
+
3
+ from digitalhub.entities._commons.enums import EntityKinds
4
+ from digitalhub.entities.trigger._base.builder import TriggerBuilder
5
+ from digitalhub.entities.trigger.scheduler.entity import TriggerScheduler
6
+ from digitalhub.entities.trigger.scheduler.spec import TriggerSpecScheduler, TriggerValidatorScheduler
7
+ from digitalhub.entities.trigger.scheduler.status import TriggerStatusScheduler
8
+
9
+
10
+ class TriggerSchedulerBuilder(TriggerBuilder):
11
+ """
12
+ TriggerScheduler builder.
13
+ """
14
+
15
+ ENTITY_CLASS = TriggerScheduler
16
+ ENTITY_SPEC_CLASS = TriggerSpecScheduler
17
+ ENTITY_SPEC_VALIDATOR = TriggerValidatorScheduler
18
+ ENTITY_STATUS_CLASS = TriggerStatusScheduler
19
+ ENTITY_KIND = EntityKinds.TRIGGER_SCHEDULER.value
@@ -0,0 +1,32 @@
1
+ from __future__ import annotations
2
+
3
+ import typing
4
+
5
+ from digitalhub.entities.trigger._base.entity import Trigger
6
+
7
+ if typing.TYPE_CHECKING:
8
+ from digitalhub.entities._base.entity.metadata import Metadata
9
+ from digitalhub.entities.trigger.scheduler.spec import TriggerSpecScheduler
10
+ from digitalhub.entities.trigger.scheduler.status import TriggerStatusScheduler
11
+
12
+
13
+ class TriggerScheduler(Trigger):
14
+ """
15
+ TriggerScheduler class.
16
+ """
17
+
18
+ def __init__(
19
+ self,
20
+ project: str,
21
+ name: str,
22
+ uuid: str,
23
+ kind: str,
24
+ metadata: Metadata,
25
+ spec: TriggerSpecScheduler,
26
+ status: TriggerStatusScheduler,
27
+ user: str | None = None,
28
+ ) -> None:
29
+ super().__init__(project, name, uuid, kind, metadata, spec, status, user)
30
+
31
+ self.spec: TriggerSpecScheduler
32
+ self.status: TriggerStatusScheduler
@@ -0,0 +1,29 @@
1
+ from __future__ import annotations
2
+
3
+ from digitalhub.entities.trigger._base.spec import TriggerSpec, TriggerValidator
4
+
5
+
6
+ class TriggerSpecScheduler(TriggerSpec):
7
+ """
8
+ TriggerSpecScheduler specifications.
9
+ """
10
+
11
+ def __init__(
12
+ self,
13
+ task: str,
14
+ template: dict,
15
+ function: str | None = None,
16
+ workflow: str | None = None,
17
+ schedule: str | None = None,
18
+ ) -> None:
19
+ super().__init__(task, template, function, workflow)
20
+ self.schedule = schedule
21
+
22
+
23
+ class TriggerValidatorScheduler(TriggerValidator):
24
+ """
25
+ TriggerValidatorScheduler validator.
26
+ """
27
+
28
+ schedule: str
29
+ """Quartz cron expression."""
@@ -0,0 +1,9 @@
1
+ from __future__ import annotations
2
+
3
+ from digitalhub.entities.trigger._base.status import TriggerStatus
4
+
5
+
6
+ class TriggerStatusScheduler(TriggerStatus):
7
+ """
8
+ TriggerStatusScheduler status.
9
+ """
@@ -4,7 +4,7 @@ import typing
4
4
 
5
5
  from digitalhub.entities._base.executable.entity import ExecutableEntity
6
6
  from digitalhub.entities._commons.enums import EntityTypes, Relationship
7
- from digitalhub.factory.api import get_run_kind, get_task_kind_from_action
7
+ from digitalhub.factory.factory import factory
8
8
  from digitalhub.utils.exceptions import BackendError
9
9
 
10
10
  if typing.TYPE_CHECKING:
@@ -68,8 +68,8 @@ class Workflow(ExecutableEntity):
68
68
  Run instance.
69
69
  """
70
70
  # Get task and run kind
71
- task_kind = get_task_kind_from_action(self.kind, action)
72
- run_kind = get_run_kind(self.kind)
71
+ task_kind = factory.get_task_kind_from_action(self.kind, action)
72
+ run_kind = factory.get_run_kind(self.kind)
73
73
 
74
74
  # Create or update new task
75
75
  task = self._get_or_create_task(task_kind)