sibi-flux 2025.12.0__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 (110) hide show
  1. sibi_dst/__init__.py +44 -0
  2. sibi_flux/__init__.py +49 -0
  3. sibi_flux/artifacts/__init__.py +7 -0
  4. sibi_flux/artifacts/base.py +166 -0
  5. sibi_flux/artifacts/parquet.py +360 -0
  6. sibi_flux/artifacts/parquet_engine/__init__.py +5 -0
  7. sibi_flux/artifacts/parquet_engine/executor.py +204 -0
  8. sibi_flux/artifacts/parquet_engine/manifest.py +101 -0
  9. sibi_flux/artifacts/parquet_engine/planner.py +544 -0
  10. sibi_flux/conf/settings.py +131 -0
  11. sibi_flux/core/__init__.py +5 -0
  12. sibi_flux/core/managed_resource/__init__.py +3 -0
  13. sibi_flux/core/managed_resource/_managed_resource.py +733 -0
  14. sibi_flux/core/type_maps/__init__.py +100 -0
  15. sibi_flux/dask_cluster/__init__.py +47 -0
  16. sibi_flux/dask_cluster/async_core.py +27 -0
  17. sibi_flux/dask_cluster/client_manager.py +549 -0
  18. sibi_flux/dask_cluster/core.py +322 -0
  19. sibi_flux/dask_cluster/exceptions.py +34 -0
  20. sibi_flux/dask_cluster/utils.py +49 -0
  21. sibi_flux/datacube/__init__.py +3 -0
  22. sibi_flux/datacube/_data_cube.py +332 -0
  23. sibi_flux/datacube/config_engine.py +152 -0
  24. sibi_flux/datacube/field_factory.py +48 -0
  25. sibi_flux/datacube/field_registry.py +122 -0
  26. sibi_flux/datacube/generator.py +677 -0
  27. sibi_flux/datacube/orchestrator.py +171 -0
  28. sibi_flux/dataset/__init__.py +3 -0
  29. sibi_flux/dataset/_dataset.py +162 -0
  30. sibi_flux/df_enricher/__init__.py +56 -0
  31. sibi_flux/df_enricher/async_enricher.py +201 -0
  32. sibi_flux/df_enricher/merger.py +253 -0
  33. sibi_flux/df_enricher/specs.py +45 -0
  34. sibi_flux/df_enricher/types.py +12 -0
  35. sibi_flux/df_helper/__init__.py +5 -0
  36. sibi_flux/df_helper/_df_helper.py +450 -0
  37. sibi_flux/df_helper/backends/__init__.py +34 -0
  38. sibi_flux/df_helper/backends/_params.py +173 -0
  39. sibi_flux/df_helper/backends/_strategies.py +295 -0
  40. sibi_flux/df_helper/backends/http/__init__.py +5 -0
  41. sibi_flux/df_helper/backends/http/_http_config.py +122 -0
  42. sibi_flux/df_helper/backends/parquet/__init__.py +7 -0
  43. sibi_flux/df_helper/backends/parquet/_parquet_options.py +268 -0
  44. sibi_flux/df_helper/backends/sqlalchemy/__init__.py +9 -0
  45. sibi_flux/df_helper/backends/sqlalchemy/_db_connection.py +256 -0
  46. sibi_flux/df_helper/backends/sqlalchemy/_db_gatekeeper.py +15 -0
  47. sibi_flux/df_helper/backends/sqlalchemy/_io_dask.py +386 -0
  48. sibi_flux/df_helper/backends/sqlalchemy/_load_from_db.py +134 -0
  49. sibi_flux/df_helper/backends/sqlalchemy/_model_registry.py +239 -0
  50. sibi_flux/df_helper/backends/sqlalchemy/_sql_model_builder.py +42 -0
  51. sibi_flux/df_helper/backends/utils.py +32 -0
  52. sibi_flux/df_helper/core/__init__.py +15 -0
  53. sibi_flux/df_helper/core/_defaults.py +104 -0
  54. sibi_flux/df_helper/core/_filter_handler.py +617 -0
  55. sibi_flux/df_helper/core/_params_config.py +185 -0
  56. sibi_flux/df_helper/core/_query_config.py +17 -0
  57. sibi_flux/df_validator/__init__.py +3 -0
  58. sibi_flux/df_validator/_df_validator.py +222 -0
  59. sibi_flux/logger/__init__.py +1 -0
  60. sibi_flux/logger/_logger.py +480 -0
  61. sibi_flux/mcp/__init__.py +26 -0
  62. sibi_flux/mcp/client.py +150 -0
  63. sibi_flux/mcp/router.py +126 -0
  64. sibi_flux/orchestration/__init__.py +9 -0
  65. sibi_flux/orchestration/_artifact_orchestrator.py +346 -0
  66. sibi_flux/orchestration/_pipeline_executor.py +212 -0
  67. sibi_flux/osmnx_helper/__init__.py +22 -0
  68. sibi_flux/osmnx_helper/_pbf_handler.py +384 -0
  69. sibi_flux/osmnx_helper/graph_loader.py +225 -0
  70. sibi_flux/osmnx_helper/utils.py +100 -0
  71. sibi_flux/pipelines/__init__.py +3 -0
  72. sibi_flux/pipelines/base.py +218 -0
  73. sibi_flux/py.typed +0 -0
  74. sibi_flux/readers/__init__.py +3 -0
  75. sibi_flux/readers/base.py +82 -0
  76. sibi_flux/readers/parquet.py +106 -0
  77. sibi_flux/utils/__init__.py +53 -0
  78. sibi_flux/utils/boilerplate/__init__.py +19 -0
  79. sibi_flux/utils/boilerplate/base_attacher.py +45 -0
  80. sibi_flux/utils/boilerplate/base_cube_router.py +283 -0
  81. sibi_flux/utils/boilerplate/base_data_cube.py +132 -0
  82. sibi_flux/utils/boilerplate/base_pipeline_template.py +54 -0
  83. sibi_flux/utils/boilerplate/hybrid_data_loader.py +193 -0
  84. sibi_flux/utils/clickhouse_writer/__init__.py +6 -0
  85. sibi_flux/utils/clickhouse_writer/_clickhouse_writer.py +225 -0
  86. sibi_flux/utils/common.py +7 -0
  87. sibi_flux/utils/credentials/__init__.py +3 -0
  88. sibi_flux/utils/credentials/_config_manager.py +155 -0
  89. sibi_flux/utils/dask_utils.py +14 -0
  90. sibi_flux/utils/data_utils/__init__.py +3 -0
  91. sibi_flux/utils/data_utils/_data_utils.py +389 -0
  92. sibi_flux/utils/dataframe_utils.py +52 -0
  93. sibi_flux/utils/date_utils/__init__.py +10 -0
  94. sibi_flux/utils/date_utils/_business_days.py +220 -0
  95. sibi_flux/utils/date_utils/_date_utils.py +311 -0
  96. sibi_flux/utils/date_utils/_file_age_checker.py +319 -0
  97. sibi_flux/utils/file_utils.py +48 -0
  98. sibi_flux/utils/filepath_generator/__init__.py +5 -0
  99. sibi_flux/utils/filepath_generator/_filepath_generator.py +185 -0
  100. sibi_flux/utils/parquet_saver/__init__.py +6 -0
  101. sibi_flux/utils/parquet_saver/_parquet_saver.py +436 -0
  102. sibi_flux/utils/parquet_saver/_write_gatekeeper.py +33 -0
  103. sibi_flux/utils/retry.py +46 -0
  104. sibi_flux/utils/storage/__init__.py +7 -0
  105. sibi_flux/utils/storage/_fs_registry.py +112 -0
  106. sibi_flux/utils/storage/_storage_manager.py +257 -0
  107. sibi_flux/utils/storage/factory.py +33 -0
  108. sibi_flux-2025.12.0.dist-info/METADATA +283 -0
  109. sibi_flux-2025.12.0.dist-info/RECORD +110 -0
  110. sibi_flux-2025.12.0.dist-info/WHEEL +4 -0
@@ -0,0 +1,283 @@
1
+ Metadata-Version: 2.3
2
+ Name: sibi-flux
3
+ Version: 2025.12.0
4
+ Summary: Sibi Toolkit: A collection of tools for Data Analysis/Engineering.
5
+ Author: Luis Valverde
6
+ Author-email: Luis Valverde <lvalverdeb@gmail.com>
7
+ Requires-Dist: pandas>=2.3.3
8
+ Requires-Dist: pyarrow>=22.0.0
9
+ Requires-Dist: pydantic>=2.12.5
10
+ Requires-Dist: pydantic-settings>=2.12.0
11
+ Requires-Dist: dask>=2025.11.0
12
+ Requires-Dist: fsspec>=2025.10.0
13
+ Requires-Dist: s3fs>=2025.10.0
14
+ Requires-Dist: sqlalchemy>=2.0.44
15
+ Requires-Dist: psycopg2>=2.9.11
16
+ Requires-Dist: pymysql>=1.1.2
17
+ Requires-Dist: clickhouse-connect>=0.10.0
18
+ Requires-Dist: concurrent-log-handler>=0.9.28
19
+ Requires-Dist: rich>=14.2.0
20
+ Requires-Dist: filelock>=3.20.1
21
+ Requires-Dist: tqdm>=4.67.1
22
+ Requires-Dist: watchdog>=6.0.0
23
+ Requires-Dist: tornado==6.5.4
24
+ Requires-Dist: typer>=0.21.0
25
+ Requires-Dist: psutil>=6.1.1
26
+ Requires-Dist: httpx>=0.28.1
27
+ Requires-Dist: opentelemetry-api>=1.38.0
28
+ Requires-Dist: opentelemetry-exporter-otlp>=1.38.0
29
+ Requires-Dist: opentelemetry-sdk>=1.38.0
30
+ Requires-Dist: sibi-flux[distributed,geospatial,mcp] ; extra == 'complete'
31
+ Requires-Dist: distributed>=2025.11.0 ; extra == 'distributed'
32
+ Requires-Dist: osmnx>=2.0.7 ; extra == 'geospatial'
33
+ Requires-Dist: geopandas>=1.1.2 ; extra == 'geospatial'
34
+ Requires-Dist: geopy>=2.4.1 ; extra == 'geospatial'
35
+ Requires-Dist: folium>=0.20.0 ; extra == 'geospatial'
36
+ Requires-Dist: osmium>=4.2.0 ; extra == 'geospatial'
37
+ Requires-Dist: shapely>=2.0.0 ; extra == 'geospatial'
38
+ Requires-Dist: networkx>=3.6.1 ; extra == 'geospatial'
39
+ Requires-Dist: sibi-flux[distributed] ; extra == 'mcp'
40
+ Requires-Dist: mcp>=1.1.2 ; extra == 'mcp'
41
+ Requires-Dist: fastapi>=0.127.0 ; extra == 'mcp'
42
+ Requires-Dist: uvicorn>=0.40.0 ; extra == 'mcp'
43
+ Requires-Dist: httpx>=0.28.1 ; extra == 'mcp'
44
+ Requires-Python: >=3.11
45
+ Provides-Extra: complete
46
+ Provides-Extra: distributed
47
+ Provides-Extra: geospatial
48
+ Provides-Extra: mcp
49
+ Description-Content-Type: text/markdown
50
+
51
+ # SibiFlux
52
+
53
+ **SibiFlux** is a production-grade resilient data engineering ecosystem designed to bridge the gap between local development, distributed computing, and agentic AI workflows. It provides a unified engine for hybrid data loading (batch + streaming), self-healing distributed operations, and native interfaces for AI agents via the Model Context Protocol (MCP).
54
+
55
+ ```mermaid
56
+ graph TD
57
+ subgraph "Agentic Interface (MCP)"
58
+ Agent["AI Agent / Claude"] <--> Router["MCP Router"]
59
+ Router <--> Resources["SibiFlux Resources"]
60
+ end
61
+
62
+ subgraph "Solutions Layer (Business Logic)"
63
+ Logistics["Logistics Solutions"]
64
+ Enrichment["Enrichment Pipelines"]
65
+ Cubes["DataCubes"]
66
+ end
67
+
68
+ subgraph "SibiFlux Core Engine"
69
+ DfHelper["DfHelper (Unified Loader)"]
70
+ Cluster["Resilient Dask Cluster"]
71
+ Managed["ManagedResource Lifecycle"]
72
+ end
73
+
74
+ Resources --> Cubes
75
+ Logistics --> DfHelper
76
+ Cubes --> DfHelper
77
+ DfHelper --> Cluster
78
+ ```
79
+
80
+ ## Core Architecture
81
+
82
+ ### 1. The Flux Engine (`sibi_flux`)
83
+ The foundational library providing resilient distributed primitives.
84
+ - **`DfHelper`**: A unified API for loading data from SQLAlchemy, Parquet, or HTTP sources into Pandas or Dask DataFrames.
85
+ - **`Dataset`**: A high-level abstraction for hybrid data loading, seamlessly merging historical (Parquet) and live (SQL) data sources.
86
+ - **`DfValidator`**: A robust schema enforcement tool that validates DataFrames against strict type maps and generates ClickHouse DDL.
87
+ - **`ArtifactOrchestrator`**: An async engine for managing concurrent artifact updates with retries, backoff, and worker isolation.
88
+ - **`ManagedResource`**: A rigorous lifecycle management system for async resources, ensuring clean shutdown, signal handling, and observability.
89
+ - **`Dask Cluster`**: A self-healing distributed runtime that detects worker failures, manages re-connection, and enforces "The Nuclear Option" for test isolation.
90
+
91
+ ### 2. Agentic Interface (`mcp`)
92
+ Native support for the **Model Context Protocol (MCP)**, allowing AI agents to directly interact with SibiFlux data structures.
93
+ - **Expose DataCubes**: Automatically turn any `DataCube` into a queryable MCP Resource.
94
+ - **Tooling**: Register Python functions as tools callable by agents.
95
+
96
+ ## Key Capabilities
97
+
98
+ ### Hybrid Data Loading
99
+ SibiFlux implements a "Hot/Cold" architecture for seamless data access:
100
+ - **Historical Data**: Read efficiently from partitioned Parquet archives (S3/Local).
101
+ - **Live Data**: Query operational SQL databases for real-time changes.
102
+ - **Automatic Merge**: `DfHelper` and `Dataset` automatically stitch these sources together, handling schema evolution and deduplication.
103
+
104
+ ### Resilient Distributed Compute
105
+ The SibiFlux Dask wrapper provides:
106
+ - **Auto-Healing**: Clients that automatically reconnect if the scheduler dies.
107
+ - **Safe Persistence**: Wrappers like `safe_persist` that retry operations on network jitter.
108
+ - **Smart Partitioning**: Automated repartitioning to prevent "small file problem" in Parquet outputs.
109
+
110
+ ### Observability
111
+ Built-in integration with OpenTelemetry (OTel):
112
+ - structured logging with correlation IDs.
113
+ - distributed tracing across async boundaries.
114
+
115
+ ## Quick Start
116
+
117
+ ### Installation
118
+
119
+ ```bash
120
+ # Base installation (Core Engine only)
121
+ pip install sibi-flux
122
+
123
+ # For Distributed Computing (Dask Cluster support)
124
+ pip install "sibi-flux[distributed]"
125
+
126
+ # For Geospatial capabilities (OSMnx, GeoPandas, etc.)
127
+ pip install "sibi-flux[geospatial]"
128
+
129
+ # For MCP Agentic Interface support
130
+ pip install "sibi-flux[mcp]"
131
+
132
+ # Complete installation (Simulates the "All-in-One" environment)
133
+ pip install "sibi-flux[complete]"
134
+ ```
135
+
136
+ ## API Examples
137
+
138
+ ### 1. Data Loading (`Dataset`)
139
+
140
+ The `Dataset` class provides a high-level abstraction for hybrid loading.
141
+
142
+ ```python
143
+ from sibi_flux import Dataset
144
+ from solutions.logistics.readers.products import ProductsParquetReader, ProductsSqlReader
145
+
146
+ class ProductsDataset(Dataset):
147
+ historical_reader = ProductsParquetReader
148
+ live_reader = ProductsSqlReader
149
+ date_field = "created_at"
150
+
151
+ # Load hybrid data (merges Parquet + SQL)
152
+ ds = ProductsDataset(start_date="2023-01-01", end_date="2023-01-31")
153
+ df = await ds.aload() # Returns a Dask DataFrame
154
+ ```
155
+
156
+ ### 2. Schema Validation (`DfValidator`)
157
+
158
+ Ensure your data meets strict type requirements and generate DDL for ClickHouse.
159
+
160
+ ```python
161
+ from sibi_flux import DfValidator
162
+
163
+ # Define expected schema
164
+ SCHEMA = {
165
+ "product_id": "Int64[pyarrow]",
166
+ "price": "Float64[pyarrow]",
167
+ "name": "string[pyarrow]"
168
+ }
169
+
170
+ validator = DfValidator(df)
171
+ validator.validate_schema(SCHEMA)
172
+ validator.standardize_data_quality()
173
+
174
+ # Generate ClickHouse DDL
175
+ ddl = validator.generate_clickhouse_ddl("products_table")
176
+ print(ddl)
177
+ ```
178
+
179
+ ### 3. Data Enrichment (`AsyncDfEnricher`)
180
+
181
+ Enrich a base DataFrame with data from other sources using `AttachmentSpec`.
182
+
183
+ ```python
184
+ from sibi_flux.df_enricher import AsyncDfEnricher, AttachmentSpec
185
+
186
+ specs = [
187
+ AttachmentSpec(
188
+ key="customer_info",
189
+ required_cols={"customer_id"},
190
+ attachment_fn=fetch_customer_data, # Async function returning DF
191
+ left_on=["customer_id"],
192
+ right_on=["id"],
193
+ drop_cols=["id"]
194
+ )
195
+ ]
196
+
197
+ enricher = AsyncDfEnricher(base_df=orders_df, specs=specs)
198
+ enriched_df = await enricher.enrich()
199
+ ```
200
+
201
+ ### 4. Orchestration (`ArtifactOrchestrator`)
202
+
203
+ Manage concurrent updates of multiple artifacts with retries and worker isolation.
204
+
205
+ ```python
206
+ from sibi_flux.orchestration import ArtifactOrchestrator
207
+
208
+ orchestrator = ArtifactOrchestrator(
209
+ wrapped_classes={"daily": [ProductsDataset, OrdersDataset]},
210
+ max_workers=3,
211
+ retry_attempts=3
212
+ )
213
+
214
+ # Updates all 'daily' artifacts concurrently
215
+ results = await orchestrator.update_data("daily")
216
+ ```
217
+
218
+ ### 5. Distributed Compute (`Dask Cluster`)
219
+
220
+ Execute resilient operations that survive scheduler restarts.
221
+
222
+ ```python
223
+ from sibi_flux.dask_cluster import safe_compute, get_persistent_client
224
+
225
+ client = get_persistent_client()
226
+
227
+ # Safe compute with auto-retry logic
228
+ result = safe_compute(df.groupby("category").sum())
229
+ ```
230
+
231
+ ### 6. Resource Management (`ManagedResource`)
232
+
233
+ Create lifecycle-safe components.
234
+
235
+ ```python
236
+ from sibi_flux.core import ManagedResource
237
+
238
+ class MyResource(ManagedResource):
239
+ async def _acleanup(self):
240
+ await self.db_connection.close()
241
+ self.logger.info("Cleaned up!")
242
+
243
+ async with MyResource() as res:
244
+ await res.do_work()
245
+ # Automatically cleaned up here
246
+ ```
247
+
248
+ ### 7. Agentic Interface (`sibi_flux.mcp`)
249
+
250
+ Seamlessly bridge your data with AI Agents.
251
+
252
+ **Server Side (Expose Resources)**
253
+
254
+ ```python
255
+ from sibi_flux.mcp import BaseMCPRouter
256
+ from products import ProductsDataset
257
+
258
+ # Create an MCP Router compatible with FastAPI
259
+ router = BaseMCPRouter(name="data-server")
260
+
261
+ # Automatically register a Dataset as an MCP Resource
262
+ # Agent can now read `sibi://ProductsDataset`
263
+ router.register_cube_resource(ProductsDataset)
264
+
265
+ # Register a custom tool
266
+ @router.tool()
267
+ def calculate_vat(amount: float) -> float:
268
+ return amount * 0.2
269
+ ```
270
+
271
+ **Client Side (Consume Resources)**
272
+
273
+ ```python
274
+ from sibi_flux.mcp import GenericMcpClient
275
+
276
+ # Connect to the MCP Server
277
+ async with GenericMcpClient(url="http://localhost:8000/sse") as client:
278
+ # Read the resource (returns JSON data from the Dataset)
279
+ data = await client.read_resource("sibi://ProductsDataset")
280
+
281
+ # Call a tool
282
+ vat = await client.call_tool("calculate_vat", arguments={"amount": 100.0})
283
+ ```
@@ -0,0 +1,110 @@
1
+ sibi_dst/__init__.py,sha256=QS5F0UZRObIqKFjefBGhrLqfZrjD431ymuTBV--zPUs,1245
2
+ sibi_flux/__init__.py,sha256=jGgbwMFajaeRUll7PP5iFOJetedN9mvTEEzB7N2RrpE,1275
3
+ sibi_flux/artifacts/__init__.py,sha256=Ag-hy5Twi7qktN8mhTizoSgKO0Q9sWQ39HT4f9mWL2c,126
4
+ sibi_flux/artifacts/base.py,sha256=gyyDRyn7Zq4lYyzfxKABXXPAIMFYAPzgFAEDzhb4674,5809
5
+ sibi_flux/artifacts/parquet.py,sha256=iCVCKHIXn698lXBM0X78DaL826y8x9_cy5t1kbvn8cE,12541
6
+ sibi_flux/artifacts/parquet_engine/__init__.py,sha256=L9OBs-v6HMTZ-_7hrzr7J_oYF-evHlzJlwA-jMM7ybA,193
7
+ sibi_flux/artifacts/parquet_engine/executor.py,sha256=62vy1nWfhBnYAylqKd-mq6YJ7_TWrNda8iWcokyA1QY,6899
8
+ sibi_flux/artifacts/parquet_engine/manifest.py,sha256=AoeIUFgLPfzvxmchExZIJ_gKP1wnLfYBKWbCYG5XYKk,3324
9
+ sibi_flux/artifacts/parquet_engine/planner.py,sha256=c_oWfZKMvtpyKH5v-UYlJRRFidRrZR5nW4YquMyRGCs,21640
10
+ sibi_flux/conf/settings.py,sha256=KxnmtnGCZWP-OZh_D65G-7HD8nnJstiPzoObDY5O2Zc,3957
11
+ sibi_flux/core/__init__.py,sha256=3NvyTOJns99CGxNTd6K-xV392JjKHHA3p_PQUEjYxLg,84
12
+ sibi_flux/core/managed_resource/__init__.py,sha256=gyYTDZEPCgOJQvcF-_RJGzBrNoRNkijEIqxm0ruatY4,78
13
+ sibi_flux/core/managed_resource/_managed_resource.py,sha256=DGcSX5kQ_nHnXqAISxpjHiDdKG3ertyPj6anz_kNOKw,24606
14
+ sibi_flux/core/type_maps/__init__.py,sha256=NfRAo80MomZCEcfYwOTrgYR8EvG5QRTqSeudsET_fZc,4654
15
+ sibi_flux/dask_cluster/__init__.py,sha256=o-pEvM8FaPy3FqOxkEXTZIzuaVj1ceCGEdVAgfTAex4,936
16
+ sibi_flux/dask_cluster/async_core.py,sha256=SZh313KX56VP6d_VpyOf3aeyjzL0cWxE4Akf5l9KPsA,1040
17
+ sibi_flux/dask_cluster/client_manager.py,sha256=UhGb_qEsAnTD1plfE6-Jv299MK2nyQ086VDWuKRd93E,19472
18
+ sibi_flux/dask_cluster/core.py,sha256=1QOII0HeDOX3Z7aSn0XLPt1VOYaE-37dQXZD7OW0LtQ,10532
19
+ sibi_flux/dask_cluster/exceptions.py,sha256=apQZaUMgac8k2ZTTsvUd-VlWdo9-Nrh5b6StMWCMJ-I,829
20
+ sibi_flux/dask_cluster/utils.py,sha256=Pr2qaow6GVyvM0hqKSM0ZQpe2Ot5ayfGYQiNhNpYA8Y,1342
21
+ sibi_flux/datacube/__init__.py,sha256=ODEoa4r5RtzynIp-PdVDaJ-4BcPBj1L9VkLIF7RYSPE,91
22
+ sibi_flux/datacube/_data_cube.py,sha256=DBSGc5bUDjb2bd9sASn66nXonqEbWz_23p04EPTUyXI,12311
23
+ sibi_flux/datacube/config_engine.py,sha256=NBQp_0hl3aci-cJPK5MyDnboB6WYoB7BWS2eq_IPACA,4883
24
+ sibi_flux/datacube/field_factory.py,sha256=49Nqv0GoEQY7-TdSNrYxTYvmiBjK1z0JEkEwvv9U6Kw,1603
25
+ sibi_flux/datacube/field_registry.py,sha256=DEDPYYMKUSgTjWt4CmvYJUkWEHvY42cMyq8E1ldvJyk,4268
26
+ sibi_flux/datacube/generator.py,sha256=hTT2rOjJ47e1YFhFb3FHsKRZBeoihXaLDZ_hiKg4t6U,24132
27
+ sibi_flux/datacube/orchestrator.py,sha256=14lEaF2XBSOkH2xCDWYPOujirznTCeXSGL6ivr7LmwQ,6126
28
+ sibi_flux/dataset/__init__.py,sha256=zYpf4-nalcQNSUIOCDG0CqQu2SKkm89I9AF6Zy6z1sE,53
29
+ sibi_flux/dataset/_dataset.py,sha256=Hu13Rf9u3ATU5_LrK0sR18rnQJ1zMudqTq_cc5vG6jU,6499
30
+ sibi_flux/df_enricher/__init__.py,sha256=ZDk2-VZNJCQZYfEBqABZHxug1kRCJ1TC_cO_B5-96pQ,1540
31
+ sibi_flux/df_enricher/async_enricher.py,sha256=c0FmbGqUFzsOgqYjlfAxEwNRGeQMsfekUFzCYrNP5VM,7150
32
+ sibi_flux/df_enricher/merger.py,sha256=8j0AtC4GNtLehQgZJ728rhZuV0KQEqaWRFYCTcZyJLQ,9349
33
+ sibi_flux/df_enricher/specs.py,sha256=wgviYCsry_61ZnRWxRJQhPn4Lb42mO5NJEXV5We3548,1256
34
+ sibi_flux/df_enricher/types.py,sha256=Hf15xEAg8BCIHTS1O3CtY05GWAOaxOFHrkeNaKXv9uk,213
35
+ sibi_flux/df_helper/__init__.py,sha256=xIHiRmbkFLyXyh8QARYVRq4bsZAzUS8IWN5oLpx4wCg,64
36
+ sibi_flux/df_helper/_df_helper.py,sha256=rWg9ALvn90tSuVy-jG7F27WVEuDFbIskpNehA14PMTU,17231
37
+ sibi_flux/df_helper/backends/__init__.py,sha256=EvV_dfQtiONZ0h8HHxTMBUXIaUXsY2_E7fxcEsKD9GA,639
38
+ sibi_flux/df_helper/backends/_params.py,sha256=Co07r_j4z62OoxKZFN_Rt10PWhjJgdcy5TtmI402eM0,5944
39
+ sibi_flux/df_helper/backends/_strategies.py,sha256=Dr5WqC4NfI8URLUueakNzeWDG_I9lff0DmlQ2fKt0jE,11356
40
+ sibi_flux/df_helper/backends/http/__init__.py,sha256=n_C6yiqwOPI-ziUrVc2X4IcHbkvKFcJePvZPciLx2ag,99
41
+ sibi_flux/df_helper/backends/http/_http_config.py,sha256=rPEKo0f4GykEo_ohF4Wi1xFMDh2tyhcBGcLBrLaFKMQ,5101
42
+ sibi_flux/df_helper/backends/parquet/__init__.py,sha256=CJAnHpdZ4pBtOfUHTyt5ZCHpom7NNDsRj2QNqGshsYE,116
43
+ sibi_flux/df_helper/backends/parquet/_parquet_options.py,sha256=vhNbP1Nc0ZpncX5ytEGWQFQvXtN4KwxKLVh0S5VjZjI,9578
44
+ sibi_flux/df_helper/backends/sqlalchemy/__init__.py,sha256=Nvr4Ky064kD79tpmDmL3Qq5h7V8ZS41kBhmborqiM2I,265
45
+ sibi_flux/df_helper/backends/sqlalchemy/_db_connection.py,sha256=BSjbdV_ZjNeKLCCPHPraNgKxUh_RudYGVKr3cV7fvLw,9036
46
+ sibi_flux/df_helper/backends/sqlalchemy/_db_gatekeeper.py,sha256=J1yeT59uYNngL_JME-YPnHCBL9OfkWOmPbG2icZpalM,415
47
+ sibi_flux/df_helper/backends/sqlalchemy/_io_dask.py,sha256=ix6iTD_hyTqX4AdOcsSDECuAy4A7_EPhXcsDzXEXpoM,14151
48
+ sibi_flux/df_helper/backends/sqlalchemy/_load_from_db.py,sha256=j8fVvAHtmWsAS9SgJTiajPIatWWaQ0xauD5B1FKoOd4,4858
49
+ sibi_flux/df_helper/backends/sqlalchemy/_model_registry.py,sha256=z4359gXrKi18-irXYKVarIsXlwJnsTRen1KYMzHL3e4,8326
50
+ sibi_flux/df_helper/backends/sqlalchemy/_sql_model_builder.py,sha256=Q-dB1cOMy-BkXC3assdUMcZ5y3jDkVGQDdZM4DjaDQ4,1398
51
+ sibi_flux/df_helper/backends/utils.py,sha256=wd_4Q8uS9A9Z4gaCJGTdWdubM04AcfMaj12w4suC1gY,885
52
+ sibi_flux/df_helper/core/__init__.py,sha256=VxbA2sdVNtI_Ma2ZfY6XwErlcPaU7zDBLKYjAtnl2MQ,438
53
+ sibi_flux/df_helper/core/_defaults.py,sha256=9HJ2xwUhgaywF4_oSNRlHaOjEZTp1k9i6N8pSMZ42Ss,3988
54
+ sibi_flux/df_helper/core/_filter_handler.py,sha256=7FFcNVKfm8HdoDn3iv2Jw-X7EHpwnWE7aMVIapSm8xA,21834
55
+ sibi_flux/df_helper/core/_params_config.py,sha256=JgR0pgb_GZaovtvckigYtddVFVBoRGMxYd4y_Yy26Xc,6189
56
+ sibi_flux/df_helper/core/_query_config.py,sha256=bS_k0qmvom1uVhkcJngPV2pc9pOhQ0FDIsanZSVKMFo,439
57
+ sibi_flux/df_validator/__init__.py,sha256=lkgTVmeCmH0yqfpZ4oPrRMZS8Jy9lm4OF7DjTSWbgTY,66
58
+ sibi_flux/df_validator/_df_validator.py,sha256=kaHjjHsSTst5CutQHgpmCKXaqSjdxy6HJW1C2RK26FM,8716
59
+ sibi_flux/logger/__init__.py,sha256=3XZyYf4LZV2x8aM-zv2LmasCXjtrHn9laz4bty-Hxp0,38
60
+ sibi_flux/logger/_logger.py,sha256=UwhBG14wK_mfOgg2LfM-nwzPVHg-TsoGC9tXob_upLg,16700
61
+ sibi_flux/mcp/__init__.py,sha256=_9ZQ8TBQpoOVlBj8M3RUhpgQpWPCD_8myPTHXxK6ZSc,1022
62
+ sibi_flux/mcp/client.py,sha256=KJtbSWYHDDsmReOZjO30v3_F82dqnGOebMtJh1jjKsU,5286
63
+ sibi_flux/mcp/router.py,sha256=Lim3PnWmpS62dx-qy8aLG5AnzKNMBElpEkFySydW7vw,4448
64
+ sibi_flux/orchestration/__init__.py,sha256=Uy0t5lHugdvheWWROxBjSxQCzAh4wD2wCX6awGHJ87I,202
65
+ sibi_flux/orchestration/_artifact_orchestrator.py,sha256=0i23lUtSZNWFmci8b07O9si8HPc9XsNi8WIyhP8ELhk,12011
66
+ sibi_flux/orchestration/_pipeline_executor.py,sha256=s4CDMJNqUpPq37G07rEkhyCRro97SKtC1QeSXZsEyBo,8122
67
+ sibi_flux/osmnx_helper/__init__.py,sha256=nbycKPQ_vA0hVmiDULqOWBsKyTNSTZeIH12JWCr5xuQ,849
68
+ sibi_flux/osmnx_helper/_pbf_handler.py,sha256=UrJVL-Ck_eqohOzeGN4uFOcfFrYcVjkON51j34jwlFs,15847
69
+ sibi_flux/osmnx_helper/graph_loader.py,sha256=sjgosrlW_4idUrJtwL0T8AXIsnFcqfxoiyFx9gGIrQw,8958
70
+ sibi_flux/osmnx_helper/utils.py,sha256=A6XuDR7p3jjlvs-IU69sIw651b3fupjVGD2PoouF1Rk,2968
71
+ sibi_flux/pipelines/__init__.py,sha256=bxBZaijhuR2flIk4HOAp_XWF1LIyNKqzH-NBVIxietc,59
72
+ sibi_flux/pipelines/base.py,sha256=ekNflFwX6K27PlQmCLVKDsScji8c7Qwa5PWzpuP-a6A,7560
73
+ sibi_flux/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
74
+ sibi_flux/readers/__init__.py,sha256=RFMKL8sWL63WuKL1-3VZWWOg-h-nIzn4YXG5BDmKahg,64
75
+ sibi_flux/readers/base.py,sha256=Em4oNwSvRMK8d6X5X5kjtmHbV3pCzfc1nurU6GG4t70,3256
76
+ sibi_flux/readers/parquet.py,sha256=HckgObBjkDbxvFIthMQKC1tD2F82fNJLX1hd3QdmubM,4063
77
+ sibi_flux/utils/__init__.py,sha256=EnNHFvs0jkRA1nJSewex3oFjvDJQkYqnY--fIrWDpI0,1264
78
+ sibi_flux/utils/boilerplate/__init__.py,sha256=OdmeJQ549XpZDAuJ-kgKIQyvX2OE2yXhcqmiPFBX0LQ,482
79
+ sibi_flux/utils/boilerplate/base_attacher.py,sha256=eY4X3rX-A7ENtcUmquViRKL6nirY5EsLSih30qsyn2E,1279
80
+ sibi_flux/utils/boilerplate/base_cube_router.py,sha256=KgxNByNTdKtzm2UVggFTYkMkmniVVZkNUKJnF6bstIA,10759
81
+ sibi_flux/utils/boilerplate/base_data_cube.py,sha256=yPJ2mdf48Zez3Sty1Gx-Wl0h4iVuBqkkOTrpf0JRx80,4227
82
+ sibi_flux/utils/boilerplate/base_pipeline_template.py,sha256=MNZaFSYrS5l1wCQgV0W8HXVxrmds4sOyy_LhRGqmGXc,1569
83
+ sibi_flux/utils/boilerplate/hybrid_data_loader.py,sha256=c-gt3x8DLPpQWwpx1OnAueT6OT47eXK7GakHi8Dna00,7693
84
+ sibi_flux/utils/clickhouse_writer/__init__.py,sha256=5l1f_5OGe4NM4PDEBvzAwANMNeip7_C2-O9IoCz59oo,114
85
+ sibi_flux/utils/clickhouse_writer/_clickhouse_writer.py,sha256=2aow6KwWn1RNFQRvPMzbII8upB41GgV9NT7VQjW9C3g,7135
86
+ sibi_flux/utils/common.py,sha256=xOiaRX39v6rR_X88iRvTfMcoaymIjXeHkj_MpoWbHrg,202
87
+ sibi_flux/utils/credentials/__init__.py,sha256=IY64wvP8J0E61kMuAi0SNddCllM6fK0wCqurqGQ7j5M,72
88
+ sibi_flux/utils/credentials/_config_manager.py,sha256=aiGgkwr1maYCwprt_vjdCpfGSycawBCERAjY3jn6xS4,5093
89
+ sibi_flux/utils/dask_utils.py,sha256=ixHUDSn8fj4fvA4s5FBbdKFP0wY83ieVW1WNaUi-Gh0,403
90
+ sibi_flux/utils/data_utils/__init__.py,sha256=9p7cxEcPdxZZI0DCId4yU9sWtSVGF8Z1DjvUQoXiQb4,60
91
+ sibi_flux/utils/data_utils/_data_utils.py,sha256=nzj2DT1MSGWBN92ypOBhxbPmu0q5HyzdLRD7ioeKSS4,13773
92
+ sibi_flux/utils/dataframe_utils.py,sha256=hkt98Y7Sc7m9oaIFGqi_8TMoX666kEaz4ZIICT6EgOQ,1679
93
+ sibi_flux/utils/date_utils/__init__.py,sha256=EZ2ZiS-JqM9LMhAW4h0YVX76bH3j2L-AvVofDtUe5AA,197
94
+ sibi_flux/utils/date_utils/_business_days.py,sha256=vjWTky-zggcAFyt7GbWA-OQNwtBSlbLkkpcYYnJiafk,6572
95
+ sibi_flux/utils/date_utils/_date_utils.py,sha256=3FAZY9K0zejSD9oE8Tf-jnTbJ8wioDYjyzxkDMChs8s,11470
96
+ sibi_flux/utils/date_utils/_file_age_checker.py,sha256=mgtFflUDCz-r0g-necQuGUecdkQxf90rFh6pzaSSPhs,11782
97
+ sibi_flux/utils/file_utils.py,sha256=7OHUW65OTe6HlQ6wkDagDd7d0SCQ_-NEGmHlOJguKYw,1626
98
+ sibi_flux/utils/filepath_generator/__init__.py,sha256=YVFJhIewjwksb9E2t43ojNC-W_AqUDhkKxQVBIBMkY8,91
99
+ sibi_flux/utils/filepath_generator/_filepath_generator.py,sha256=4HG-Ubvjtv6luL0z-A-8B6_r3o9YqBwATFXhOXiTbKc,6789
100
+ sibi_flux/utils/parquet_saver/__init__.py,sha256=TDbcryjgPaa0vsY1bqJONgLE00iTtNrrj5AeEYEwf68,120
101
+ sibi_flux/utils/parquet_saver/_parquet_saver.py,sha256=3VfA7j1cre3V-YQPocssIK_PP9rBOmghrl-itPVk9n4,17443
102
+ sibi_flux/utils/parquet_saver/_write_gatekeeper.py,sha256=UPH-LEj6kxLNSROI5hjEc2qyIBeOX1yFKVU9iG6mmZY,1306
103
+ sibi_flux/utils/retry.py,sha256=45t0MF2IoMayN9xkn5_FtakMq4HwZlGvHVd6qv8x1AY,1227
104
+ sibi_flux/utils/storage/__init__.py,sha256=j5xftw1jpk8-4stgo9tkHqs_iVM4pnvJQdShWVSjYdI,137
105
+ sibi_flux/utils/storage/_fs_registry.py,sha256=nhNhDObdNiIQXI6k42Xa-7pgmLQmzaNTjttVkMLJAiQ,4139
106
+ sibi_flux/utils/storage/_storage_manager.py,sha256=pEfms7WF7aACWq3TXorBQTr7OqKpLVV0IDPQqIIA1WA,9368
107
+ sibi_flux/utils/storage/factory.py,sha256=4_MT7zS9di9eBhdgUXdwwa88Ijslbjrn9xKs_7Tklto,1185
108
+ sibi_flux-2025.12.0.dist-info/WHEEL,sha256=ZyFSCYkV2BrxH6-HRVRg3R9Fo7MALzer9KiPYqNxSbo,79
109
+ sibi_flux-2025.12.0.dist-info/METADATA,sha256=1H1xBJGsycX7vgPRCrXiFfQhDzn0TmfoFlXpRxSxeq4,9336
110
+ sibi_flux-2025.12.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: uv 0.9.18
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any