digitalhub 0.9.1__py3-none-any.whl → 0.10.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 (121) hide show
  1. digitalhub/__init__.py +2 -3
  2. digitalhub/client/_base/api_builder.py +1 -1
  3. digitalhub/client/_base/client.py +25 -2
  4. digitalhub/client/_base/params_builder.py +16 -0
  5. digitalhub/client/dhcore/api_builder.py +10 -4
  6. digitalhub/client/dhcore/client.py +30 -398
  7. digitalhub/client/dhcore/configurator.py +361 -0
  8. digitalhub/client/dhcore/error_parser.py +107 -0
  9. digitalhub/client/dhcore/models.py +13 -23
  10. digitalhub/client/dhcore/params_builder.py +178 -0
  11. digitalhub/client/dhcore/utils.py +4 -44
  12. digitalhub/client/local/api_builder.py +13 -18
  13. digitalhub/client/local/client.py +18 -2
  14. digitalhub/client/local/enums.py +11 -0
  15. digitalhub/client/local/params_builder.py +116 -0
  16. digitalhub/configurator/api.py +31 -0
  17. digitalhub/configurator/configurator.py +195 -0
  18. digitalhub/configurator/credentials_store.py +65 -0
  19. digitalhub/configurator/ini_module.py +74 -0
  20. digitalhub/entities/_base/_base/entity.py +2 -2
  21. digitalhub/entities/_base/context/entity.py +4 -4
  22. digitalhub/entities/_base/entity/builder.py +5 -5
  23. digitalhub/entities/_base/executable/entity.py +2 -2
  24. digitalhub/entities/_base/material/entity.py +12 -12
  25. digitalhub/entities/_base/material/status.py +1 -1
  26. digitalhub/entities/_base/material/utils.py +2 -2
  27. digitalhub/entities/_base/unversioned/entity.py +2 -2
  28. digitalhub/entities/_base/versioned/entity.py +2 -2
  29. digitalhub/entities/_commons/enums.py +2 -0
  30. digitalhub/entities/_commons/metrics.py +164 -0
  31. digitalhub/entities/_commons/types.py +5 -0
  32. digitalhub/entities/_commons/utils.py +2 -2
  33. digitalhub/entities/_processors/base.py +527 -0
  34. digitalhub/entities/{_operations/processor.py → _processors/context.py} +212 -837
  35. digitalhub/entities/_processors/utils.py +158 -0
  36. digitalhub/entities/artifact/artifact/spec.py +3 -1
  37. digitalhub/entities/artifact/crud.py +13 -12
  38. digitalhub/entities/artifact/utils.py +1 -1
  39. digitalhub/entities/builders.py +6 -18
  40. digitalhub/entities/dataitem/_base/entity.py +0 -41
  41. digitalhub/entities/dataitem/crud.py +27 -15
  42. digitalhub/entities/dataitem/table/entity.py +49 -35
  43. digitalhub/entities/dataitem/table/models.py +4 -3
  44. digitalhub/{utils/data_utils.py → entities/dataitem/table/utils.py} +46 -54
  45. digitalhub/entities/dataitem/utils.py +58 -10
  46. digitalhub/entities/function/crud.py +9 -9
  47. digitalhub/entities/model/_base/entity.py +120 -0
  48. digitalhub/entities/model/_base/spec.py +6 -17
  49. digitalhub/entities/model/_base/status.py +10 -0
  50. digitalhub/entities/model/crud.py +13 -12
  51. digitalhub/entities/model/huggingface/spec.py +9 -4
  52. digitalhub/entities/model/mlflow/models.py +2 -2
  53. digitalhub/entities/model/mlflow/spec.py +7 -7
  54. digitalhub/entities/model/mlflow/utils.py +44 -5
  55. digitalhub/entities/project/_base/entity.py +317 -9
  56. digitalhub/entities/project/_base/spec.py +8 -6
  57. digitalhub/entities/project/crud.py +12 -11
  58. digitalhub/entities/run/_base/entity.py +103 -6
  59. digitalhub/entities/run/_base/spec.py +4 -2
  60. digitalhub/entities/run/_base/status.py +12 -0
  61. digitalhub/entities/run/crud.py +8 -8
  62. digitalhub/entities/secret/_base/entity.py +3 -3
  63. digitalhub/entities/secret/_base/spec.py +4 -2
  64. digitalhub/entities/secret/crud.py +11 -9
  65. digitalhub/entities/task/_base/entity.py +4 -4
  66. digitalhub/entities/task/_base/models.py +51 -40
  67. digitalhub/entities/task/_base/spec.py +2 -0
  68. digitalhub/entities/task/_base/utils.py +2 -2
  69. digitalhub/entities/task/crud.py +12 -8
  70. digitalhub/entities/workflow/crud.py +9 -9
  71. digitalhub/factory/utils.py +9 -9
  72. digitalhub/readers/{_base → data/_base}/builder.py +1 -1
  73. digitalhub/readers/{_base → data/_base}/reader.py +16 -4
  74. digitalhub/readers/{api.py → data/api.py} +2 -2
  75. digitalhub/readers/{factory.py → data/factory.py} +3 -3
  76. digitalhub/readers/{pandas → data/pandas}/builder.py +2 -2
  77. digitalhub/readers/{pandas → data/pandas}/reader.py +110 -30
  78. digitalhub/readers/query/__init__.py +0 -0
  79. digitalhub/stores/_base/store.py +59 -69
  80. digitalhub/stores/api.py +8 -33
  81. digitalhub/stores/builder.py +44 -161
  82. digitalhub/stores/local/store.py +106 -89
  83. digitalhub/stores/remote/store.py +86 -11
  84. digitalhub/stores/s3/configurator.py +108 -0
  85. digitalhub/stores/s3/enums.py +17 -0
  86. digitalhub/stores/s3/models.py +21 -0
  87. digitalhub/stores/s3/store.py +154 -70
  88. digitalhub/{utils/s3_utils.py → stores/s3/utils.py} +7 -3
  89. digitalhub/stores/sql/configurator.py +88 -0
  90. digitalhub/stores/sql/enums.py +16 -0
  91. digitalhub/stores/sql/models.py +24 -0
  92. digitalhub/stores/sql/store.py +106 -85
  93. digitalhub/{readers/_commons → utils}/enums.py +5 -1
  94. digitalhub/utils/exceptions.py +6 -0
  95. digitalhub/utils/file_utils.py +8 -7
  96. digitalhub/utils/generic_utils.py +28 -15
  97. digitalhub/utils/git_utils.py +16 -9
  98. digitalhub/utils/types.py +5 -0
  99. digitalhub/utils/uri_utils.py +2 -2
  100. {digitalhub-0.9.1.dist-info → digitalhub-0.10.0.dist-info}/METADATA +25 -31
  101. {digitalhub-0.9.1.dist-info → digitalhub-0.10.0.dist-info}/RECORD +108 -99
  102. {digitalhub-0.9.1.dist-info → digitalhub-0.10.0.dist-info}/WHEEL +1 -2
  103. digitalhub/client/dhcore/env.py +0 -23
  104. digitalhub/entities/_base/project/entity.py +0 -341
  105. digitalhub-0.9.1.dist-info/top_level.txt +0 -2
  106. test/local/CRUD/test_artifacts.py +0 -96
  107. test/local/CRUD/test_dataitems.py +0 -96
  108. test/local/CRUD/test_models.py +0 -95
  109. test/local/imports/test_imports.py +0 -66
  110. test/local/instances/test_validate.py +0 -55
  111. test/test_crud_functions.py +0 -109
  112. test/test_crud_runs.py +0 -86
  113. test/test_crud_tasks.py +0 -81
  114. test/testkfp.py +0 -37
  115. test/testkfp_pipeline.py +0 -22
  116. /digitalhub/{entities/_base/project → configurator}/__init__.py +0 -0
  117. /digitalhub/entities/{_operations → _processors}/__init__.py +0 -0
  118. /digitalhub/readers/{_base → data}/__init__.py +0 -0
  119. /digitalhub/readers/{_commons → data/_base}/__init__.py +0 -0
  120. /digitalhub/readers/{pandas → data/pandas}/__init__.py +0 -0
  121. {digitalhub-0.9.1.dist-info → digitalhub-0.10.0.dist-info/licenses}/LICENSE.txt +0 -0
@@ -1,341 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import typing
4
- from pathlib import Path
5
-
6
- from digitalhub.client.api import get_client
7
- from digitalhub.context.api import build_context
8
- from digitalhub.entities._base.entity.entity import Entity
9
- from digitalhub.entities._commons.enums import EntityTypes
10
- from digitalhub.entities._operations.processor import processor
11
- from digitalhub.factory.api import build_entity_from_dict
12
- from digitalhub.utils.exceptions import BackendError, EntityAlreadyExistsError, EntityError
13
- from digitalhub.utils.generic_utils import get_timestamp
14
- from digitalhub.utils.io_utils import write_yaml
15
- from digitalhub.utils.uri_utils import has_local_scheme
16
-
17
- if typing.TYPE_CHECKING:
18
- from digitalhub.entities._base.context.entity import ContextEntity
19
- from digitalhub.entities._base.entity.metadata import Metadata
20
- from digitalhub.entities._base.entity.spec import Spec
21
- from digitalhub.entities._base.entity.status import Status
22
-
23
-
24
- class ProjectEntity(Entity):
25
- """
26
- Base entity for Project entity.
27
- Used to abstract a bit by handling I/O CRUD.
28
- """
29
-
30
- def __init__(
31
- self,
32
- name: str,
33
- kind: str,
34
- metadata: Metadata,
35
- spec: Spec,
36
- status: Status,
37
- user: str | None = None,
38
- local: bool = False,
39
- ) -> None:
40
- super().__init__(kind, metadata, spec, status, user)
41
- self.id = name
42
- self.name = name
43
- self.key = processor.build_project_key(self.name, local=local)
44
-
45
- self._obj_attr.extend(["id", "name"])
46
-
47
- # Set client
48
- self._client = get_client(local)
49
-
50
- # Set context
51
- build_context(self)
52
-
53
- ##############################
54
- # Save / Refresh / Export
55
- ##############################
56
-
57
- def save(self, update: bool = False) -> ProjectEntity:
58
- """
59
- Save entity into backend.
60
-
61
- Parameters
62
- ----------
63
- update : bool
64
- If True, the object will be updated.
65
-
66
- Returns
67
- -------
68
- Project
69
- Entity saved.
70
- """
71
- if update:
72
- if self._client.is_local():
73
- self.metadata.updated = get_timestamp()
74
- new_obj = processor.update_project_entity(
75
- entity_type=self.ENTITY_TYPE,
76
- entity_name=self.name,
77
- entity_dict=self.to_dict(),
78
- local=self._client.is_local(),
79
- )
80
- else:
81
- new_obj = processor.create_project_entity(_entity=self)
82
- self._update_attributes(new_obj)
83
- return self
84
-
85
- def refresh(self) -> ProjectEntity:
86
- """
87
- Refresh object from backend.
88
-
89
- Returns
90
- -------
91
- Project
92
- Project object.
93
- """
94
- new_obj = processor.read_project_entity(
95
- entity_type=self.ENTITY_TYPE,
96
- entity_name=self.name,
97
- local=self._client.is_local(),
98
- )
99
- self._update_attributes(new_obj)
100
- return self
101
-
102
- def search_entity(
103
- self,
104
- query: str | None = None,
105
- entity_types: list[str] | None = None,
106
- name: str | None = None,
107
- kind: str | None = None,
108
- created: str | None = None,
109
- updated: str | None = None,
110
- description: str | None = None,
111
- labels: list[str] | None = None,
112
- **kwargs,
113
- ) -> list[ContextEntity]:
114
- """
115
- Search objects from backend.
116
-
117
- Parameters
118
- ----------
119
- query : str
120
- Search query.
121
- entity_types : list[str]
122
- Entity types.
123
- name : str
124
- Entity name.
125
- kind : str
126
- Entity kind.
127
- created : str
128
- Entity creation date.
129
- updated : str
130
- Entity update date.
131
- description : str
132
- Entity description.
133
- labels : list[str]
134
- Entity labels.
135
- **kwargs : dict
136
- Parameters to pass to the API call.
137
-
138
- Returns
139
- -------
140
- list[ContextEntity]
141
- List of object instances.
142
- """
143
- objs = processor.search_entity(
144
- self.name,
145
- query=query,
146
- entity_types=entity_types,
147
- name=name,
148
- kind=kind,
149
- created=created,
150
- updated=updated,
151
- description=description,
152
- labels=labels,
153
- **kwargs,
154
- )
155
- self.refresh()
156
- return objs
157
-
158
- def export(self) -> str:
159
- """
160
- Export object as a YAML file in the context folder.
161
- If the objects are not embedded, the objects are exported as a YAML file.
162
-
163
- Returns
164
- -------
165
- str
166
- Exported filepath.
167
- """
168
- obj = self._refresh_to_dict()
169
- pth = Path(self.spec.context) / f"{self.ENTITY_TYPE}s-{self.name}.yaml"
170
- obj = self._export_not_embedded(obj)
171
- write_yaml(pth, obj)
172
- return str(pth)
173
-
174
- def _refresh_to_dict(self) -> dict:
175
- """
176
- Try to refresh object to collect entities related to project.
177
-
178
- Returns
179
- -------
180
- dict
181
- Entity object in dictionary format.
182
- """
183
- try:
184
- return self.refresh().to_dict()
185
- except BackendError:
186
- return self.to_dict()
187
-
188
- def _export_not_embedded(self, obj: dict) -> dict:
189
- """
190
- Export project objects if not embedded.
191
-
192
- Parameters
193
- ----------
194
- obj : dict
195
- Project object in dictionary format.
196
-
197
- Returns
198
- -------
199
- dict
200
- Updatated project object in dictionary format with referenced entities.
201
- """
202
- # Cycle over entity types
203
- for entity_type in self._get_entity_types():
204
- # Entity types are stored as a list of entities
205
- for idx, entity in enumerate(obj.get("spec", {}).get(entity_type, [])):
206
- # Export entity if not embedded is in metadata, else do nothing
207
- if not self._is_embedded(entity):
208
- # Get entity object from backend
209
- ent = processor.read_context_entity(entity["key"])
210
-
211
- # Export and store ref in object metadata inside project
212
- pth = ent.export()
213
- obj["spec"][entity_type][idx]["metadata"]["ref"] = pth
214
-
215
- # Return updated object
216
- return obj
217
-
218
- def _import_entities(self, obj: dict) -> None:
219
- """
220
- Import project entities.
221
-
222
- Parameters
223
- ----------
224
- obj : dict
225
- Project object in dictionary format.
226
-
227
- Returns
228
- -------
229
- None
230
- """
231
- entity_types = self._get_entity_types()
232
-
233
- # Cycle over entity types
234
- for entity_type in entity_types:
235
- # Entity types are stored as a list of entities
236
- for entity in obj.get("spec", {}).get(entity_type, []):
237
- embedded = self._is_embedded(entity)
238
- ref = entity["metadata"].get("ref")
239
-
240
- # Import entity if not embedded and there is a ref
241
- if not embedded and ref is not None:
242
- # Import entity from local ref
243
- if has_local_scheme(ref):
244
- try:
245
- # Artifacts, Dataitems and Models
246
- if entity_type in entity_types[:3]:
247
- processor.import_context_entity(ref)
248
-
249
- # Functions and Workflows
250
- elif entity_type in entity_types[3:]:
251
- processor.import_executable_entity(ref)
252
-
253
- except FileNotFoundError:
254
- msg = f"File not found: {ref}."
255
- raise EntityError(msg)
256
-
257
- # If entity is embedded, create it and try to save
258
- elif embedded:
259
- # It's possible that embedded field in metadata is not shown
260
- if entity["metadata"].get("embedded") is None:
261
- entity["metadata"]["embedded"] = True
262
-
263
- try:
264
- build_entity_from_dict(entity).save()
265
- except EntityAlreadyExistsError:
266
- pass
267
-
268
- def _load_entities(self, obj: dict) -> None:
269
- """
270
- Load project entities.
271
-
272
- Parameters
273
- ----------
274
- obj : dict
275
- Project object in dictionary format.
276
-
277
- Returns
278
- -------
279
- None
280
- """
281
- entity_types = self._get_entity_types()
282
-
283
- # Cycle over entity types
284
- for entity_type in entity_types:
285
- # Entity types are stored as a list of entities
286
- for entity in obj.get("spec", {}).get(entity_type, []):
287
- embedded = self._is_embedded(entity)
288
- ref = entity["metadata"].get("ref")
289
-
290
- # Load entity if not embedded and there is a ref
291
- if not embedded and ref is not None:
292
- # Load entity from local ref
293
- if has_local_scheme(ref):
294
- try:
295
- # Artifacts, Dataitems and Models
296
- if entity_type in entity_types[:3]:
297
- processor.load_context_entity(ref)
298
-
299
- # Functions and Workflows
300
- elif entity_type in entity_types[3:]:
301
- processor.load_executable_entity(ref)
302
-
303
- except FileNotFoundError:
304
- msg = f"File not found: {ref}."
305
- raise EntityError(msg)
306
-
307
- def _is_embedded(self, entity: dict) -> bool:
308
- """
309
- Check if entity is embedded.
310
-
311
- Parameters
312
- ----------
313
- entity : dict
314
- Entity in dictionary format.
315
-
316
- Returns
317
- -------
318
- bool
319
- True if entity is embedded.
320
- """
321
- metadata_embedded = entity["metadata"].get("embedded", False)
322
- no_status = entity.get("status", None) is None
323
- no_spec = entity.get("spec", None) is None
324
- return metadata_embedded or not (no_status and no_spec)
325
-
326
- def _get_entity_types(self) -> list[str]:
327
- """
328
- Get entity types.
329
-
330
- Returns
331
- -------
332
- list
333
- Entity types.
334
- """
335
- return [
336
- f"{EntityTypes.ARTIFACT.value}s",
337
- f"{EntityTypes.DATAITEM.value}s",
338
- f"{EntityTypes.MODEL.value}s",
339
- f"{EntityTypes.FUNCTION.value}s",
340
- f"{EntityTypes.WORKFLOW.value}s",
341
- ]
@@ -1,2 +0,0 @@
1
- digitalhub
2
- test
@@ -1,96 +0,0 @@
1
- """
2
- Unit tests for the entity Artifact
3
- """
4
-
5
- import digitalhub as dh
6
- from digitalhub.entities.artifact._base.entity import Artifact
7
-
8
-
9
- class TestArtifactCRUD:
10
- def create_test_dicts(self):
11
- names = ["test1", "test2", "test3", "test4"]
12
- uuids = [
13
- "d150bcca-bb64-451d-8455-dff862254b95",
14
- "31acdd2d-0c41-428c-b68b-1b133da9e97b",
15
- "b4a3dfdc-b917-44c4-9a29-613dcf734244",
16
- "2618d9c4-cd61-440f-aebb-7e5761709f3b",
17
- ]
18
- paths = [
19
- "./data/test.csv",
20
- "s3://bucket/key.csv",
21
- "sql://database/schema/table",
22
- "https://url.com/file.csv",
23
- ]
24
- kind = ["artifact", "artifact", "artifact", "artifact"]
25
-
26
- dicts = []
27
- for i in range(len(names)):
28
- dicts.append({"name": names[i], "uuid": uuids[i], "path": paths[i], "kind": kind[i]})
29
-
30
- return dicts
31
-
32
- def test_create_delete(self):
33
- dicts = self.create_test_dicts()
34
- p = dh.get_or_create_project("test", local=True)
35
- # Create and delete artifacts
36
- for i in dicts:
37
- d = dh.new_artifact(p.name, **i)
38
- dh.delete_artifact(d.key)
39
- d = dh.new_artifact(p.name, **i)
40
- dh.delete_artifact(d.name, project=p.name, entity_id=d.id)
41
- d = p.new_artifact(**i)
42
- p.delete_artifact(d.key)
43
-
44
- assert dh.list_artifacts(p.name) == []
45
- dh.delete_project("test", local=True, clean_context=True)
46
-
47
- def test_list(self):
48
- dicts = self.create_test_dicts()
49
- p = dh.get_or_create_project("test", local=True)
50
-
51
- assert dh.list_artifacts(p.name) == []
52
-
53
- for i in dicts:
54
- dh.new_artifact(p.name, **i)
55
-
56
- # List artifacts
57
- l_obj = dh.list_artifacts(p.name)
58
- assert isinstance(l_obj, list)
59
- assert len(l_obj) == 4
60
- for i in l_obj:
61
- assert isinstance(i, Artifact)
62
-
63
- # delete listed objects
64
- for obj in l_obj:
65
- dh.delete_artifact(obj.key)
66
-
67
- assert len(dh.list_artifacts(p.name)) == 0
68
-
69
- dh.delete_project("test", clean_context=True, local=True)
70
-
71
- def test_get(self):
72
- dicts = self.create_test_dicts()
73
- p = dh.get_or_create_project("test", local=True)
74
-
75
- for i in dicts:
76
- o1 = dh.new_artifact(p.name, **i)
77
- assert isinstance(o1, Artifact)
78
-
79
- # Get by name and id
80
- o2 = dh.get_artifact(o1.name, project=p.name, entity_id=o1.id)
81
- assert isinstance(o2, Artifact)
82
- assert o1.id == o2.id
83
-
84
- # Get by key
85
- o3 = dh.get_artifact(o1.key)
86
- assert isinstance(o3, Artifact)
87
- assert o1.id == o3.id
88
-
89
- # delete listed objects
90
- l_obj = dh.list_artifacts(p.name)
91
- for obj in l_obj:
92
- dh.delete_artifact(obj.key)
93
-
94
- assert len(dh.list_artifacts(p.name)) == 0
95
-
96
- dh.delete_project("test", clean_context=True, local=True)
@@ -1,96 +0,0 @@
1
- """
2
- Unit tests for the entity Dataitem
3
- """
4
-
5
- import digitalhub as dh
6
- from digitalhub.entities.dataitem._base.entity import Dataitem
7
-
8
-
9
- class TestDataitemCRUD:
10
- def create_test_dicts(self):
11
- names = ["test1", "test2", "test3", "test4"]
12
- uuids = [
13
- "d150bcca-bb64-451d-8455-dff862254b95",
14
- "31acdd2d-0c41-428c-b68b-1b133da9e97b",
15
- "b4a3dfdc-b917-44c4-9a29-613dcf734244",
16
- "2618d9c4-cd61-440f-aebb-7e5761709f3b",
17
- ]
18
- paths = [
19
- "./data/test.csv",
20
- "s3://bucket/key.csv",
21
- "sql://database/schema/table",
22
- "https://url.com/file.csv",
23
- ]
24
- kind = ["dataitem", "dataitem", "dataitem", "dataitem"]
25
-
26
- dicts = []
27
- for i in range(len(names)):
28
- dicts.append({"name": names[i], "uuid": uuids[i], "path": paths[i], "kind": kind[i]})
29
-
30
- return dicts
31
-
32
- def test_create_delete(self):
33
- dicts = self.create_test_dicts()
34
- p = dh.get_or_create_project("test", local=True)
35
- # Create and delete dataitems
36
- for i in dicts:
37
- d = dh.new_dataitem(p.name, **i)
38
- dh.delete_dataitem(d.key)
39
- d = dh.new_dataitem(p.name, **i)
40
- dh.delete_dataitem(d.name, project=p.name, entity_id=d.id)
41
- d = p.new_dataitem(**i)
42
- p.delete_dataitem(d.key)
43
-
44
- assert dh.list_dataitems(p.name) == []
45
- dh.delete_project("test", local=True, clean_context=True)
46
-
47
- def test_list(self):
48
- dicts = self.create_test_dicts()
49
- p = dh.get_or_create_project("test", local=True)
50
-
51
- assert dh.list_dataitems(p.name) == []
52
-
53
- for i in dicts:
54
- dh.new_dataitem(p.name, **i)
55
-
56
- # List dataitems
57
- l_obj = dh.list_dataitems(p.name)
58
- assert isinstance(l_obj, list)
59
- assert len(l_obj) == 4
60
- for i in l_obj:
61
- assert isinstance(i, Dataitem)
62
-
63
- # delete listed objects
64
- for obj in l_obj:
65
- dh.delete_dataitem(obj.key)
66
-
67
- assert len(dh.list_dataitems(p.name)) == 0
68
-
69
- dh.delete_project("test", clean_context=True, local=True)
70
-
71
- def test_get(self):
72
- dicts = self.create_test_dicts()
73
- p = dh.get_or_create_project("test", local=True)
74
-
75
- for i in dicts:
76
- o1 = dh.new_dataitem(p.name, **i)
77
- assert isinstance(o1, Dataitem)
78
-
79
- # Get by name and id
80
- o2 = dh.get_dataitem(o1.name, project=p.name, entity_id=o1.id)
81
- assert isinstance(o2, Dataitem)
82
- assert o1.id == o2.id
83
-
84
- # Get by key
85
- o3 = dh.get_dataitem(o1.key)
86
- assert isinstance(o3, Dataitem)
87
- assert o1.id == o3.id
88
-
89
- # delete listed objects
90
- l_obj = dh.list_dataitems(p.name)
91
- for obj in l_obj:
92
- dh.delete_dataitem(obj.key)
93
-
94
- assert len(dh.list_dataitems(p.name)) == 0
95
-
96
- dh.delete_project("test", clean_context=True, local=True)
@@ -1,95 +0,0 @@
1
- """
2
- Unit tests for the entity Models
3
- """
4
-
5
- import digitalhub as dh
6
- from digitalhub.entities.model._base.entity import Model
7
-
8
-
9
- class TestModelCRUD:
10
- def create_test_dicts(self):
11
- names = ["test1", "test2", "test3", "test4"]
12
- uuids = [
13
- "d150bcca-bb64-451d-8455-dff862254b95",
14
- "31acdd2d-0c41-428c-b68b-1b133da9e97b",
15
- "b4a3dfdc-b917-44c4-9a29-613dcf734244",
16
- "2618d9c4-cd61-440f-aebb-7e5761709f3b",
17
- ]
18
- paths = [
19
- "./data/my_random_forest_model.pkl",
20
- "s3://bucket/model.pkl",
21
- "sql://database/schema/linear_regression_model.joblib",
22
- "https://url.com/bert_base_uncased.pt",
23
- ]
24
- kind = ["model", "model", "model", "model"]
25
-
26
- dicts = []
27
- for i in range(len(names)):
28
- dicts.append({"name": names[i], "uuid": uuids[i], "path": paths[i], "kind": kind[i]})
29
-
30
- return dicts
31
-
32
- def test_create_delete(self):
33
- dicts = self.create_test_dicts()
34
- p = dh.get_or_create_project("test", local=True)
35
- # Create and delete models
36
- for i in dicts:
37
- d = dh.new_model(p.name, **i)
38
- dh.delete_model(d.key)
39
- d = dh.new_model(p.name, **i)
40
- dh.delete_model(d.name, project=p.name, entity_id=d.id)
41
- d = p.new_model(**i)
42
- p.delete_model(d.key)
43
- assert dh.list_models(p.name) == []
44
- dh.delete_project("test", local=True, clean_context=True)
45
-
46
- def test_list(self):
47
- dicts = self.create_test_dicts()
48
- p = dh.get_or_create_project("test", local=True)
49
-
50
- assert dh.list_models(p.name) == []
51
-
52
- for i in dicts:
53
- dh.new_model(p.name, **i)
54
-
55
- # List models
56
- l_obj = dh.list_models(p.name)
57
- assert isinstance(l_obj, list)
58
- assert len(l_obj) == 4
59
- for i in l_obj:
60
- assert isinstance(i, Model)
61
-
62
- # delete listed objects
63
- for obj in l_obj:
64
- dh.delete_model(obj.key)
65
-
66
- assert len(dh.list_models(p.name)) == 0
67
-
68
- dh.delete_project("test", clean_context=True, local=True)
69
-
70
- def test_get(self):
71
- dicts = self.create_test_dicts()
72
- p = dh.get_or_create_project("test", local=True)
73
-
74
- for i in dicts:
75
- o1 = dh.new_model(p.name, **i)
76
- assert isinstance(o1, Model)
77
-
78
- # Get by name and id
79
- o2 = dh.get_model(o1.name, project=p.name, entity_id=o1.id)
80
- assert isinstance(o2, Model)
81
- assert o1.id == o2.id
82
-
83
- # Get by key
84
- o3 = dh.get_model(o1.key)
85
- assert isinstance(o3, Model)
86
- assert o1.id == o3.id
87
-
88
- # delete listed objects
89
- l_obj = dh.list_models(p.name)
90
- for obj in l_obj:
91
- dh.delete_model(obj.key)
92
-
93
- assert len(dh.list_models(p.name)) == 0
94
-
95
- dh.delete_project("test", clean_context=True, local=True)
@@ -1,66 +0,0 @@
1
- import digitalhub
2
-
3
- METHODS = [
4
- "new_artifact",
5
- "new_function",
6
- "new_project",
7
- "new_run",
8
- "new_secret",
9
- "new_task",
10
- "new_workflow",
11
- "new_dataitem",
12
- "new_model",
13
- "get_artifact",
14
- "get_function",
15
- "get_project",
16
- "get_run",
17
- "get_secret",
18
- "get_task",
19
- "get_workflow",
20
- "get_dataitem",
21
- "get_model",
22
- "import_artifact",
23
- "import_function",
24
- "import_project",
25
- "import_run",
26
- "import_secret",
27
- "import_task",
28
- "import_workflow",
29
- "import_dataitem",
30
- "import_model",
31
- "list_artifacts",
32
- "list_functions",
33
- "list_runs",
34
- "list_secrets",
35
- "list_tasks",
36
- "list_workflows",
37
- "list_dataitems",
38
- "list_models",
39
- "update_artifact",
40
- "update_function",
41
- "update_project",
42
- "update_run",
43
- "update_secret",
44
- "update_task",
45
- "update_workflow",
46
- "update_dataitem",
47
- "update_model",
48
- "delete_artifact",
49
- "delete_function",
50
- "delete_project",
51
- "delete_run",
52
- "delete_secret",
53
- "delete_task",
54
- "delete_workflow",
55
- "delete_dataitem",
56
- "delete_model",
57
- "set_dhcore_env",
58
- "set_store",
59
- "load_project",
60
- "get_or_create_project",
61
- ]
62
-
63
-
64
- def test_imports():
65
- for i in METHODS:
66
- assert hasattr(digitalhub, i)