digitalhub 0.8.0b0__py3-none-any.whl → 0.8.0b2__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/__init__.py +62 -94
- digitalhub/client/__init__.py +0 -0
- digitalhub/client/builder.py +105 -0
- digitalhub/client/objects/__init__.py +0 -0
- digitalhub/client/objects/base.py +56 -0
- digitalhub/client/objects/dhcore.py +681 -0
- digitalhub/client/objects/local.py +533 -0
- digitalhub/context/__init__.py +0 -0
- digitalhub/context/builder.py +178 -0
- digitalhub/context/context.py +136 -0
- digitalhub/datastores/__init__.py +0 -0
- digitalhub/datastores/builder.py +134 -0
- digitalhub/datastores/objects/__init__.py +0 -0
- digitalhub/datastores/objects/base.py +85 -0
- digitalhub/datastores/objects/local.py +42 -0
- digitalhub/datastores/objects/remote.py +23 -0
- digitalhub/datastores/objects/s3.py +38 -0
- digitalhub/datastores/objects/sql.py +60 -0
- digitalhub/entities/__init__.py +0 -0
- digitalhub/entities/_base/__init__.py +0 -0
- digitalhub/entities/_base/api.py +346 -0
- digitalhub/entities/_base/base.py +82 -0
- digitalhub/entities/_base/crud.py +610 -0
- digitalhub/entities/_base/entity/__init__.py +0 -0
- digitalhub/entities/_base/entity/base.py +132 -0
- digitalhub/entities/_base/entity/context.py +118 -0
- digitalhub/entities/_base/entity/executable.py +380 -0
- digitalhub/entities/_base/entity/material.py +214 -0
- digitalhub/entities/_base/entity/unversioned.py +87 -0
- digitalhub/entities/_base/entity/versioned.py +94 -0
- digitalhub/entities/_base/metadata.py +59 -0
- digitalhub/entities/_base/spec/__init__.py +0 -0
- digitalhub/entities/_base/spec/base.py +58 -0
- digitalhub/entities/_base/spec/material.py +22 -0
- digitalhub/entities/_base/state.py +31 -0
- digitalhub/entities/_base/status/__init__.py +0 -0
- digitalhub/entities/_base/status/base.py +32 -0
- digitalhub/entities/_base/status/material.py +49 -0
- digitalhub/entities/_builders/__init__.py +0 -0
- digitalhub/entities/_builders/metadata.py +60 -0
- digitalhub/entities/_builders/name.py +31 -0
- digitalhub/entities/_builders/spec.py +43 -0
- digitalhub/entities/_builders/status.py +62 -0
- digitalhub/entities/_builders/uuid.py +33 -0
- digitalhub/entities/artifact/__init__.py +0 -0
- digitalhub/entities/artifact/builder.py +133 -0
- digitalhub/entities/artifact/crud.py +358 -0
- digitalhub/entities/artifact/entity/__init__.py +0 -0
- digitalhub/entities/artifact/entity/_base.py +39 -0
- digitalhub/entities/artifact/entity/artifact.py +9 -0
- digitalhub/entities/artifact/spec.py +39 -0
- digitalhub/entities/artifact/status.py +15 -0
- digitalhub/entities/dataitem/__init__.py +0 -0
- digitalhub/entities/dataitem/builder.py +144 -0
- digitalhub/entities/dataitem/crud.py +395 -0
- digitalhub/entities/dataitem/entity/__init__.py +0 -0
- digitalhub/entities/dataitem/entity/_base.py +75 -0
- digitalhub/entities/dataitem/entity/dataitem.py +9 -0
- digitalhub/entities/dataitem/entity/iceberg.py +7 -0
- digitalhub/entities/dataitem/entity/table.py +125 -0
- digitalhub/entities/dataitem/models.py +62 -0
- digitalhub/entities/dataitem/spec.py +61 -0
- digitalhub/entities/dataitem/status.py +38 -0
- digitalhub/entities/entity_types.py +19 -0
- digitalhub/entities/function/__init__.py +0 -0
- digitalhub/entities/function/builder.py +86 -0
- digitalhub/entities/function/crud.py +305 -0
- digitalhub/entities/function/entity.py +101 -0
- digitalhub/entities/function/models.py +118 -0
- digitalhub/entities/function/spec.py +81 -0
- digitalhub/entities/function/status.py +9 -0
- digitalhub/entities/model/__init__.py +0 -0
- digitalhub/entities/model/builder.py +152 -0
- digitalhub/entities/model/crud.py +358 -0
- digitalhub/entities/model/entity/__init__.py +0 -0
- digitalhub/entities/model/entity/_base.py +34 -0
- digitalhub/entities/model/entity/huggingface.py +9 -0
- digitalhub/entities/model/entity/mlflow.py +90 -0
- digitalhub/entities/model/entity/model.py +9 -0
- digitalhub/entities/model/entity/sklearn.py +9 -0
- digitalhub/entities/model/models.py +26 -0
- digitalhub/entities/model/spec.py +146 -0
- digitalhub/entities/model/status.py +33 -0
- digitalhub/entities/project/__init__.py +0 -0
- digitalhub/entities/project/builder.py +82 -0
- digitalhub/entities/project/crud.py +350 -0
- digitalhub/entities/project/entity.py +2060 -0
- digitalhub/entities/project/spec.py +50 -0
- digitalhub/entities/project/status.py +9 -0
- digitalhub/entities/registries.py +48 -0
- digitalhub/entities/run/__init__.py +0 -0
- digitalhub/entities/run/builder.py +77 -0
- digitalhub/entities/run/crud.py +232 -0
- digitalhub/entities/run/entity.py +461 -0
- digitalhub/entities/run/spec.py +153 -0
- digitalhub/entities/run/status.py +114 -0
- digitalhub/entities/secret/__init__.py +0 -0
- digitalhub/entities/secret/builder.py +93 -0
- digitalhub/entities/secret/crud.py +294 -0
- digitalhub/entities/secret/entity.py +73 -0
- digitalhub/entities/secret/spec.py +35 -0
- digitalhub/entities/secret/status.py +9 -0
- digitalhub/entities/task/__init__.py +0 -0
- digitalhub/entities/task/builder.py +74 -0
- digitalhub/entities/task/crud.py +241 -0
- digitalhub/entities/task/entity.py +135 -0
- digitalhub/entities/task/models.py +199 -0
- digitalhub/entities/task/spec.py +51 -0
- digitalhub/entities/task/status.py +9 -0
- digitalhub/entities/utils.py +184 -0
- digitalhub/entities/workflow/__init__.py +0 -0
- digitalhub/entities/workflow/builder.py +91 -0
- digitalhub/entities/workflow/crud.py +304 -0
- digitalhub/entities/workflow/entity.py +77 -0
- digitalhub/entities/workflow/spec.py +15 -0
- digitalhub/entities/workflow/status.py +9 -0
- digitalhub/readers/__init__.py +0 -0
- digitalhub/readers/builder.py +54 -0
- digitalhub/readers/objects/__init__.py +0 -0
- digitalhub/readers/objects/base.py +70 -0
- digitalhub/readers/objects/pandas.py +207 -0
- digitalhub/readers/registry.py +15 -0
- digitalhub/registry/__init__.py +0 -0
- digitalhub/registry/models.py +87 -0
- digitalhub/registry/registry.py +74 -0
- digitalhub/registry/utils.py +150 -0
- digitalhub/runtimes/__init__.py +0 -0
- digitalhub/runtimes/base.py +164 -0
- digitalhub/runtimes/builder.py +53 -0
- digitalhub/runtimes/kind_registry.py +170 -0
- digitalhub/stores/__init__.py +0 -0
- digitalhub/stores/builder.py +257 -0
- digitalhub/stores/objects/__init__.py +0 -0
- digitalhub/stores/objects/base.py +189 -0
- digitalhub/stores/objects/local.py +230 -0
- digitalhub/stores/objects/remote.py +143 -0
- digitalhub/stores/objects/s3.py +563 -0
- digitalhub/stores/objects/sql.py +328 -0
- digitalhub/utils/__init__.py +0 -0
- digitalhub/utils/data_utils.py +127 -0
- digitalhub/utils/env_utils.py +123 -0
- digitalhub/utils/exceptions.py +55 -0
- digitalhub/utils/file_utils.py +204 -0
- digitalhub/utils/generic_utils.py +207 -0
- digitalhub/utils/git_utils.py +148 -0
- digitalhub/utils/io_utils.py +79 -0
- digitalhub/utils/logger.py +17 -0
- digitalhub/utils/uri_utils.py +56 -0
- {digitalhub-0.8.0b0.dist-info → digitalhub-0.8.0b2.dist-info}/METADATA +27 -12
- digitalhub-0.8.0b2.dist-info/RECORD +161 -0
- test/test_crud_artifacts.py +1 -1
- test/test_crud_dataitems.py +1 -1
- test/test_crud_functions.py +1 -1
- test/test_crud_runs.py +1 -1
- test/test_crud_tasks.py +1 -1
- digitalhub-0.8.0b0.dist-info/RECORD +0 -14
- {digitalhub-0.8.0b0.dist-info → digitalhub-0.8.0b2.dist-info}/LICENSE.txt +0 -0
- {digitalhub-0.8.0b0.dist-info → digitalhub-0.8.0b2.dist-info}/WHEEL +0 -0
- {digitalhub-0.8.0b0.dist-info → digitalhub-0.8.0b2.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import typing
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
|
|
6
|
+
if typing.TYPE_CHECKING:
|
|
7
|
+
from digitalhub.entities.project.entity._base import Project
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class Context:
|
|
11
|
+
"""
|
|
12
|
+
Context class built forom a `Project` instance. It contains
|
|
13
|
+
some information about the project, such as the project name,
|
|
14
|
+
a client instance (local or non-local), the local context
|
|
15
|
+
project path and information about client locality.
|
|
16
|
+
It exposes CRUD operations for the entities and act as a layer
|
|
17
|
+
between the project object and its client.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
def __init__(self, project: Project) -> None:
|
|
21
|
+
self.name = project.name
|
|
22
|
+
self.client = project._client
|
|
23
|
+
self.local = project._client.is_local()
|
|
24
|
+
self.root = Path(project.spec.context)
|
|
25
|
+
|
|
26
|
+
def create_object(self, api: str, obj: dict, **kwargs) -> dict:
|
|
27
|
+
"""
|
|
28
|
+
Create an object.
|
|
29
|
+
|
|
30
|
+
Parameters
|
|
31
|
+
----------
|
|
32
|
+
api : str
|
|
33
|
+
Create API.
|
|
34
|
+
obj : dict
|
|
35
|
+
Object to create.
|
|
36
|
+
**kwargs : dict
|
|
37
|
+
Keyword arguments passed to the request.
|
|
38
|
+
|
|
39
|
+
Returns
|
|
40
|
+
-------
|
|
41
|
+
dict
|
|
42
|
+
Response object.
|
|
43
|
+
"""
|
|
44
|
+
return self.client.create_object(api, obj, **kwargs)
|
|
45
|
+
|
|
46
|
+
def read_object(self, api: str, **kwargs) -> dict:
|
|
47
|
+
"""
|
|
48
|
+
Read an object.
|
|
49
|
+
|
|
50
|
+
Parameters
|
|
51
|
+
----------
|
|
52
|
+
api : str
|
|
53
|
+
Read API.
|
|
54
|
+
**kwargs : dict
|
|
55
|
+
Keyword arguments passed to the request.
|
|
56
|
+
|
|
57
|
+
Returns
|
|
58
|
+
-------
|
|
59
|
+
dict
|
|
60
|
+
Response object.
|
|
61
|
+
"""
|
|
62
|
+
return self.client.read_object(api, **kwargs)
|
|
63
|
+
|
|
64
|
+
def update_object(self, api: str, obj: dict, **kwargs) -> dict:
|
|
65
|
+
"""
|
|
66
|
+
Update an object.
|
|
67
|
+
|
|
68
|
+
Parameters
|
|
69
|
+
----------
|
|
70
|
+
api : str
|
|
71
|
+
Update API.
|
|
72
|
+
obj : dict
|
|
73
|
+
Object to update.
|
|
74
|
+
**kwargs : dict
|
|
75
|
+
Keyword arguments passed to the request.
|
|
76
|
+
|
|
77
|
+
Returns
|
|
78
|
+
-------
|
|
79
|
+
dict
|
|
80
|
+
Response object.
|
|
81
|
+
"""
|
|
82
|
+
return self.client.update_object(api, obj, **kwargs)
|
|
83
|
+
|
|
84
|
+
def delete_object(self, api: str, **kwargs) -> dict:
|
|
85
|
+
"""
|
|
86
|
+
Delete an object.
|
|
87
|
+
|
|
88
|
+
Parameters
|
|
89
|
+
----------
|
|
90
|
+
api : str
|
|
91
|
+
Delete API.
|
|
92
|
+
**kwargs : dict
|
|
93
|
+
Keyword arguments passed to the request.
|
|
94
|
+
|
|
95
|
+
Returns
|
|
96
|
+
-------
|
|
97
|
+
dict
|
|
98
|
+
Response object.
|
|
99
|
+
"""
|
|
100
|
+
return self.client.delete_object(api, **kwargs)
|
|
101
|
+
|
|
102
|
+
def list_objects(self, api: str, **kwargs) -> dict:
|
|
103
|
+
"""
|
|
104
|
+
List objects.
|
|
105
|
+
|
|
106
|
+
Parameters
|
|
107
|
+
----------
|
|
108
|
+
api : str
|
|
109
|
+
The api to list the objects with.
|
|
110
|
+
**kwargs : dict
|
|
111
|
+
Keyword arguments passed to the request.
|
|
112
|
+
|
|
113
|
+
Returns
|
|
114
|
+
-------
|
|
115
|
+
dict
|
|
116
|
+
The list of objects.
|
|
117
|
+
"""
|
|
118
|
+
return self.client.list_objects(api, **kwargs)
|
|
119
|
+
|
|
120
|
+
def list_first_object(self, api: str, **kwargs) -> dict:
|
|
121
|
+
"""
|
|
122
|
+
List first objects.
|
|
123
|
+
|
|
124
|
+
Parameters
|
|
125
|
+
----------
|
|
126
|
+
api : str
|
|
127
|
+
The api to list the objects with.
|
|
128
|
+
**kwargs : dict
|
|
129
|
+
Keyword arguments passed to the request.
|
|
130
|
+
|
|
131
|
+
Returns
|
|
132
|
+
-------
|
|
133
|
+
dict
|
|
134
|
+
The list of objects.
|
|
135
|
+
"""
|
|
136
|
+
return self.client.list_first_object(api, **kwargs)
|
|
File without changes
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import typing
|
|
4
|
+
|
|
5
|
+
from digitalhub.datastores.objects.local import LocalDatastore
|
|
6
|
+
from digitalhub.datastores.objects.remote import RemoteDatastore
|
|
7
|
+
from digitalhub.datastores.objects.s3 import S3Datastore
|
|
8
|
+
from digitalhub.datastores.objects.sql import SqlDatastore
|
|
9
|
+
from digitalhub.stores.builder import get_default_store, get_store
|
|
10
|
+
from digitalhub.utils.uri_utils import map_uri_scheme
|
|
11
|
+
|
|
12
|
+
if typing.TYPE_CHECKING:
|
|
13
|
+
from digitalhub.datastores.objects.base import Datastore
|
|
14
|
+
from digitalhub.stores.objects.base import Store
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
REGISTRY_DATASTORES = {"local": LocalDatastore, "remote": RemoteDatastore, "s3": S3Datastore, "sql": SqlDatastore}
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class DatastoreBuilder:
|
|
21
|
+
"""
|
|
22
|
+
Datastore builder class.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
def __init__(self) -> None:
|
|
26
|
+
self._instances: dict[str, Datastore] = {}
|
|
27
|
+
self._default: Datastore | None = None
|
|
28
|
+
self._def_scheme = "s3"
|
|
29
|
+
|
|
30
|
+
def build(self, uri: str) -> None:
|
|
31
|
+
"""
|
|
32
|
+
Build a datastore instance and register it.
|
|
33
|
+
It overrides any existing instance.
|
|
34
|
+
|
|
35
|
+
Parameters
|
|
36
|
+
----------
|
|
37
|
+
uri : str
|
|
38
|
+
URI to parse.
|
|
39
|
+
|
|
40
|
+
Returns
|
|
41
|
+
-------
|
|
42
|
+
None
|
|
43
|
+
"""
|
|
44
|
+
store = get_store(uri)
|
|
45
|
+
self._instances[store.type] = self.build_datastore(store)
|
|
46
|
+
|
|
47
|
+
def get(self, uri: str) -> Datastore:
|
|
48
|
+
"""
|
|
49
|
+
Get a store instance by URI.
|
|
50
|
+
|
|
51
|
+
Parameters
|
|
52
|
+
----------
|
|
53
|
+
uri : str
|
|
54
|
+
URI to parse.
|
|
55
|
+
|
|
56
|
+
Returns
|
|
57
|
+
-------
|
|
58
|
+
Datastore
|
|
59
|
+
The datastore instance.
|
|
60
|
+
"""
|
|
61
|
+
scheme = map_uri_scheme(uri)
|
|
62
|
+
if scheme not in self._instances:
|
|
63
|
+
self.build(uri)
|
|
64
|
+
return self._instances[scheme]
|
|
65
|
+
|
|
66
|
+
def default(self) -> Datastore:
|
|
67
|
+
"""
|
|
68
|
+
Get the default store instance.
|
|
69
|
+
|
|
70
|
+
Returns
|
|
71
|
+
-------
|
|
72
|
+
Datastore
|
|
73
|
+
The default datastore instance.
|
|
74
|
+
"""
|
|
75
|
+
if self._default is None:
|
|
76
|
+
store = get_default_store()
|
|
77
|
+
self._default = self.build_datastore(store)
|
|
78
|
+
return self._default
|
|
79
|
+
|
|
80
|
+
def build_datastore(self, store: Store) -> Datastore:
|
|
81
|
+
"""
|
|
82
|
+
Build a datastore instance.
|
|
83
|
+
|
|
84
|
+
Parameters
|
|
85
|
+
----------
|
|
86
|
+
store : Store
|
|
87
|
+
Store instance.
|
|
88
|
+
|
|
89
|
+
Returns
|
|
90
|
+
-------
|
|
91
|
+
Datastore
|
|
92
|
+
The datastore instance.
|
|
93
|
+
|
|
94
|
+
Raises
|
|
95
|
+
------
|
|
96
|
+
NotImplementedError
|
|
97
|
+
If the store type is not implemented.
|
|
98
|
+
"""
|
|
99
|
+
try:
|
|
100
|
+
return REGISTRY_DATASTORES[store.type](store)
|
|
101
|
+
except KeyError as e:
|
|
102
|
+
raise NotImplementedError from e
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
builder = DatastoreBuilder()
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def get_datastore(uri: str) -> Datastore:
|
|
109
|
+
"""
|
|
110
|
+
Get a datastore instance by URI.
|
|
111
|
+
|
|
112
|
+
Parameters
|
|
113
|
+
----------
|
|
114
|
+
uri : str
|
|
115
|
+
URI to parse.
|
|
116
|
+
|
|
117
|
+
Returns
|
|
118
|
+
-------
|
|
119
|
+
Datastore
|
|
120
|
+
The datastore instance.
|
|
121
|
+
"""
|
|
122
|
+
return builder.get(uri)
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def get_default_datastore() -> Datastore:
|
|
126
|
+
"""
|
|
127
|
+
Get the default datastore instance.
|
|
128
|
+
|
|
129
|
+
Returns
|
|
130
|
+
-------
|
|
131
|
+
Datastore
|
|
132
|
+
The default datastore instance.
|
|
133
|
+
"""
|
|
134
|
+
return builder.default()
|
|
File without changes
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import typing
|
|
4
|
+
from abc import ABCMeta, abstractmethod
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
from digitalhub.readers.builder import get_reader_by_engine
|
|
8
|
+
|
|
9
|
+
if typing.TYPE_CHECKING:
|
|
10
|
+
from digitalhub.stores.objects.base import Store
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class Datastore(metaclass=ABCMeta):
|
|
14
|
+
"""
|
|
15
|
+
Datastore abstract class.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
def __init__(self, store: Store, **kwargs) -> None:
|
|
19
|
+
self.store = store
|
|
20
|
+
|
|
21
|
+
##############################
|
|
22
|
+
# IO methods
|
|
23
|
+
##############################
|
|
24
|
+
|
|
25
|
+
@abstractmethod
|
|
26
|
+
def write_df(self, df: Any, dst: str, extension: str | None = None, **kwargs) -> str:
|
|
27
|
+
"""
|
|
28
|
+
Write DataFrame as parquet or csv.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
def read_df(
|
|
32
|
+
self,
|
|
33
|
+
path: str | list[str],
|
|
34
|
+
extension: str,
|
|
35
|
+
engine: str | None = "pandas",
|
|
36
|
+
**kwargs,
|
|
37
|
+
) -> Any:
|
|
38
|
+
"""
|
|
39
|
+
Read DataFrame from path.
|
|
40
|
+
|
|
41
|
+
Parameters
|
|
42
|
+
----------
|
|
43
|
+
path : str | list[str]
|
|
44
|
+
Path(s) to read DataFrame from.
|
|
45
|
+
extension : str
|
|
46
|
+
Extension of the file.
|
|
47
|
+
engine : str
|
|
48
|
+
Dataframe engine (pandas, polars, etc.).
|
|
49
|
+
**kwargs : dict
|
|
50
|
+
Keyword arguments.
|
|
51
|
+
|
|
52
|
+
Returns
|
|
53
|
+
-------
|
|
54
|
+
Any
|
|
55
|
+
DataFrame.
|
|
56
|
+
"""
|
|
57
|
+
reader = get_reader_by_engine(engine)
|
|
58
|
+
self._validate_extension(extension)
|
|
59
|
+
return reader.read_df(path, extension, **kwargs)
|
|
60
|
+
|
|
61
|
+
##############################
|
|
62
|
+
# Helper methods
|
|
63
|
+
##############################
|
|
64
|
+
|
|
65
|
+
@staticmethod
|
|
66
|
+
def _validate_extension(extension: str) -> None:
|
|
67
|
+
"""
|
|
68
|
+
Validate extension.
|
|
69
|
+
|
|
70
|
+
Parameters
|
|
71
|
+
----------
|
|
72
|
+
extension : str
|
|
73
|
+
Extension of the file.
|
|
74
|
+
|
|
75
|
+
Returns
|
|
76
|
+
-------
|
|
77
|
+
None
|
|
78
|
+
|
|
79
|
+
Raises
|
|
80
|
+
------
|
|
81
|
+
ValueError
|
|
82
|
+
If extension is not supported.
|
|
83
|
+
"""
|
|
84
|
+
if extension not in ["csv", "parquet", "file"]:
|
|
85
|
+
raise ValueError(f"Extension {extension} not supported.")
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
from digitalhub.datastores.objects.base import Datastore
|
|
7
|
+
from digitalhub.readers.builder import get_reader_by_object
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class LocalDatastore(Datastore):
|
|
11
|
+
"""
|
|
12
|
+
Local Datastore class.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
def write_df(self, df: Any, dst: str, extension: str | None = None, **kwargs) -> str:
|
|
16
|
+
"""
|
|
17
|
+
Method to write a dataframe to a file. Kwargs are passed to df.to_parquet().
|
|
18
|
+
If destination is not provided, the dataframe is written to the default
|
|
19
|
+
store path with generated name.
|
|
20
|
+
|
|
21
|
+
Parameters
|
|
22
|
+
----------
|
|
23
|
+
df : Any
|
|
24
|
+
The dataframe to write.
|
|
25
|
+
dst : str
|
|
26
|
+
The destination of the dataframe.
|
|
27
|
+
**kwargs : dict
|
|
28
|
+
Keyword arguments.
|
|
29
|
+
|
|
30
|
+
Returns
|
|
31
|
+
-------
|
|
32
|
+
str
|
|
33
|
+
Path of written dataframe.
|
|
34
|
+
"""
|
|
35
|
+
self.store._check_local_dst(dst)
|
|
36
|
+
self._validate_extension(Path(dst).suffix.removeprefix("."))
|
|
37
|
+
|
|
38
|
+
# Write dataframe
|
|
39
|
+
reader = get_reader_by_object(df)
|
|
40
|
+
reader.write_df(df, dst, extension=extension, **kwargs)
|
|
41
|
+
|
|
42
|
+
return dst
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
from digitalhub.datastores.objects.base import Datastore
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class RemoteDatastore(Datastore):
|
|
9
|
+
"""
|
|
10
|
+
Remote Datastore class.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
def write_df(self, df: Any, dst: str, extension: str | None = None, **kwargs) -> str:
|
|
14
|
+
"""
|
|
15
|
+
Method to write a dataframe to a file. Note that this method is not implemented
|
|
16
|
+
since the remote store is not meant to write dataframes.
|
|
17
|
+
|
|
18
|
+
Raises
|
|
19
|
+
------
|
|
20
|
+
NotImplementedError
|
|
21
|
+
This method is not implemented.
|
|
22
|
+
"""
|
|
23
|
+
raise NotImplementedError("Remote store does not support write_df.")
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from io import BytesIO
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
from digitalhub.datastores.objects.base import Datastore
|
|
7
|
+
from digitalhub.readers.builder import get_reader_by_object
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class S3Datastore(Datastore):
|
|
11
|
+
"""
|
|
12
|
+
S3 Datastore class.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
def write_df(self, df: Any, dst: str, extension: str | None = None, **kwargs) -> str:
|
|
16
|
+
"""
|
|
17
|
+
Write a dataframe to S3 based storage. Kwargs are passed to df.to_parquet().
|
|
18
|
+
|
|
19
|
+
Parameters
|
|
20
|
+
----------
|
|
21
|
+
df : Any
|
|
22
|
+
The dataframe.
|
|
23
|
+
dst : str
|
|
24
|
+
The destination path on S3 based storage.
|
|
25
|
+
**kwargs : dict
|
|
26
|
+
Keyword arguments.
|
|
27
|
+
|
|
28
|
+
Returns
|
|
29
|
+
-------
|
|
30
|
+
str
|
|
31
|
+
The S3 path where the dataframe was saved.
|
|
32
|
+
"""
|
|
33
|
+
fileobj = BytesIO()
|
|
34
|
+
reader = get_reader_by_object(df)
|
|
35
|
+
reader.write_df(df, fileobj, extension=extension, **kwargs)
|
|
36
|
+
|
|
37
|
+
key = self.store._get_key(dst)
|
|
38
|
+
return self.store.upload_fileobject(fileobj, key)
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
from digitalhub.datastores.objects.base import Datastore
|
|
6
|
+
from digitalhub.readers.builder import get_reader_by_object
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class SqlDatastore(Datastore):
|
|
10
|
+
"""
|
|
11
|
+
Sql Datastore class.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
def write_df(self, df: Any, dst: str, extension: str | None = None, **kwargs) -> str:
|
|
15
|
+
"""
|
|
16
|
+
Write a dataframe to a database. Kwargs are passed to df.to_sql().
|
|
17
|
+
|
|
18
|
+
Parameters
|
|
19
|
+
----------
|
|
20
|
+
df : Any
|
|
21
|
+
The dataframe to write.
|
|
22
|
+
dst : str
|
|
23
|
+
The destination of the dataframe.
|
|
24
|
+
**kwargs : dict
|
|
25
|
+
Keyword arguments.
|
|
26
|
+
|
|
27
|
+
Returns
|
|
28
|
+
-------
|
|
29
|
+
str
|
|
30
|
+
Path of written dataframe.
|
|
31
|
+
"""
|
|
32
|
+
schema = self.store._get_schema(dst)
|
|
33
|
+
table = self.store._get_table_name(dst)
|
|
34
|
+
return self._upload_table(df, schema, table, **kwargs)
|
|
35
|
+
|
|
36
|
+
def _upload_table(self, df: Any, schema: str, table: str, **kwargs) -> str:
|
|
37
|
+
"""
|
|
38
|
+
Upload a table to SQL based storage.
|
|
39
|
+
|
|
40
|
+
Parameters
|
|
41
|
+
----------
|
|
42
|
+
df : DataFrame
|
|
43
|
+
The dataframe.
|
|
44
|
+
schema : str
|
|
45
|
+
Destination schema.
|
|
46
|
+
table : str
|
|
47
|
+
Destination table.
|
|
48
|
+
**kwargs : dict
|
|
49
|
+
Keyword arguments.
|
|
50
|
+
|
|
51
|
+
Returns
|
|
52
|
+
-------
|
|
53
|
+
str
|
|
54
|
+
The SQL URI where the dataframe was saved.
|
|
55
|
+
"""
|
|
56
|
+
reader = get_reader_by_object(df)
|
|
57
|
+
engine = self.store._check_factory()
|
|
58
|
+
reader.write_table(df, table, engine, schema, **kwargs)
|
|
59
|
+
engine.dispose()
|
|
60
|
+
return f"sql://{engine.url.database}/{schema}/{table}"
|
|
File without changes
|
|
File without changes
|