digitalhub 0.10.0b7__py3-none-any.whl → 0.10.2__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 (77) hide show
  1. digitalhub/__init__.py +2 -3
  2. digitalhub/entities/_base/material/entity.py +1 -1
  3. digitalhub/entities/_base/material/utils.py +1 -1
  4. digitalhub/entities/_processors/base.py +2 -2
  5. digitalhub/entities/_processors/utils.py +2 -2
  6. digitalhub/entities/dataitem/table/entity.py +1 -1
  7. digitalhub/entities/dataitem/utils.py +2 -2
  8. digitalhub/entities/model/_base/entity.py +30 -0
  9. digitalhub/entities/project/_base/entity.py +1 -1
  10. digitalhub/entities/run/_base/entity.py +30 -0
  11. digitalhub/{client → stores/client}/_base/client.py +3 -3
  12. digitalhub/{client → stores/client}/api.py +2 -2
  13. digitalhub/{client → stores/client}/builder.py +3 -3
  14. digitalhub/{client → stores/client}/dhcore/api_builder.py +1 -1
  15. digitalhub/{client → stores/client}/dhcore/client.py +6 -6
  16. digitalhub/{client → stores/client}/dhcore/configurator.py +27 -78
  17. digitalhub/{client → stores/client}/dhcore/key_builder.py +1 -1
  18. digitalhub/{client → stores/client}/dhcore/params_builder.py +1 -1
  19. digitalhub/{client → stores/client}/dhcore/utils.py +3 -3
  20. digitalhub/{client → stores/client}/local/api_builder.py +2 -2
  21. digitalhub/{client → stores/client}/local/client.py +5 -5
  22. digitalhub/{client → stores/client}/local/key_builder.py +1 -1
  23. digitalhub/{client → stores/client}/local/params_builder.py +1 -1
  24. digitalhub/{configurator → stores/configurator}/api.py +1 -1
  25. digitalhub/{configurator → stores/configurator}/configurator.py +5 -5
  26. digitalhub/stores/configurator/enums.py +12 -0
  27. digitalhub/{configurator → stores/configurator}/ini_module.py +1 -1
  28. digitalhub/stores/{_base → data/_base}/store.py +2 -2
  29. digitalhub/stores/{api.py → data/api.py} +2 -2
  30. digitalhub/stores/{builder.py → data/builder.py} +6 -6
  31. digitalhub/stores/{local → data/local}/store.py +2 -2
  32. digitalhub/stores/{remote → data/remote}/store.py +1 -1
  33. digitalhub/stores/data/s3/configurator.py +146 -0
  34. digitalhub/stores/{s3 → data/s3}/store.py +26 -10
  35. digitalhub/stores/{s3 → data/s3}/utils.py +1 -1
  36. digitalhub/stores/data/sql/configurator.py +126 -0
  37. digitalhub/stores/{sql → data/sql}/store.py +21 -9
  38. digitalhub/{readers → stores/readers}/data/_base/builder.py +1 -1
  39. digitalhub/{readers → stores/readers}/data/api.py +2 -2
  40. digitalhub/{readers → stores/readers}/data/factory.py +3 -3
  41. digitalhub/{readers → stores/readers}/data/pandas/builder.py +2 -2
  42. digitalhub/{readers → stores/readers}/data/pandas/reader.py +1 -1
  43. digitalhub/stores/readers/query/__init__.py +0 -0
  44. {digitalhub-0.10.0b7.dist-info → digitalhub-0.10.2.dist-info}/METADATA +3 -4
  45. {digitalhub-0.10.0b7.dist-info → digitalhub-0.10.2.dist-info}/RECORD +75 -73
  46. digitalhub/stores/s3/configurator.py +0 -108
  47. digitalhub/stores/sql/configurator.py +0 -88
  48. /digitalhub/{client → stores/client}/__init__.py +0 -0
  49. /digitalhub/{client → stores/client}/_base/__init__.py +0 -0
  50. /digitalhub/{client → stores/client}/_base/api_builder.py +0 -0
  51. /digitalhub/{client → stores/client}/_base/key_builder.py +0 -0
  52. /digitalhub/{client → stores/client}/_base/params_builder.py +0 -0
  53. /digitalhub/{client → stores/client}/dhcore/__init__.py +0 -0
  54. /digitalhub/{client → stores/client}/dhcore/enums.py +0 -0
  55. /digitalhub/{client → stores/client}/dhcore/error_parser.py +0 -0
  56. /digitalhub/{client → stores/client}/dhcore/models.py +0 -0
  57. /digitalhub/{client → stores/client}/local/__init__.py +0 -0
  58. /digitalhub/{client → stores/client}/local/enums.py +0 -0
  59. /digitalhub/{configurator → stores/configurator}/__init__.py +0 -0
  60. /digitalhub/{configurator → stores/configurator}/credentials_store.py +0 -0
  61. /digitalhub/{readers → stores/data}/__init__.py +0 -0
  62. /digitalhub/{readers/data → stores/data/_base}/__init__.py +0 -0
  63. /digitalhub/{readers/data/_base → stores/data/local}/__init__.py +0 -0
  64. /digitalhub/{readers/data/pandas → stores/data/remote}/__init__.py +0 -0
  65. /digitalhub/{readers/query → stores/data/s3}/__init__.py +0 -0
  66. /digitalhub/stores/{s3 → data/s3}/enums.py +0 -0
  67. /digitalhub/stores/{s3 → data/s3}/models.py +0 -0
  68. /digitalhub/stores/{_base → data/sql}/__init__.py +0 -0
  69. /digitalhub/stores/{sql → data/sql}/enums.py +0 -0
  70. /digitalhub/stores/{sql → data/sql}/models.py +0 -0
  71. /digitalhub/stores/{local → readers}/__init__.py +0 -0
  72. /digitalhub/stores/{remote → readers/data}/__init__.py +0 -0
  73. /digitalhub/stores/{s3 → readers/data/_base}/__init__.py +0 -0
  74. /digitalhub/{readers → stores/readers}/data/_base/reader.py +0 -0
  75. /digitalhub/stores/{sql → readers/data/pandas}/__init__.py +0 -0
  76. {digitalhub-0.10.0b7.dist-info → digitalhub-0.10.2.dist-info}/WHEEL +0 -0
  77. {digitalhub-0.10.0b7.dist-info → digitalhub-0.10.2.dist-info}/licenses/LICENSE.txt +0 -0
@@ -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.readers.data.api import get_reader_by_object
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
- self._check_access_to_storage(client, bucket)
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 as e:
643
- raise ClientError("No access to s3 bucket!") from e
658
+ except ClientError:
659
+ raise StoreError("No access to s3 bucket!")
644
660
 
645
661
  @staticmethod
646
662
  def _get_key(path: str) -> str:
@@ -6,7 +6,7 @@ from urllib.parse import urlparse
6
6
 
7
7
  from boto3 import client as boto3_client
8
8
 
9
- from digitalhub.stores.s3.enums import S3StoreEnv
9
+ from digitalhub.stores.data.s3.enums import S3StoreEnv
10
10
 
11
11
  DEFAULT_BUCKET = "datalake"
12
12
 
@@ -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.readers.data.api import get_reader_by_object
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
- engine = self._get_engine(schema)
338
- self._check_access_to_storage(engine)
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.0b7
3
+ Version: 0.10.2
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,14 +226,14 @@ 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
232
- Requires-Dist: numpy<2
233
+ Requires-Dist: numpy
233
234
  Requires-Dist: psycopg2-binary
234
235
  Requires-Dist: pyarrow
235
236
  Requires-Dist: pydantic
236
- Requires-Dist: python-dotenv
237
237
  Requires-Dist: python-slugify
238
238
  Requires-Dist: pyyaml
239
239
  Requires-Dist: requests
@@ -249,7 +249,6 @@ Requires-Dist: pandas; extra == 'full'
249
249
  Provides-Extra: mlflow
250
250
  Requires-Dist: mlflow; extra == 'mlflow'
251
251
  Provides-Extra: pandas
252
- Requires-Dist: fsspec; extra == 'pandas'
253
252
  Requires-Dist: pandas; extra == 'pandas'
254
253
  Description-Content-Type: text/markdown
255
254