sibi-dst 2025.1.8__tar.gz → 2025.1.10__tar.gz
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.
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/PKG-INFO +1 -1
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/pyproject.toml +1 -1
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/df_helper/_artifact_updater_multi_wrapper.py +2 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/df_helper/_df_helper.py +25 -4
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/df_helper/backends/parquet/_parquet_options.py +33 -8
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/df_helper/backends/sqlalchemy/_db_connection.py +1 -1
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/utils/data_wrapper.py +36 -36
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/utils/update_planner.py +5 -7
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/README.md +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/__init__.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/df_helper/__init__.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/df_helper/_parquet_artifact.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/df_helper/_parquet_reader.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/df_helper/backends/__init__.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/df_helper/backends/http/__init__.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/df_helper/backends/http/_http_config.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/df_helper/backends/parquet/__init__.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/df_helper/backends/parquet/_filter_handler.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/df_helper/backends/sqlalchemy/__init__.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/df_helper/backends/sqlalchemy/_io_dask.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/df_helper/backends/sqlalchemy/_load_from_db.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/df_helper/backends/sqlalchemy/_sql_model_builder.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/df_helper/core/__init__.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/df_helper/core/_defaults.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/df_helper/core/_filter_handler.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/df_helper/core/_params_config.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/df_helper/core/_query_config.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/df_helper/data_cleaner.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/geopy_helper/__init__.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/geopy_helper/geo_location_service.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/geopy_helper/utils.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/osmnx_helper/__init__.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/osmnx_helper/base_osm_map.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/osmnx_helper/basemaps/__init__.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/osmnx_helper/basemaps/calendar_html.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/osmnx_helper/basemaps/router_plotter.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/osmnx_helper/utils.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/tests/__init__.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/tests/test_data_wrapper_class.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/utils/__init__.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/utils/base.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/utils/clickhouse_writer.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/utils/credentials.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/utils/data_from_http_source.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/utils/data_utils.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/utils/date_utils.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/utils/df_utils.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/utils/file_utils.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/utils/filepath_generator.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/utils/log_utils.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/utils/manifest_manager.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/utils/parquet_saver.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/utils/phone_formatter.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/utils/storage_config.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/utils/storage_manager.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/utils/webdav_client.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/v2/__init__.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/v2/df_helper/__init__.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/v2/df_helper/_df_helper.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/v2/df_helper/backends/__init__.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/v2/df_helper/backends/sqlalchemy/__init__.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/v2/df_helper/backends/sqlalchemy/_db_connection.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/v2/df_helper/backends/sqlalchemy/_io_dask.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/v2/df_helper/backends/sqlalchemy/_load_from_db.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/v2/df_helper/backends/sqlalchemy/_model_builder.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/v2/df_helper/backends/sqlmodel/__init__.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/v2/df_helper/backends/sqlmodel/_db_connection.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/v2/df_helper/backends/sqlmodel/_io_dask.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/v2/df_helper/backends/sqlmodel/_load_from_db.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/v2/df_helper/backends/sqlmodel/_model_builder.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/v2/df_helper/core/__init__.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/v2/df_helper/core/_filter_handler.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/v2/df_helper/core/_params_config.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/v2/df_helper/core/_query_config.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/v2/utils/__init__.py +0 -0
- {sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/v2/utils/log_utils.py +0 -0
{sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/df_helper/_artifact_updater_multi_wrapper.py
RENAMED
@@ -49,6 +49,7 @@ class ArtifactUpdaterMultiWrapperThreaded(ManagedResource):
|
|
49
49
|
self.completion_times: Dict[str, float] = {}
|
50
50
|
self.failed: List[str] = []
|
51
51
|
self.original_classes: List[Type] = []
|
52
|
+
self.logger.info("ArtifactUpdaterMultiWrapperThreaded initialized")
|
52
53
|
|
53
54
|
def get_artifact_classes(self, data_type: str) -> List[Type]:
|
54
55
|
"""Retrieve artifact classes by data type."""
|
@@ -270,6 +271,7 @@ class ArtifactUpdaterMultiWrapperAsync(ManagedResource):
|
|
270
271
|
self.completion_times: Dict[str, float] = {}
|
271
272
|
self.failed: List[str] = []
|
272
273
|
self.original_classes: List[Type] = []
|
274
|
+
self.logger.info("ArtifactUpdaterMultiWrapperAsync initialized")
|
273
275
|
|
274
276
|
def get_artifact_classes(self, data_type: str) -> List[Type]:
|
275
277
|
"""
|
@@ -28,6 +28,7 @@ class BaseBackend:
|
|
28
28
|
self.logger = helper.logger
|
29
29
|
self.debug = helper.debug
|
30
30
|
self.total_records = helper.total_records # no records loaded yet
|
31
|
+
self._entered = helper._entered # Track if the helper is used in a context manager
|
31
32
|
|
32
33
|
def load(self, **options) -> tuple[Any, Any] | Union[dd.DataFrame | pd.DataFrame]:
|
33
34
|
"""Synchronous data loading method. Must be implemented by sync backends."""
|
@@ -67,7 +68,7 @@ class ParquetBackend(BaseBackend):
|
|
67
68
|
df = self.helper.backend_parquet.load_files()
|
68
69
|
if options and df is not None:
|
69
70
|
df = FilterHandler('dask', logger=self.logger, debug=False).apply_filters(df, filters=options)
|
70
|
-
self.total_records = len(df)
|
71
|
+
self.total_records = len(df) or -1 # If df is empty, set total_records to -1
|
71
72
|
return self.total_records, df
|
72
73
|
except Exception as e:
|
73
74
|
self.total_records = -1 # Reset total_records on failure
|
@@ -105,6 +106,12 @@ class DfHelper(ManagedResource):
|
|
105
106
|
'http': HttpBackend,
|
106
107
|
}
|
107
108
|
|
109
|
+
_BACKEND_ATTR_MAP = {
|
110
|
+
'sqlalchemy': 'backend_db_connection',
|
111
|
+
'parquet': 'backend_parquet',
|
112
|
+
'http': 'backend_http',
|
113
|
+
}
|
114
|
+
|
108
115
|
default_config: Dict = None
|
109
116
|
|
110
117
|
def __init__(self, backend='sqlalchemy', **kwargs):
|
@@ -140,9 +147,15 @@ class DfHelper(ManagedResource):
|
|
140
147
|
super().__exit__(exc_type, exc_value, traceback)
|
141
148
|
|
142
149
|
def _cleanup(self):
|
143
|
-
|
150
|
+
attr_name = self._BACKEND_ATTR_MAP.get(self.backend)
|
151
|
+
if not attr_name:
|
152
|
+
self.logger.warning(f"No attribute mapping found for backend '{self.backend}'. Cleanup skipped.")
|
153
|
+
return
|
154
|
+
# Get the actual config object (e.g., self.backend_db_connection)
|
155
|
+
active_config = getattr(self, attr_name, None)
|
156
|
+
|
144
157
|
if active_config and hasattr(active_config, "close"):
|
145
|
-
self.logger.debug(f"Closing resources for '{self.backend}' backend.")
|
158
|
+
self.logger.debug(f"Closing resources for '{self.backend}' backend using attribute '{attr_name}'.")
|
146
159
|
active_config.close()
|
147
160
|
|
148
161
|
def _get_config(self, model: T, kwargs: Dict[str, Any]) -> T:
|
@@ -156,6 +169,10 @@ class DfHelper(ManagedResource):
|
|
156
169
|
self.total_records, df = self.backend_strategy.load(**options)
|
157
170
|
df = self._process_loaded_data(df)
|
158
171
|
df = self._post_process_df(df)
|
172
|
+
if not self._entered:
|
173
|
+
self.logger.warning(
|
174
|
+
"DfHelper instance was not used in a context manager; cleanup is being called manually.")
|
175
|
+
self._cleanup()
|
159
176
|
return df.compute() if as_pandas else df
|
160
177
|
|
161
178
|
async def aload(self, as_pandas=False, **options) -> Union[pd.DataFrame, dd.DataFrame]:
|
@@ -200,7 +217,11 @@ class DfHelper(ManagedResource):
|
|
200
217
|
self.logger.warning("Cannot save to parquet; DataFrame is empty.")
|
201
218
|
return
|
202
219
|
fs = kwargs.pop('fs', self.fs)
|
203
|
-
|
220
|
+
if not fs:
|
221
|
+
raise ValueError("Filesystem (fs) must be provided to save to parquet.")
|
222
|
+
path = kwargs.pop('parquet_storage_path', None)
|
223
|
+
if not path:
|
224
|
+
raise ValueError("parquet_storage_path must be provided to save to parquet.")
|
204
225
|
writer_config = {
|
205
226
|
'df_result': df,
|
206
227
|
'parquet_storage_path': path,
|
{sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/df_helper/backends/parquet/_parquet_options.py
RENAMED
@@ -4,8 +4,8 @@ from typing import Optional, List
|
|
4
4
|
|
5
5
|
import dask.dataframe as dd
|
6
6
|
import fsspec
|
7
|
-
|
8
|
-
|
7
|
+
import pandas as pd
|
8
|
+
from pydantic import BaseModel, model_validator, ConfigDict
|
9
9
|
from sibi_dst.utils import FilePathGenerator
|
10
10
|
from sibi_dst.utils import Logger
|
11
11
|
|
@@ -93,7 +93,7 @@ class ParquetConfig(BaseModel):
|
|
93
93
|
self.parquet_storage_path = self.parquet_storage_path.rstrip('/')
|
94
94
|
if not self.fs.exists(self.parquet_storage_path):
|
95
95
|
self.fs.mkdirs(self.parquet_storage_path, exist_ok=True)
|
96
|
-
#raise ValueError('Parquet storage path does not exist')
|
96
|
+
# raise ValueError('Parquet storage path does not exist')
|
97
97
|
self.load_parquet = False
|
98
98
|
if self.parquet_filename is not None:
|
99
99
|
self.parquet_full_path = self.ensure_file_extension(
|
@@ -184,11 +184,36 @@ class ParquetConfig(BaseModel):
|
|
184
184
|
:return: A Dask DataFrame containing loaded parquet file data.
|
185
185
|
:rtype: dask.dataframe.DataFrame
|
186
186
|
"""
|
187
|
-
if self.load_parquet:
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
187
|
+
if not self.load_parquet:
|
188
|
+
self.logger.warning("Parquet loading is disabled. Returning empty DataFrame.")
|
189
|
+
return dd.from_pandas(pd.DataFrame(), npartitions=1)
|
190
|
+
|
191
|
+
paths_to_load = []
|
192
|
+
if self.parquet_folder_list:
|
193
|
+
# Filter out any None values from the list
|
194
|
+
paths_to_load = [p for p in self.parquet_folder_list if p is not None]
|
195
|
+
elif self.parquet_full_path:
|
196
|
+
# Treat the single path as a list with one item
|
197
|
+
paths_to_load = [self.parquet_full_path]
|
198
|
+
|
199
|
+
if not paths_to_load:
|
200
|
+
self.logger.warning("No valid parquet file paths were provided. Returning empty DataFrame.")
|
201
|
+
return dd.from_pandas(pd.DataFrame(), npartitions=1)
|
202
|
+
|
203
|
+
try:
|
204
|
+
self.logger.debug(f"Attempting to load Parquet data from: {paths_to_load}")
|
205
|
+
return dd.read_parquet(
|
206
|
+
paths_to_load,
|
207
|
+
engine="pyarrow",
|
208
|
+
filesystem=self.fs,
|
209
|
+
exclude=["_*", ".*"]
|
210
|
+
)
|
211
|
+
except Exception as e:
|
212
|
+
# This robust error handling is excellent.
|
213
|
+
self.logger.error(f"Parquet loading failed for paths {paths_to_load}: {e}", exc_info=True)
|
214
|
+
self.logger.warning("Returning empty DataFrame due to loading error.")
|
215
|
+
return dd.from_pandas(pd.DataFrame(), npartitions=1)
|
216
|
+
|
192
217
|
|
193
218
|
@staticmethod
|
194
219
|
def ensure_file_extension(filepath: str, extension: str) -> str:
|
{sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/df_helper/backends/sqlalchemy/_db_connection.py
RENAMED
@@ -172,7 +172,7 @@ class SqlAlchemyConnectionConfig(BaseModel):
|
|
172
172
|
return
|
173
173
|
|
174
174
|
engine_wrapper['ref_count'] -= 1
|
175
|
-
self.logger.debug(f"Closing
|
175
|
+
self.logger.debug(f"Closing connection within engine wrapper. Ref count is now {engine_wrapper['ref_count']}.")
|
176
176
|
|
177
177
|
if engine_wrapper['ref_count'] <= 0:
|
178
178
|
self.logger.debug(f"Disposing engine as reference count is zero. Key: {key}")
|
@@ -153,44 +153,44 @@ class DataWrapper(ManagedResource):
|
|
153
153
|
# Create a copy to avoid mutating the shared instance dictionary
|
154
154
|
local_load_params = self.load_params.copy()
|
155
155
|
local_load_params.update(date_filter)
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
156
|
+
with self.dataclass(**self.class_params) as local_class_instance:
|
157
|
+
df = local_class_instance.load(**local_load_params)
|
158
|
+
load_time = time.perf_counter() - load_start
|
159
|
+
|
160
|
+
if hasattr(local_class_instance, "total_records"):
|
161
|
+
self.logger.debug(
|
162
|
+
f"Total records loaded by {local_class_instance.__class__.__name__}: {local_class_instance.total_records}")
|
163
|
+
if int(local_class_instance.total_records) == 0: # If no records were loaded but not due to an error
|
164
|
+
if self.mmanifest:
|
165
|
+
self.mmanifest.record(
|
166
166
|
full_path=path
|
167
167
|
)
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
168
|
+
self.logger.info(f"No data found for {full_path}. Logged to missing manifest.")
|
169
|
+
elif int(local_class_instance.total_records) < 0:
|
170
|
+
self.logger.warning(
|
171
|
+
f"Negative record count ({local_class_instance.total_records}) for {full_path}. "
|
172
|
+
"This may indicate an error in the data loading process."
|
173
|
+
)
|
174
|
+
else:
|
175
|
+
save_start = time.perf_counter()
|
176
|
+
parquet_params ={
|
177
|
+
"df_result": df,
|
178
|
+
"parquet_storage_path": path,
|
179
|
+
"fs": self.fs,
|
180
|
+
"logger": self.logger,
|
181
|
+
"debug": self.debug,
|
182
|
+
}
|
183
|
+
with ParquetSaver(**parquet_params) as ps:
|
184
|
+
ps.save_to_parquet(self.parquet_filename, overwrite=True)
|
185
|
+
save_time = time.perf_counter() - save_start
|
186
|
+
|
187
|
+
total_time = time.perf_counter() - overall_start
|
188
|
+
self.benchmarks[date] = {
|
189
|
+
"load_duration": load_time,
|
190
|
+
"save_duration": save_time,
|
191
|
+
"total_duration": total_time
|
192
|
+
}
|
193
|
+
self._log_success(date, total_time, full_path)
|
194
194
|
except Exception as e:
|
195
195
|
self._log_failure(date, e)
|
196
196
|
raise
|
@@ -72,9 +72,6 @@ class UpdatePlanner(ManagedResource):
|
|
72
72
|
data_path: str,
|
73
73
|
filename: str,
|
74
74
|
description: str = "Update Planner",
|
75
|
-
#fs: Optional[fsspec.AbstractFileSystem] = None,
|
76
|
-
#filesystem_type: str = "file",
|
77
|
-
#filesystem_options: Optional[Dict] = None,
|
78
75
|
reference_date: Union[str, datetime.date] = None,
|
79
76
|
history_days_threshold: int = DEFAULT_HISTORY_DAYS_THRESHOLD,
|
80
77
|
max_age_minutes: int = DEFAULT_MAX_AGE_MINUTES,
|
@@ -199,11 +196,12 @@ class UpdatePlanner(ManagedResource):
|
|
199
196
|
for _, row in self.plan.iterrows():
|
200
197
|
table.add_row(*(str(item) for item in row))
|
201
198
|
|
202
|
-
console
|
199
|
+
console = Console()
|
200
|
+
with console.capture() as capture:
|
201
|
+
console.print(table)
|
202
|
+
plan_string = capture.get()
|
203
203
|
|
204
|
-
|
205
|
-
|
206
|
-
self.logger.info(f"Full Update Plan:\n{plan_string}")
|
204
|
+
self.logger.info(f"Full Update Plan:\n{plan_string.strip()}")
|
207
205
|
|
208
206
|
def get_tasks_by_priority(self) -> Iterator[Tuple[int, List[datetime.date]]]:
|
209
207
|
"""Yields batches of dates to be processed, grouped and sorted by priority."""
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/df_helper/backends/parquet/_filter_handler.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/df_helper/backends/sqlalchemy/_load_from_db.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/v2/df_helper/backends/sqlalchemy/__init__.py
RENAMED
File without changes
|
{sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/v2/df_helper/backends/sqlalchemy/_db_connection.py
RENAMED
File without changes
|
{sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/v2/df_helper/backends/sqlalchemy/_io_dask.py
RENAMED
File without changes
|
{sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/v2/df_helper/backends/sqlalchemy/_load_from_db.py
RENAMED
File without changes
|
{sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/v2/df_helper/backends/sqlalchemy/_model_builder.py
RENAMED
File without changes
|
{sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/v2/df_helper/backends/sqlmodel/__init__.py
RENAMED
File without changes
|
{sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/v2/df_helper/backends/sqlmodel/_db_connection.py
RENAMED
File without changes
|
{sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/v2/df_helper/backends/sqlmodel/_io_dask.py
RENAMED
File without changes
|
{sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/v2/df_helper/backends/sqlmodel/_load_from_db.py
RENAMED
File without changes
|
{sibi_dst-2025.1.8 → sibi_dst-2025.1.10}/sibi_dst/v2/df_helper/backends/sqlmodel/_model_builder.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|