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
@@ -7,8 +7,8 @@ from __future__ import annotations
7
7
  import typing
8
8
 
9
9
  from digitalhub.entities._commons.enums import EntityTypes
10
- from digitalhub.entities._processors.context import context_processor
11
- from digitalhub.entities.artifact.utils import eval_source, process_kwargs
10
+ from digitalhub.entities._processors.processors import context_processor
11
+ from digitalhub.entities.model.utils import eval_source, process_kwargs
12
12
  from digitalhub.utils.types import SourcesOrListOfSources
13
13
 
14
14
  if typing.TYPE_CHECKING:
@@ -131,7 +131,6 @@ def get_model(
131
131
  identifier: str,
132
132
  project: str | None = None,
133
133
  entity_id: str | None = None,
134
- **kwargs,
135
134
  ) -> Model:
136
135
  """
137
136
  Get object from backend.
@@ -144,8 +143,6 @@ def get_model(
144
143
  Project name.
145
144
  entity_id : str
146
145
  Entity ID.
147
- **kwargs : dict
148
- Parameters to pass to the API call.
149
146
 
150
147
  Returns
151
148
  -------
@@ -167,14 +164,12 @@ def get_model(
167
164
  entity_type=ENTITY_TYPE,
168
165
  project=project,
169
166
  entity_id=entity_id,
170
- **kwargs,
171
167
  )
172
168
 
173
169
 
174
170
  def get_model_versions(
175
171
  identifier: str,
176
172
  project: str | None = None,
177
- **kwargs,
178
173
  ) -> list[Model]:
179
174
  """
180
175
  Get object versions from backend.
@@ -185,8 +180,6 @@ def get_model_versions(
185
180
  Entity key (store://...) or entity name.
186
181
  project : str
187
182
  Project name.
188
- **kwargs : dict
189
- Parameters to pass to the API call.
190
183
 
191
184
  Returns
192
185
  -------
@@ -206,11 +199,20 @@ def get_model_versions(
206
199
  identifier=identifier,
207
200
  entity_type=ENTITY_TYPE,
208
201
  project=project,
209
- **kwargs,
210
202
  )
211
203
 
212
204
 
213
- def list_models(project: str, **kwargs) -> list[Model]:
205
+ def list_models(
206
+ project: str,
207
+ q: str | None = None,
208
+ name: str | None = None,
209
+ kind: str | None = None,
210
+ user: str | None = None,
211
+ state: str | None = None,
212
+ created: str | None = None,
213
+ updated: str | None = None,
214
+ versions: str | None = None,
215
+ ) -> list[Model]:
214
216
  """
215
217
  List all latest version objects from backend.
216
218
 
@@ -218,8 +220,22 @@ def list_models(project: str, **kwargs) -> list[Model]:
218
220
  ----------
219
221
  project : str
220
222
  Project name.
221
- **kwargs : dict
222
- Parameters to pass to the API call.
223
+ q : str
224
+ Query string to filter objects.
225
+ name : str
226
+ Object name.
227
+ kind : str
228
+ Kind of the object.
229
+ user : str
230
+ User that created the object.
231
+ state : str
232
+ Object state.
233
+ created : str
234
+ Creation date filter.
235
+ updated : str
236
+ Update date filter.
237
+ versions : str
238
+ Object version, default is latest.
223
239
 
224
240
  Returns
225
241
  -------
@@ -233,18 +249,36 @@ def list_models(project: str, **kwargs) -> list[Model]:
233
249
  return context_processor.list_context_entities(
234
250
  project=project,
235
251
  entity_type=ENTITY_TYPE,
236
- **kwargs,
252
+ q=q,
253
+ name=name,
254
+ kind=kind,
255
+ user=user,
256
+ state=state,
257
+ created=created,
258
+ updated=updated,
259
+ versions=versions,
237
260
  )
238
261
 
239
262
 
240
- def import_model(file: str) -> Model:
263
+ def import_model(
264
+ file: str | None = None,
265
+ key: str | None = None,
266
+ reset_id: bool = False,
267
+ context: str | None = None,
268
+ ) -> Model:
241
269
  """
242
- Import object from a YAML file and create a new object into the backend.
270
+ Import an object from a YAML file or from a storage key.
243
271
 
244
272
  Parameters
245
273
  ----------
246
274
  file : str
247
- Path to YAML file.
275
+ Path to the YAML file.
276
+ key : str
277
+ Entity key (store://...).
278
+ reset_id : bool
279
+ Flag to determine if the ID of executable entities should be reset.
280
+ context : str
281
+ Project name to use for context resolution.
248
282
 
249
283
  Returns
250
284
  -------
@@ -255,7 +289,12 @@ def import_model(file: str) -> Model:
255
289
  --------
256
290
  >>> obj = import_model("my-model.yaml")
257
291
  """
258
- return context_processor.import_context_entity(file)
292
+ return context_processor.import_context_entity(
293
+ file,
294
+ key,
295
+ reset_id,
296
+ context,
297
+ )
259
298
 
260
299
 
261
300
  def load_model(file: str) -> Model:
@@ -311,7 +350,6 @@ def delete_model(
311
350
  entity_id: str | None = None,
312
351
  delete_all_versions: bool = False,
313
352
  cascade: bool = True,
314
- **kwargs,
315
353
  ) -> dict:
316
354
  """
317
355
  Delete object from backend.
@@ -325,11 +363,10 @@ def delete_model(
325
363
  entity_id : str
326
364
  Entity ID.
327
365
  delete_all_versions : bool
328
- Delete all versions of the named entity. If True, use entity name instead of entity key as identifier.
366
+ Delete all versions of the named entity.
367
+ If True, use entity name instead of entity key as identifier.
329
368
  cascade : bool
330
369
  Cascade delete.
331
- **kwargs : dict
332
- Parameters to pass to the API call.
333
370
 
334
371
  Returns
335
372
  -------
@@ -353,5 +390,4 @@ def delete_model(
353
390
  entity_id=entity_id,
354
391
  delete_all_versions=delete_all_versions,
355
392
  cascade=cascade,
356
- **kwargs,
357
393
  )
@@ -53,10 +53,13 @@ def from_mlflow_run(run_id: str) -> dict:
53
53
  # Extract spec
54
54
  data = run.data
55
55
  parameters = data.params
56
- source_path = urlparse(run.info.artifact_uri).path
56
+ source_path = urlparse(run.info.artifact_uri).path + "/model"
57
57
  model_uri = f"runs:/{run_id}/model"
58
58
  model = mlflow.pyfunc.load_model(model_uri=model_uri)
59
- model_config = model.model_config
59
+ try:
60
+ model_config = model.model_config
61
+ except Exception:
62
+ model_config = {}
60
63
  flavor = None
61
64
  for f in model.metadata.flavors:
62
65
  if f != "python_function":
@@ -64,27 +67,33 @@ def from_mlflow_run(run_id: str) -> dict:
64
67
  break
65
68
 
66
69
  # Extract signature
67
- mlflow_signature = model.metadata.signature
68
- signature = Signature(
69
- inputs=mlflow_signature.inputs.to_json() if mlflow_signature.inputs else None,
70
- outputs=mlflow_signature.outputs.to_json() if mlflow_signature.outputs else None,
71
- params=mlflow_signature.params.to_json() if mlflow_signature.params else None,
72
- ).to_dict()
70
+ try:
71
+ mlflow_signature = model.metadata.signature
72
+ signature = Signature(
73
+ inputs=mlflow_signature.inputs.to_json() if mlflow_signature.inputs else None,
74
+ outputs=mlflow_signature.outputs.to_json() if mlflow_signature.outputs else None,
75
+ params=mlflow_signature.params.to_json() if mlflow_signature.params else None,
76
+ ).to_dict()
77
+ except Exception:
78
+ signature = None
73
79
 
74
80
  # Extract datasets
75
81
  datasets = []
76
- if run.inputs and run.inputs.dataset_inputs:
77
- datasets = [
78
- Dataset(
79
- name=d.dataset.name,
80
- digest=d.dataset.digest,
81
- profile=d.dataset.profile,
82
- dataset_schema=d.dataset.schema,
83
- source=d.dataset.source,
84
- source_type=d.dataset.source_type,
85
- ).to_dict()
86
- for d in run.inputs.dataset_inputs
87
- ]
82
+ try:
83
+ if run.inputs and run.inputs.dataset_inputs:
84
+ datasets = [
85
+ Dataset(
86
+ name=d.dataset.name,
87
+ digest=d.dataset.digest,
88
+ profile=d.dataset.profile,
89
+ dataset_schema=d.dataset.schema,
90
+ source=d.dataset.source,
91
+ source_type=d.dataset.source_type,
92
+ ).to_dict()
93
+ for d in run.inputs.dataset_inputs
94
+ ]
95
+ except Exception:
96
+ datasets = []
88
97
 
89
98
  # Create model params
90
99
  model_params = {}
@@ -6,25 +6,32 @@ from __future__ import annotations
6
6
 
7
7
  from typing import Any
8
8
 
9
- from digitalhub.entities._base.entity._constructors.uuid import build_uuid
10
9
  from digitalhub.entities._base.material.utils import build_log_path_from_source, eval_local_source
11
10
  from digitalhub.entities._commons.enums import EntityTypes
11
+ from digitalhub.entities._constructors.uuid import build_uuid
12
12
 
13
13
 
14
14
  def eval_source(
15
15
  source: str | list[str] | None = None,
16
16
  ) -> Any:
17
17
  """
18
- Evaluate if source is local.
18
+ Evaluate whether the source is local or remote.
19
+
20
+ Determines if the provided source(s) reference local files or
21
+ remote resources. This evaluation affects how the model
22
+ will be processed and stored.
19
23
 
20
24
  Parameters
21
25
  ----------
22
- source : str | list[str]
23
- Source(s).
26
+ source : str, list[str], or None
27
+ The source specification(s) to evaluate. Can be a single
28
+ source string, a list of source strings, or None.
24
29
 
25
30
  Returns
26
31
  -------
27
- None
32
+ Any
33
+ The result of the local source evaluation, indicating
34
+ whether the source is local or remote.
28
35
  """
29
36
  return eval_local_source(source)
30
37
 
@@ -37,25 +44,33 @@ def process_kwargs(
37
44
  **kwargs,
38
45
  ) -> dict:
39
46
  """
40
- Process spec kwargs.
47
+ Process and enhance specification parameters for model creation.
48
+
49
+ Processes the keyword arguments for model specification, handling
50
+ path generation and UUID assignment. If no path is provided, generates
51
+ a unique path based on project, entity type, name, and source.
41
52
 
42
53
  Parameters
43
54
  ----------
44
55
  project : str
45
- Project name.
56
+ The name of the project containing the model.
46
57
  name : str
47
- Object name.
48
- source : str
49
- Source(s).
58
+ The name of the model entity.
59
+ source : str or list[str]
60
+ The source specification(s) for the model content.
61
+ Can be a single source or multiple sources.
50
62
  path : str
51
- Destination path of the entity. If not provided, it's generated.
63
+ The destination path for the model entity.
64
+ If None, a path will be automatically generated.
52
65
  **kwargs : dict
53
- Spec parameters.
66
+ Additional specification parameters to be processed
67
+ and passed to the model creation.
54
68
 
55
69
  Returns
56
70
  -------
57
71
  dict
58
- Kwargs updated.
72
+ The updated kwargs dictionary with processed path
73
+ and UUID information included.
59
74
  """
60
75
  if path is None:
61
76
  uuid = build_uuid()
@@ -29,7 +29,6 @@ class ProjectProjectBuilder(EntityBuilder):
29
29
  kind: str,
30
30
  description: str | None = None,
31
31
  labels: list[str] | None = None,
32
- local: bool = False,
33
32
  config: dict | None = None,
34
33
  context: str | None = None,
35
34
  **kwargs,
@@ -47,8 +46,6 @@ class ProjectProjectBuilder(EntityBuilder):
47
46
  Description of the object (human readable).
48
47
  labels : list[str]
49
48
  List of labels.
50
- local : bool
51
- If True, use local backend, if False use DHCore backend. Default to False.
52
49
  config : dict
53
50
  DHCore environment configuration.
54
51
  context : str
@@ -80,7 +77,6 @@ class ProjectProjectBuilder(EntityBuilder):
80
77
  metadata=metadata,
81
78
  spec=spec,
82
79
  status=status,
83
- local=local,
84
80
  )
85
81
 
86
82
  def from_dict(self, obj: dict, validate: bool = True) -> Project:
@@ -120,7 +116,6 @@ class ProjectProjectBuilder(EntityBuilder):
120
116
  """
121
117
  name = self.build_name(obj.get("name"))
122
118
  kind = obj.get("kind")
123
- local = obj.get("local", False)
124
119
  metadata = self.build_metadata(**obj.get("metadata", {}))
125
120
  spec = self.build_spec(validate=validate, **obj.get("spec", {}))
126
121
  status = self.build_status(**obj.get("status", {}))
@@ -132,5 +127,4 @@ class ProjectProjectBuilder(EntityBuilder):
132
127
  "spec": spec,
133
128
  "status": status,
134
129
  "user": user,
135
- "local": local,
136
130
  }