digitalhub 0.10.0b6__py3-none-any.whl → 0.10.1__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 +2 -3
- digitalhub/entities/_base/material/entity.py +1 -1
- digitalhub/entities/_base/material/utils.py +1 -1
- digitalhub/entities/_processors/base.py +2 -2
- digitalhub/entities/_processors/context.py +1 -1
- digitalhub/entities/_processors/utils.py +2 -2
- digitalhub/entities/dataitem/table/entity.py +1 -1
- digitalhub/entities/dataitem/utils.py +2 -2
- digitalhub/entities/model/_base/entity.py +30 -0
- digitalhub/entities/project/_base/entity.py +1 -1
- digitalhub/entities/run/_base/entity.py +30 -0
- digitalhub/{client → stores/client}/_base/client.py +3 -3
- digitalhub/{client → stores/client}/api.py +2 -2
- digitalhub/{client → stores/client}/builder.py +3 -3
- digitalhub/{client → stores/client}/dhcore/api_builder.py +1 -1
- digitalhub/{client → stores/client}/dhcore/client.py +6 -6
- digitalhub/{client → stores/client}/dhcore/configurator.py +27 -78
- digitalhub/{client → stores/client}/dhcore/key_builder.py +1 -1
- digitalhub/{client → stores/client}/dhcore/params_builder.py +6 -2
- digitalhub/{client → stores/client}/dhcore/utils.py +3 -3
- digitalhub/{client → stores/client}/local/api_builder.py +2 -2
- digitalhub/{client → stores/client}/local/client.py +5 -5
- digitalhub/{client → stores/client}/local/key_builder.py +1 -1
- digitalhub/{client → stores/client}/local/params_builder.py +1 -1
- digitalhub/{configurator → stores/configurator}/api.py +1 -1
- digitalhub/{configurator → stores/configurator}/configurator.py +5 -5
- digitalhub/stores/configurator/enums.py +12 -0
- digitalhub/{configurator → stores/configurator}/ini_module.py +1 -1
- digitalhub/stores/{_base → data/_base}/store.py +2 -2
- digitalhub/stores/{api.py → data/api.py} +2 -2
- digitalhub/stores/{builder.py → data/builder.py} +6 -6
- digitalhub/stores/{local → data/local}/store.py +2 -2
- digitalhub/stores/{remote → data/remote}/store.py +1 -1
- digitalhub/stores/data/s3/configurator.py +146 -0
- digitalhub/stores/{s3 → data/s3}/store.py +26 -10
- digitalhub/stores/{s3 → data/s3}/utils.py +1 -1
- digitalhub/stores/data/sql/configurator.py +126 -0
- digitalhub/stores/{sql → data/sql}/store.py +21 -9
- digitalhub/{readers → stores/readers}/data/_base/builder.py +1 -1
- digitalhub/{readers → stores/readers}/data/api.py +2 -2
- digitalhub/{readers → stores/readers}/data/factory.py +3 -3
- digitalhub/{readers → stores/readers}/data/pandas/builder.py +2 -2
- digitalhub/{readers → stores/readers}/data/pandas/reader.py +1 -1
- digitalhub/stores/readers/query/__init__.py +0 -0
- {digitalhub-0.10.0b6.dist-info → digitalhub-0.10.1.dist-info}/METADATA +2 -2
- {digitalhub-0.10.0b6.dist-info → digitalhub-0.10.1.dist-info}/RECORD +76 -74
- digitalhub/stores/s3/configurator.py +0 -108
- digitalhub/stores/sql/configurator.py +0 -88
- /digitalhub/{client → stores/client}/__init__.py +0 -0
- /digitalhub/{client → stores/client}/_base/__init__.py +0 -0
- /digitalhub/{client → stores/client}/_base/api_builder.py +0 -0
- /digitalhub/{client → stores/client}/_base/key_builder.py +0 -0
- /digitalhub/{client → stores/client}/_base/params_builder.py +0 -0
- /digitalhub/{client → stores/client}/dhcore/__init__.py +0 -0
- /digitalhub/{client → stores/client}/dhcore/enums.py +0 -0
- /digitalhub/{client → stores/client}/dhcore/error_parser.py +0 -0
- /digitalhub/{client → stores/client}/dhcore/models.py +0 -0
- /digitalhub/{client → stores/client}/local/__init__.py +0 -0
- /digitalhub/{client → stores/client}/local/enums.py +0 -0
- /digitalhub/{configurator → stores/configurator}/__init__.py +0 -0
- /digitalhub/{configurator → stores/configurator}/credentials_store.py +0 -0
- /digitalhub/{readers → stores/data}/__init__.py +0 -0
- /digitalhub/{readers/data → stores/data/_base}/__init__.py +0 -0
- /digitalhub/{readers/data/_base → stores/data/local}/__init__.py +0 -0
- /digitalhub/{readers/data/pandas → stores/data/remote}/__init__.py +0 -0
- /digitalhub/{readers/query → stores/data/s3}/__init__.py +0 -0
- /digitalhub/stores/{s3 → data/s3}/enums.py +0 -0
- /digitalhub/stores/{s3 → data/s3}/models.py +0 -0
- /digitalhub/stores/{_base → data/sql}/__init__.py +0 -0
- /digitalhub/stores/{sql → data/sql}/enums.py +0 -0
- /digitalhub/stores/{sql → data/sql}/models.py +0 -0
- /digitalhub/stores/{local → readers}/__init__.py +0 -0
- /digitalhub/stores/{remote → readers/data}/__init__.py +0 -0
- /digitalhub/stores/{s3 → readers/data/_base}/__init__.py +0 -0
- /digitalhub/{readers → stores/readers}/data/_base/reader.py +0 -0
- /digitalhub/stores/{sql → readers/data/pandas}/__init__.py +0 -0
- {digitalhub-0.10.0b6.dist-info → digitalhub-0.10.1.dist-info}/WHEEL +0 -0
- {digitalhub-0.10.0b6.dist-info → digitalhub-0.10.1.dist-info}/licenses/LICENSE.txt +0 -0
|
@@ -5,7 +5,7 @@ from typing import Any
|
|
|
5
5
|
|
|
6
6
|
import requests
|
|
7
7
|
|
|
8
|
-
from digitalhub.stores._base.store import Store
|
|
8
|
+
from digitalhub.stores.data._base.store import Store
|
|
9
9
|
from digitalhub.utils.exceptions import StoreError
|
|
10
10
|
from digitalhub.utils.types import SourcesOrListOfSources
|
|
11
11
|
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from botocore.config import Config
|
|
4
|
+
|
|
5
|
+
from digitalhub.stores.configurator.configurator import configurator
|
|
6
|
+
from digitalhub.stores.configurator.enums import CredsOrigin
|
|
7
|
+
from digitalhub.stores.data.s3.enums import S3StoreEnv
|
|
8
|
+
from digitalhub.utils.exceptions import StoreError
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class S3StoreConfigurator:
|
|
12
|
+
"""
|
|
13
|
+
Configure the store by getting the credentials from user
|
|
14
|
+
provided config or from environment.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
required_vars = [
|
|
18
|
+
S3StoreEnv.ENDPOINT_URL,
|
|
19
|
+
S3StoreEnv.ACCESS_KEY_ID,
|
|
20
|
+
S3StoreEnv.SECRET_ACCESS_KEY,
|
|
21
|
+
S3StoreEnv.BUCKET_NAME,
|
|
22
|
+
]
|
|
23
|
+
optional_vars = [
|
|
24
|
+
S3StoreEnv.REGION,
|
|
25
|
+
S3StoreEnv.SIGNATURE_VERSION,
|
|
26
|
+
S3StoreEnv.SESSION_TOKEN,
|
|
27
|
+
]
|
|
28
|
+
|
|
29
|
+
def __init__(self, config: dict | None = None) -> None:
|
|
30
|
+
self.configure(config)
|
|
31
|
+
|
|
32
|
+
##############################
|
|
33
|
+
# Configuration methods
|
|
34
|
+
##############################
|
|
35
|
+
|
|
36
|
+
def configure(self, config: dict | None = None) -> None:
|
|
37
|
+
"""
|
|
38
|
+
Configure the store by getting the credentials from user
|
|
39
|
+
provided config or from environment.
|
|
40
|
+
|
|
41
|
+
Parameters
|
|
42
|
+
----------
|
|
43
|
+
config : dict
|
|
44
|
+
Configuration dictionary.
|
|
45
|
+
|
|
46
|
+
Returns
|
|
47
|
+
-------
|
|
48
|
+
None
|
|
49
|
+
"""
|
|
50
|
+
self._get_env_config()
|
|
51
|
+
|
|
52
|
+
def get_boto3_client_config(self, origin: str) -> dict:
|
|
53
|
+
"""
|
|
54
|
+
Get S3 credentials (access key, secret key,
|
|
55
|
+
session token and other config).
|
|
56
|
+
|
|
57
|
+
Parameters
|
|
58
|
+
----------
|
|
59
|
+
origin : str
|
|
60
|
+
The origin of the credentials.
|
|
61
|
+
|
|
62
|
+
Returns
|
|
63
|
+
-------
|
|
64
|
+
dict
|
|
65
|
+
The credentials.
|
|
66
|
+
"""
|
|
67
|
+
if origin == CredsOrigin.ENV.value:
|
|
68
|
+
creds = self._get_env_config()
|
|
69
|
+
elif origin == CredsOrigin.FILE.value:
|
|
70
|
+
creds = self._get_file_config()
|
|
71
|
+
else:
|
|
72
|
+
raise StoreError(f"Unknown origin: {origin}")
|
|
73
|
+
return {
|
|
74
|
+
"endpoint_url": creds[S3StoreEnv.ENDPOINT_URL.value],
|
|
75
|
+
"aws_access_key_id": creds[S3StoreEnv.ACCESS_KEY_ID.value],
|
|
76
|
+
"aws_secret_access_key": creds[S3StoreEnv.SECRET_ACCESS_KEY.value],
|
|
77
|
+
"aws_session_token": creds[S3StoreEnv.SESSION_TOKEN.value],
|
|
78
|
+
"config": Config(
|
|
79
|
+
region_name=creds[S3StoreEnv.REGION.value],
|
|
80
|
+
signature_version=creds[S3StoreEnv.SIGNATURE_VERSION.value],
|
|
81
|
+
),
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
def _get_env_config(self) -> dict:
|
|
85
|
+
"""
|
|
86
|
+
Get the store configuration from environment variables.
|
|
87
|
+
|
|
88
|
+
Returns
|
|
89
|
+
-------
|
|
90
|
+
dict
|
|
91
|
+
The credentials.
|
|
92
|
+
"""
|
|
93
|
+
credentials = {
|
|
94
|
+
var.value: configurator.load_from_env(var.value) for var in self.required_vars + self.optional_vars
|
|
95
|
+
}
|
|
96
|
+
self._set_credentials(credentials)
|
|
97
|
+
return credentials
|
|
98
|
+
|
|
99
|
+
def _get_file_config(self) -> dict:
|
|
100
|
+
"""
|
|
101
|
+
Get the store configuration from file.
|
|
102
|
+
|
|
103
|
+
Returns
|
|
104
|
+
-------
|
|
105
|
+
dict
|
|
106
|
+
The credentials.
|
|
107
|
+
"""
|
|
108
|
+
credentials = {
|
|
109
|
+
var.value: configurator.load_from_file(var.value) for var in self.required_vars + self.optional_vars
|
|
110
|
+
}
|
|
111
|
+
self._set_credentials(credentials)
|
|
112
|
+
return credentials
|
|
113
|
+
|
|
114
|
+
def _check_credentials(self, credentials: dict) -> None:
|
|
115
|
+
"""
|
|
116
|
+
Check for missing credentials.
|
|
117
|
+
|
|
118
|
+
Parameters
|
|
119
|
+
----------
|
|
120
|
+
credentials : dict
|
|
121
|
+
The credentials.
|
|
122
|
+
|
|
123
|
+
Returns
|
|
124
|
+
-------
|
|
125
|
+
None
|
|
126
|
+
"""
|
|
127
|
+
missing_vars = [key for key, value in credentials.items() if value is None and key in self.required_vars]
|
|
128
|
+
if missing_vars:
|
|
129
|
+
raise StoreError(f"Missing credentials for S3 store: {', '.join(missing_vars)}")
|
|
130
|
+
|
|
131
|
+
def _set_credentials(self, credentials: dict) -> None:
|
|
132
|
+
"""
|
|
133
|
+
Set the store credentials into the configurator.
|
|
134
|
+
|
|
135
|
+
Parameters
|
|
136
|
+
----------
|
|
137
|
+
credentials : dict
|
|
138
|
+
The credentials.
|
|
139
|
+
|
|
140
|
+
Returns
|
|
141
|
+
-------
|
|
142
|
+
None
|
|
143
|
+
"""
|
|
144
|
+
# Set credentials
|
|
145
|
+
for key, value in credentials.items():
|
|
146
|
+
configurator.set_credential(key, value)
|
|
@@ -10,10 +10,11 @@ import boto3
|
|
|
10
10
|
import botocore.client # pylint: disable=unused-import
|
|
11
11
|
from botocore.exceptions import ClientError
|
|
12
12
|
|
|
13
|
-
from digitalhub.
|
|
14
|
-
from digitalhub.stores._base.store import Store
|
|
15
|
-
from digitalhub.stores.s3.configurator import S3StoreConfigurator
|
|
16
|
-
from digitalhub.stores.s3.utils import get_bucket_name
|
|
13
|
+
from digitalhub.stores.configurator.enums import CredsOrigin
|
|
14
|
+
from digitalhub.stores.data._base.store import Store
|
|
15
|
+
from digitalhub.stores.data.s3.configurator import S3StoreConfigurator
|
|
16
|
+
from digitalhub.stores.data.s3.utils import get_bucket_name
|
|
17
|
+
from digitalhub.stores.readers.data.api import get_reader_by_object
|
|
17
18
|
from digitalhub.utils.exceptions import StoreError
|
|
18
19
|
from digitalhub.utils.file_utils import get_file_info_from_s3, get_file_mime_type
|
|
19
20
|
from digitalhub.utils.types import SourcesOrListOfSources
|
|
@@ -591,16 +592,20 @@ class S3Store(Store):
|
|
|
591
592
|
"""
|
|
592
593
|
return get_bucket_name(root)
|
|
593
594
|
|
|
594
|
-
def _get_client(self) -> S3Client:
|
|
595
|
+
def _get_client(self, cfg: dict) -> S3Client:
|
|
595
596
|
"""
|
|
596
597
|
Get an S3 client object.
|
|
597
598
|
|
|
599
|
+
Parameters
|
|
600
|
+
----------
|
|
601
|
+
cfg : dict
|
|
602
|
+
The configuration of the S3 client.
|
|
603
|
+
|
|
598
604
|
Returns
|
|
599
605
|
-------
|
|
600
606
|
S3Client
|
|
601
607
|
Returns a client object that interacts with the S3 storage service.
|
|
602
608
|
"""
|
|
603
|
-
cfg = self._configurator.get_boto3_client_config()
|
|
604
609
|
return boto3.client("s3", **cfg)
|
|
605
610
|
|
|
606
611
|
def _check_factory(self, root: str) -> tuple[S3Client, str]:
|
|
@@ -612,9 +617,20 @@ class S3Store(Store):
|
|
|
612
617
|
tuple[S3Client, str]
|
|
613
618
|
A tuple containing the S3 client object and the name of the S3 bucket.
|
|
614
619
|
"""
|
|
615
|
-
client = self._get_client()
|
|
616
620
|
bucket = self._get_bucket(root)
|
|
617
|
-
|
|
621
|
+
|
|
622
|
+
# Try to get client from environment variables
|
|
623
|
+
try:
|
|
624
|
+
cfg = self._configurator.get_boto3_client_config(CredsOrigin.ENV.value)
|
|
625
|
+
client = self._get_client(cfg)
|
|
626
|
+
self._check_access_to_storage(client, bucket)
|
|
627
|
+
|
|
628
|
+
# Fallback to file
|
|
629
|
+
except StoreError:
|
|
630
|
+
cfg = self._configurator.get_boto3_client_config(CredsOrigin.FILE.value)
|
|
631
|
+
client = self._get_client(cfg)
|
|
632
|
+
self._check_access_to_storage(client, bucket)
|
|
633
|
+
|
|
618
634
|
return client, bucket
|
|
619
635
|
|
|
620
636
|
def _check_access_to_storage(self, client: S3Client, bucket: str) -> None:
|
|
@@ -639,8 +655,8 @@ class S3Store(Store):
|
|
|
639
655
|
"""
|
|
640
656
|
try:
|
|
641
657
|
client.head_bucket(Bucket=bucket)
|
|
642
|
-
except ClientError
|
|
643
|
-
raise
|
|
658
|
+
except ClientError:
|
|
659
|
+
raise StoreError("No access to s3 bucket!")
|
|
644
660
|
|
|
645
661
|
@staticmethod
|
|
646
662
|
def _get_key(path: str) -> str:
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from digitalhub.stores.configurator.configurator import configurator
|
|
4
|
+
from digitalhub.stores.configurator.enums import CredsOrigin
|
|
5
|
+
from digitalhub.stores.data.sql.enums import SqlStoreEnv
|
|
6
|
+
from digitalhub.utils.exceptions import StoreError
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class SqlStoreConfigurator:
|
|
10
|
+
"""
|
|
11
|
+
Configure the store by getting the credentials from user
|
|
12
|
+
provided config or from environment.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
variables = [SqlStoreEnv.USERNAME, SqlStoreEnv.PASSWORD, SqlStoreEnv.HOST, SqlStoreEnv.PORT, SqlStoreEnv.DATABASE]
|
|
16
|
+
|
|
17
|
+
def __init__(self, config: dict | None = None) -> None:
|
|
18
|
+
self.configure(config)
|
|
19
|
+
|
|
20
|
+
##############################
|
|
21
|
+
# Configuration methods
|
|
22
|
+
##############################
|
|
23
|
+
|
|
24
|
+
def configure(self, config: dict | None = None) -> None:
|
|
25
|
+
"""
|
|
26
|
+
Configure the store by getting the credentials from user
|
|
27
|
+
provided config or from environment.
|
|
28
|
+
|
|
29
|
+
Parameters
|
|
30
|
+
----------
|
|
31
|
+
config : dict
|
|
32
|
+
Configuration dictionary.
|
|
33
|
+
|
|
34
|
+
Returns
|
|
35
|
+
-------
|
|
36
|
+
None
|
|
37
|
+
"""
|
|
38
|
+
self._get_env_config()
|
|
39
|
+
|
|
40
|
+
def get_sql_conn_string(self, origin: str) -> str:
|
|
41
|
+
"""
|
|
42
|
+
Get the connection string from environment variables.
|
|
43
|
+
|
|
44
|
+
Parameters
|
|
45
|
+
----------
|
|
46
|
+
origin : str
|
|
47
|
+
The origin of the credentials.
|
|
48
|
+
|
|
49
|
+
Returns
|
|
50
|
+
-------
|
|
51
|
+
str
|
|
52
|
+
The connection string.
|
|
53
|
+
"""
|
|
54
|
+
if origin == CredsOrigin.ENV.value:
|
|
55
|
+
creds = self._get_env_config()
|
|
56
|
+
elif origin == CredsOrigin.FILE.value:
|
|
57
|
+
creds = self._get_file_config()
|
|
58
|
+
else:
|
|
59
|
+
raise StoreError(f"Unknown origin: {origin}")
|
|
60
|
+
|
|
61
|
+
user = creds[SqlStoreEnv.USERNAME.value]
|
|
62
|
+
password = creds[SqlStoreEnv.PASSWORD.value]
|
|
63
|
+
host = creds[SqlStoreEnv.HOST.value]
|
|
64
|
+
port = creds[SqlStoreEnv.PORT.value]
|
|
65
|
+
database = creds[SqlStoreEnv.DATABASE.value]
|
|
66
|
+
return f"postgresql://{user}:{password}@{host}:{port}/{database}"
|
|
67
|
+
|
|
68
|
+
def _get_env_config(self) -> dict:
|
|
69
|
+
"""
|
|
70
|
+
Get the store configuration from environment variables.
|
|
71
|
+
|
|
72
|
+
Returns
|
|
73
|
+
-------
|
|
74
|
+
dict
|
|
75
|
+
The credentials.
|
|
76
|
+
"""
|
|
77
|
+
credentials = {var.value: configurator.load_from_env(var.value) for var in self.variables}
|
|
78
|
+
self._set_credentials(credentials)
|
|
79
|
+
return credentials
|
|
80
|
+
|
|
81
|
+
def _get_file_config(self) -> dict:
|
|
82
|
+
"""
|
|
83
|
+
Get the store configuration from file.
|
|
84
|
+
|
|
85
|
+
Returns
|
|
86
|
+
-------
|
|
87
|
+
dict
|
|
88
|
+
The credentials.
|
|
89
|
+
"""
|
|
90
|
+
credentials = {var.value: configurator.load_from_file(var.value) for var in self.variables}
|
|
91
|
+
self._set_credentials(credentials)
|
|
92
|
+
return credentials
|
|
93
|
+
|
|
94
|
+
def _check_credentials(self, credentials: dict) -> None:
|
|
95
|
+
"""
|
|
96
|
+
Check for missing credentials.
|
|
97
|
+
|
|
98
|
+
Parameters
|
|
99
|
+
----------
|
|
100
|
+
credentials : dict
|
|
101
|
+
The credentials.
|
|
102
|
+
|
|
103
|
+
Returns
|
|
104
|
+
-------
|
|
105
|
+
None
|
|
106
|
+
"""
|
|
107
|
+
missing_vars = [key for key, value in credentials.items() if value is None and key in self.required_vars]
|
|
108
|
+
if missing_vars:
|
|
109
|
+
raise StoreError(f"Missing credentials for SQL store: {', '.join(missing_vars)}")
|
|
110
|
+
|
|
111
|
+
def _set_credentials(self, credentials: dict) -> None:
|
|
112
|
+
"""
|
|
113
|
+
Set the store credentials into the configurator.
|
|
114
|
+
|
|
115
|
+
Parameters
|
|
116
|
+
----------
|
|
117
|
+
credentials : dict
|
|
118
|
+
The credentials.
|
|
119
|
+
|
|
120
|
+
Returns
|
|
121
|
+
-------
|
|
122
|
+
None
|
|
123
|
+
"""
|
|
124
|
+
# Set credentials
|
|
125
|
+
for key, value in credentials.items():
|
|
126
|
+
configurator.set_credential(key, value)
|
|
@@ -10,9 +10,10 @@ from sqlalchemy import MetaData, Table, create_engine, select
|
|
|
10
10
|
from sqlalchemy.engine import Engine
|
|
11
11
|
from sqlalchemy.exc import SQLAlchemyError
|
|
12
12
|
|
|
13
|
-
from digitalhub.
|
|
14
|
-
from digitalhub.stores._base.store import Store
|
|
15
|
-
from digitalhub.stores.sql.configurator import SqlStoreConfigurator
|
|
13
|
+
from digitalhub.stores.configurator.enums import CredsOrigin
|
|
14
|
+
from digitalhub.stores.data._base.store import Store
|
|
15
|
+
from digitalhub.stores.data.sql.configurator import SqlStoreConfigurator
|
|
16
|
+
from digitalhub.stores.readers.data.api import get_reader_by_object
|
|
16
17
|
from digitalhub.utils.exceptions import StoreError
|
|
17
18
|
from digitalhub.utils.types import SourcesOrListOfSources
|
|
18
19
|
|
|
@@ -284,23 +285,30 @@ class SqlStore(Store):
|
|
|
284
285
|
# Helper methods
|
|
285
286
|
##############################
|
|
286
287
|
|
|
287
|
-
def _get_connection_string(self) -> str:
|
|
288
|
+
def _get_connection_string(self, origin: str) -> str:
|
|
288
289
|
"""
|
|
289
290
|
Get the connection string.
|
|
290
291
|
|
|
292
|
+
Parameters
|
|
293
|
+
----------
|
|
294
|
+
origin : str
|
|
295
|
+
The origin of the credentials.
|
|
296
|
+
|
|
291
297
|
Returns
|
|
292
298
|
-------
|
|
293
299
|
str
|
|
294
300
|
The connection string.
|
|
295
301
|
"""
|
|
296
|
-
return self._configurator.get_sql_conn_string()
|
|
302
|
+
return self._configurator.get_sql_conn_string(origin)
|
|
297
303
|
|
|
298
|
-
def _get_engine(self, schema: str | None = None) -> Engine:
|
|
304
|
+
def _get_engine(self, origin: str, schema: str | None = None) -> Engine:
|
|
299
305
|
"""
|
|
300
306
|
Create engine from connection string.
|
|
301
307
|
|
|
302
308
|
Parameters
|
|
303
309
|
----------
|
|
310
|
+
origin : str
|
|
311
|
+
The origin of the credentials.
|
|
304
312
|
schema : str
|
|
305
313
|
The schema.
|
|
306
314
|
|
|
@@ -309,7 +317,7 @@ class SqlStore(Store):
|
|
|
309
317
|
Engine
|
|
310
318
|
An SQLAlchemy engine.
|
|
311
319
|
"""
|
|
312
|
-
connection_string = self._get_connection_string()
|
|
320
|
+
connection_string = self._get_connection_string(origin)
|
|
313
321
|
if not isinstance(connection_string, str):
|
|
314
322
|
raise StoreError("Connection string must be a string.")
|
|
315
323
|
try:
|
|
@@ -334,8 +342,12 @@ class SqlStore(Store):
|
|
|
334
342
|
Engine
|
|
335
343
|
The database engine.
|
|
336
344
|
"""
|
|
337
|
-
|
|
338
|
-
|
|
345
|
+
try:
|
|
346
|
+
engine = self._get_engine(CredsOrigin.ENV.value, schema)
|
|
347
|
+
self._check_access_to_storage(engine)
|
|
348
|
+
except StoreError:
|
|
349
|
+
engine = self._get_engine(CredsOrigin.FILE.value, schema)
|
|
350
|
+
self._check_access_to_storage(engine)
|
|
339
351
|
return engine
|
|
340
352
|
|
|
341
353
|
@staticmethod
|
|
@@ -6,7 +6,7 @@ from abc import abstractmethod
|
|
|
6
6
|
from digitalhub.utils.exceptions import BuilderError
|
|
7
7
|
|
|
8
8
|
if typing.TYPE_CHECKING:
|
|
9
|
-
from digitalhub.readers.data._base.reader import DataframeReader
|
|
9
|
+
from digitalhub.stores.readers.data._base.reader import DataframeReader
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
class ReaderBuilder:
|
|
@@ -3,11 +3,11 @@ from __future__ import annotations
|
|
|
3
3
|
import typing
|
|
4
4
|
from typing import Any
|
|
5
5
|
|
|
6
|
-
from digitalhub.readers.data.factory import factory
|
|
6
|
+
from digitalhub.stores.readers.data.factory import factory
|
|
7
7
|
from digitalhub.utils.exceptions import ReaderError
|
|
8
8
|
|
|
9
9
|
if typing.TYPE_CHECKING:
|
|
10
|
-
from digitalhub.readers.data._base.reader import DataframeReader
|
|
10
|
+
from digitalhub.stores.readers.data._base.reader import DataframeReader
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
def get_reader_by_engine(engine: str | None = None) -> DataframeReader:
|
|
@@ -5,8 +5,8 @@ import typing
|
|
|
5
5
|
from digitalhub.utils.exceptions import BuilderError
|
|
6
6
|
|
|
7
7
|
if typing.TYPE_CHECKING:
|
|
8
|
-
from digitalhub.readers.data._base.builder import ReaderBuilder
|
|
9
|
-
from digitalhub.readers.data._base.reader import DataframeReader
|
|
8
|
+
from digitalhub.stores.readers.data._base.builder import ReaderBuilder
|
|
9
|
+
from digitalhub.stores.readers.data._base.reader import DataframeReader
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
class ReaderFactory:
|
|
@@ -126,7 +126,7 @@ class ReaderFactory:
|
|
|
126
126
|
factory = ReaderFactory()
|
|
127
127
|
|
|
128
128
|
try:
|
|
129
|
-
from digitalhub.readers.data.pandas.builder import ReaderBuilderPandas
|
|
129
|
+
from digitalhub.stores.readers.data.pandas.builder import ReaderBuilderPandas
|
|
130
130
|
|
|
131
131
|
factory.add_builder(
|
|
132
132
|
ReaderBuilderPandas.ENGINE,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from digitalhub.readers.data._base.builder import ReaderBuilder
|
|
4
|
-
from digitalhub.readers.data.pandas.reader import DataframeReaderPandas
|
|
3
|
+
from digitalhub.stores.readers.data._base.builder import ReaderBuilder
|
|
4
|
+
from digitalhub.stores.readers.data.pandas.reader import DataframeReaderPandas
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
class ReaderBuilderPandas(ReaderBuilder):
|
|
@@ -9,7 +9,7 @@ import pandas as pd
|
|
|
9
9
|
from pandas.errors import ParserError
|
|
10
10
|
|
|
11
11
|
from digitalhub.entities.dataitem.table.utils import check_preview_size, finalize_preview, prepare_data, prepare_preview
|
|
12
|
-
from digitalhub.readers.data._base.reader import DataframeReader
|
|
12
|
+
from digitalhub.stores.readers.data._base.reader import DataframeReader
|
|
13
13
|
from digitalhub.utils.enums import FileExtensions
|
|
14
14
|
from digitalhub.utils.exceptions import ReaderError
|
|
15
15
|
from digitalhub.utils.generic_utils import CustomJsonEncoder
|
|
File without changes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: digitalhub
|
|
3
|
-
Version: 0.10.
|
|
3
|
+
Version: 0.10.1
|
|
4
4
|
Summary: Python SDK for Digitalhub
|
|
5
5
|
Project-URL: Homepage, https://github.com/scc-digitalhub/digitalhub-sdk
|
|
6
6
|
Author-email: Fondazione Bruno Kessler <dslab@fbk.eu>, Matteo Martini <mmartini@fbk.eu>
|
|
@@ -226,6 +226,7 @@ Classifier: License :: OSI Approved :: Apache Software License
|
|
|
226
226
|
Classifier: Programming Language :: Python :: 3.9
|
|
227
227
|
Classifier: Programming Language :: Python :: 3.10
|
|
228
228
|
Classifier: Programming Language :: Python :: 3.11
|
|
229
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
229
230
|
Requires-Python: <3.13,>=3.9
|
|
230
231
|
Requires-Dist: boto3
|
|
231
232
|
Requires-Dist: gitpython>=3
|
|
@@ -249,7 +250,6 @@ Requires-Dist: pandas; extra == 'full'
|
|
|
249
250
|
Provides-Extra: mlflow
|
|
250
251
|
Requires-Dist: mlflow; extra == 'mlflow'
|
|
251
252
|
Provides-Extra: pandas
|
|
252
|
-
Requires-Dist: fsspec; extra == 'pandas'
|
|
253
253
|
Requires-Dist: pandas; extra == 'pandas'
|
|
254
254
|
Description-Content-Type: text/markdown
|
|
255
255
|
|