digitalhub 0.7.0b2__py3-none-any.whl → 0.8.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 (232) hide show
  1. digitalhub/__init__.py +63 -93
  2. digitalhub/client/__init__.py +0 -0
  3. digitalhub/client/_base/__init__.py +0 -0
  4. digitalhub/client/_base/client.py +56 -0
  5. digitalhub/client/api.py +63 -0
  6. digitalhub/client/builder.py +50 -0
  7. digitalhub/client/dhcore/__init__.py +0 -0
  8. digitalhub/client/dhcore/client.py +669 -0
  9. digitalhub/client/dhcore/env.py +21 -0
  10. digitalhub/client/dhcore/models.py +46 -0
  11. digitalhub/client/dhcore/utils.py +111 -0
  12. digitalhub/client/local/__init__.py +0 -0
  13. digitalhub/client/local/client.py +533 -0
  14. digitalhub/context/__init__.py +0 -0
  15. digitalhub/context/api.py +93 -0
  16. digitalhub/context/builder.py +94 -0
  17. digitalhub/context/context.py +136 -0
  18. digitalhub/datastores/__init__.py +0 -0
  19. digitalhub/datastores/_base/__init__.py +0 -0
  20. digitalhub/datastores/_base/datastore.py +85 -0
  21. digitalhub/datastores/api.py +37 -0
  22. digitalhub/datastores/builder.py +110 -0
  23. digitalhub/datastores/local/__init__.py +0 -0
  24. digitalhub/datastores/local/datastore.py +50 -0
  25. digitalhub/datastores/remote/__init__.py +0 -0
  26. digitalhub/datastores/remote/datastore.py +31 -0
  27. digitalhub/datastores/s3/__init__.py +0 -0
  28. digitalhub/datastores/s3/datastore.py +46 -0
  29. digitalhub/datastores/sql/__init__.py +0 -0
  30. digitalhub/datastores/sql/datastore.py +68 -0
  31. digitalhub/entities/__init__.py +0 -0
  32. digitalhub/entities/_base/__init__.py +0 -0
  33. digitalhub/entities/_base/_base/__init__.py +0 -0
  34. digitalhub/entities/_base/_base/entity.py +82 -0
  35. digitalhub/entities/_base/api_utils.py +620 -0
  36. digitalhub/entities/_base/context/__init__.py +0 -0
  37. digitalhub/entities/_base/context/entity.py +118 -0
  38. digitalhub/entities/_base/crud.py +468 -0
  39. digitalhub/entities/_base/entity/__init__.py +0 -0
  40. digitalhub/entities/_base/entity/_constructors/__init__.py +0 -0
  41. digitalhub/entities/_base/entity/_constructors/metadata.py +44 -0
  42. digitalhub/entities/_base/entity/_constructors/name.py +31 -0
  43. digitalhub/entities/_base/entity/_constructors/spec.py +33 -0
  44. digitalhub/entities/_base/entity/_constructors/status.py +52 -0
  45. digitalhub/entities/_base/entity/_constructors/uuid.py +26 -0
  46. digitalhub/entities/_base/entity/builder.py +175 -0
  47. digitalhub/entities/_base/entity/entity.py +106 -0
  48. digitalhub/entities/_base/entity/metadata.py +59 -0
  49. digitalhub/entities/_base/entity/spec.py +58 -0
  50. digitalhub/entities/_base/entity/status.py +43 -0
  51. digitalhub/entities/_base/executable/__init__.py +0 -0
  52. digitalhub/entities/_base/executable/entity.py +405 -0
  53. digitalhub/entities/_base/material/__init__.py +0 -0
  54. digitalhub/entities/_base/material/entity.py +214 -0
  55. digitalhub/entities/_base/material/spec.py +22 -0
  56. digitalhub/entities/_base/material/status.py +49 -0
  57. digitalhub/entities/_base/runtime_entity/__init__.py +0 -0
  58. digitalhub/entities/_base/runtime_entity/builder.py +106 -0
  59. digitalhub/entities/_base/unversioned/__init__.py +0 -0
  60. digitalhub/entities/_base/unversioned/builder.py +66 -0
  61. digitalhub/entities/_base/unversioned/entity.py +49 -0
  62. digitalhub/entities/_base/versioned/__init__.py +0 -0
  63. digitalhub/entities/_base/versioned/builder.py +68 -0
  64. digitalhub/entities/_base/versioned/entity.py +53 -0
  65. digitalhub/entities/artifact/__init__.py +0 -0
  66. digitalhub/entities/artifact/_base/__init__.py +0 -0
  67. digitalhub/entities/artifact/_base/builder.py +86 -0
  68. digitalhub/entities/artifact/_base/entity.py +39 -0
  69. digitalhub/entities/artifact/_base/spec.py +15 -0
  70. digitalhub/entities/artifact/_base/status.py +9 -0
  71. digitalhub/entities/artifact/artifact/__init__.py +0 -0
  72. digitalhub/entities/artifact/artifact/builder.py +18 -0
  73. digitalhub/entities/artifact/artifact/entity.py +32 -0
  74. digitalhub/entities/artifact/artifact/spec.py +27 -0
  75. digitalhub/entities/artifact/artifact/status.py +15 -0
  76. digitalhub/entities/artifact/crud.py +332 -0
  77. digitalhub/entities/builders.py +63 -0
  78. digitalhub/entities/dataitem/__init__.py +0 -0
  79. digitalhub/entities/dataitem/_base/__init__.py +0 -0
  80. digitalhub/entities/dataitem/_base/builder.py +86 -0
  81. digitalhub/entities/dataitem/_base/entity.py +75 -0
  82. digitalhub/entities/dataitem/_base/spec.py +15 -0
  83. digitalhub/entities/dataitem/_base/status.py +20 -0
  84. digitalhub/entities/dataitem/crud.py +372 -0
  85. digitalhub/entities/dataitem/dataitem/__init__.py +0 -0
  86. digitalhub/entities/dataitem/dataitem/builder.py +18 -0
  87. digitalhub/entities/dataitem/dataitem/entity.py +32 -0
  88. digitalhub/entities/dataitem/dataitem/spec.py +15 -0
  89. digitalhub/entities/dataitem/dataitem/status.py +9 -0
  90. digitalhub/entities/dataitem/iceberg/__init__.py +0 -0
  91. digitalhub/entities/dataitem/iceberg/builder.py +18 -0
  92. digitalhub/entities/dataitem/iceberg/entity.py +32 -0
  93. digitalhub/entities/dataitem/iceberg/spec.py +15 -0
  94. digitalhub/entities/dataitem/iceberg/status.py +9 -0
  95. digitalhub/entities/dataitem/table/__init__.py +0 -0
  96. digitalhub/entities/dataitem/table/builder.py +18 -0
  97. digitalhub/entities/dataitem/table/entity.py +146 -0
  98. digitalhub/entities/dataitem/table/models.py +62 -0
  99. digitalhub/entities/dataitem/table/spec.py +25 -0
  100. digitalhub/entities/dataitem/table/status.py +9 -0
  101. digitalhub/entities/function/__init__.py +0 -0
  102. digitalhub/entities/function/_base/__init__.py +0 -0
  103. digitalhub/entities/function/_base/builder.py +79 -0
  104. digitalhub/entities/function/_base/entity.py +98 -0
  105. digitalhub/entities/function/_base/models.py +118 -0
  106. digitalhub/entities/function/_base/spec.py +15 -0
  107. digitalhub/entities/function/_base/status.py +9 -0
  108. digitalhub/entities/function/crud.py +279 -0
  109. digitalhub/entities/model/__init__.py +0 -0
  110. digitalhub/entities/model/_base/__init__.py +0 -0
  111. digitalhub/entities/model/_base/builder.py +86 -0
  112. digitalhub/entities/model/_base/entity.py +34 -0
  113. digitalhub/entities/model/_base/spec.py +49 -0
  114. digitalhub/entities/model/_base/status.py +9 -0
  115. digitalhub/entities/model/crud.py +331 -0
  116. digitalhub/entities/model/huggingface/__init__.py +0 -0
  117. digitalhub/entities/model/huggingface/builder.py +18 -0
  118. digitalhub/entities/model/huggingface/entity.py +32 -0
  119. digitalhub/entities/model/huggingface/spec.py +36 -0
  120. digitalhub/entities/model/huggingface/status.py +9 -0
  121. digitalhub/entities/model/mlflow/__init__.py +0 -0
  122. digitalhub/entities/model/mlflow/builder.py +18 -0
  123. digitalhub/entities/model/mlflow/entity.py +32 -0
  124. digitalhub/entities/model/mlflow/models.py +26 -0
  125. digitalhub/entities/model/mlflow/spec.py +44 -0
  126. digitalhub/entities/model/mlflow/status.py +9 -0
  127. digitalhub/entities/model/mlflow/utils.py +81 -0
  128. digitalhub/entities/model/model/__init__.py +0 -0
  129. digitalhub/entities/model/model/builder.py +18 -0
  130. digitalhub/entities/model/model/entity.py +32 -0
  131. digitalhub/entities/model/model/spec.py +15 -0
  132. digitalhub/entities/model/model/status.py +9 -0
  133. digitalhub/entities/model/sklearn/__init__.py +0 -0
  134. digitalhub/entities/model/sklearn/builder.py +18 -0
  135. digitalhub/entities/model/sklearn/entity.py +32 -0
  136. digitalhub/entities/model/sklearn/spec.py +15 -0
  137. digitalhub/entities/model/sklearn/status.py +9 -0
  138. digitalhub/entities/project/__init__.py +0 -0
  139. digitalhub/entities/project/_base/__init__.py +0 -0
  140. digitalhub/entities/project/_base/builder.py +128 -0
  141. digitalhub/entities/project/_base/entity.py +2078 -0
  142. digitalhub/entities/project/_base/spec.py +50 -0
  143. digitalhub/entities/project/_base/status.py +9 -0
  144. digitalhub/entities/project/crud.py +357 -0
  145. digitalhub/entities/run/__init__.py +0 -0
  146. digitalhub/entities/run/_base/__init__.py +0 -0
  147. digitalhub/entities/run/_base/builder.py +94 -0
  148. digitalhub/entities/run/_base/entity.py +307 -0
  149. digitalhub/entities/run/_base/spec.py +50 -0
  150. digitalhub/entities/run/_base/status.py +9 -0
  151. digitalhub/entities/run/crud.py +219 -0
  152. digitalhub/entities/secret/__init__.py +0 -0
  153. digitalhub/entities/secret/_base/__init__.py +0 -0
  154. digitalhub/entities/secret/_base/builder.py +81 -0
  155. digitalhub/entities/secret/_base/entity.py +74 -0
  156. digitalhub/entities/secret/_base/spec.py +35 -0
  157. digitalhub/entities/secret/_base/status.py +9 -0
  158. digitalhub/entities/secret/crud.py +290 -0
  159. digitalhub/entities/task/__init__.py +0 -0
  160. digitalhub/entities/task/_base/__init__.py +0 -0
  161. digitalhub/entities/task/_base/builder.py +91 -0
  162. digitalhub/entities/task/_base/entity.py +136 -0
  163. digitalhub/entities/task/_base/models.py +208 -0
  164. digitalhub/entities/task/_base/spec.py +53 -0
  165. digitalhub/entities/task/_base/status.py +9 -0
  166. digitalhub/entities/task/crud.py +228 -0
  167. digitalhub/entities/utils/__init__.py +0 -0
  168. digitalhub/entities/utils/api.py +346 -0
  169. digitalhub/entities/utils/entity_types.py +19 -0
  170. digitalhub/entities/utils/state.py +31 -0
  171. digitalhub/entities/utils/utils.py +202 -0
  172. digitalhub/entities/workflow/__init__.py +0 -0
  173. digitalhub/entities/workflow/_base/__init__.py +0 -0
  174. digitalhub/entities/workflow/_base/builder.py +79 -0
  175. digitalhub/entities/workflow/_base/entity.py +74 -0
  176. digitalhub/entities/workflow/_base/spec.py +15 -0
  177. digitalhub/entities/workflow/_base/status.py +9 -0
  178. digitalhub/entities/workflow/crud.py +278 -0
  179. digitalhub/factory/__init__.py +0 -0
  180. digitalhub/factory/api.py +277 -0
  181. digitalhub/factory/factory.py +268 -0
  182. digitalhub/factory/utils.py +90 -0
  183. digitalhub/readers/__init__.py +0 -0
  184. digitalhub/readers/_base/__init__.py +0 -0
  185. digitalhub/readers/_base/builder.py +26 -0
  186. digitalhub/readers/_base/reader.py +70 -0
  187. digitalhub/readers/api.py +80 -0
  188. digitalhub/readers/factory.py +133 -0
  189. digitalhub/readers/pandas/__init__.py +0 -0
  190. digitalhub/readers/pandas/builder.py +29 -0
  191. digitalhub/readers/pandas/reader.py +207 -0
  192. digitalhub/runtimes/__init__.py +0 -0
  193. digitalhub/runtimes/_base.py +102 -0
  194. digitalhub/runtimes/builder.py +32 -0
  195. digitalhub/stores/__init__.py +0 -0
  196. digitalhub/stores/_base/__init__.py +0 -0
  197. digitalhub/stores/_base/store.py +189 -0
  198. digitalhub/stores/api.py +54 -0
  199. digitalhub/stores/builder.py +211 -0
  200. digitalhub/stores/local/__init__.py +0 -0
  201. digitalhub/stores/local/store.py +230 -0
  202. digitalhub/stores/remote/__init__.py +0 -0
  203. digitalhub/stores/remote/store.py +143 -0
  204. digitalhub/stores/s3/__init__.py +0 -0
  205. digitalhub/stores/s3/store.py +563 -0
  206. digitalhub/stores/sql/__init__.py +0 -0
  207. digitalhub/stores/sql/store.py +328 -0
  208. digitalhub/utils/__init__.py +0 -0
  209. digitalhub/utils/data_utils.py +127 -0
  210. digitalhub/utils/exceptions.py +67 -0
  211. digitalhub/utils/file_utils.py +204 -0
  212. digitalhub/utils/generic_utils.py +183 -0
  213. digitalhub/utils/git_utils.py +148 -0
  214. digitalhub/utils/io_utils.py +116 -0
  215. digitalhub/utils/logger.py +17 -0
  216. digitalhub/utils/s3_utils.py +58 -0
  217. digitalhub/utils/uri_utils.py +56 -0
  218. {digitalhub-0.7.0b2.dist-info → digitalhub-0.8.0.dist-info}/METADATA +30 -13
  219. digitalhub-0.8.0.dist-info/RECORD +231 -0
  220. {digitalhub-0.7.0b2.dist-info → digitalhub-0.8.0.dist-info}/WHEEL +1 -1
  221. test/local/CRUD/test_artifacts.py +96 -0
  222. test/local/CRUD/test_dataitems.py +96 -0
  223. test/local/CRUD/test_models.py +95 -0
  224. test/test_crud_functions.py +1 -1
  225. test/test_crud_runs.py +1 -1
  226. test/test_crud_tasks.py +1 -1
  227. digitalhub-0.7.0b2.dist-info/RECORD +0 -14
  228. test/test_crud_artifacts.py +0 -96
  229. test/test_crud_dataitems.py +0 -96
  230. {digitalhub-0.7.0b2.dist-info → digitalhub-0.8.0.dist-info}/LICENSE.txt +0 -0
  231. {digitalhub-0.7.0b2.dist-info → digitalhub-0.8.0.dist-info}/top_level.txt +0 -0
  232. /test/{test_imports.py → local/imports/test_imports.py} +0 -0
@@ -0,0 +1,268 @@
1
+ from __future__ import annotations
2
+
3
+ import typing
4
+
5
+ from digitalhub.utils.exceptions import BuilderError
6
+
7
+ if typing.TYPE_CHECKING:
8
+ from digitalhub.entities._base.entity.builder import EntityBuilder
9
+ from digitalhub.entities._base.entity.entity import Entity
10
+ from digitalhub.entities._base.entity.metadata import Metadata
11
+ from digitalhub.entities._base.entity.spec import Spec
12
+ from digitalhub.entities._base.entity.status import Status
13
+ from digitalhub.entities._base.runtime_entity.builder import RuntimeEntityBuilder
14
+ from digitalhub.runtimes._base import Runtime
15
+ from digitalhub.runtimes.builder import RuntimeBuilder
16
+
17
+
18
+ class Factory:
19
+ """
20
+ Factory class for building entities and runtimes.
21
+ """
22
+
23
+ def __init__(self):
24
+ self._entity_builders: dict[str, EntityBuilder | RuntimeEntityBuilder] = {}
25
+ self._runtime_builders: dict[str, RuntimeBuilder] = {}
26
+
27
+ def add_entity_builder(self, name: str, builder: EntityBuilder | RuntimeEntityBuilder) -> None:
28
+ """
29
+ Add a builder to the factory.
30
+
31
+ Parameters
32
+ ----------
33
+ name : str
34
+ Builder name.
35
+ builder : EntityBuilder
36
+ Builder object.
37
+
38
+ Returns
39
+ -------
40
+ None
41
+ """
42
+ if name in self._entity_builders:
43
+ raise BuilderError(f"Builder {name} already exists.")
44
+ self._entity_builders[name] = builder()
45
+
46
+ def add_runtime_builder(self, name: str, builder: RuntimeBuilder) -> None:
47
+ """
48
+ Add a builder to the factory.
49
+
50
+ Parameters
51
+ ----------
52
+ name : str
53
+ Builder name.
54
+ builder : RuntimeBuilder
55
+ Builder object.
56
+
57
+ Returns
58
+ -------
59
+ None
60
+ """
61
+ if name in self._runtime_builders:
62
+ raise BuilderError(f"Builder {name} already exists.")
63
+ self._runtime_builders[name] = builder()
64
+
65
+ def build_entity_from_params(self, kind_to_build_from: str, **kwargs) -> Entity:
66
+ """
67
+ Build an entity from parameters.
68
+
69
+ Parameters
70
+ ----------
71
+ kind_to_build_from : str
72
+ Entity type.
73
+ **kwargs
74
+ Entity parameters.
75
+
76
+ Returns
77
+ -------
78
+ Entity
79
+ Entity object.
80
+ """
81
+ return self._entity_builders[kind_to_build_from].build(**kwargs)
82
+
83
+ def build_entity_from_dict(self, kind_to_build_from: str, obj: dict) -> Entity:
84
+ """
85
+ Build an entity from a dictionary.
86
+
87
+ Parameters
88
+ ----------
89
+ kind_to_build_from : str
90
+ Entity type.
91
+ dict_data : dict
92
+ Dictionary with entity data.
93
+
94
+ Returns
95
+ -------
96
+ Entity
97
+ Entity object.
98
+ """
99
+ return self._entity_builders[kind_to_build_from].from_dict(obj)
100
+
101
+ def build_spec(self, kind_to_build_from: str, **kwargs) -> Spec:
102
+ """
103
+ Build an entity spec.
104
+
105
+ Parameters
106
+ ----------
107
+ kind_to_build_from : str
108
+ Entity type.
109
+
110
+ Returns
111
+ -------
112
+ Spec
113
+ Spec object.
114
+ """
115
+ return self._entity_builders[kind_to_build_from].build_spec(**kwargs)
116
+
117
+ def build_metadata(self, kind_to_build_from: str, **kwargs) -> Metadata:
118
+ """
119
+ Build an entity metadata.
120
+
121
+ Parameters
122
+ ----------
123
+ kind_to_build_from : str
124
+ Entity type.
125
+
126
+ Returns
127
+ -------
128
+ Metadata
129
+ Metadata object.
130
+ """
131
+ return self._entity_builders[kind_to_build_from].build_metadata(**kwargs)
132
+
133
+ def build_status(self, kind_to_build_from: str, **kwargs) -> Status:
134
+ """
135
+ Build an entity status.
136
+
137
+ Parameters
138
+ ----------
139
+ kind_to_build_from : str
140
+ Entity type.
141
+
142
+ Returns
143
+ -------
144
+ Status
145
+ Status object.
146
+ """
147
+ return self._entity_builders[kind_to_build_from].build_status(**kwargs)
148
+
149
+ def build_runtime(self, kind_to_build_from: str, project: str) -> Runtime:
150
+ """
151
+ Build a runtime.
152
+
153
+ Parameters
154
+ ----------
155
+ kind_to_build_from : str
156
+ Runtime type.
157
+ project : str
158
+ Project name.
159
+
160
+ Returns
161
+ -------
162
+ Runtime
163
+ Runtime object.
164
+ """
165
+ return self._runtime_builders[kind_to_build_from].build(project=project)
166
+
167
+ def get_entity_type_from_kind(self, kind: str) -> str:
168
+ """
169
+ Get entity type from builder.
170
+
171
+ Parameters
172
+ ----------
173
+ kind : str
174
+ Entity type.
175
+
176
+ Returns
177
+ -------
178
+ str
179
+ Entity type.
180
+ """
181
+ return self._entity_builders[kind].get_entity_type()
182
+
183
+ def get_executable_kind(self, kind: str) -> str:
184
+ """
185
+ Get executable kind.
186
+
187
+ Parameters
188
+ ----------
189
+ kind : str
190
+ Kind.
191
+
192
+ Returns
193
+ -------
194
+ str
195
+ Executable kind.
196
+ """
197
+ return self._entity_builders[kind].get_executable_kind()
198
+
199
+ def get_action_from_task_kind(self, kind: str, task_kind: str) -> str:
200
+ """
201
+ Get action from task.
202
+
203
+ Parameters
204
+ ----------
205
+ kind : str
206
+ Kind.
207
+ task_kind : str
208
+ Task kind.
209
+
210
+ Returns
211
+ -------
212
+ str
213
+ Action.
214
+ """
215
+ return self._entity_builders[kind].get_action_from_task_kind(task_kind)
216
+
217
+ def get_task_kind_from_action(self, kind: str, action: str) -> list[str]:
218
+ """
219
+ Get task kinds from action.
220
+
221
+ Parameters
222
+ ----------
223
+ kind : str
224
+ Kind.
225
+ action : str
226
+ Action.
227
+
228
+ Returns
229
+ -------
230
+ list[str]
231
+ Task kinds.
232
+ """
233
+ return self._entity_builders[kind].get_task_kind_from_action(action)
234
+
235
+ def get_run_kind(self, kind: str) -> str:
236
+ """
237
+ Get run kind.
238
+
239
+ Parameters
240
+ ----------
241
+ kind : str
242
+ Kind.
243
+
244
+ Returns
245
+ -------
246
+ str
247
+ Run kind.
248
+ """
249
+ return self._entity_builders[kind].get_run_kind()
250
+
251
+ def get_all_kinds(self, kind: str) -> list[str]:
252
+ """
253
+ Get all kinds.
254
+
255
+ Parameters
256
+ ----------
257
+ kind : str
258
+ Kind.
259
+
260
+ Returns
261
+ -------
262
+ list[str]
263
+ All kinds.
264
+ """
265
+ return self._entity_builders[kind].get_all_kinds()
266
+
267
+
268
+ factory = Factory()
@@ -0,0 +1,90 @@
1
+ from __future__ import annotations
2
+
3
+ import importlib
4
+ import importlib.metadata
5
+ import pkgutil
6
+ import re
7
+ from types import ModuleType
8
+
9
+ from digitalhub.factory.factory import factory
10
+
11
+
12
+ def import_module(package: str) -> ModuleType:
13
+ """
14
+ Import modules from package name.
15
+
16
+ Parameters
17
+ ----------
18
+ package : str
19
+ Package name.
20
+
21
+ Returns
22
+ -------
23
+ ModuleType
24
+ Module.
25
+ """
26
+ try:
27
+ return importlib.import_module(package)
28
+ except ModuleNotFoundError:
29
+ raise ModuleNotFoundError(f"Package {package} not found.")
30
+ except Exception as e:
31
+ raise e
32
+
33
+
34
+ def list_runtimes() -> list[str]:
35
+ """
36
+ List installed runtimes for digitalhub.
37
+
38
+ Returns
39
+ -------
40
+ list
41
+ List of installed runtimes names.
42
+ """
43
+ pattern = r"digitalhub_runtime_.*"
44
+ runtimes = []
45
+ try:
46
+ for _, name, _ in pkgutil.iter_modules():
47
+ if re.match(pattern, name):
48
+ runtimes.append(name)
49
+ return runtimes
50
+ except Exception:
51
+ raise RuntimeError("Error listing installed runtimes.")
52
+
53
+
54
+ def register_runtimes_entities() -> None:
55
+ """
56
+ Register runtimes and related entities into registry.
57
+
58
+ Returns
59
+ -------
60
+ None
61
+ """
62
+ for package in list_runtimes():
63
+ module = import_module(package)
64
+ entity_builders = getattr(module, "entity_builders")
65
+ for entity_builder_tuple in entity_builders:
66
+ kind, builder = entity_builder_tuple
67
+ factory.add_entity_builder(kind, builder)
68
+
69
+ runtime_builders = getattr(module, "runtime_builders")
70
+ for runtime_builder_tuple in runtime_builders:
71
+ kind, builder = runtime_builder_tuple
72
+ factory.add_runtime_builder(kind, builder)
73
+
74
+
75
+ def register_entities() -> None:
76
+ """
77
+ Register layer and related entities into registry.
78
+
79
+ Returns
80
+ -------
81
+ None
82
+ """
83
+ try:
84
+ module = import_module("digitalhub.entities.builders")
85
+ entities_builders_list = getattr(module, "entity_builders")
86
+ for entity_builder_tuple in entities_builders_list:
87
+ kind, builder = entity_builder_tuple
88
+ factory.add_entity_builder(kind, builder)
89
+ except Exception:
90
+ pass
File without changes
File without changes
@@ -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,70 @@
1
+ from __future__ import annotations
2
+
3
+ from abc import ABCMeta, abstractmethod
4
+ from typing import Any
5
+
6
+
7
+ class DataframeReader(metaclass=ABCMeta):
8
+ """
9
+ Dataframe reader abstract class.
10
+ """
11
+
12
+ ##############################
13
+ # Read methods
14
+ ##############################
15
+
16
+ @staticmethod
17
+ @abstractmethod
18
+ def read_df(path: str | list[str], extension: str, **kwargs) -> Any:
19
+ """
20
+ Read DataFrame from path.
21
+ """
22
+
23
+ ##############################
24
+ # Write methods
25
+ ##############################
26
+
27
+ @abstractmethod
28
+ def write_df(self, df: Any, dst: Any, extension: str | None = None, **kwargs) -> None:
29
+ """
30
+ Method to write a dataframe to a file.
31
+ """
32
+
33
+ @staticmethod
34
+ @abstractmethod
35
+ def write_csv(df: Any, *args, **kwargs) -> str:
36
+ """
37
+ Write DataFrame as csv.
38
+ """
39
+
40
+ @staticmethod
41
+ @abstractmethod
42
+ def write_parquet(df: Any, *args, **kwargs) -> str:
43
+ """
44
+ Write DataFrame as parquet.
45
+ """
46
+
47
+ @staticmethod
48
+ @abstractmethod
49
+ def write_table(df: Any, *args, **kwargs) -> str:
50
+ """
51
+ Write DataFrame as table.
52
+ """
53
+
54
+ ##############################
55
+ # Utils
56
+ ##############################
57
+
58
+ @staticmethod
59
+ @abstractmethod
60
+ def get_schema(df: Any) -> Any:
61
+ """
62
+ Get schema.
63
+ """
64
+
65
+ @staticmethod
66
+ @abstractmethod
67
+ def get_preview(df: Any) -> Any:
68
+ """
69
+ Get preview.
70
+ """
@@ -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()
@@ -0,0 +1,133 @@
1
+ from __future__ import annotations
2
+
3
+ import typing
4
+
5
+ if typing.TYPE_CHECKING:
6
+ from digitalhub.readers._base.builder import ReaderBuilder
7
+ from digitalhub.readers._base.reader import DataframeReader
8
+
9
+
10
+ class ReaderFactory:
11
+ """
12
+ Reader factory class.
13
+ """
14
+
15
+ def __init__(self) -> None:
16
+ self._engine_builders: dict[str, ReaderBuilder] = None
17
+ self._dataframe_builders: dict[str, ReaderBuilder] = None
18
+ self._default: str = None
19
+
20
+ def add_builder(self, engine: str, dataframe: str, builder: ReaderBuilder) -> None:
21
+ """
22
+ Add a builder to the factory.
23
+
24
+ Parameters
25
+ ----------
26
+ name : str
27
+ Reader name.
28
+ builder : DataframeReader
29
+ Builder object.
30
+
31
+ Returns
32
+ -------
33
+ None
34
+ """
35
+ if self._engine_builders is None:
36
+ self._engine_builders = {}
37
+ if engine in self._engine_builders:
38
+ raise ValueError(f"Engine {engine} already exists.")
39
+ self._engine_builders[engine] = builder
40
+
41
+ if self._dataframe_builders is None:
42
+ self._dataframe_builders = {}
43
+ if dataframe in self._dataframe_builders:
44
+ raise ValueError(f"Dataframe {dataframe} already exists.")
45
+ self._dataframe_builders[dataframe] = builder
46
+
47
+ def build(self, engine: str | None = None, dataframe: str | None = None, **kwargs) -> DataframeReader:
48
+ """
49
+ Build reader object.
50
+
51
+ Parameters
52
+ ----------
53
+ engine : str | None
54
+ Engine name.
55
+ dataframe : str | None
56
+ Dataframe name.
57
+ **kwargs : dict
58
+ Keyword arguments.
59
+
60
+ Returns
61
+ -------
62
+ DataframeReader
63
+ Reader object.
64
+ """
65
+ if (engine is None) == (dataframe is None):
66
+ raise ValueError("Either engine or dataframe must be provided.")
67
+ if engine is not None:
68
+ return self._engine_builders[engine].build(**kwargs)
69
+ return self._dataframe_builders[dataframe].build(**kwargs)
70
+
71
+ def list_supported_engines(self) -> list[str]:
72
+ """
73
+ List supported engines.
74
+
75
+ Returns
76
+ -------
77
+ list[str]
78
+ List of supported engines.
79
+ """
80
+ return list(self._engine_builders.keys())
81
+
82
+ def list_supported_dataframes(self) -> list[str]:
83
+ """
84
+ List supported dataframes.
85
+
86
+ Returns
87
+ -------
88
+ list[str]
89
+ List of supported dataframes.
90
+ """
91
+ return list(self._dataframe_builders.keys())
92
+
93
+ def set_default(self, engine: str) -> None:
94
+ """
95
+ Set default engine.
96
+
97
+ Parameters
98
+ ----------
99
+ engine : str
100
+ Engine name.
101
+
102
+ Returns
103
+ -------
104
+ None
105
+ """
106
+ if engine not in self._engine_builders:
107
+ raise ValueError(f"Engine {engine} not found.")
108
+ self._default = engine
109
+
110
+ def get_default(self) -> str:
111
+ """
112
+ Get default engine.
113
+
114
+ Returns
115
+ -------
116
+ str
117
+ Default engine.
118
+ """
119
+ if self._default is None:
120
+ raise ValueError("No default engine set.")
121
+ return self._default
122
+
123
+
124
+ factory = ReaderFactory()
125
+
126
+ try:
127
+ from digitalhub.readers.pandas.builder import ReaderBuilderPandas
128
+
129
+ factory.add_builder(ReaderBuilderPandas.ENGINE, ReaderBuilderPandas.DATAFRAME_CLASS, ReaderBuilderPandas())
130
+ factory.set_default(ReaderBuilderPandas.ENGINE)
131
+
132
+ except ImportError:
133
+ pass
File without changes
@@ -0,0 +1,29 @@
1
+ from __future__ import annotations
2
+
3
+ from digitalhub.readers._base.builder import ReaderBuilder
4
+ from digitalhub.readers.pandas.reader import DataframeReaderPandas
5
+
6
+
7
+ class ReaderBuilderPandas(ReaderBuilder):
8
+ """
9
+ Pandas reader builder.
10
+ """
11
+
12
+ ENGINE = "pandas"
13
+ DATAFRAME_CLASS = "pandas.core.frame.DataFrame"
14
+
15
+ def build(self, **kwargs) -> DataframeReaderPandas:
16
+ """
17
+ Build reader object.
18
+
19
+ Parameters
20
+ ----------
21
+ **kwargs : dict
22
+ Keyword arguments.
23
+
24
+ Returns
25
+ -------
26
+ DataframeReaderPandas
27
+ Pandas reader object.
28
+ """
29
+ return DataframeReaderPandas(**kwargs)