sibi-dst 0.3.50__py3-none-any.whl → 0.3.51__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.
@@ -15,6 +15,7 @@ from .credentials import *
15
15
  from .data_wrapper import DataWrapper
16
16
  from .storage_config import StorageConfig
17
17
  from .data_from_http_source import DataFromHttpSource
18
+ from .webdav_client import WebDAVClient
18
19
 
19
20
  __all__ = [
20
21
  "Logger",
@@ -34,5 +35,6 @@ __all__ = [
34
35
  "ClickHouseWriter",
35
36
  "AirflowDAGManager",
36
37
  "StorageConfig",
37
- "DataFromHttpSource"
38
+ "DataFromHttpSource",
39
+ "WebDAVClient"
38
40
  ]
@@ -51,6 +51,9 @@ class DateUtils:
51
51
  continue
52
52
  raise ValueError(f"Unsupported date format: {value}")
53
53
 
54
+ # Public alias to access _ensure_date from other classes
55
+ ensure_date = _ensure_date
56
+
54
57
  @classmethod
55
58
  def calc_week_range(cls, reference_date: Union[str, datetime.date, datetime.datetime, pd.Timestamp]) -> Tuple[
56
59
  datetime.date, datetime.date]:
@@ -367,6 +370,8 @@ class BusinessDays:
367
370
  def calculate_business_days(row, holidays, weekmask):
368
371
  begin_date = pd.to_datetime(row[begin_date_col])
369
372
  end_date = pd.to_datetime(row[end_date_col])
373
+ if pd.isna(begin_date) or pd.isna(end_date):
374
+ return np.nan
370
375
  busdaycal = np.busdaycalendar(holidays=holidays, weekmask=weekmask)
371
376
  return np.busday_count(
372
377
  begin_date.strftime("%Y-%m-%d"),
@@ -2,19 +2,23 @@ from .storage_manager import StorageManager
2
2
  from .credentials import ConfigManager
3
3
 
4
4
  class StorageConfig:
5
- def __init__(self, config:ConfigManager, depots:dict):
5
+ def __init__(self, config:ConfigManager, depots:dict=None):
6
6
  self.conf = config
7
7
  self.depots = depots
8
8
  self._initialize_storage()
9
9
  self.storage_manager = StorageManager(self.base_storage, self.filesystem_type, self.filesystem_options)
10
- self.depot_paths, self.depot_names = self.storage_manager.rebuild_depot_paths(depots)
10
+ if self.depots is not None:
11
+ self.depot_paths, self.depot_names = self.storage_manager.rebuild_depot_paths(depots)
12
+ else:
13
+ self.depot_paths = None
14
+ self.depot_names = None
11
15
 
12
16
  def _initialize_storage(self):
13
17
  self.filesystem_type = self.conf.get('fs_type','file')
14
18
  self.base_storage = self.conf.get('fs_path', "local_storage/")
15
19
  if self.filesystem_type == "file":
16
20
  self.filesystem_options ={}
17
- else:
21
+ elif self.filesystem_type == "s3":
18
22
  self.filesystem_options = {
19
23
  "key": self.conf.get('fs_key',''),
20
24
  "secret": self.conf.get('fs_secret'),
@@ -25,4 +29,21 @@ class StorageConfig:
25
29
  "endpoint_url": self.conf.get('fs_endpoint')
26
30
  }
27
31
  }
28
- self.filesystem_options = {k: v for k, v in self.filesystem_options.items() if v}
32
+ elif self.filesystem_type == "webdav":
33
+ verify_ssl = self.conf.get('fs_verify_ssl', True)
34
+ # Convert string 'false' to boolean False
35
+ if isinstance(verify_ssl, str) and verify_ssl.lower() == 'false':
36
+ verify_ssl = False
37
+ self.filesystem_options = {
38
+ "base_url": self.conf.get('fs_endpoint', ''),
39
+ "username": self.conf.get('fs_key', ''),
40
+ "password": self.conf.get('fs_secret', ''),
41
+ "token": self.conf.get('fs_token', ''),
42
+ "verify": verify_ssl
43
+ }
44
+ else:
45
+ # unsupported filesystem type
46
+ # defaulting to local filesystem
47
+ self.filesystem_type = 'file'
48
+ self.filesystem_options = {}
49
+ self.filesystem_options = {k: v for k, v in self.filesystem_options.items() if v}
@@ -1,7 +1,7 @@
1
1
  from types import SimpleNamespace
2
2
 
3
3
  import fsspec
4
-
4
+ from .webdav_client import WebDAVClient
5
5
 
6
6
  class StorageManager:
7
7
  def __init__(self, storage_path, fs_type="file", fs_options=None, debug=False):
@@ -16,11 +16,37 @@ class StorageManager:
16
16
  self.storage_path = storage_path.rstrip("/")
17
17
  self.fs_type = fs_type
18
18
  self.fs_options = fs_options or {}
19
-
20
- self.fs = fsspec.filesystem(fs_type, **self.fs_options)
19
+ if fs_type == "webdav":
20
+ self._initialize_webdav()
21
+ else:
22
+ self.fs = fsspec.filesystem(fs_type, **self.fs_options)
21
23
  self.depot_paths = {}
22
24
  self.depot_name = None
23
25
 
26
+ def _initialize_webdav(self):
27
+ """
28
+ Initialize WebDAV filesystem using the WebDAVClient.
29
+ """
30
+ base_url = self.fs_options.get("base_url", "")
31
+ username = self.fs_options.get("username", "")
32
+ password = self.fs_options.get("password", "")
33
+ token = self.fs_options.get("token", "")
34
+ # Convert string 'false' to boolean False
35
+ verify = self.fs_options.get("verify", True)
36
+ if isinstance(verify, str) and verify.lower() == 'false':
37
+ verify = False
38
+
39
+ # Create WebDAV client
40
+ self.webdav_client = WebDAVClient(
41
+ base_url=base_url,
42
+ username=username,
43
+ password=password,
44
+ token=token,
45
+ verify=verify
46
+ )
47
+
48
+ # Use the fsspec-compatible filesystem
49
+ self.fs = self.webdav_client.get_fs()
24
50
  @staticmethod
25
51
  def join_paths(*parts):
26
52
  """
@@ -101,4 +127,38 @@ class StorageManager:
101
127
  print("Rebuild complete.")
102
128
 
103
129
  def get_fs_instance(self):
104
- return fsspec.filesystem(self.fs_type, **self.fs_options)
130
+ """
131
+ Returns the filesystem instance.
132
+ """
133
+ if self.fs_type == "webdav":
134
+ return self.fs
135
+ else:
136
+ return fsspec.filesystem(self.fs_type, **self.fs_options)
137
+
138
+ def upload_file(self, local_path, remote_path):
139
+ """
140
+ Upload a file to the storage.
141
+
142
+ :param local_path: Local file path
143
+ :param remote_path: Remote file path
144
+ """
145
+ if self.fs_type == "webdav":
146
+ # Use the WebDAV client's upload method for WebDAV
147
+ self.webdav_client.upload_file(local_path, remote_path)
148
+ else:
149
+ # Use fsspec's put method for other filesystems
150
+ self.fs.put(local_path, remote_path)
151
+
152
+ def download_file(self, remote_path, local_path):
153
+ """
154
+ Download a file from the storage.
155
+
156
+ :param remote_path: Remote file path
157
+ :param local_path: Local file path
158
+ """
159
+ if self.fs_type == "webdav":
160
+ # Use the WebDAV client's download method for WebDAV
161
+ self.webdav_client.download_file(remote_path, local_path)
162
+ else:
163
+ # Use fsspec's get method for other filesystems
164
+ self.fs.get(remote_path, local_path)
@@ -0,0 +1,220 @@
1
+ """
2
+ WebDAV client implementation for storage manager.
3
+ """
4
+ from webdav4.client import Client, ResourceNotFound
5
+ from webdav4.fsspec import WebdavFileSystem
6
+
7
+
8
+ class WebDAVClient:
9
+ """
10
+ WebDAV client wrapper for interacting with WebDAV servers like NextCloud.
11
+ """
12
+
13
+ def __init__(self, base_url, username=None, password=None, token=None, verify=True):
14
+ """
15
+ Initialize the WebDAV client.
16
+
17
+ :param base_url: Base URL of the WebDAV server (e.g., "https://nextcloud.example.com/remote.php/dav/files/username/")
18
+ :param username: Username for authentication
19
+ :param password: Password for authentication
20
+ :param token: Authentication token (alternative to username/password)
21
+ :param verify: Whether to verify SSL certificates
22
+ """
23
+ self.base_url = base_url
24
+ self.username = username
25
+ self.password = password
26
+ self.token = token
27
+ # Set up verification
28
+ if isinstance(verify, str) and verify.lower() == 'false':
29
+ self.verify = False
30
+ else:
31
+ self.verify = verify
32
+
33
+ # Set up authentication
34
+ if token:
35
+ self.auth = token
36
+ elif username and password:
37
+ self.auth = (username, password)
38
+ else:
39
+ self.auth = None
40
+
41
+ # Initialize the client
42
+ self.client = Client(
43
+ base_url,
44
+ auth=self.auth,
45
+ verify=self.verify
46
+ )
47
+
48
+ # Initialize the fsspec filesystem
49
+ self.fs = WebdavFileSystem(
50
+ base_url,
51
+ auth=self.auth,
52
+ verify=self.verify
53
+ )
54
+
55
+ def exists(self, path):
56
+ """
57
+ Check if a path exists on the WebDAV server.
58
+
59
+ :param path: Path to check
60
+ :return: True if exists, False otherwise
61
+ """
62
+ try:
63
+ return self.client.exists(path)
64
+ except Exception:
65
+ return False
66
+
67
+ def list_directory(self, path="", detail=False):
68
+ """
69
+ List contents of a directory.
70
+
71
+ :param path: Directory path to list
72
+ :param detail: Whether to return detailed information
73
+ :return: List of files/directories or detailed information
74
+ """
75
+ try:
76
+ return self.client.ls(path, detail=detail)
77
+ except ResourceNotFound:
78
+ # Return empty list if directory doesn't exist
79
+ return [] if not detail else {}
80
+
81
+ def ensure_directory_exists(self, path):
82
+ """
83
+ Ensure a directory exists, creating parent directories if needed.
84
+
85
+ :param path: Directory path to ensure exists
86
+ """
87
+ if not path or path == "/" or path == ".":
88
+ return
89
+
90
+ # Check if the directory already exists
91
+ if self.exists(path):
92
+ return
93
+
94
+ # Split the path into components
95
+ parts = path.strip('/').split('/')
96
+ current_path = ""
97
+
98
+ # Create each directory in the path if it doesn't exist
99
+ for part in parts:
100
+ if not part:
101
+ continue
102
+
103
+ current_path = f"{current_path}/{part}" if current_path else part
104
+
105
+ if not self.exists(current_path):
106
+ try:
107
+ self.client.mkdir(current_path)
108
+ except ResourceNotFound:
109
+ # If parent directory doesn't exist, create it first
110
+ parent_path = '/'.join(current_path.split('/')[:-1])
111
+ self.ensure_directory_exists(parent_path)
112
+ # Then try to create the directory again
113
+ self.client.mkdir(current_path)
114
+ except Exception as e:
115
+ # If directory already exists or other error, log and continue
116
+ if self.exists(current_path):
117
+ pass # Directory exists, which is fine
118
+ else:
119
+ raise e # Re-raise if it's a different error
120
+
121
+ def create_directory(self, path):
122
+ """
123
+ Create a directory on the WebDAV server.
124
+
125
+ :param path: Directory path to create
126
+ """
127
+ self.ensure_directory_exists(path)
128
+
129
+ def upload_file(self, local_path, remote_path):
130
+ """
131
+ Upload a file to the WebDAV server.
132
+
133
+ :param local_path: Local file path
134
+ :param remote_path: Remote file path
135
+ """
136
+ # Ensure parent directory exists
137
+ parent_dir = '/'.join(remote_path.split('/')[:-1])
138
+ if parent_dir:
139
+ self.ensure_directory_exists(parent_dir)
140
+
141
+ # Upload the file
142
+ self.client.upload_file(local_path, remote_path)
143
+
144
+ def download_file(self, remote_path, local_path):
145
+ """
146
+ Download a file from the WebDAV server.
147
+
148
+ :param remote_path: Remote file path
149
+ :param local_path: Local file path
150
+ """
151
+ self.client.download_file(remote_path, local_path)
152
+
153
+ def delete(self, path, recursive=False):
154
+ """
155
+ Delete a file or directory on the WebDAV server.
156
+
157
+ :param path: Path to delete
158
+ :param recursive: Whether to delete recursively (for directories)
159
+ """
160
+ try:
161
+ self.client.remove(path, recursive=recursive)
162
+ except ResourceNotFound:
163
+ # If the resource doesn't exist, that's fine - it's already gone
164
+ pass
165
+ except Exception as e:
166
+ # Re-raise other exceptions
167
+ raise e
168
+
169
+ def get_fs(self):
170
+ """
171
+ Get the fsspec filesystem instance.
172
+
173
+ :return: WebdavFileSystem instance
174
+ """
175
+ return self.fs
176
+
177
+ # Add fsspec-compatible method aliases
178
+ def mkdir(self, path, create_parents=True):
179
+ """
180
+ Create a directory (fsspec-compatible method).
181
+
182
+ :param path: Directory path to create
183
+ :param create_parents: Whether to create parent directories
184
+ """
185
+ if create_parents:
186
+ self.ensure_directory_exists(path)
187
+ else:
188
+ try:
189
+ self.client.mkdir(path)
190
+ except ResourceNotFound:
191
+ # If parent directory doesn't exist and create_parents is False, raise error
192
+ raise
193
+
194
+ def ls(self, path="", detail=False):
195
+ """
196
+ List contents of a directory (fsspec-compatible method).
197
+
198
+ :param path: Directory path to list
199
+ :param detail: Whether to return detailed information
200
+ :return: List of files/directories or detailed information
201
+ """
202
+ return self.list_directory(path, detail=detail)
203
+
204
+ def rm(self, path, recursive=False):
205
+ """
206
+ Delete a file or directory (fsspec-compatible method).
207
+
208
+ :param path: Path to delete
209
+ :param recursive: Whether to delete recursively (for directories)
210
+ """
211
+ self.delete(path, recursive=recursive)
212
+
213
+ def makedirs(self, path, exist_ok=True):
214
+ """
215
+ Create a directory and all parent directories (fsspec-compatible method).
216
+
217
+ :param path: Directory path to create
218
+ :param exist_ok: Whether it's okay if the directory already exists
219
+ """
220
+ self.ensure_directory_exists(path)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sibi-dst
3
- Version: 0.3.50
3
+ Version: 0.3.51
4
4
  Summary: Data Science Toolkit
5
5
  Author: Luis Valverde
6
6
  Author-email: lvalverdeb@gmail.com
@@ -9,43 +9,48 @@ Classifier: Programming Language :: Python :: 3
9
9
  Classifier: Programming Language :: Python :: 3.11
10
10
  Classifier: Programming Language :: Python :: 3.12
11
11
  Classifier: Programming Language :: Python :: 3.13
12
+ Provides-Extra: basic
12
13
  Provides-Extra: complete
14
+ Provides-Extra: df-helper
15
+ Provides-Extra: geopy-helper
16
+ Provides-Extra: osmnx-helper
13
17
  Requires-Dist: apache-airflow-client (>=2.10.0,<3.0.0)
14
18
  Requires-Dist: chardet (>=5.2.0,<6.0.0)
15
19
  Requires-Dist: charset-normalizer (>=3.4.0,<4.0.0)
16
20
  Requires-Dist: clickhouse-connect (>=0.8.7,<0.9.0)
17
21
  Requires-Dist: clickhouse-driver (>=0.2.9,<0.3.0)
18
22
  Requires-Dist: dask[complete] (>=2025.3.0,<2026.0.0)
19
- Requires-Dist: django (>=5.1.4,<6.0.0) ; extra == "complete"
20
- Requires-Dist: djangorestframework (>=3.15.2,<4.0.0) ; extra == "complete"
21
- Requires-Dist: folium (>=0.19.4,<0.20.0)
22
- Requires-Dist: geopandas (>=1.0.1,<2.0.0)
23
- Requires-Dist: geopy (>=2.4.1,<3.0.0)
23
+ Requires-Dist: django (>=5.1.4,<6.0.0) ; extra == "df-helper"
24
+ Requires-Dist: djangorestframework (>=3.15.2,<4.0.0) ; extra == "df-helper"
25
+ Requires-Dist: folium (>=0.19.4,<0.20.0) ; extra == "osmnx-helper"
26
+ Requires-Dist: geopandas (>=1.0.1,<2.0.0) ; extra == "osmnx-helper"
27
+ Requires-Dist: geopy (>=2.4.1,<3.0.0) ; extra == "geopy-helper"
24
28
  Requires-Dist: gunicorn (>=23.0.0,<24.0.0)
25
29
  Requires-Dist: httpx (>=0.27.2,<0.28.0)
26
30
  Requires-Dist: ipython (>=8.29.0,<9.0.0)
27
31
  Requires-Dist: jinja2 (>=3.1.4,<4.0.0)
28
- Requires-Dist: mysqlclient (>=2.2.6,<3.0.0)
32
+ Requires-Dist: mysqlclient (>=2.2.6,<3.0.0) ; extra == "df-helper"
29
33
  Requires-Dist: nltk (>=3.9.1,<4.0.0)
30
34
  Requires-Dist: openpyxl (>=3.1.5,<4.0.0)
31
- Requires-Dist: osmnx (>=2.0.1,<3.0.0)
35
+ Requires-Dist: osmnx (>=2.0.1,<3.0.0) ; extra == "osmnx-helper"
32
36
  Requires-Dist: pandas (>=2.2.3,<3.0.0)
33
37
  Requires-Dist: paramiko (>=3.5.0,<4.0.0)
34
38
  Requires-Dist: psutil (>=6.1.0,<7.0.0)
35
- Requires-Dist: psycopg2 (>=2.9.10,<3.0.0)
39
+ Requires-Dist: psycopg2 (>=2.9.10,<3.0.0) ; extra == "df-helper"
36
40
  Requires-Dist: pyarrow (>=18.0.0,<19.0.0)
37
41
  Requires-Dist: pydantic (>=2.9.2,<3.0.0)
38
- Requires-Dist: pymysql (>=1.1.1,<2.0.0)
42
+ Requires-Dist: pymysql (>=1.1.1,<2.0.0) ; extra == "df-helper"
39
43
  Requires-Dist: pytest (>=8.3.3,<9.0.0)
40
44
  Requires-Dist: pytest-mock (>=3.14.0,<4.0.0)
41
45
  Requires-Dist: python-dotenv (>=1.0.1,<2.0.0)
42
46
  Requires-Dist: s3fs (>=2024.12.0,<2025.0.0)
43
- Requires-Dist: sqlalchemy (>=2.0.36,<3.0.0)
44
- Requires-Dist: sqlmodel (>=0.0.22,<0.0.23)
47
+ Requires-Dist: sqlalchemy (>=2.0.36,<3.0.0) ; extra == "df-helper"
48
+ Requires-Dist: sqlmodel (>=0.0.22,<0.0.23) ; extra == "df-helper"
45
49
  Requires-Dist: tornado (>=6.4.1,<7.0.0)
46
50
  Requires-Dist: tqdm (>=4.67.0,<5.0.0)
47
51
  Requires-Dist: uvicorn (>=0.34.0,<0.35.0)
48
52
  Requires-Dist: uvicorn-worker (>=0.3.0,<0.4.0)
53
+ Requires-Dist: webdav4[fsspec] (>=0.10.0,<0.11.0)
49
54
  Description-Content-Type: text/markdown
50
55
 
51
56
  # sibi-dst
@@ -38,22 +38,23 @@ sibi_dst/osmnx_helper/basemaps/router_plotter.py,sha256=UAiijn-J-jjX4YnL0_P9SFqT
38
38
  sibi_dst/osmnx_helper/utils.py,sha256=BzuY8CtYnBAAO8UAr_M7EOk6CP1zcifNLs8pkdFZEFg,20577
39
39
  sibi_dst/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
40
40
  sibi_dst/tests/test_data_wrapper_class.py,sha256=6uFmZR2DxnxQz49L5jT2ehlKvlLnpUHMLFB_PqqUq7k,3336
41
- sibi_dst/utils/__init__.py,sha256=ecBkVoWRqzljPRpmufl0FFWqTJNsVa56e4ahgKwRojM,1017
41
+ sibi_dst/utils/__init__.py,sha256=_4kuTzjCfbRF9927ywXqi-JKoHNec8wf05LYh4DMbPI,1077
42
42
  sibi_dst/utils/airflow_manager.py,sha256=-d44EKUZNYJyp4wuNwRvilRQktunArPOB5fZuWdQv10,7526
43
43
  sibi_dst/utils/clickhouse_writer.py,sha256=iAUe4_Kn2WR1xZjpLW2FOWCWfOTw6fCGMTUcWxIQJ60,9877
44
44
  sibi_dst/utils/credentials.py,sha256=cHJPPsmVyijqbUQIq7WWPe-lIallA-mI5RAy3YUuRME,1724
45
45
  sibi_dst/utils/data_from_http_source.py,sha256=AcpKNsqTgN2ClNwuhgUpuNCx62r5_DdsAiKY8vcHEBA,1867
46
46
  sibi_dst/utils/data_utils.py,sha256=MqbwXk33BuANWeKKmsabHouhb8GZswSmbM-VetWWE-M,10357
47
47
  sibi_dst/utils/data_wrapper.py,sha256=pIIQxeHknUeQd0YbISkAhL-xYBK4OdijoATBY-oBznw,12114
48
- sibi_dst/utils/date_utils.py,sha256=7cqgC6WEcfkh6BKTgq-kyig4H9rf_0VzpySPYElSo_0,18359
48
+ sibi_dst/utils/date_utils.py,sha256=OCJqkWl5e8fE7z11Ufz4206DUeuLMd_Gf_JGZu914Pg,18539
49
49
  sibi_dst/utils/df_utils.py,sha256=TzIAUCLbgOn3bvCFvzkc1S9YU-OlZTImdCj-88dtg8g,11401
50
50
  sibi_dst/utils/file_utils.py,sha256=Z99CZ_4nPDIaZqbCfzzUDfAYJjSudWDj-mwEO8grhbc,1253
51
51
  sibi_dst/utils/filepath_generator.py,sha256=-HHO0U-PR8fysDDFwnWdHRlgqksh_RkmgBZLWv9hM7s,6669
52
52
  sibi_dst/utils/log_utils.py,sha256=eSAbi_jmMpJ8RpycakzT4S4zNkqVZDj3FY8WwnxpdXc,4623
53
53
  sibi_dst/utils/parquet_saver.py,sha256=Tucxv9jRX66VuLQZn0dPQBN7JOttBou6SF8FxqufeGE,8169
54
54
  sibi_dst/utils/phone_formatter.py,sha256=tsVTDamuthFYgy4-5UwmQkPQ-FGTGH7MjZyH8utAkIY,4945
55
- sibi_dst/utils/storage_config.py,sha256=ugM70OHo63dN7LPukl0FZTWwXKBuoCILFh3RdNEeMgY,1239
56
- sibi_dst/utils/storage_manager.py,sha256=H_itUFJv9nP0BfXYYQDsw4RzB0YWfgVOAHNWAiMpZ_w,4443
55
+ sibi_dst/utils/storage_config.py,sha256=Cg8EOGLZ_5v9sunaQHZLYHdp5FDkgPrCVVNHF-ys5sQ,2181
56
+ sibi_dst/utils/storage_manager.py,sha256=btecX7ggNb7rfu5EK9Xuu2q_FZA7r_rB_tfhQ8V96qc,6567
57
+ sibi_dst/utils/webdav_client.py,sha256=pYF1UsGOuxYeGLq7aBfwZFvkvD4meOcbbaiZ4d6GW9I,7107
57
58
  sibi_dst/v2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
58
59
  sibi_dst/v2/df_helper/__init__.py,sha256=XuH6jKYAPg2DdRbsxxBSxp9X3x-ARyaT0xe27uILrVo,99
59
60
  sibi_dst/v2/df_helper/_df_helper.py,sha256=9pED3bjQ2Z81zqzJrZ9e7SguoO4-hBmNTJK4WOKrr4M,9297
@@ -74,6 +75,6 @@ sibi_dst/v2/df_helper/core/_params_config.py,sha256=DYx2drDz3uF-lSPzizPkchhy-kxR
74
75
  sibi_dst/v2/df_helper/core/_query_config.py,sha256=Y8LVSyaKuVkrPluRDkQoOwuXHQxner1pFWG3HPfnDHM,441
75
76
  sibi_dst/v2/utils/__init__.py,sha256=6H4cvhqTiFufnFPETBF0f8beVVMpfJfvUs6Ne0TQZNY,58
76
77
  sibi_dst/v2/utils/log_utils.py,sha256=rfk5VsLAt-FKpv6aPTC1FToIPiyrnHAFFBAkHme24po,4123
77
- sibi_dst-0.3.50.dist-info/METADATA,sha256=_dUt_ZYu2Qu7ps0JDtbRTsBWw-eVLY6aeUD8ilDs12A,6613
78
- sibi_dst-0.3.50.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
79
- sibi_dst-0.3.50.dist-info/RECORD,,
78
+ sibi_dst-0.3.51.dist-info/METADATA,sha256=kZ7AciJEK6jQFJRhT-GNC3s11a2tzWAnVCx0WTHVogI,6990
79
+ sibi_dst-0.3.51.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
80
+ sibi_dst-0.3.51.dist-info/RECORD,,