sibi-flux 2026.1.3__tar.gz → 2026.1.5__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 (125) hide show
  1. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/PKG-INFO +4 -4
  2. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/README.md +3 -3
  3. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/pyproject.toml +2 -2
  4. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/config/settings.py +21 -0
  5. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/datacube/field_factory.py +1 -0
  6. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/datacube/router.py +5 -0
  7. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/df_validator/_df_validator.py +1 -0
  8. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_dst/__init__.py +0 -0
  9. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/__init__.py +0 -0
  10. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/artifacts/__init__.py +0 -0
  11. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/artifacts/base.py +0 -0
  12. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/artifacts/parquet.py +0 -0
  13. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/artifacts/parquet_engine/__init__.py +0 -0
  14. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/artifacts/parquet_engine/executor.py +0 -0
  15. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/artifacts/parquet_engine/manifest.py +0 -0
  16. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/artifacts/parquet_engine/planner.py +0 -0
  17. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/cli.py +0 -0
  18. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/config/__init__.py +0 -0
  19. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/config/manager.py +0 -0
  20. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/core/__init__.py +0 -0
  21. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/core/managed_resource/__init__.py +0 -0
  22. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/core/managed_resource/_managed_resource.py +0 -0
  23. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/core/type_maps/__init__.py +0 -0
  24. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/dask_cluster/__init__.py +0 -0
  25. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/dask_cluster/async_core.py +0 -0
  26. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/dask_cluster/client_manager.py +0 -0
  27. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/dask_cluster/core.py +0 -0
  28. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/dask_cluster/exceptions.py +0 -0
  29. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/dask_cluster/utils.py +0 -0
  30. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/datacube/__init__.py +0 -0
  31. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/datacube/_data_cube.py +0 -0
  32. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/datacube/cli.py +0 -0
  33. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/datacube/config_engine.py +0 -0
  34. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/datacube/field_mapper.py +0 -0
  35. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/datacube/field_registry.py +0 -0
  36. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/datacube/generator.py +0 -0
  37. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/datacube/orchestrator.py +0 -0
  38. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/dataset/__init__.py +0 -0
  39. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/dataset/_dataset.py +0 -0
  40. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/dataset/hybrid_loader.py +0 -0
  41. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/df_enricher/__init__.py +0 -0
  42. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/df_enricher/async_enricher.py +0 -0
  43. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/df_enricher/attacher.py +0 -0
  44. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/df_enricher/merger.py +0 -0
  45. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/df_enricher/specs.py +0 -0
  46. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/df_enricher/types.py +0 -0
  47. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/df_helper/__init__.py +0 -0
  48. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/df_helper/_df_helper.py +0 -0
  49. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/df_helper/backends/__init__.py +0 -0
  50. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/df_helper/backends/_params.py +0 -0
  51. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/df_helper/backends/_strategies.py +0 -0
  52. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/df_helper/backends/http/__init__.py +0 -0
  53. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/df_helper/backends/http/_http_config.py +0 -0
  54. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/df_helper/backends/parquet/__init__.py +0 -0
  55. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/df_helper/backends/parquet/_parquet_options.py +0 -0
  56. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/df_helper/backends/sqlalchemy/__init__.py +0 -0
  57. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/df_helper/backends/sqlalchemy/_db_connection.py +0 -0
  58. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/df_helper/backends/sqlalchemy/_db_gatekeeper.py +0 -0
  59. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/df_helper/backends/sqlalchemy/_io_dask.py +0 -0
  60. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/df_helper/backends/sqlalchemy/_load_from_db.py +0 -0
  61. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/df_helper/backends/sqlalchemy/_model_registry.py +0 -0
  62. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/df_helper/backends/sqlalchemy/_sql_model_builder.py +0 -0
  63. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/df_helper/backends/utils.py +0 -0
  64. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/df_helper/core/__init__.py +0 -0
  65. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/df_helper/core/_defaults.py +0 -0
  66. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/df_helper/core/_filter_handler.py +0 -0
  67. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/df_helper/core/_params_config.py +0 -0
  68. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/df_helper/core/_query_config.py +0 -0
  69. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/df_validator/__init__.py +0 -0
  70. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/init/__init__.py +0 -0
  71. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/init/core.py +0 -0
  72. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/init/discovery_updater.py +0 -0
  73. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/init/env.py +0 -0
  74. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/init/env_engine.py +0 -0
  75. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/init/env_generator.py +0 -0
  76. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/init/rule_generator.py +0 -0
  77. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/init/templates/__init__.py +0 -0
  78. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/init/templates/discovery_params.yaml +0 -0
  79. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/init/templates/gen_dc.py +0 -0
  80. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/init/templates/property_template.yaml +0 -0
  81. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/logger/__init__.py +0 -0
  82. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/logger/_logger.py +0 -0
  83. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/mcp/__init__.py +0 -0
  84. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/mcp/client.py +0 -0
  85. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/mcp/router.py +0 -0
  86. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/orchestration/__init__.py +0 -0
  87. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/orchestration/_artifact_orchestrator.py +0 -0
  88. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/orchestration/_pipeline_executor.py +0 -0
  89. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/osmnx_helper/__init__.py +0 -0
  90. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/osmnx_helper/_pbf_handler.py +0 -0
  91. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/osmnx_helper/graph_loader.py +0 -0
  92. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/osmnx_helper/utils.py +0 -0
  93. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/parquet/__init__.py +0 -0
  94. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/parquet/readers/__init__.py +0 -0
  95. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/parquet/readers/base.py +0 -0
  96. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/parquet/readers/parquet.py +0 -0
  97. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/parquet/saver/__init__.py +0 -0
  98. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/parquet/saver/_parquet_saver.py +0 -0
  99. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/parquet/saver/_write_gatekeeper.py +0 -0
  100. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/pipelines/__init__.py +0 -0
  101. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/pipelines/base.py +0 -0
  102. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/pipelines/template.py +0 -0
  103. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/py.typed +0 -0
  104. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/readers/__init__.py +0 -0
  105. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/readers/base.py +0 -0
  106. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/storage/__init__.py +0 -0
  107. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/storage/_fs_registry.py +0 -0
  108. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/storage/_storage_manager.py +0 -0
  109. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/storage/factory.py +0 -0
  110. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/utils/__init__.py +0 -0
  111. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/utils/clickhouse_writer/__init__.py +0 -0
  112. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/utils/clickhouse_writer/_clickhouse_writer.py +0 -0
  113. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/utils/common.py +0 -0
  114. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/utils/dask_utils.py +0 -0
  115. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/utils/data_utils/__init__.py +0 -0
  116. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/utils/data_utils/_data_utils.py +0 -0
  117. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/utils/dataframe_utils.py +0 -0
  118. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/utils/date_utils/__init__.py +0 -0
  119. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/utils/date_utils/_business_days.py +0 -0
  120. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/utils/date_utils/_date_utils.py +0 -0
  121. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/utils/date_utils/_file_age_checker.py +0 -0
  122. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/utils/file_utils.py +0 -0
  123. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/utils/filepath_generator/__init__.py +0 -0
  124. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/src/sibi_flux/utils/filepath_generator/_filepath_generator.py +0 -0
  125. {sibi_flux-2026.1.3 → sibi_flux-2026.1.5}/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.3
3
+ Version: 2026.1.5
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>
@@ -54,18 +54,18 @@ Description-Content-Type: text/markdown
54
54
 
55
55
  ```mermaid
56
56
  graph TD
57
- subgraph "Agentic Interface (MCP)"
57
+ subgraph G1["Agentic Interface (MCP)"]
58
58
  Agent["AI Agent / Claude"] <--> Router["MCP Router"]
59
59
  Router <--> Resources["SibiFlux Resources"]
60
60
  end
61
61
 
62
- subgraph "Solutions Layer (Business Logic)"
62
+ subgraph G2["Solutions Layer (Business Logic)"]
63
63
  Logistics["Logistics Solutions"]
64
64
  Enrichment["Enrichment Pipelines"]
65
65
  Cubes["DataCubes"]
66
66
  end
67
67
 
68
- subgraph "SibiFlux Core Engine"
68
+ subgraph G3["SibiFlux Core Engine"]
69
69
  DfHelper["DfHelper (Unified Loader)"]
70
70
  Cluster["Resilient Dask Cluster"]
71
71
  Managed["ManagedResource Lifecycle"]
@@ -4,18 +4,18 @@
4
4
 
5
5
  ```mermaid
6
6
  graph TD
7
- subgraph "Agentic Interface (MCP)"
7
+ subgraph G1["Agentic Interface (MCP)"]
8
8
  Agent["AI Agent / Claude"] <--> Router["MCP Router"]
9
9
  Router <--> Resources["SibiFlux Resources"]
10
10
  end
11
11
 
12
- subgraph "Solutions Layer (Business Logic)"
12
+ subgraph G2["Solutions Layer (Business Logic)"]
13
13
  Logistics["Logistics Solutions"]
14
14
  Enrichment["Enrichment Pipelines"]
15
15
  Cubes["DataCubes"]
16
16
  end
17
17
 
18
- subgraph "SibiFlux Core Engine"
18
+ subgraph G3["SibiFlux Core Engine"]
19
19
  DfHelper["DfHelper (Unified Loader)"]
20
20
  Cluster["Resilient Dask Cluster"]
21
21
  Managed["ManagedResource Lifecycle"]
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "sibi-flux"
3
- version = "2026.1.3"
3
+ version = "2026.1.5"
4
4
  description = "Sibi Toolkit: A collection of tools for Data Analysis/Engineering."
5
5
  readme = "README.md"
6
6
  authors = [
@@ -117,7 +117,7 @@ uvicorn solutions.main:app
117
117
  --env-file .env.linux
118
118
  --workers 1
119
119
  """
120
- test = { cmd = "pytest tests/"}
120
+ test = { cmd = "pytest tests/", env = { SIBI_FLUX_ROUTER_INTROSPECTION = "false" } }
121
121
  lint = "black src/"
122
122
  build = "uv build"
123
123
  dc-sync = "python solutions/generators/datacubes/gen_dc.py sync"
@@ -103,6 +103,27 @@ class DatabaseSettings(SibiBaseSettings):
103
103
  }
104
104
 
105
105
 
106
+ class ClickhouseBaseSettings(SibiBaseSettings):
107
+ """Base settings for ClickHouse connection."""
108
+
109
+ interface: str = "http"
110
+ host: str = "localhost"
111
+ port: int = 8123
112
+ database: str = "default"
113
+ username: str = "default"
114
+ password: SecretStr = SecretStr("")
115
+
116
+ def to_legacy_dict(self) -> dict[str, Any]:
117
+ return {
118
+ "interface": self.interface,
119
+ "host": self.host,
120
+ "port": self.port,
121
+ "database": self.database,
122
+ "username": self.username,
123
+ "password": self.password.get_secret_value() if self.password else None,
124
+ }
125
+
126
+
106
127
  class RedisBaseSettings(SibiBaseSettings):
107
128
  """Base settings for Redis connection."""
108
129
 
@@ -72,6 +72,7 @@ class FieldMapFactory:
72
72
  # 2. Fallback to standard locations if not found
73
73
  if not repo_path:
74
74
  candidates = [
75
+ Path("solutions/dataobjects/globals/global_field_repository.yaml"),
75
76
  Path("dataobjects/globals/global_field_repository.yaml"),
76
77
  Path("solutions/conf/global_field_repository.yaml"),
77
78
  ]
@@ -1,5 +1,6 @@
1
1
  import asyncio
2
2
  import json
3
+ import os
3
4
  from contextlib import suppress
4
5
  from collections.abc import Mapping
5
6
  from typing import Any, Optional, Type, Sequence, List
@@ -68,6 +69,10 @@ class BaseCubeRouter:
68
69
  _exclude_columns = ["id"]
69
70
 
70
71
  try:
72
+ # Check if introspection is allowed via env var (default: true)
73
+ if os.environ.get("SIBI_FLUX_ROUTER_INTROSPECTION", "true").lower() == "false":
74
+ return self._fallback_create_model(_exclude_columns)
75
+
71
76
  # Introspect dtypes by loading an empty slice/schema
72
77
  # We use n_records=1 at init to hint the backend to limit query size
73
78
  # Note: This requires the DB/Backend to be accessible at startup
@@ -75,6 +75,7 @@ class DfValidator:
75
75
  "float64": "Float64[pyarrow]",
76
76
  "string": "string[pyarrow]",
77
77
  "timestamp[ns][pyarrow]": "datetime64[ns, UTC]",
78
+ "datetime64[us, UTC]": "datetime64[ns, UTC]",
78
79
  "bool": "boolean[pyarrow]",
79
80
  }
80
81
  return mapping.get(dtype_str, dtype_str)