digitalhub 0.8.0b14__py3-none-any.whl → 0.8.0b15__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.

digitalhub/context/api.py CHANGED
@@ -3,6 +3,7 @@ from __future__ import annotations
3
3
  import typing
4
4
 
5
5
  from digitalhub.context.builder import context_builder
6
+ from digitalhub.utils.exceptions import ContextError
6
7
 
7
8
  if typing.TYPE_CHECKING:
8
9
  from digitalhub.context.context import Context
@@ -24,8 +25,7 @@ def check_context(project: str) -> None:
24
25
  True if the project is in the context, False otherwise.
25
26
  """
26
27
  if project not in context_builder._instances:
27
- msg = f"Context missing. Set context by creating or importing a project named '{project}'."
28
- raise RuntimeError(msg)
28
+ raise ContextError
29
29
 
30
30
 
31
31
  def set_context(project: Project) -> None:
@@ -2,15 +2,19 @@ from __future__ import annotations
2
2
 
3
3
  import typing
4
4
 
5
+ from digitalhub.client.api import build_client, get_client
5
6
  from digitalhub.context.api import check_context
6
7
  from digitalhub.entities._base.api_utils import (
7
8
  delete_entity_api_ctx,
8
9
  list_entity_api_ctx,
10
+ read_entity_api_base,
9
11
  read_entity_api_ctx,
10
12
  read_entity_api_ctx_versions,
11
13
  )
14
+ from digitalhub.entities.utils.entity_types import EntityTypes
15
+ from digitalhub.entities.utils.utils import parse_entity_key
12
16
  from digitalhub.factory.api import build_entity_from_dict, build_entity_from_params
13
- from digitalhub.utils.exceptions import EntityAlreadyExistsError, EntityError
17
+ from digitalhub.utils.exceptions import ContextError, EntityAlreadyExistsError, EntityError, EntityNotExistsError
14
18
  from digitalhub.utils.io_utils import read_yaml
15
19
 
16
20
  if typing.TYPE_CHECKING:
@@ -21,6 +25,58 @@ if typing.TYPE_CHECKING:
21
25
  from digitalhub.entities._base.versioned.entity import VersionedEntity
22
26
 
23
27
 
28
+ def _check_context(project: str) -> None:
29
+ """
30
+ Check if the given project is in the context.
31
+ Otherwise try to get the project from remote.
32
+
33
+ Parameters
34
+ ----------
35
+ project : str
36
+ Project name.
37
+
38
+ Returns
39
+ -------
40
+ None
41
+ """
42
+ try:
43
+ check_context(project)
44
+ except ContextError:
45
+ try:
46
+ build_client()
47
+ client = get_client()
48
+ obj = read_entity_api_base(client, EntityTypes.PROJECT.value, project)
49
+ build_entity_from_dict(obj)
50
+ except EntityNotExistsError:
51
+ raise ContextError(f"Project '{project}' not found.")
52
+
53
+
54
+ def _check_project_from_identifier(identifier: str, project: str | None = None) -> None:
55
+ """
56
+ Check if the given project is in the context.
57
+ Otherwise try to get the project from remote.
58
+
59
+ Parameters
60
+ ----------
61
+ identifier : str
62
+ Entity key (store://...) or entity name.
63
+ project : str
64
+ Project name.
65
+
66
+ Returns
67
+ -------
68
+ None
69
+ """
70
+ if not identifier.startswith("store://"):
71
+ if project is None:
72
+ raise EntityError("Specify project if you do not specify entity key.")
73
+
74
+ else:
75
+ project, _, _, _, _ = parse_entity_key(identifier)
76
+
77
+ _check_context(project)
78
+
79
+
24
80
  def new_context_entity(**kwargs) -> ContextEntity:
25
81
  """
26
82
  Create a new object.
@@ -45,7 +101,7 @@ def new_context_entity(**kwargs) -> ContextEntity:
45
101
  ContextEntity
46
102
  Object instance.
47
103
  """
48
- check_context(kwargs["project"])
104
+ _check_context(kwargs["project"])
49
105
  obj = build_entity_from_params(**kwargs)
50
106
  obj.save()
51
107
  return obj
@@ -79,6 +135,7 @@ def get_versioned_entity(
79
135
  VersionedEntity
80
136
  Object instance.
81
137
  """
138
+ _check_project_from_identifier(identifier, project)
82
139
  obj = read_entity_api_ctx(
83
140
  identifier,
84
141
  entity_type=entity_type,
@@ -116,8 +173,8 @@ def get_unversioned_entity(
116
173
  UnversionedEntity
117
174
  Object instance.
118
175
  """
119
- if not identifier.startswith("store://") and project is None:
120
- raise EntityError("Specify entity key or entity ID combined with project")
176
+ _check_project_from_identifier(identifier, project)
177
+
121
178
  obj = read_entity_api_ctx(
122
179
  identifier,
123
180
  entity_type=entity_type,
@@ -191,6 +248,7 @@ def get_context_entity_versions(
191
248
  list[ContextEntity]
192
249
  List of object instances.
193
250
  """
251
+ _check_project_from_identifier(identifier, project)
194
252
  obj = read_entity_api_ctx_versions(
195
253
  identifier,
196
254
  entity_type=entity_type,
@@ -225,6 +283,7 @@ def get_material_entity_versions(
225
283
  list[MaterialEntity]
226
284
  List of object instances.
227
285
  """
286
+ _check_project_from_identifier(identifier, project)
228
287
  objs = read_entity_api_ctx_versions(
229
288
  identifier,
230
289
  entity_type=entity_type,
@@ -257,6 +316,7 @@ def list_context_entities(project: str, entity_type: str, **kwargs) -> list[Cont
257
316
  list[ContextEntity]
258
317
  List of object instances.
259
318
  """
319
+ _check_context(project)
260
320
  objs = list_entity_api_ctx(
261
321
  project=project,
262
322
  entity_type=entity_type,
@@ -287,6 +347,7 @@ def list_material_entities(
287
347
  list[MaterialEntity]
288
348
  List of object instances.
289
349
  """
350
+ _check_context(project)
290
351
  objs = list_entity_api_ctx(
291
352
  project=project,
292
353
  entity_type=entity_type,
@@ -316,7 +377,7 @@ def import_context_entity(file: str) -> ContextEntity:
316
377
  """
317
378
  dict_obj: dict = read_yaml(file)
318
379
 
319
- check_context(dict_obj["project"])
380
+ _check_context(dict_obj["project"])
320
381
 
321
382
  obj = build_entity_from_dict(dict_obj)
322
383
  try:
@@ -348,7 +409,7 @@ def import_executable_entity(file: str) -> ExecutableEntity:
348
409
  exec_dict = dict_obj
349
410
  tsk_dicts = []
350
411
 
351
- check_context(exec_dict["project"])
412
+ _check_context(exec_dict["project"])
352
413
 
353
414
  obj: ExecutableEntity = build_entity_from_dict(exec_dict)
354
415
 
@@ -395,6 +456,7 @@ def delete_entity(
395
456
  dict
396
457
  Response from backend.
397
458
  """
459
+ _check_project_from_identifier(identifier, project)
398
460
  return delete_entity_api_ctx(
399
461
  identifier=identifier,
400
462
  entity_type=entity_type,
@@ -227,13 +227,10 @@ class Project(Entity):
227
227
  """
228
228
  # Cycle over entity types
229
229
  for entity_type in self._get_entity_types():
230
-
231
230
  # Entity types are stored as a list of entities
232
231
  for idx, entity in enumerate(obj.get("spec", {}).get(entity_type, [])):
233
-
234
232
  # Export entity if not embedded is in metadata, else do nothing
235
233
  if not self._is_embedded(entity):
236
-
237
234
  # Get entity object from backend
238
235
  obj_dict: dict = read_entity_api_ctx(entity["key"])
239
236
 
@@ -264,16 +261,13 @@ class Project(Entity):
264
261
 
265
262
  # Cycle over entity types
266
263
  for entity_type in entity_types:
267
-
268
264
  # Entity types are stored as a list of entities
269
265
  for entity in obj.get("spec", {}).get(entity_type, []):
270
-
271
266
  embedded = self._is_embedded(entity)
272
267
  ref = entity["metadata"].get("ref")
273
268
 
274
269
  # Import entity if not embedded and there is a ref
275
270
  if not embedded and ref is not None:
276
-
277
271
  # Import entity from local ref
278
272
  if map_uri_scheme(ref) == "local":
279
273
  try:
@@ -291,7 +285,6 @@ class Project(Entity):
291
285
 
292
286
  # If entity is embedded, create it and try to save
293
287
  elif embedded:
294
-
295
288
  # It's possible that embedded field in metadata is not shown
296
289
  if entity["metadata"].get("embedded") is None:
297
290
  entity["metadata"]["embedded"] = True
@@ -59,3 +59,9 @@ class EntityError(Exception):
59
59
  """
60
60
  Raised when incontered errors on entities.
61
61
  """
62
+
63
+
64
+ class ContextError(Exception):
65
+ """
66
+ Raised when context errors.
67
+ """
@@ -62,7 +62,7 @@ class NoDatesSafeLoader(yaml.SafeLoader):
62
62
  -------
63
63
  None
64
64
  """
65
- if not "yaml_implicit_resolvers" in cls.__dict__:
65
+ if "yaml_implicit_resolvers" not in cls.__dict__:
66
66
  cls.yaml_implicit_resolvers = cls.yaml_implicit_resolvers.copy()
67
67
 
68
68
  for first_letter, mappings in cls.yaml_implicit_resolvers.items():
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: digitalhub
3
- Version: 0.8.0b14
3
+ Version: 0.8.0b15
4
4
  Summary: Python SDK for Digitalhub
5
5
  Author-email: Fondazione Bruno Kessler <dslab@fbk.eu>, Matteo Martini <mmartini@fbk.eu>
6
6
  License: Apache License
@@ -12,7 +12,7 @@ digitalhub/client/dhcore/utils.py,sha256=TaLjA3LT6heKpPclmufZx-kZKZNOe4OzS_Jtpj2
12
12
  digitalhub/client/local/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
13
  digitalhub/client/local/client.py,sha256=VBJJVEqbFFb_fzFogoo1kVyifezt0L7d489UTZxV0x8,16780
14
14
  digitalhub/context/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
- digitalhub/context/api.py,sha256=cZzS_1Kz-wW5iFMtEt3x9dD1PncnAsNnPoIfmoOQ5-g,1781
15
+ digitalhub/context/api.py,sha256=-76HPxc7ird13HJoOl_-Z_q2l2g8Yv3rcsXjHphn2to,1729
16
16
  digitalhub/context/builder.py,sha256=qpw8T-xho80Njf9wNPTooKkwjWuMT30BeKoQUDWm_yc,2132
17
17
  digitalhub/context/context.py,sha256=hDZEW4riMjR5-v2zWiirt-Z5puxdc7d_Da6vFhyuRF4,3338
18
18
  digitalhub/datastores/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -32,7 +32,7 @@ digitalhub/entities/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSu
32
32
  digitalhub/entities/builders.py,sha256=wKNC3ly-IUrF9uaSXWQ5cMzEj7JikM467uXIOdgko2c,1951
33
33
  digitalhub/entities/_base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
34
34
  digitalhub/entities/_base/api_utils.py,sha256=cxnQ8Bi1QtHi8pQi-CM8P1zOOuFZbhRf7dWOrrXPX1I,13346
35
- digitalhub/entities/_base/crud.py,sha256=OThKNECVYRHUuaqR5cvBY9Tb6gooIFd_wFSDfAoSl-g,9148
35
+ digitalhub/entities/_base/crud.py,sha256=m5A7Fya2DmfGdBis54U5SA--6BVc6WQ3SUhg4nXjaws,10852
36
36
  digitalhub/entities/_base/_base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
37
  digitalhub/entities/_base/_base/entity.py,sha256=DLJHhviHVKCo26jCEYg7iXwkfS9mDBQrHxBtHF_yE-0,2180
38
38
  digitalhub/entities/_base/context/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -139,7 +139,7 @@ digitalhub/entities/project/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMp
139
139
  digitalhub/entities/project/crud.py,sha256=P2IhKR2-YNmiNy0rpu0PG-LKD9nJGKsAahxvhsovmJA,8971
140
140
  digitalhub/entities/project/_base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
141
141
  digitalhub/entities/project/_base/builder.py,sha256=Fx_p8M75SkE_ssVBvKGu45wwqwqAZ5N6l6UZZj9LSNc,3612
142
- digitalhub/entities/project/_base/entity.py,sha256=OZ4vH38ORWTdYS6yE4sxc0jdIpqgKszDJp_IrpeQJMQ,53559
142
+ digitalhub/entities/project/_base/entity.py,sha256=CA3MqkwJlvnoI0shUIqsf-SsOoTZUA4Z41wnn0jbT5c,53552
143
143
  digitalhub/entities/project/_base/spec.py,sha256=zRJKFztK7z79LU4spxX7Rykv_1sK6kV9F9Qg95HBc6s,1346
144
144
  digitalhub/entities/project/_base/status.py,sha256=w1Hj_yFwr_5X7ZH7SmtZRto4qUdCWb010viFfvbqX48,168
145
145
  digitalhub/entities/run/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -207,11 +207,11 @@ digitalhub/stores/sql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
207
207
  digitalhub/stores/sql/store.py,sha256=NdELCkP2Rl5ewiRuI4J9eRvTiBzVmpF0cMowZ1NME_8,8654
208
208
  digitalhub/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
209
209
  digitalhub/utils/data_utils.py,sha256=2eETyxml610Ij7uyDnNc3YiELl2WFLIkj3FL4y6EPk8,2733
210
- digitalhub/utils/exceptions.py,sha256=MjLhgaGSAe0oJXoR-dnEtAh02RYDj3wZ1ZS1SLFUD4A,964
210
+ digitalhub/utils/exceptions.py,sha256=4jiWXyt4wNtFGRbcEm17hc7EQmwE8D0RhaeNW1z3EtA,1045
211
211
  digitalhub/utils/file_utils.py,sha256=Qe71D2b6mOil_Y0Hy2QCJbnIaQOyXvhjFRbJoZXhsGQ,4006
212
212
  digitalhub/utils/generic_utils.py,sha256=YHWCCF77JFqgm4TNr3_U2GbX4SjEQjUmxA6i9PkRqG8,3527
213
213
  digitalhub/utils/git_utils.py,sha256=aFYL1cpfY-2VnlW7eHmjjjlTLECc5UUUfjb_IQPOY5k,3244
214
- digitalhub/utils/io_utils.py,sha256=Yg24Lt_0aAUaj4Yv5-1iy7VIA0umLxQGW6lkDRWcjrE,2997
214
+ digitalhub/utils/io_utils.py,sha256=7pe0LwLPblx9Lx5_lugALZ84_eHGDifJ0RchK5fU1io,2997
215
215
  digitalhub/utils/logger.py,sha256=ml3ne6D8wuRdNZ4F6ywmvWotSxjmZWnmKgNiuHb4R5M,437
216
216
  digitalhub/utils/s3_utils.py,sha256=oXLzp4K7o45IwK0XOMt4OElDyB09fKRic5WTNA82WUA,1113
217
217
  digitalhub/utils/uri_utils.py,sha256=wArWRQ3ygGUNHexGKP3YM-aBE7TyGxhPvfEc7R4T4p4,1144
@@ -224,8 +224,8 @@ test/local/CRUD/test_artifacts.py,sha256=Y3J_C7SDRSsQd2SGIZjPIOvyTL92B1sTFrUONG3
224
224
  test/local/CRUD/test_dataitems.py,sha256=LQqTzI59uwTGy4zoq8jL0yWVe2W9vXlatkgDU9aB6xg,2968
225
225
  test/local/CRUD/test_models.py,sha256=msosbZuRwIMbZtmi3ZaOva4TjQ4lrzkNu9AguIFhrSo,2929
226
226
  test/local/imports/test_imports.py,sha256=W-YugO0rpJwvtWp57MXaXfEmE-f5iWuCiLY-n0ZU4z8,1271
227
- digitalhub-0.8.0b14.dist-info/LICENSE.txt,sha256=_yVOtnbW7Ss28mp058UEEc1X4Rgj8-kQBP_kj8_Sc88,11585
228
- digitalhub-0.8.0b14.dist-info/METADATA,sha256=ZCqntN3pfX1zYGBO3TwzSli4gxGmsyqB8dnJZXXL8Jk,15289
229
- digitalhub-0.8.0b14.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
230
- digitalhub-0.8.0b14.dist-info/top_level.txt,sha256=ae9pDfCF27ZoaVAxuBKONMP0lm5P-N_I-e-no1WlvD8,16
231
- digitalhub-0.8.0b14.dist-info/RECORD,,
227
+ digitalhub-0.8.0b15.dist-info/LICENSE.txt,sha256=_yVOtnbW7Ss28mp058UEEc1X4Rgj8-kQBP_kj8_Sc88,11585
228
+ digitalhub-0.8.0b15.dist-info/METADATA,sha256=nv71Q9Q1Ni-cZ3_fVQ4_T1q29zC0nvaOaViNCL19Xes,15289
229
+ digitalhub-0.8.0b15.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
230
+ digitalhub-0.8.0b15.dist-info/top_level.txt,sha256=ae9pDfCF27ZoaVAxuBKONMP0lm5P-N_I-e-no1WlvD8,16
231
+ digitalhub-0.8.0b15.dist-info/RECORD,,