digitalhub 0.8.0b6__py3-none-any.whl → 0.8.0b10__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 (64) hide show
  1. digitalhub/__init__.py +1 -1
  2. digitalhub/client/api.py +63 -0
  3. digitalhub/client/builder.py +0 -55
  4. digitalhub/client/dhcore/utils.py +1 -1
  5. digitalhub/context/api.py +93 -0
  6. digitalhub/context/builder.py +0 -84
  7. digitalhub/datastores/_base/datastore.py +2 -2
  8. digitalhub/datastores/api.py +37 -0
  9. digitalhub/datastores/builder.py +7 -31
  10. digitalhub/datastores/local/datastore.py +9 -1
  11. digitalhub/datastores/remote/datastore.py +8 -0
  12. digitalhub/datastores/s3/datastore.py +9 -1
  13. digitalhub/datastores/sql/datastore.py +9 -1
  14. digitalhub/entities/_base/api_utils.py +620 -0
  15. digitalhub/entities/_base/context/entity.py +2 -2
  16. digitalhub/entities/_base/crud.py +204 -408
  17. digitalhub/entities/_base/entity/entity.py +1 -1
  18. digitalhub/entities/_base/entity/status.py +12 -1
  19. digitalhub/entities/_base/executable/entity.py +7 -6
  20. digitalhub/entities/_base/material/entity.py +2 -2
  21. digitalhub/entities/artifact/crud.py +16 -42
  22. digitalhub/entities/dataitem/crud.py +19 -45
  23. digitalhub/entities/dataitem/table/entity.py +1 -1
  24. digitalhub/entities/function/crud.py +13 -39
  25. digitalhub/entities/model/crud.py +15 -42
  26. digitalhub/entities/project/_base/entity.py +65 -38
  27. digitalhub/entities/project/crud.py +8 -8
  28. digitalhub/entities/run/_base/entity.py +1 -14
  29. digitalhub/entities/run/_base/spec.py +0 -103
  30. digitalhub/entities/run/_base/status.py +0 -105
  31. digitalhub/entities/run/crud.py +17 -30
  32. digitalhub/entities/secret/_base/builder.py +1 -1
  33. digitalhub/entities/secret/_base/entity.py +1 -1
  34. digitalhub/entities/secret/crud.py +15 -27
  35. digitalhub/entities/task/_base/entity.py +3 -2
  36. digitalhub/entities/task/crud.py +17 -30
  37. digitalhub/entities/utils/utils.py +18 -0
  38. digitalhub/entities/workflow/crud.py +13 -39
  39. digitalhub/factory/api.py +31 -25
  40. digitalhub/factory/factory.py +7 -5
  41. digitalhub/readers/_base/builder.py +26 -0
  42. digitalhub/readers/api.py +80 -0
  43. digitalhub/readers/factory.py +133 -0
  44. digitalhub/readers/pandas/builder.py +29 -0
  45. digitalhub/readers/pandas/{readers.py → reader.py} +1 -1
  46. digitalhub/stores/api.py +54 -0
  47. digitalhub/stores/builder.py +0 -46
  48. {digitalhub-0.8.0b6.dist-info → digitalhub-0.8.0b10.dist-info}/METADATA +1 -1
  49. {digitalhub-0.8.0b6.dist-info → digitalhub-0.8.0b10.dist-info}/RECORD +53 -55
  50. digitalhub/entities/artifact/builder.py +0 -51
  51. digitalhub/entities/dataitem/builder.py +0 -51
  52. digitalhub/entities/function/builder.py +0 -51
  53. digitalhub/entities/model/builder.py +0 -51
  54. digitalhub/entities/project/builder.py +0 -51
  55. digitalhub/entities/run/builder.py +0 -51
  56. digitalhub/entities/secret/builder.py +0 -51
  57. digitalhub/entities/task/builder.py +0 -51
  58. digitalhub/entities/workflow/builder.py +0 -51
  59. digitalhub/readers/builder.py +0 -54
  60. digitalhub/readers/registry.py +0 -15
  61. /digitalhub/readers/_base/{readers.py → reader.py} +0 -0
  62. {digitalhub-0.8.0b6.dist-info → digitalhub-0.8.0b10.dist-info}/LICENSE.txt +0 -0
  63. {digitalhub-0.8.0b6.dist-info → digitalhub-0.8.0b10.dist-info}/WHEEL +0 -0
  64. {digitalhub-0.8.0b6.dist-info → digitalhub-0.8.0b10.dist-info}/top_level.txt +0 -0
@@ -2,17 +2,17 @@ from __future__ import annotations
2
2
 
3
3
  import typing
4
4
 
5
- from digitalhub.context.builder import check_context
5
+ from digitalhub.context.api import check_context
6
6
  from digitalhub.entities._base.crud import (
7
- delete_entity_api_ctx,
8
- list_entity_api_ctx,
9
- read_entity_api_ctx,
10
- read_entity_api_ctx_versions,
7
+ delete_entity,
8
+ get_context_entity_versions,
9
+ get_versioned_entity,
10
+ import_context_entity,
11
+ list_context_entities,
12
+ new_context_entity,
11
13
  )
12
- from digitalhub.entities.secret.builder import secret_from_dict, secret_from_parameters
13
14
  from digitalhub.entities.utils.entity_types import EntityTypes
14
- from digitalhub.utils.exceptions import EntityAlreadyExistsError, EntityNotExistsError
15
- from digitalhub.utils.io_utils import read_yaml
15
+ from digitalhub.utils.exceptions import EntityNotExistsError
16
16
 
17
17
  if typing.TYPE_CHECKING:
18
18
  from digitalhub.entities.secret._base.entity import Secret
@@ -68,8 +68,7 @@ def new_secret(
68
68
 
69
69
  if secret_value is None:
70
70
  raise ValueError("secret_value must be provided.")
71
-
72
- obj = secret_from_parameters(
71
+ obj: Secret = new_context_entity(
73
72
  project=project,
74
73
  name=name,
75
74
  kind="secret",
@@ -79,7 +78,6 @@ def new_secret(
79
78
  embedded=embedded,
80
79
  **kwargs,
81
80
  )
82
- obj.save()
83
81
  obj.set_secret_value(value=secret_value)
84
82
  return obj
85
83
 
@@ -127,14 +125,13 @@ def get_secret(
127
125
  else:
128
126
  raise EntityNotExistsError(f"Secret {identifier} not found.")
129
127
 
130
- obj = read_entity_api_ctx(
128
+ return get_versioned_entity(
131
129
  identifier,
132
- ENTITY_TYPE,
130
+ entity_type=ENTITY_TYPE,
133
131
  project=project,
134
132
  entity_id=entity_id,
135
133
  **kwargs,
136
134
  )
137
- return secret_from_dict(obj)
138
135
 
139
136
 
140
137
  def get_secret_versions(
@@ -168,13 +165,12 @@ def get_secret_versions(
168
165
  >>> objs = get_secret_versions("my-secret-name",
169
166
  >>> project="my-project")
170
167
  """
171
- obj = read_entity_api_ctx_versions(
168
+ return get_context_entity_versions(
172
169
  identifier,
173
170
  entity_type=ENTITY_TYPE,
174
171
  project=project,
175
172
  **kwargs,
176
173
  )
177
- return [secret_from_dict(o) for o in obj]
178
174
 
179
175
 
180
176
  def list_secrets(project: str, **kwargs) -> list[Secret]:
@@ -197,12 +193,11 @@ def list_secrets(project: str, **kwargs) -> list[Secret]:
197
193
  --------
198
194
  >>> objs = list_secrets(project="my-project")
199
195
  """
200
- objs = list_entity_api_ctx(
196
+ return list_context_entities(
201
197
  project=project,
202
198
  entity_type=ENTITY_TYPE,
203
199
  **kwargs,
204
200
  )
205
- return [secret_from_dict(obj) for obj in objs]
206
201
 
207
202
 
208
203
  def import_secret(file: str) -> Secret:
@@ -223,14 +218,7 @@ def import_secret(file: str) -> Secret:
223
218
  --------
224
219
  >>> obj = import_secret("my-secret.yaml")
225
220
  """
226
- dict_obj: dict = read_yaml(file)
227
- obj = secret_from_dict(dict_obj)
228
- try:
229
- obj.save()
230
- except EntityAlreadyExistsError:
231
- pass
232
- finally:
233
- return obj
221
+ return import_context_entity(file)
234
222
 
235
223
 
236
224
  def update_secret(entity: Secret) -> Secret:
@@ -292,7 +280,7 @@ def delete_secret(
292
280
  >>> project="my-project",
293
281
  >>> delete_all_versions=True)
294
282
  """
295
- return delete_entity_api_ctx(
283
+ return delete_entity(
296
284
  identifier=identifier,
297
285
  entity_type=ENTITY_TYPE,
298
286
  project=project,
@@ -3,8 +3,9 @@ from __future__ import annotations
3
3
  import typing
4
4
 
5
5
  from digitalhub.entities._base.unversioned.entity import UnversionedEntity
6
- from digitalhub.entities.run.crud import delete_run, get_run, new_run, run_from_parameters
6
+ from digitalhub.entities.run.crud import delete_run, get_run, new_run
7
7
  from digitalhub.entities.utils.entity_types import EntityTypes
8
+ from digitalhub.factory.api import build_entity_from_params
8
9
 
9
10
  if typing.TYPE_CHECKING:
10
11
  from digitalhub.entities._base.entity.metadata import Metadata
@@ -100,7 +101,7 @@ class Task(UnversionedEntity):
100
101
  Run object.
101
102
  """
102
103
  if kwargs["local_execution"]:
103
- return run_from_parameters(**kwargs)
104
+ return build_entity_from_params(**kwargs)
104
105
  return new_run(**kwargs)
105
106
 
106
107
  def get_run(self, entity_key: str) -> Run:
@@ -2,12 +2,15 @@ from __future__ import annotations
2
2
 
3
3
  import typing
4
4
 
5
- from digitalhub.context.builder import check_context
6
- from digitalhub.entities._base.crud import delete_entity_api_ctx, list_entity_api_ctx, read_entity_api_ctx
7
- from digitalhub.entities.task.builder import task_from_dict, task_from_parameters
5
+ from digitalhub.entities._base.crud import (
6
+ delete_entity,
7
+ get_unversioned_entity,
8
+ import_context_entity,
9
+ list_context_entities,
10
+ new_context_entity,
11
+ )
8
12
  from digitalhub.entities.utils.entity_types import EntityTypes
9
- from digitalhub.utils.exceptions import EntityAlreadyExistsError, EntityError
10
- from digitalhub.utils.io_utils import read_yaml
13
+ from digitalhub.utils.exceptions import EntityError
11
14
 
12
15
  if typing.TYPE_CHECKING:
13
16
  from digitalhub.entities.task._base.entity import Task
@@ -49,13 +52,11 @@ def new_task(
49
52
 
50
53
  Examples
51
54
  --------
52
- >>> obj = new_function(project="my-project",
53
- >>> name="my-function",
54
- >>> kind="python+task",
55
- >>> task="task-string"
55
+ >>> obj = new_task(project="my-project",
56
+ >>> kind="python+job",
57
+ >>> function="function-string")
56
58
  """
57
- check_context(project)
58
- obj = task_from_parameters(
59
+ return new_context_entity(
59
60
  project=project,
60
61
  kind=kind,
61
62
  uuid=uuid,
@@ -63,8 +64,6 @@ def new_task(
63
64
  function=function,
64
65
  **kwargs,
65
66
  )
66
- obj.save()
67
- return obj
68
67
 
69
68
 
70
69
  def get_task(
@@ -98,16 +97,12 @@ def get_task(
98
97
  >>> obj = get_task("my-task-id"
99
98
  >>> project="my-project")
100
99
  """
101
- if not identifier.startswith("store://"):
102
- raise EntityError("Task has no name. Use key instead.")
103
- obj = read_entity_api_ctx(
100
+ return get_unversioned_entity(
104
101
  identifier,
105
- ENTITY_TYPE,
102
+ entity_type=ENTITY_TYPE,
106
103
  project=project,
107
- entity_id=identifier,
108
104
  **kwargs,
109
105
  )
110
- return task_from_dict(obj)
111
106
 
112
107
 
113
108
  def list_tasks(project: str, **kwargs) -> list[Task]:
@@ -130,12 +125,11 @@ def list_tasks(project: str, **kwargs) -> list[Task]:
130
125
  --------
131
126
  >>> objs = list_tasks(project="my-project")
132
127
  """
133
- objs = list_entity_api_ctx(
128
+ return list_context_entities(
134
129
  project=project,
135
130
  entity_type=ENTITY_TYPE,
136
131
  **kwargs,
137
132
  )
138
- return [task_from_dict(obj) for obj in objs]
139
133
 
140
134
 
141
135
  def import_task(file: str) -> Task:
@@ -156,14 +150,7 @@ def import_task(file: str) -> Task:
156
150
  -------
157
151
  >>> obj = import_task("my-task.yaml")
158
152
  """
159
- dict_obj: dict = read_yaml(file)
160
- obj = task_from_dict(dict_obj)
161
- try:
162
- obj.save()
163
- except EntityAlreadyExistsError:
164
- pass
165
- finally:
166
- return obj
153
+ return import_context_entity(file)
167
154
 
168
155
 
169
156
  def update_task(entity: Task) -> Task:
@@ -230,7 +217,7 @@ def delete_task(
230
217
  """
231
218
  if not identifier.startswith("store://"):
232
219
  raise EntityError("Task has no name. Use key instead.")
233
- return delete_entity_api_ctx(
220
+ return delete_entity(
234
221
  identifier=identifier,
235
222
  entity_type=ENTITY_TYPE,
236
223
  project=project,
@@ -182,3 +182,21 @@ def build_log_path_from_source(
182
182
  path += f"/{Path(source).name}"
183
183
 
184
184
  return path
185
+
186
+
187
+ def get_entity_type_from_key(key: str) -> str:
188
+ """
189
+ Get entity type.
190
+
191
+ Parameters
192
+ ----------
193
+ key : str
194
+ The key of the entity.
195
+
196
+ Returns
197
+ -------
198
+ str
199
+ The entity type.
200
+ """
201
+ _, entity_type, _, _, _ = parse_entity_key(key)
202
+ return entity_type
@@ -2,17 +2,15 @@ from __future__ import annotations
2
2
 
3
3
  import typing
4
4
 
5
- from digitalhub.context.builder import check_context
6
5
  from digitalhub.entities._base.crud import (
7
- delete_entity_api_ctx,
8
- list_entity_api_ctx,
9
- read_entity_api_ctx,
10
- read_entity_api_ctx_versions,
6
+ delete_entity,
7
+ get_context_entity_versions,
8
+ get_versioned_entity,
9
+ import_executable_entity,
10
+ list_context_entities,
11
+ new_context_entity,
11
12
  )
12
13
  from digitalhub.entities.utils.entity_types import EntityTypes
13
- from digitalhub.entities.workflow.builder import workflow_from_dict, workflow_from_parameters
14
- from digitalhub.utils.exceptions import EntityAlreadyExistsError
15
- from digitalhub.utils.io_utils import read_yaml
16
14
 
17
15
  if typing.TYPE_CHECKING:
18
16
  from digitalhub.entities.workflow._base.entity import Workflow
@@ -64,8 +62,7 @@ def new_workflow(
64
62
  >>> code_src="pipeline.py",
65
63
  >>> handler="pipeline-handler")
66
64
  """
67
- check_context(project)
68
- obj = workflow_from_parameters(
65
+ return new_context_entity(
69
66
  project=project,
70
67
  name=name,
71
68
  kind=kind,
@@ -75,8 +72,6 @@ def new_workflow(
75
72
  embedded=embedded,
76
73
  **kwargs,
77
74
  )
78
- obj.save()
79
- return obj
80
75
 
81
76
 
82
77
  def get_workflow(
@@ -114,14 +109,13 @@ def get_workflow(
114
109
  >>> project="my-project",
115
110
  >>> entity_id="my-workflow-id")
116
111
  """
117
- obj = read_entity_api_ctx(
112
+ return get_versioned_entity(
118
113
  identifier,
119
- ENTITY_TYPE,
114
+ entity_type=ENTITY_TYPE,
120
115
  project=project,
121
116
  entity_id=entity_id,
122
117
  **kwargs,
123
118
  )
124
- return workflow_from_dict(obj)
125
119
 
126
120
 
127
121
  def get_workflow_versions(
@@ -155,13 +149,12 @@ def get_workflow_versions(
155
149
  >>> obj = get_workflow_versions("my-workflow-name"
156
150
  >>> project="my-project")
157
151
  """
158
- obj = read_entity_api_ctx_versions(
152
+ return get_context_entity_versions(
159
153
  identifier,
160
154
  entity_type=ENTITY_TYPE,
161
155
  project=project,
162
156
  **kwargs,
163
157
  )
164
- return [workflow_from_dict(o) for o in obj]
165
158
 
166
159
 
167
160
  def list_workflows(project: str, **kwargs) -> list[Workflow]:
@@ -184,12 +177,11 @@ def list_workflows(project: str, **kwargs) -> list[Workflow]:
184
177
  --------
185
178
  >>> objs = list_workflows(project="my-project")
186
179
  """
187
- objs = list_entity_api_ctx(
180
+ return list_context_entities(
188
181
  project=project,
189
182
  entity_type=ENTITY_TYPE,
190
183
  **kwargs,
191
184
  )
192
- return [workflow_from_dict(obj) for obj in objs]
193
185
 
194
186
 
195
187
  def import_workflow(file: str) -> Workflow:
@@ -210,25 +202,7 @@ def import_workflow(file: str) -> Workflow:
210
202
  --------
211
203
  >>> obj = import_workflow("my-workflow.yaml")
212
204
  """
213
- dict_obj: dict | list[dict] = read_yaml(file)
214
- if isinstance(dict_obj, list):
215
- wkf_dict = dict_obj[0]
216
- tsk_dicts = dict_obj[1:]
217
- else:
218
- wkf_dict = dict_obj
219
- tsk_dicts = []
220
-
221
- check_context(wkf_dict.get("project"))
222
- obj = workflow_from_dict(wkf_dict)
223
-
224
- obj.import_tasks(tsk_dicts)
225
-
226
- try:
227
- obj.save()
228
- except EntityAlreadyExistsError:
229
- pass
230
- finally:
231
- return obj
205
+ return import_executable_entity(file)
232
206
 
233
207
 
234
208
  def update_workflow(entity: Workflow) -> Workflow:
@@ -293,7 +267,7 @@ def delete_workflow(
293
267
  >>> project="my-project",
294
268
  >>> delete_all_versions=True)
295
269
  """
296
- return delete_entity_api_ctx(
270
+ return delete_entity(
297
271
  identifier=identifier,
298
272
  entity_type=ENTITY_TYPE,
299
273
  project=project,
digitalhub/factory/api.py CHANGED
@@ -13,22 +13,48 @@ if typing.TYPE_CHECKING:
13
13
  from digitalhub.runtimes._base import Runtime
14
14
 
15
15
 
16
- def build_entity(kind_to_build_from: str, *args, **kwargs) -> Entity:
16
+ def build_entity_from_params(**kwargs) -> Entity:
17
17
  """
18
18
  Build an entity.
19
19
 
20
20
  Parameters
21
21
  ----------
22
- kind_to_build_from : str
23
- Entity type.
22
+ **kwargs
23
+ Entity parameters.
24
24
 
25
25
  Returns
26
26
  -------
27
27
  Entity
28
28
  Entity object.
29
29
  """
30
- _raise_if_entity_builder_not_found(kind_to_build_from)
31
- return factory.build_entity_from_params(kind_to_build_from, *args, **kwargs)
30
+ try:
31
+ kind = kwargs["kind"]
32
+ except KeyError:
33
+ raise BuilderError("Missing 'kind' parameter.")
34
+ _raise_if_entity_builder_not_found(kind)
35
+ return factory.build_entity_from_params(kind, **kwargs)
36
+
37
+
38
+ def build_entity_from_dict(obj: dict) -> Entity:
39
+ """
40
+ Build an entity from a dictionary.
41
+
42
+ Parameters
43
+ ----------
44
+ obj : dict
45
+ Dictionary with entity data.
46
+
47
+ Returns
48
+ -------
49
+ Entity
50
+ Entity object.
51
+ """
52
+ try:
53
+ kind = obj["kind"]
54
+ except KeyError:
55
+ raise BuilderError("Missing 'kind' parameter.")
56
+ _raise_if_entity_builder_not_found(kind)
57
+ return factory.build_entity_from_dict(kind, obj)
32
58
 
33
59
 
34
60
  def build_spec(kind_to_build_from: str, **kwargs) -> Spec:
@@ -105,26 +131,6 @@ def build_runtime(kind_to_build_from: str, project: str) -> Runtime:
105
131
  return factory.build_runtime(kind_to_build_from, project)
106
132
 
107
133
 
108
- def build_entity_from_dict(kind_to_build_from: str, dict_data: dict) -> Entity:
109
- """
110
- Build an entity from a dictionary.
111
-
112
- Parameters
113
- ----------
114
- kind_to_build_from : str
115
- Entity type.
116
- dict_data : dict
117
- Dictionary with entity data.
118
-
119
- Returns
120
- -------
121
- Entity
122
- Entity object.
123
- """
124
- _raise_if_entity_builder_not_found(kind_to_build_from)
125
- return factory.build_entity_from_dict(kind_to_build_from, dict_data)
126
-
127
-
128
134
  def get_entity_type_from_kind(kind: str) -> str:
129
135
  """
130
136
  Get entity type from builder.
@@ -62,23 +62,25 @@ class Factory:
62
62
  raise BuilderError(f"Builder {name} already exists.")
63
63
  self._runtime_builders[name] = builder()
64
64
 
65
- def build_entity_from_params(self, kind_to_build_from: str, *args, **kwargs) -> Entity:
65
+ def build_entity_from_params(self, kind_to_build_from: str, **kwargs) -> Entity:
66
66
  """
67
- Build an entity.
67
+ Build an entity from parameters.
68
68
 
69
69
  Parameters
70
70
  ----------
71
71
  kind_to_build_from : str
72
72
  Entity type.
73
+ **kwargs
74
+ Entity parameters.
73
75
 
74
76
  Returns
75
77
  -------
76
78
  Entity
77
79
  Entity object.
78
80
  """
79
- return self._entity_builders[kind_to_build_from].build(*args, **kwargs)
81
+ return self._entity_builders[kind_to_build_from].build(**kwargs)
80
82
 
81
- def build_entity_from_dict(self, kind_to_build_from: str, dict_data: dict) -> Entity:
83
+ def build_entity_from_dict(self, kind_to_build_from: str, obj: dict) -> Entity:
82
84
  """
83
85
  Build an entity from a dictionary.
84
86
 
@@ -94,7 +96,7 @@ class Factory:
94
96
  Entity
95
97
  Entity object.
96
98
  """
97
- return self._entity_builders[kind_to_build_from].from_dict(dict_data)
99
+ return self._entity_builders[kind_to_build_from].from_dict(obj)
98
100
 
99
101
  def build_spec(self, kind_to_build_from: str, **kwargs) -> Spec:
100
102
  """
@@ -0,0 +1,26 @@
1
+ from __future__ import annotations
2
+
3
+ import typing
4
+ from abc import abstractmethod
5
+
6
+ from digitalhub.utils.exceptions import BuilderError
7
+
8
+ if typing.TYPE_CHECKING:
9
+ from digitalhub.readers._base.reader import DataframeReader
10
+
11
+
12
+ class ReaderBuilder:
13
+ ENGINE = None
14
+ DATAFRAME_CLASS = None
15
+
16
+ def __init__(self):
17
+ if self.ENGINE is None:
18
+ raise BuilderError("ENGINE must be set.")
19
+ if self.DATAFRAME_CLASS is None:
20
+ raise BuilderError("DATAFRAME_CLASS must be set.")
21
+
22
+ @abstractmethod
23
+ def build(self, **kwargs) -> DataframeReader:
24
+ """
25
+ Build reader object.
26
+ """
@@ -0,0 +1,80 @@
1
+ from __future__ import annotations
2
+
3
+ import typing
4
+ from typing import Any
5
+
6
+ from digitalhub.readers.factory import factory
7
+
8
+ if typing.TYPE_CHECKING:
9
+ from digitalhub.readers._base.reader import DataframeReader
10
+
11
+
12
+ def get_reader_by_engine(engine: str | None = None) -> DataframeReader:
13
+ """
14
+ Get Dataframe reader.
15
+
16
+ Parameters
17
+ ----------
18
+ engine : str
19
+ Dataframe engine (pandas, polars, etc.).
20
+
21
+ Returns
22
+ -------
23
+ DataframeReader
24
+ Reader object.
25
+ """
26
+ if engine is None:
27
+ engine = factory.get_default()
28
+ try:
29
+ return factory.build(engine=engine)
30
+ except KeyError:
31
+ engines = factory.list_supported_engines()
32
+ msg = f"Unsupported dataframe engine: '{engine}'. Supported engines: {engines}"
33
+ raise ValueError(msg)
34
+
35
+
36
+ def get_reader_by_object(obj: Any) -> DataframeReader:
37
+ """
38
+ Get Dataframe reader by object.
39
+
40
+ Parameters
41
+ ----------
42
+ obj : Any
43
+ Object to get reader from.
44
+
45
+ Returns
46
+ -------
47
+ DataframeReader
48
+ Reader object.
49
+ """
50
+ try:
51
+ obj_name = f"{obj.__class__.__module__}.{obj.__class__.__name__}"
52
+ return factory.build(dataframe=obj_name)
53
+ except KeyError:
54
+ types = factory.list_supported_dataframes()
55
+ msg = f"Unsupported dataframe type: '{obj}'. Supported types: {types}"
56
+ raise ValueError(msg)
57
+
58
+
59
+ def get_supported_engines() -> list[str]:
60
+ """
61
+ Get supported engines.
62
+
63
+ Returns
64
+ -------
65
+ list
66
+ List of supported engines.
67
+ """
68
+ return factory.list_supported_engines()
69
+
70
+
71
+ def get_supported_dataframes() -> list[str]:
72
+ """
73
+ Get supported dataframes.
74
+
75
+ Returns
76
+ -------
77
+ list
78
+ List of supported dataframes.
79
+ """
80
+ return factory.list_supported_dataframes()