sibi-dst 2025.1.13__py3-none-any.whl → 2025.8.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.
Files changed (37) hide show
  1. sibi_dst/__init__.py +7 -1
  2. sibi_dst/df_helper/__init__.py +3 -2
  3. sibi_dst/df_helper/_artifact_updater_async.py +238 -0
  4. sibi_dst/df_helper/_artifact_updater_threaded.py +195 -0
  5. sibi_dst/df_helper/_df_helper.py +418 -118
  6. sibi_dst/df_helper/_parquet_artifact.py +275 -283
  7. sibi_dst/df_helper/_parquet_reader.py +9 -10
  8. sibi_dst/df_helper/backends/parquet/_parquet_options.py +8 -4
  9. sibi_dst/df_helper/backends/sqlalchemy/_db_connection.py +68 -107
  10. sibi_dst/df_helper/backends/sqlalchemy/_db_gatekeeper.py +15 -0
  11. sibi_dst/df_helper/backends/sqlalchemy/_io_dask.py +105 -255
  12. sibi_dst/df_helper/backends/sqlalchemy/_load_from_db.py +90 -42
  13. sibi_dst/df_helper/backends/sqlalchemy/_model_registry.py +192 -0
  14. sibi_dst/df_helper/backends/sqlalchemy/_sql_model_builder.py +122 -72
  15. sibi_dst/osmnx_helper/route_path_builder.py +45 -46
  16. sibi_dst/utils/__init__.py +2 -0
  17. sibi_dst/utils/base.py +235 -100
  18. sibi_dst/utils/business_days.py +248 -0
  19. sibi_dst/utils/clickhouse_writer.py +472 -206
  20. sibi_dst/utils/data_utils.py +139 -186
  21. sibi_dst/utils/data_wrapper.py +392 -88
  22. sibi_dst/utils/date_utils.py +711 -393
  23. sibi_dst/utils/df_utils.py +193 -213
  24. sibi_dst/utils/file_age_checker.py +301 -0
  25. sibi_dst/utils/file_utils.py +3 -2
  26. sibi_dst/utils/filepath_generator.py +314 -152
  27. sibi_dst/utils/log_utils.py +581 -242
  28. sibi_dst/utils/manifest_manager.py +60 -76
  29. sibi_dst/utils/parquet_saver.py +33 -27
  30. sibi_dst/utils/periods.py +42 -0
  31. sibi_dst/utils/phone_formatter.py +88 -95
  32. sibi_dst/utils/update_planner.py +180 -178
  33. sibi_dst/utils/webdav_client.py +116 -166
  34. {sibi_dst-2025.1.13.dist-info → sibi_dst-2025.8.2.dist-info}/METADATA +1 -1
  35. {sibi_dst-2025.1.13.dist-info → sibi_dst-2025.8.2.dist-info}/RECORD +36 -30
  36. sibi_dst/df_helper/_artifact_updater_multi_wrapper.py +0 -422
  37. {sibi_dst-2025.1.13.dist-info → sibi_dst-2025.8.2.dist-info}/WHEEL +0 -0
@@ -1,220 +1,170 @@
1
1
  """
2
2
  WebDAV client implementation for storage manager.
3
3
  """
4
+ from __future__ import annotations
5
+
6
+ from pathlib import PurePosixPath
7
+ from typing import Optional, Tuple, Union, Iterable
8
+
4
9
  from webdav4.client import Client, ResourceNotFound
5
10
  from webdav4.fsspec import WebdavFileSystem
6
11
 
7
12
 
13
+ def _normalize_base_url(url: str) -> str:
14
+ # webdav4 accepts trailing slash; normalize to one
15
+ url = url.strip()
16
+ return url if url.endswith("/") else url + "/"
17
+
18
+
19
+ def _normpath(path: str) -> str:
20
+ # Ensure POSIX path semantics (WebDAV paths are POSIX-like)
21
+ # Remove duplicate slashes but keep leading slash if present
22
+ p = str(PurePosixPath("/" + path.strip("/")))
23
+ return p[1:] if not path.startswith("/") else p
24
+
25
+
8
26
  class WebDAVClient:
9
27
  """
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.
28
+ WebDAV client wrapper for interacting with WebDAV servers (e.g., Nextcloud).
16
29
 
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
30
+ - Uses webdav4.Client for high-level ops and WebdavFileSystem (fsspec) for path utilities.
31
+ - Provides fsspec-compatible aliases: ls, rm, mkdir, makedirs.
32
+ - Prefer fs methods for filesystem ops (exists, makedirs, copy, open).
33
+ """
32
34
 
33
- # Set up authentication
35
+ def __init__(
36
+ self,
37
+ base_url: str,
38
+ *,
39
+ username: Optional[str] = None,
40
+ password: Optional[str] = None,
41
+ token: Optional[str] = None,
42
+ verify: Union[bool, str] = True,
43
+ timeout: Optional[float] = None,
44
+ ) -> None:
45
+ """
46
+ :param base_url: e.g. "https://host/remote.php/dav/files/user/"
47
+ :param username: Basic auth username (ignored if token is provided)
48
+ :param password: Basic auth password
49
+ :param token: Bearer/token auth (passed as `auth=token`)
50
+ :param verify: bool or path to CA bundle; "false" (str) treated as False
51
+ :param timeout: Optional default timeout (seconds) for client requests
52
+ """
53
+ self.base_url = _normalize_base_url(base_url)
54
+
55
+ # verify may arrive as 'false' string
56
+ if isinstance(verify, str) and verify.lower() == "false":
57
+ verify = False
58
+ self.verify = verify
59
+
60
+ # auth precedence: token -> (username, password) -> None
34
61
  if token:
35
- self.auth = token
62
+ self.auth: Union[str, Tuple[str, str], None] = token
36
63
  elif username and password:
37
64
  self.auth = (username, password)
38
65
  else:
39
66
  self.auth = None
40
67
 
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.
68
+ # Core clients
69
+ self.client = Client(self.base_url, auth=self.auth, verify=self.verify, timeout=timeout)
70
+ self.fs = WebdavFileSystem(self.base_url, auth=self.auth, verify=self.verify, timeout=timeout)
58
71
 
59
- :param path: Path to check
60
- :return: True if exists, False otherwise
61
- """
72
+ # ---------- convenience ----------
73
+
74
+ def _p(self, path: str) -> str:
75
+ """Normalize a relative/absolute path to WebDAV format."""
76
+ return _normpath(path)
77
+
78
+ # ---------- existence / listing ----------
79
+
80
+ def exists(self, path: str) -> bool:
81
+ """Return True if the resource exists."""
62
82
  try:
63
- return self.client.exists(path)
83
+ return bool(self.fs.exists(self._p(path)))
64
84
  except Exception:
65
85
  return False
66
86
 
67
- def list_directory(self, path="", detail=False):
87
+ def list_directory(self, path: str = "", detail: bool = False):
68
88
  """
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
89
+ List contents of a directory. Returns [] (or {}) if not found.
74
90
  """
91
+ p = self._p(path)
75
92
  try:
76
- return self.client.ls(path, detail=detail)
93
+ return self.fs.ls(p, detail=detail)
94
+ except FileNotFoundError:
95
+ return [] if not detail else {}
77
96
  except ResourceNotFound:
78
- # Return empty list if directory doesn't exist
79
97
  return [] if not detail else {}
80
98
 
81
- def ensure_directory_exists(self, path):
82
- """
83
- Ensure a directory exists, creating parent directories if needed.
99
+ # ---------- directory creation ----------
84
100
 
85
- :param path: Directory path to ensure exists
101
+ def ensure_directory_exists(self, path: str) -> None:
86
102
  """
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):
103
+ Create a directory and parents if needed (idempotent).
122
104
  """
123
- Create a directory on the WebDAV server.
105
+ p = self._p(path)
106
+ # WebdavFileSystem implements makedirs(exist_ok=True)
107
+ self.fs.makedirs(p, exist_ok=True)
124
108
 
125
- :param path: Directory path to create
126
- """
109
+ def create_directory(self, path: str) -> None:
127
110
  self.ensure_directory_exists(path)
128
111
 
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)
112
+ # ---------- file transfer ----------
143
113
 
144
- def download_file(self, remote_path, local_path):
145
- """
146
- Download a file from the WebDAV server.
114
+ def upload_file(self, local_path: str, remote_path: str) -> None:
115
+ parent = PurePosixPath(self._p(remote_path)).parent.as_posix()
116
+ if parent and parent not in (".", "/"):
117
+ self.ensure_directory_exists(parent)
118
+ # client supports upload_file(local, remote)
119
+ self.client.upload_file(local_path, self._p(remote_path))
147
120
 
148
- :param remote_path: Remote file path
149
- :param local_path: Local file path
150
- """
151
- self.client.download_file(remote_path, local_path)
121
+ def download_file(self, remote_path: str, local_path: str) -> None:
122
+ self.client.download_file(self._p(remote_path), local_path)
152
123
 
153
- def delete(self, path, recursive=False):
154
- """
155
- Delete a file or directory on the WebDAV server.
124
+ # ---------- deletion ----------
156
125
 
157
- :param path: Path to delete
158
- :param recursive: Whether to delete recursively (for directories)
159
- """
126
+ def delete(self, path: str, recursive: bool = False) -> None:
127
+ p = self._p(path)
160
128
  try:
161
- self.client.remove(path, recursive=recursive)
129
+ # fs.rm handles both files and directories
130
+ self.fs.rm(p, recursive=recursive)
131
+ except FileNotFoundError:
132
+ pass
162
133
  except ResourceNotFound:
163
- # If the resource doesn't exist, that's fine - it's already gone
164
134
  pass
165
- except Exception as e:
166
- # Re-raise other exceptions
167
- raise e
168
135
 
169
- def get_fs(self):
170
- """
171
- Get the fsspec filesystem instance.
136
+ # ---------- fsspec-like aliases ----------
172
137
 
173
- :return: WebdavFileSystem instance
174
- """
138
+ def get_fs(self) -> WebdavFileSystem:
175
139
  return self.fs
176
140
 
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
- """
141
+ def mkdir(self, path: str, create_parents: bool = True) -> None:
185
142
  if create_parents:
186
143
  self.ensure_directory_exists(path)
187
144
  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).
145
+ # fsspec's mkdir usually creates a single level
146
+ self.fs.mkdir(self._p(path))
197
147
 
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
- """
148
+ def ls(self, path: str = "", detail: bool = False):
202
149
  return self.list_directory(path, detail=detail)
203
150
 
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
- """
151
+ def rm(self, path: str, recursive: bool = False) -> None:
211
152
  self.delete(path, recursive=recursive)
212
153
 
213
- def makedirs(self, path, exist_ok=True):
214
- """
215
- Create a directory and all parent directories (fsspec-compatible method).
154
+ def makedirs(self, path: str, exist_ok: bool = True) -> None:
155
+ p = self._p(path)
156
+ self.fs.makedirs(p, exist_ok=exist_ok)
216
157
 
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)
158
+ # ---------- context manager ----------
159
+
160
+ def __enter__(self) -> "WebDAVClient":
161
+ return self
162
+
163
+ def __exit__(self, exc_type, exc, tb) -> None:
164
+ # webdav4 clients don’t require explicit close, but fsspec may hold pools
165
+ try:
166
+ close = getattr(self.fs, "close", None)
167
+ if callable(close):
168
+ close()
169
+ except Exception:
170
+ pass
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sibi-dst
3
- Version: 2025.1.13
3
+ Version: 2025.8.2
4
4
  Summary: Data Science Toolkit
5
5
  Author: Luis Valverde
6
6
  Author-email: lvalverdeb@gmail.com
@@ -1,20 +1,23 @@
1
- sibi_dst/__init__.py,sha256=j8lZpGCJlxlLgEgeIMxZnWdqJ0g3MCs7-gsnbvPn_KY,285
2
- sibi_dst/df_helper/__init__.py,sha256=Jur_MO8RGPkVw0CS3XH5YIWv-d922DC_FwRDTvHHV6Y,432
3
- sibi_dst/df_helper/_artifact_updater_multi_wrapper.py,sha256=pSSw3N_ZNZCZHAiChbsF_ECyCmz0L2xCgvt9srHtPOM,17575
4
- sibi_dst/df_helper/_df_helper.py,sha256=PNoN0nlzRwo_4JiaVyzmOM--LRrsJ0jB9pZqDi_kkRA,12917
5
- sibi_dst/df_helper/_parquet_artifact.py,sha256=dCvUA2bytv0wY0pFI8lxbcLwXlgGpHndS36iKfEmjLw,14310
6
- sibi_dst/df_helper/_parquet_reader.py,sha256=m98C0TZRroOXvVc2LpEuElrJnquGlR81E1gjI7v1hi4,3102
1
+ sibi_dst/__init__.py,sha256=D01Z2Ds4zES8uz5Zp7qOWD0EcfCllWgew7AWt2X1SQg,445
2
+ sibi_dst/df_helper/__init__.py,sha256=CyDXtFhRnMrycktxNO8jGGkP0938QiScl56kMZS1Sf8,578
3
+ sibi_dst/df_helper/_artifact_updater_async.py,sha256=0lUwel-IkmKewRnmMv9GtuT-P6SivkIKtgOHvKchHlc,8462
4
+ sibi_dst/df_helper/_artifact_updater_threaded.py,sha256=M5GNZismOqMmBrcyfolP1DPv87VILQf_P18is_epn50,7238
5
+ sibi_dst/df_helper/_df_helper.py,sha256=wZtsFinZZ7gbPP5MLMyVCRG0bcj_eL-fZ-2ZirGD2WI,26880
6
+ sibi_dst/df_helper/_parquet_artifact.py,sha256=tqYOjwxHV1MsADmn-RNFuVI_RrEvvmCJHZieRcsVXuc,12334
7
+ sibi_dst/df_helper/_parquet_reader.py,sha256=tFq0OQVczozbKZou93vscokp2R6O2DIJ1zHbZqVjagc,3069
7
8
  sibi_dst/df_helper/backends/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
9
  sibi_dst/df_helper/backends/http/__init__.py,sha256=d1pfgYxbiYg7E0Iw8RbJ7xfqIfJShqqTBQQGU_S6OOo,105
9
10
  sibi_dst/df_helper/backends/http/_http_config.py,sha256=eGPFdqZ5M3Tscqx2P93B6XoBEEzlmdt7yNg7PXUQnNQ,4726
10
11
  sibi_dst/df_helper/backends/parquet/__init__.py,sha256=esWJ9aSuYC26d-T01z9dPrJ1uqJzvdaPNTYRb5qXTlQ,182
11
12
  sibi_dst/df_helper/backends/parquet/_filter_handler.py,sha256=TvDf0RXta7mwJv11GNQttYJsXgFf2XDj4oLIjt4xTzA,5219
12
- sibi_dst/df_helper/backends/parquet/_parquet_options.py,sha256=FWExRRTlhGrOhGPyzL1tucxgoHa3nJenLLs87I2gs-I,11776
13
+ sibi_dst/df_helper/backends/parquet/_parquet_options.py,sha256=FusVcLVysitLoc8Ui_zU4JMhdHW1MMn4i0vnMbl2K84,12017
13
14
  sibi_dst/df_helper/backends/sqlalchemy/__init__.py,sha256=LjWm9B7CweTvlvFOgB90XjSe0lVLILAIYMWKPkFXFm8,265
14
- sibi_dst/df_helper/backends/sqlalchemy/_db_connection.py,sha256=ycjnkhD1lWMKnLFy1bycle__jbfaWH6oI7m9ymX59c4,10783
15
- sibi_dst/df_helper/backends/sqlalchemy/_io_dask.py,sha256=NqBSHqeYv_1vHt6J0tez0GdMwKrP_sIRcXYXu869ZkY,13313
16
- sibi_dst/df_helper/backends/sqlalchemy/_load_from_db.py,sha256=ibxeVqpIEsSVusP2bgcd1MNV_wJIoNgXwacltUbwTas,3194
17
- sibi_dst/df_helper/backends/sqlalchemy/_sql_model_builder.py,sha256=d_-ip-dQnWOlM8btCjoywAXpaiSuN6AaavkTGJsVQfY,3576
15
+ sibi_dst/df_helper/backends/sqlalchemy/_db_connection.py,sha256=R3_WY_lsQrfQwD6yAzH66MqvsgZdMd0HKcVChDQcbpM,8401
16
+ sibi_dst/df_helper/backends/sqlalchemy/_db_gatekeeper.py,sha256=GQwDy2JwPUx37vpwxPM5hg4ZydilPIP824y5C_clsl0,383
17
+ sibi_dst/df_helper/backends/sqlalchemy/_io_dask.py,sha256=Gsj1pa5PV4ZznnANfKwv6907d8bG3v_9FW8ACi-1_0Q,7372
18
+ sibi_dst/df_helper/backends/sqlalchemy/_load_from_db.py,sha256=Mzj0GcsXP_NcXpEt4iNCDDB-QmcEe0GKw20NThYL9vk,5542
19
+ sibi_dst/df_helper/backends/sqlalchemy/_model_registry.py,sha256=MHk64f5WDOKHQ_L4mM8L-I-Uep_y1dczAodxA9fDJHs,6667
20
+ sibi_dst/df_helper/backends/sqlalchemy/_sql_model_builder.py,sha256=RiCaVPME5wzgZ9xUGY0JOs_c2C0KcDIbTeMGpPupIa0,5242
18
21
  sibi_dst/df_helper/core/__init__.py,sha256=LfmTqFh6GUZup-g95bcXgAxX7J5Hkve7ftLE_CJg_AE,409
19
22
  sibi_dst/df_helper/core/_defaults.py,sha256=9UMEMu2wXznO5UzEhnQ82f_ZazZ20JRyRXIi3HP3gDw,4043
20
23
  sibi_dst/df_helper/core/_filter_handler.py,sha256=Pmbzygry2mpkNPVS7DBMulHpAb1yYZNFqUU0bJTWJF0,11214
@@ -30,29 +33,32 @@ sibi_dst/osmnx_helper/basemaps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5
30
33
  sibi_dst/osmnx_helper/basemaps/calendar_html.py,sha256=UArt6FDgoCgoRte45Xo3IHqd-RNzW0YgitgZYfOFasY,4031
31
34
  sibi_dst/osmnx_helper/basemaps/route_map_plotter.py,sha256=rsJidieojcqIoe0kBanZbrxcelrS6nWoAyWoQXWdPiQ,11849
32
35
  sibi_dst/osmnx_helper/basemaps/router_plotter.py,sha256=UAiijn-J-jjX4YnL0_P9SFqTadrxMx-YK4djYhqPqfQ,10941
33
- sibi_dst/osmnx_helper/route_path_builder.py,sha256=mDV4mn0yZOCFghOiyiOgHggooh8i2Wqz95iEj-Ar6s4,3815
36
+ sibi_dst/osmnx_helper/route_path_builder.py,sha256=XJJyu4YXegAkCRjE-knyQncwXaxDVXZhalYacLcb7e0,3557
34
37
  sibi_dst/osmnx_helper/utils.py,sha256=HfxrmXVPq3akf68SiwncbAp7XI1ER-zp8YN_doh7YaY,20679
35
38
  sibi_dst/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
39
  sibi_dst/tests/test_data_wrapper_class.py,sha256=6uFmZR2DxnxQz49L5jT2ehlKvlLnpUHMLFB_PqqUq7k,3336
37
- sibi_dst/utils/__init__.py,sha256=PQsG188_lnqgSFljkCc15Nyv933HnvmQ7XYs02m77Vc,1217
38
- sibi_dst/utils/base.py,sha256=RGLcCpGeWTKxsAl9wcxicaS6nfq3lFdsgE9XiOOD_a8,4568
39
- sibi_dst/utils/clickhouse_writer.py,sha256=mNUJoYOreIdRrEFv2mQ6pdtLi1Iz_2rALDyO6ARTxhs,9978
40
+ sibi_dst/utils/__init__.py,sha256=vShNCOMPw8KKwlb4tq5XGrpjqakJ_OE8YDc_xDAWAxI,1302
41
+ sibi_dst/utils/base.py,sha256=IyObjZ7AaE-YjVU0RLIXNCnQKWwzi5NH2I6D1KfcIyk,8716
42
+ sibi_dst/utils/business_days.py,sha256=dP0Xj4FhTBIvZZrZYLOHZl5zOpDAgWkD4p_1a7BOT7I,8461
43
+ sibi_dst/utils/clickhouse_writer.py,sha256=pE-igxddDdxekJywsaWQqKlGXIvLjPMpoFBUJ24t9Tw,20255
40
44
  sibi_dst/utils/credentials.py,sha256=cHJPPsmVyijqbUQIq7WWPe-lIallA-mI5RAy3YUuRME,1724
41
45
  sibi_dst/utils/data_from_http_source.py,sha256=AcpKNsqTgN2ClNwuhgUpuNCx62r5_DdsAiKY8vcHEBA,1867
42
- sibi_dst/utils/data_utils.py,sha256=MqbwXk33BuANWeKKmsabHouhb8GZswSmbM-VetWWE-M,10357
43
- sibi_dst/utils/data_wrapper.py,sha256=9aYXorbrqDX53NVJ5oUnNQy6FbXYhs5osxzeMcdZpC4,9609
44
- sibi_dst/utils/date_utils.py,sha256=fV2X9HZND92CV-sRvOOGMs6Iv82gaLURQ8M78xAWfTY,17996
45
- sibi_dst/utils/df_utils.py,sha256=TzIAUCLbgOn3bvCFvzkc1S9YU-OlZTImdCj-88dtg8g,11401
46
- sibi_dst/utils/file_utils.py,sha256=Z99CZ_4nPDIaZqbCfzzUDfAYJjSudWDj-mwEO8grhbc,1253
47
- sibi_dst/utils/filepath_generator.py,sha256=-HHO0U-PR8fysDDFwnWdHRlgqksh_RkmgBZLWv9hM7s,6669
48
- sibi_dst/utils/log_utils.py,sha256=_YnpCnMcjT--ou3BU0EGJma1xMULrA4V5v5UU4IbjAo,14102
49
- sibi_dst/utils/manifest_manager.py,sha256=Rw7i2phoKJjGlPHYLg_1kr40syVKxd9LJEmfxvZPeDg,8544
50
- sibi_dst/utils/parquet_saver.py,sha256=B1ztPZMJvsulbgXMBnJdSkPhLFvdv8sRnmyqjjBBRTI,4735
51
- sibi_dst/utils/phone_formatter.py,sha256=tsVTDamuthFYgy4-5UwmQkPQ-FGTGH7MjZyH8utAkIY,4945
46
+ sibi_dst/utils/data_utils.py,sha256=7bLidEjppieNoozDFb6OuRY0W995cxg4tiGAlkGfePI,7768
47
+ sibi_dst/utils/data_wrapper.py,sha256=EQyk0KniZYRTLncoYsAt5-KgdtU6McQxdaTzeNg03t8,21247
48
+ sibi_dst/utils/date_utils.py,sha256=hBVWu9_cqiZ-XsLR7QY9Iek09DQKLwrY1ZlYxWlXj7g,31101
49
+ sibi_dst/utils/df_utils.py,sha256=bQGromLOEdRTvbVVcuHq0vQ0fIgqhwOoD_eIp5v7VEY,10899
50
+ sibi_dst/utils/file_age_checker.py,sha256=44B3lwH_PLwzMfiKkgvJKjKx-qSgITIXxKfNbdf_VeA,11552
51
+ sibi_dst/utils/file_utils.py,sha256=cm__02IKCfEOzAKAZwdNIjnRL8H4XtPa6hKcj510pto,1310
52
+ sibi_dst/utils/filepath_generator.py,sha256=Ke_OwBjLJkNMeOP0QjbLIZpSMkzhAIxKyf4hZ5P5re0,12916
53
+ sibi_dst/utils/log_utils.py,sha256=daKptJtZW10UTezT6XAjcOabi94ukNVzfeeLDQ0O9hQ,27897
54
+ sibi_dst/utils/manifest_manager.py,sha256=9y4cV-Ig8O-ekhApp_UObTY-cTsl-bGnvKIThItEzg4,7394
55
+ sibi_dst/utils/parquet_saver.py,sha256=aYBlijqPAn-yuJXhmaRIteAN_IAQZvPh8I8Os2TLGgI,4861
56
+ sibi_dst/utils/periods.py,sha256=8eTGi-bToa6_a8Vwyg4fkBPryyzft9Nzy-3ToxjqC8c,1434
57
+ sibi_dst/utils/phone_formatter.py,sha256=oeM22nLjhObENrpItCNeVpkYS4pXRm5hSxdk0M4nvwU,4580
52
58
  sibi_dst/utils/storage_config.py,sha256=uaCBF8rgCeYkk-lxVSCjsic8O8HJKAu455MR-OBliCo,4325
53
59
  sibi_dst/utils/storage_manager.py,sha256=yyZqT8XjTf4MKFrfznCmxXxOYz_TiWgtQhzqPoXR9So,6569
54
- sibi_dst/utils/update_planner.py,sha256=Z-v9PmHsolYFiELAqiw8OZ7v0dKWPfkaCs8uorn0Usw,11497
55
- sibi_dst/utils/webdav_client.py,sha256=pYF1UsGOuxYeGLq7aBfwZFvkvD4meOcbbaiZ4d6GW9I,7107
60
+ sibi_dst/utils/update_planner.py,sha256=smlMHpr1p8guZnP5SyzCe6RsC-XkPOJWIsdeospUyb0,11471
61
+ sibi_dst/utils/webdav_client.py,sha256=D9J5d1f1qQwHGm5FE5AMVpOPwcU5oD7K8JZoKGP8NpM,5811
56
62
  sibi_dst/v2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
57
63
  sibi_dst/v2/df_helper/__init__.py,sha256=XuH6jKYAPg2DdRbsxxBSxp9X3x-ARyaT0xe27uILrVo,99
58
64
  sibi_dst/v2/df_helper/_df_helper.py,sha256=9pED3bjQ2Z81zqzJrZ9e7SguoO4-hBmNTJK4WOKrr4M,9297
@@ -73,6 +79,6 @@ sibi_dst/v2/df_helper/core/_params_config.py,sha256=DYx2drDz3uF-lSPzizPkchhy-kxR
73
79
  sibi_dst/v2/df_helper/core/_query_config.py,sha256=Y8LVSyaKuVkrPluRDkQoOwuXHQxner1pFWG3HPfnDHM,441
74
80
  sibi_dst/v2/utils/__init__.py,sha256=6H4cvhqTiFufnFPETBF0f8beVVMpfJfvUs6Ne0TQZNY,58
75
81
  sibi_dst/v2/utils/log_utils.py,sha256=rfk5VsLAt-FKpv6aPTC1FToIPiyrnHAFFBAkHme24po,4123
76
- sibi_dst-2025.1.13.dist-info/METADATA,sha256=9WnZXk7XMCz34My6z4UCuyUden5wziKHPZ7lhqyB0iA,2611
77
- sibi_dst-2025.1.13.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
78
- sibi_dst-2025.1.13.dist-info/RECORD,,
82
+ sibi_dst-2025.8.2.dist-info/METADATA,sha256=SivBygwgks3A7cD__dfdnhqpBgKtG5fmnP_DeNf78gE,2610
83
+ sibi_dst-2025.8.2.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
84
+ sibi_dst-2025.8.2.dist-info/RECORD,,