sibi-flux 2026.1.1__tar.gz → 2026.1.3__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.
Files changed (127) hide show
  1. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/PKG-INFO +43 -4
  2. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/README.md +40 -0
  3. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/pyproject.toml +14 -5
  4. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/__init__.py +0 -1
  5. sibi_flux-2026.1.3/src/sibi_flux/cli.py +68 -0
  6. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/config/settings.py +5 -7
  7. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/datacube/_data_cube.py +1 -0
  8. sibi_flux-2026.1.3/src/sibi_flux/datacube/cli.py +2469 -0
  9. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/datacube/config_engine.py +36 -18
  10. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/datacube/field_factory.py +71 -28
  11. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/datacube/field_mapper.py +93 -69
  12. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/datacube/field_registry.py +1 -1
  13. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/datacube/generator.py +255 -181
  14. sibi_flux-2026.1.3/src/sibi_flux/datacube/orchestrator.py +569 -0
  15. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/df_helper/backends/__init__.py +0 -1
  16. sibi_flux-2026.1.3/src/sibi_flux/init/core.py +211 -0
  17. sibi_flux-2026.1.3/src/sibi_flux/init/discovery_updater.py +153 -0
  18. sibi_flux-2026.1.3/src/sibi_flux/init/env.py +113 -0
  19. sibi_flux-2026.1.3/src/sibi_flux/init/env_engine.py +192 -0
  20. sibi_flux-2026.1.3/src/sibi_flux/init/env_generator.py +707 -0
  21. sibi_flux-2026.1.3/src/sibi_flux/init/rule_generator.py +171 -0
  22. sibi_flux-2026.1.3/src/sibi_flux/init/templates/__init__.py +0 -0
  23. sibi_flux-2026.1.3/src/sibi_flux/init/templates/discovery_params.yaml +44 -0
  24. sibi_flux-2026.1.3/src/sibi_flux/init/templates/gen_dc.py +188 -0
  25. sibi_flux-2026.1.3/src/sibi_flux/init/templates/property_template.yaml +10 -0
  26. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/orchestration/__init__.py +0 -1
  27. sibi_flux-2026.1.3/src/sibi_flux/py.typed +0 -0
  28. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/storage/_storage_manager.py +0 -1
  29. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/utils/date_utils/__init__.py +0 -1
  30. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/utils/date_utils/_business_days.py +0 -1
  31. sibi_flux-2026.1.1/src/sibi_flux/datacube/cli.py +0 -1247
  32. sibi_flux-2026.1.1/src/sibi_flux/datacube/orchestrator.py +0 -297
  33. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_dst/__init__.py +0 -0
  34. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/artifacts/__init__.py +0 -0
  35. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/artifacts/base.py +0 -0
  36. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/artifacts/parquet.py +0 -0
  37. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/artifacts/parquet_engine/__init__.py +0 -0
  38. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/artifacts/parquet_engine/executor.py +0 -0
  39. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/artifacts/parquet_engine/manifest.py +0 -0
  40. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/artifacts/parquet_engine/planner.py +0 -0
  41. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/config/__init__.py +0 -0
  42. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/config/manager.py +0 -0
  43. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/core/__init__.py +0 -0
  44. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/core/managed_resource/__init__.py +0 -0
  45. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/core/managed_resource/_managed_resource.py +0 -0
  46. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/core/type_maps/__init__.py +0 -0
  47. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/dask_cluster/__init__.py +0 -0
  48. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/dask_cluster/async_core.py +0 -0
  49. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/dask_cluster/client_manager.py +0 -0
  50. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/dask_cluster/core.py +0 -0
  51. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/dask_cluster/exceptions.py +0 -0
  52. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/dask_cluster/utils.py +0 -0
  53. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/datacube/__init__.py +0 -0
  54. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/datacube/router.py +0 -0
  55. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/dataset/__init__.py +0 -0
  56. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/dataset/_dataset.py +0 -0
  57. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/dataset/hybrid_loader.py +0 -0
  58. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/df_enricher/__init__.py +0 -0
  59. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/df_enricher/async_enricher.py +0 -0
  60. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/df_enricher/attacher.py +0 -0
  61. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/df_enricher/merger.py +0 -0
  62. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/df_enricher/specs.py +0 -0
  63. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/df_enricher/types.py +0 -0
  64. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/df_helper/__init__.py +0 -0
  65. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/df_helper/_df_helper.py +0 -0
  66. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/df_helper/backends/_params.py +0 -0
  67. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/df_helper/backends/_strategies.py +0 -0
  68. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/df_helper/backends/http/__init__.py +0 -0
  69. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/df_helper/backends/http/_http_config.py +0 -0
  70. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/df_helper/backends/parquet/__init__.py +0 -0
  71. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/df_helper/backends/parquet/_parquet_options.py +0 -0
  72. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/df_helper/backends/sqlalchemy/__init__.py +0 -0
  73. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/df_helper/backends/sqlalchemy/_db_connection.py +0 -0
  74. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/df_helper/backends/sqlalchemy/_db_gatekeeper.py +0 -0
  75. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/df_helper/backends/sqlalchemy/_io_dask.py +0 -0
  76. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/df_helper/backends/sqlalchemy/_load_from_db.py +0 -0
  77. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/df_helper/backends/sqlalchemy/_model_registry.py +0 -0
  78. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/df_helper/backends/sqlalchemy/_sql_model_builder.py +0 -0
  79. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/df_helper/backends/utils.py +0 -0
  80. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/df_helper/core/__init__.py +0 -0
  81. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/df_helper/core/_defaults.py +0 -0
  82. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/df_helper/core/_filter_handler.py +0 -0
  83. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/df_helper/core/_params_config.py +0 -0
  84. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/df_helper/core/_query_config.py +0 -0
  85. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/df_validator/__init__.py +0 -0
  86. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/df_validator/_df_validator.py +0 -0
  87. /sibi_flux-2026.1.1/src/sibi_flux/py.typed → /sibi_flux-2026.1.3/src/sibi_flux/init/__init__.py +0 -0
  88. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/logger/__init__.py +0 -0
  89. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/logger/_logger.py +0 -0
  90. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/mcp/__init__.py +0 -0
  91. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/mcp/client.py +0 -0
  92. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/mcp/router.py +0 -0
  93. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/orchestration/_artifact_orchestrator.py +0 -0
  94. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/orchestration/_pipeline_executor.py +0 -0
  95. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/osmnx_helper/__init__.py +0 -0
  96. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/osmnx_helper/_pbf_handler.py +0 -0
  97. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/osmnx_helper/graph_loader.py +0 -0
  98. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/osmnx_helper/utils.py +0 -0
  99. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/parquet/__init__.py +0 -0
  100. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/parquet/readers/__init__.py +0 -0
  101. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/parquet/readers/base.py +0 -0
  102. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/parquet/readers/parquet.py +0 -0
  103. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/parquet/saver/__init__.py +0 -0
  104. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/parquet/saver/_parquet_saver.py +0 -0
  105. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/parquet/saver/_write_gatekeeper.py +0 -0
  106. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/pipelines/__init__.py +0 -0
  107. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/pipelines/base.py +0 -0
  108. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/pipelines/template.py +0 -0
  109. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/readers/__init__.py +0 -0
  110. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/readers/base.py +0 -0
  111. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/storage/__init__.py +0 -0
  112. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/storage/_fs_registry.py +0 -0
  113. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/storage/factory.py +0 -0
  114. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/utils/__init__.py +0 -0
  115. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/utils/clickhouse_writer/__init__.py +0 -0
  116. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/utils/clickhouse_writer/_clickhouse_writer.py +0 -0
  117. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/utils/common.py +0 -0
  118. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/utils/dask_utils.py +0 -0
  119. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/utils/data_utils/__init__.py +0 -0
  120. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/utils/data_utils/_data_utils.py +0 -0
  121. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/utils/dataframe_utils.py +0 -0
  122. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/utils/date_utils/_date_utils.py +0 -0
  123. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/utils/date_utils/_file_age_checker.py +0 -0
  124. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/utils/file_utils.py +0 -0
  125. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/utils/filepath_generator/__init__.py +0 -0
  126. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/utils/filepath_generator/_filepath_generator.py +0 -0
  127. {sibi_flux-2026.1.1 → sibi_flux-2026.1.3}/src/sibi_flux/utils/retry.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: sibi-flux
3
- Version: 2026.1.1
3
+ Version: 2026.1.3
4
4
  Summary: Sibi Toolkit: A collection of tools for Data Analysis/Engineering.
5
5
  Author: Luis Valverde
6
6
  Author-email: Luis Valverde <lvalverdeb@gmail.com>
@@ -28,8 +28,9 @@ Requires-Dist: opentelemetry-api>=1.38.0
28
28
  Requires-Dist: opentelemetry-exporter-otlp>=1.38.0
29
29
  Requires-Dist: opentelemetry-sdk>=1.38.0
30
30
  Requires-Dist: deep-translator>=1.11.4
31
+ Requires-Dist: pyyaml>=6.0.3
32
+ Requires-Dist: distributed>=2025.11.0
31
33
  Requires-Dist: sibi-flux[distributed,geospatial,mcp] ; extra == 'complete'
32
- Requires-Dist: distributed>=2025.11.0 ; extra == 'distributed'
33
34
  Requires-Dist: osmnx>=2.0.7 ; extra == 'geospatial'
34
35
  Requires-Dist: geopandas>=1.1.2 ; extra == 'geospatial'
35
36
  Requires-Dist: geopy>=2.4.1 ; extra == 'geospatial'
@@ -37,14 +38,12 @@ Requires-Dist: folium>=0.20.0 ; extra == 'geospatial'
37
38
  Requires-Dist: osmium>=4.2.0 ; extra == 'geospatial'
38
39
  Requires-Dist: shapely>=2.0.0 ; extra == 'geospatial'
39
40
  Requires-Dist: networkx>=3.6.1 ; extra == 'geospatial'
40
- Requires-Dist: sibi-flux[distributed] ; extra == 'mcp'
41
41
  Requires-Dist: mcp>=1.1.2 ; extra == 'mcp'
42
42
  Requires-Dist: fastapi>=0.127.0 ; extra == 'mcp'
43
43
  Requires-Dist: uvicorn>=0.40.0 ; extra == 'mcp'
44
44
  Requires-Dist: httpx>=0.28.1 ; extra == 'mcp'
45
45
  Requires-Python: >=3.11
46
46
  Provides-Extra: complete
47
- Provides-Extra: distributed
48
47
  Provides-Extra: geospatial
49
48
  Provides-Extra: mcp
50
49
  Description-Content-Type: text/markdown
@@ -282,3 +281,43 @@ async with GenericMcpClient(url="http://localhost:8000/sse") as client:
282
281
  # Call a tool
283
282
  vat = await client.call_tool("calculate_vat", arguments={"amount": 100.0})
284
283
  ```
284
+
285
+ ### 8. Datacube Generation (`gen_dc.py`)
286
+
287
+ Automate the creation of Datacube classes and Field Maps from your database schema.
288
+
289
+ **Configuration (`discovery_params.yaml`)**
290
+
291
+ Define your generation rules in a hierarchical configuration file:
292
+
293
+ ```yaml
294
+ defaults:
295
+ backend: sqlalchemy
296
+ class_suffix: Dc
297
+
298
+ discovery:
299
+ whitelist_file: whitelist.yaml
300
+ rules_file: discovery_rules.yaml
301
+
302
+ generation:
303
+ enable_field_maps: true
304
+ ```
305
+
306
+ **Commands**
307
+
308
+ 1. **Discover**: Introspects the database and updates your whitelist/registry.
309
+ ```bash
310
+ uv run poe dc-discover
311
+ ```
312
+ * **Whitelist**: Explicitly define tables to generate. Support `custom_name` to override class names.
313
+ * **Rules**: Regex-based patterns to match tables.
314
+
315
+ 2. **Sync**: Generates Python code (Datacubes and Field Maps) based on the registry.
316
+ ```bash
317
+ uv run poe dc-sync --force
318
+ ```
319
+
320
+ **Key Features**
321
+ - **Custom Naming**: Add `custom_name: MyCube` to `whitelist.yaml` to override generated names.
322
+ - **Hierarchical Config**: Strict validation of generation parameters.
323
+ - **Field Maps**: Auto-generates type-safe mapping files for every table.
@@ -231,3 +231,43 @@ async with GenericMcpClient(url="http://localhost:8000/sse") as client:
231
231
  # Call a tool
232
232
  vat = await client.call_tool("calculate_vat", arguments={"amount": 100.0})
233
233
  ```
234
+
235
+ ### 8. Datacube Generation (`gen_dc.py`)
236
+
237
+ Automate the creation of Datacube classes and Field Maps from your database schema.
238
+
239
+ **Configuration (`discovery_params.yaml`)**
240
+
241
+ Define your generation rules in a hierarchical configuration file:
242
+
243
+ ```yaml
244
+ defaults:
245
+ backend: sqlalchemy
246
+ class_suffix: Dc
247
+
248
+ discovery:
249
+ whitelist_file: whitelist.yaml
250
+ rules_file: discovery_rules.yaml
251
+
252
+ generation:
253
+ enable_field_maps: true
254
+ ```
255
+
256
+ **Commands**
257
+
258
+ 1. **Discover**: Introspects the database and updates your whitelist/registry.
259
+ ```bash
260
+ uv run poe dc-discover
261
+ ```
262
+ * **Whitelist**: Explicitly define tables to generate. Support `custom_name` to override class names.
263
+ * **Rules**: Regex-based patterns to match tables.
264
+
265
+ 2. **Sync**: Generates Python code (Datacubes and Field Maps) based on the registry.
266
+ ```bash
267
+ uv run poe dc-sync --force
268
+ ```
269
+
270
+ **Key Features**
271
+ - **Custom Naming**: Add `custom_name: MyCube` to `whitelist.yaml` to override generated names.
272
+ - **Hierarchical Config**: Strict validation of generation parameters.
273
+ - **Field Maps**: Auto-generates type-safe mapping files for every table.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "sibi-flux"
3
- version = "2026.1.1"
3
+ version = "2026.1.3"
4
4
  description = "Sibi Toolkit: A collection of tools for Data Analysis/Engineering."
5
5
  readme = "README.md"
6
6
  authors = [
@@ -34,14 +34,12 @@ dependencies = [
34
34
  "opentelemetry-exporter-otlp>=1.38.0",
35
35
  "opentelemetry-sdk>=1.38.0",
36
36
  "deep-translator>=1.11.4",
37
+ "pyyaml>=6.0.3",
38
+ "distributed>=2025.11.0",
37
39
  ]
38
40
 
39
41
  [project.optional-dependencies]
40
- distributed = [
41
- "distributed>=2025.11.0",
42
- ]
43
42
  mcp = [
44
- "sibi-flux[distributed]",
45
43
  "mcp>=1.1.2",
46
44
  "fastapi>=0.127.0",
47
45
  "uvicorn>=0.40.0",
@@ -60,6 +58,9 @@ complete = [
60
58
  "sibi-flux[distributed,geospatial,mcp]"
61
59
  ]
62
60
 
61
+ [project.scripts]
62
+ sibi-flux = "sibi_flux.cli:app"
63
+
63
64
 
64
65
  [dependency-groups]
65
66
  dev = [
@@ -90,6 +91,14 @@ build-backend = "uv_build"
90
91
  module-root = "src"
91
92
  module-name = ["sibi_flux", "sibi_dst"]
92
93
 
94
+ [tool.uv.workspace]
95
+ members = [
96
+ "test-project-alpha",
97
+ "test-prj",
98
+ "test_prj",
99
+ "test_prj_verify",
100
+ ]
101
+
93
102
  [tool.pytest.ini_options]
94
103
  pythonpath = ["src", "."]
95
104
  testpaths = ["tests"]
@@ -28,7 +28,6 @@ from sibi_flux import dask_cluster
28
28
  from sibi_flux.utils import clickhouse_writer
29
29
  from sibi_flux import parquet
30
30
 
31
-
32
31
  __all__ = [
33
32
  "__version__",
34
33
  "Logger",
@@ -0,0 +1,68 @@
1
+ import typer
2
+ from typing import Optional
3
+ from pathlib import Path
4
+ from rich.console import Console
5
+ from sibi_flux.init.core import initialize_project
6
+
7
+ app = typer.Typer(help="Sibi Flux CLI")
8
+ console = Console()
9
+
10
+
11
+ @app.callback()
12
+ def callback():
13
+ """
14
+ Sibi Flux CLI
15
+ """
16
+
17
+
18
+ @app.command()
19
+ def init(
20
+ project_name: str = typer.Argument(..., help="Name of the project to create"),
21
+ lib: bool = typer.Option(
22
+ False, "--lib", help="Initialize as a library project (passed to uv init)"
23
+ ),
24
+ app: bool = typer.Option(
25
+ False, "--app", help="Initialize as an application project (passed to uv init)"
26
+ ),
27
+ ):
28
+ """
29
+ Initialize a new Sibi Flux project.
30
+
31
+ Creates a new directory <project_name>, initializes it with 'uv',
32
+ and adds 'sibi-flux' as a dependency.
33
+ """
34
+ initialize_project(project_name, lib, app)
35
+
36
+
37
+ @app.command()
38
+ def env(
39
+ project_path: Path = typer.Argument(Path("."), help="Project root directory"),
40
+ env_file: Optional[Path] = typer.Option(
41
+ None, "--env-file", "-e", help="Path to environment file (defaults to .env)"
42
+ ),
43
+ cleanup: bool = typer.Option(
44
+ False, "--cleanup", help="Remove existing configuration files"
45
+ ),
46
+ production: bool = typer.Option(
47
+ False,
48
+ "--production",
49
+ "-p",
50
+ help="Generate production skeleton (no hardcoded values)",
51
+ ),
52
+ ):
53
+ """
54
+ Initialize configuration files (settings.py, credentials) based on .env
55
+ """
56
+ from sibi_flux.init.env import init_env
57
+
58
+ init_env(project_path, env_file, cleanup=cleanup, production_mode=production)
59
+
60
+
61
+ # Mount Datacube CLI
62
+ from sibi_flux.datacube.cli import app as dc_app
63
+
64
+ app.add_typer(dc_app, name="dc", help="Datacube generation and management commands")
65
+
66
+
67
+ if __name__ == "__main__":
68
+ app()
@@ -1,4 +1,4 @@
1
- from typing import Optional, Any
1
+ from typing import Optional, Any, ClassVar
2
2
  from pydantic import SecretStr
3
3
  from pydantic_settings import BaseSettings, SettingsConfigDict
4
4
 
@@ -10,6 +10,8 @@ class SibiBaseSettings(BaseSettings):
10
10
  env_file=".env", env_file_encoding="utf-8", extra="ignore"
11
11
  )
12
12
 
13
+ conf_name: ClassVar[str] = ""
14
+
13
15
 
14
16
  class FsSettings(SibiBaseSettings):
15
17
  """Common filesystem settings."""
@@ -84,13 +86,8 @@ class DatabaseSettings(SibiBaseSettings):
84
86
  """Generic SQL Database settings."""
85
87
 
86
88
  db_url: str = "sqlite:///:memory:"
87
-
88
-
89
- class ClickhouseBaseSettings(SibiBaseSettings):
90
- """Base settings for ClickHouse connection."""
91
-
92
89
  host: str = "localhost"
93
- port: int = 8123
90
+ port: int = 5432
94
91
  database: str = "default"
95
92
  user: str = "default"
96
93
  password: SecretStr = SecretStr("secret")
@@ -102,6 +99,7 @@ class ClickhouseBaseSettings(SibiBaseSettings):
102
99
  "dbname": self.database,
103
100
  "user": self.user,
104
101
  "password": self.password.get_secret_value() if self.password else None,
102
+ "db_url": self.db_url,
105
103
  }
106
104
 
107
105
 
@@ -210,6 +210,7 @@ class Datacube(DfHelper):
210
210
  Offloads synchronous validation (CPU bound) to a thread.
211
211
  """
212
212
  import asyncio
213
+
213
214
  return await asyncio.to_thread(self.validate_data, df)
214
215
 
215
216
  def get_ddl(self, table_name: Optional[str] = None) -> str: