boti-data 1.3.5__tar.gz → 1.3.6__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 (120) hide show
  1. {boti_data-1.3.5 → boti_data-1.3.6}/PKG-INFO +6 -7
  2. {boti_data-1.3.5 → boti_data-1.3.6}/README.md +5 -6
  3. {boti_data-1.3.5 → boti_data-1.3.6}/pyproject.toml +1 -1
  4. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/helper.py +4 -0
  5. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data.egg-info/PKG-INFO +6 -7
  6. {boti_data-1.3.5 → boti_data-1.3.6}/setup.cfg +0 -0
  7. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/__init__.py +0 -0
  8. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/arrow_schema.py +0 -0
  9. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/connection_catalog.py +0 -0
  10. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/datacube/__init__.py +0 -0
  11. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/datacube/artifact.py +0 -0
  12. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/datacube/base.py +0 -0
  13. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/datacube/contract.py +0 -0
  14. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/datacube/resource.py +0 -0
  15. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/dataset/__init__.py +0 -0
  16. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/dataset/hybrid.py +0 -0
  17. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/dataset/hybrid_support.py +0 -0
  18. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/db/__init__.py +0 -0
  19. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/db/arrow_schema_mapper.py +0 -0
  20. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/db/engine_registry.py +0 -0
  21. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/db/partitioned_execution.py +0 -0
  22. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/db/partitioned_loader.py +0 -0
  23. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/db/partitioned_planner.py +0 -0
  24. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/db/partitioned_planner_async.py +0 -0
  25. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/db/partitioned_planning_math.py +0 -0
  26. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/db/partitioned_row_materialization.py +0 -0
  27. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/db/partitioned_statements.py +0 -0
  28. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/db/partitioned_types.py +0 -0
  29. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/db/sql_config.py +0 -0
  30. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/db/sql_engine.py +0 -0
  31. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/db/sql_manager.py +0 -0
  32. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/db/sql_model_builder.py +0 -0
  33. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/db/sql_model_module_injection.py +0 -0
  34. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/db/sql_model_registry.py +0 -0
  35. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/db/sql_model_registry_types.py +0 -0
  36. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/db/sql_readonly.py +0 -0
  37. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/db/sql_repository.py +0 -0
  38. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/db/sql_resource.py +0 -0
  39. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/db/sqlalchemy_async.py +0 -0
  40. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/db/vector_search.py +0 -0
  41. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/enrichment/__init__.py +0 -0
  42. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/enrichment/async_enricher.py +0 -0
  43. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/enrichment/composite.py +0 -0
  44. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/enrichment/protocol.py +0 -0
  45. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/enrichment/specs.py +0 -0
  46. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/enrichment/transformers.py +0 -0
  47. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/field_map.py +0 -0
  48. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/filters/__init__.py +0 -0
  49. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/filters/arrow_kernels.py +0 -0
  50. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/filters/arrow_kernels_comparison.py +0 -0
  51. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/filters/arrow_kernels_compile.py +0 -0
  52. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/filters/arrow_kernels_string.py +0 -0
  53. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/filters/backend_ops.py +0 -0
  54. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/filters/expressions.py +0 -0
  55. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/filters/handler.py +0 -0
  56. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/filters/parquet_compiler.py +0 -0
  57. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/filters/utils.py +0 -0
  58. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/filters/value_parsing.py +0 -0
  59. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/gateway/__init__.py +0 -0
  60. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/gateway/_backend_strategies.py +0 -0
  61. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/gateway/_factory.py +0 -0
  62. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/gateway/_gateway_init.py +0 -0
  63. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/gateway/_payloads.py +0 -0
  64. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/gateway/_series_filters.py +0 -0
  65. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/gateway/arrow_adapters.py +0 -0
  66. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/gateway/build_context.py +0 -0
  67. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/gateway/chunking.py +0 -0
  68. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/gateway/configured_load.py +0 -0
  69. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/gateway/core.py +0 -0
  70. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/gateway/core_describe.py +0 -0
  71. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/gateway/core_load.py +0 -0
  72. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/gateway/datacube_strategy.py +0 -0
  73. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/gateway/frame_convert.py +0 -0
  74. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/gateway/frame_strategies.py +0 -0
  75. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/gateway/incremental.py +0 -0
  76. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/gateway/load_execution.py +0 -0
  77. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/gateway/load_request.py +0 -0
  78. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/gateway/loaders.py +0 -0
  79. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/gateway/normalization.py +0 -0
  80. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/gateway/parquet_strategy.py +0 -0
  81. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/gateway/planning.py +0 -0
  82. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/gateway/policies.py +0 -0
  83. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/gateway/post_process.py +0 -0
  84. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/gateway/requests.py +0 -0
  85. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/gateway/return_type.py +0 -0
  86. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/gateway/select_cache.py +0 -0
  87. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/gateway/semi_join.py +0 -0
  88. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/gateway/sql_describe.py +0 -0
  89. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/gateway/sql_guard.py +0 -0
  90. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/gateway/sql_partitioned_exec.py +0 -0
  91. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/gateway/sql_size_estimation.py +0 -0
  92. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/gateway/sql_strategy.py +0 -0
  93. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/gateway/sql_strategy_configured_async.py +0 -0
  94. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/joins.py +0 -0
  95. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/parquet/__init__.py +0 -0
  96. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/parquet/config.py +0 -0
  97. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/parquet/discovery.py +0 -0
  98. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/parquet/file_info.py +0 -0
  99. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/parquet/filesystem.py +0 -0
  100. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/parquet/reader.py +0 -0
  101. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/parquet/reader_config.py +0 -0
  102. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/parquet/resource.py +0 -0
  103. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/parquet/schema_filters.py +0 -0
  104. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/pipelines/__init__.py +0 -0
  105. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/pipelines/base.py +0 -0
  106. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/pipelines/parquet_pipeline.py +0 -0
  107. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/pipelines/registry.py +0 -0
  108. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/pipelines/sinks.py +0 -0
  109. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/pipelines/sinks_common.py +0 -0
  110. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/pipelines/sinks_parquet.py +0 -0
  111. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/pipelines/sinks_text.py +0 -0
  112. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/py.typed +0 -0
  113. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/schema.py +0 -0
  114. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/watermark/__init__.py +0 -0
  115. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/watermark/incremental.py +0 -0
  116. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data/watermark/store.py +0 -0
  117. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data.egg-info/SOURCES.txt +0 -0
  118. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data.egg-info/dependency_links.txt +0 -0
  119. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data.egg-info/requires.txt +0 -0
  120. {boti_data-1.3.5 → boti_data-1.3.6}/src/boti_data.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boti-data
3
- Version: 1.3.5
3
+ Version: 1.3.6
4
4
  Summary: Data infrastructure for the Boti ecosystem
5
5
  Author: Luis Valverde
6
6
  Maintainer-email: Luis Valverde <lvalverdeb@gmail.com>
@@ -610,13 +610,13 @@ with apply_recommended_dask_config():
610
610
 
611
611
  ### Dry-run and preview on gateway loads
612
612
 
613
- Use `dry_run=True` to build and inspect a lazy Dask load graph without materializing it, and `preview(...)` / `apreview(...)` to safely sample rows inside the session:
613
+ Use `dry_run=True` to build and inspect a lazy Dask load graph without materializing it, and `limit=` to safely sample rows inside the session:
614
614
 
615
615
  ```python
616
616
  with DataHelper.session(scheduler_address="tcp://scheduler:8786", verify_connectivity=True) as client:
617
617
  with DataHelper(config, table="transactions") as helper:
618
618
  ddf = helper.dask.load(year=2024, dry_run=True, diagnostics=True)
619
- preview = helper.dask.preview(year=2024, n=5)
619
+ sample = helper.dask.load(year=2024, limit=5).compute()
620
620
  ```
621
621
 
622
622
  ### Resilient joins
@@ -702,7 +702,7 @@ with DataHelper.session(scheduler_address="tcp://scheduler:8786") as client:
702
702
  by_region = ddf.groupby("region").size().compute()
703
703
 
704
704
  # Preview persisted data before the managed session closes.
705
- preview = helper.preview(year=2024, n=5, persist=True)
705
+ sample = helper.load(year=2024, limit=5, persist=True).compute()
706
706
  ```
707
707
 
708
708
  ### Shared sessions for repeated notebook cells
@@ -996,8 +996,7 @@ with SqlDatabaseResource(config) as db:
996
996
  from boti_data import DataGateway, SqlDatabaseConfig
997
997
 
998
998
  gateway = DataGateway(
999
- backend="sqlalchemy",
1000
- config=SqlDatabaseConfig(connection_url="sqlite:///example.db", query_only=True),
999
+ SqlDatabaseConfig(connection_url="sqlite:///example.db", query_only=True),
1001
1000
  )
1002
1001
  ```
1003
1002
 
@@ -1045,7 +1044,7 @@ config = SqlDatabaseConfig(
1045
1044
  worker_connection_env_var="DB_URL",
1046
1045
  )
1047
1046
 
1048
- with DataHelper.session(cluster_factory=LocalCluster, n_workers=4) as client:
1047
+ with DataHelper.session(cluster_factory=LocalCluster, cluster_kwargs={"n_workers": 4}) as client:
1049
1048
  with DataHelper(config, table="events") as helper:
1050
1049
  ddf = helper.dask.load(event_type="purchase", persist=True)
1051
1050
  result = ddf.groupby("user_id").size().compute()
@@ -575,13 +575,13 @@ with apply_recommended_dask_config():
575
575
 
576
576
  ### Dry-run and preview on gateway loads
577
577
 
578
- Use `dry_run=True` to build and inspect a lazy Dask load graph without materializing it, and `preview(...)` / `apreview(...)` to safely sample rows inside the session:
578
+ Use `dry_run=True` to build and inspect a lazy Dask load graph without materializing it, and `limit=` to safely sample rows inside the session:
579
579
 
580
580
  ```python
581
581
  with DataHelper.session(scheduler_address="tcp://scheduler:8786", verify_connectivity=True) as client:
582
582
  with DataHelper(config, table="transactions") as helper:
583
583
  ddf = helper.dask.load(year=2024, dry_run=True, diagnostics=True)
584
- preview = helper.dask.preview(year=2024, n=5)
584
+ sample = helper.dask.load(year=2024, limit=5).compute()
585
585
  ```
586
586
 
587
587
  ### Resilient joins
@@ -667,7 +667,7 @@ with DataHelper.session(scheduler_address="tcp://scheduler:8786") as client:
667
667
  by_region = ddf.groupby("region").size().compute()
668
668
 
669
669
  # Preview persisted data before the managed session closes.
670
- preview = helper.preview(year=2024, n=5, persist=True)
670
+ sample = helper.load(year=2024, limit=5, persist=True).compute()
671
671
  ```
672
672
 
673
673
  ### Shared sessions for repeated notebook cells
@@ -961,8 +961,7 @@ with SqlDatabaseResource(config) as db:
961
961
  from boti_data import DataGateway, SqlDatabaseConfig
962
962
 
963
963
  gateway = DataGateway(
964
- backend="sqlalchemy",
965
- config=SqlDatabaseConfig(connection_url="sqlite:///example.db", query_only=True),
964
+ SqlDatabaseConfig(connection_url="sqlite:///example.db", query_only=True),
966
965
  )
967
966
  ```
968
967
 
@@ -1010,7 +1009,7 @@ config = SqlDatabaseConfig(
1010
1009
  worker_connection_env_var="DB_URL",
1011
1010
  )
1012
1011
 
1013
- with DataHelper.session(cluster_factory=LocalCluster, n_workers=4) as client:
1012
+ with DataHelper.session(cluster_factory=LocalCluster, cluster_kwargs={"n_workers": 4}) as client:
1014
1013
  with DataHelper(config, table="events") as helper:
1015
1014
  ddf = helper.dask.load(event_type="purchase", persist=True)
1016
1015
  result = ddf.groupby("user_id").size().compute()
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "boti-data"
3
- version = "1.3.5"
3
+ version = "1.3.6"
4
4
  description = "Data infrastructure for the Boti ecosystem"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.13"
@@ -140,6 +140,8 @@ def _left_join(
140
140
  left_on: Sequence[str] | None = None,
141
141
  right_on: Sequence[str] | None = None,
142
142
  persist: bool = False,
143
+ resilient: bool = False,
144
+ dry_run: bool = False,
143
145
  reset_index: bool = True,
144
146
  diagnostics: bool = False,
145
147
  logger: Any | None = None,
@@ -152,6 +154,8 @@ def _left_join(
152
154
  join_key=join_key,
153
155
  join_schema_map=join_schema_map,
154
156
  persist=persist,
157
+ resilient=resilient,
158
+ dry_run=dry_run,
155
159
  reset_index=reset_index,
156
160
  diagnostics=diagnostics,
157
161
  logger=logger,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boti-data
3
- Version: 1.3.5
3
+ Version: 1.3.6
4
4
  Summary: Data infrastructure for the Boti ecosystem
5
5
  Author: Luis Valverde
6
6
  Maintainer-email: Luis Valverde <lvalverdeb@gmail.com>
@@ -610,13 +610,13 @@ with apply_recommended_dask_config():
610
610
 
611
611
  ### Dry-run and preview on gateway loads
612
612
 
613
- Use `dry_run=True` to build and inspect a lazy Dask load graph without materializing it, and `preview(...)` / `apreview(...)` to safely sample rows inside the session:
613
+ Use `dry_run=True` to build and inspect a lazy Dask load graph without materializing it, and `limit=` to safely sample rows inside the session:
614
614
 
615
615
  ```python
616
616
  with DataHelper.session(scheduler_address="tcp://scheduler:8786", verify_connectivity=True) as client:
617
617
  with DataHelper(config, table="transactions") as helper:
618
618
  ddf = helper.dask.load(year=2024, dry_run=True, diagnostics=True)
619
- preview = helper.dask.preview(year=2024, n=5)
619
+ sample = helper.dask.load(year=2024, limit=5).compute()
620
620
  ```
621
621
 
622
622
  ### Resilient joins
@@ -702,7 +702,7 @@ with DataHelper.session(scheduler_address="tcp://scheduler:8786") as client:
702
702
  by_region = ddf.groupby("region").size().compute()
703
703
 
704
704
  # Preview persisted data before the managed session closes.
705
- preview = helper.preview(year=2024, n=5, persist=True)
705
+ sample = helper.load(year=2024, limit=5, persist=True).compute()
706
706
  ```
707
707
 
708
708
  ### Shared sessions for repeated notebook cells
@@ -996,8 +996,7 @@ with SqlDatabaseResource(config) as db:
996
996
  from boti_data import DataGateway, SqlDatabaseConfig
997
997
 
998
998
  gateway = DataGateway(
999
- backend="sqlalchemy",
1000
- config=SqlDatabaseConfig(connection_url="sqlite:///example.db", query_only=True),
999
+ SqlDatabaseConfig(connection_url="sqlite:///example.db", query_only=True),
1001
1000
  )
1002
1001
  ```
1003
1002
 
@@ -1045,7 +1044,7 @@ config = SqlDatabaseConfig(
1045
1044
  worker_connection_env_var="DB_URL",
1046
1045
  )
1047
1046
 
1048
- with DataHelper.session(cluster_factory=LocalCluster, n_workers=4) as client:
1047
+ with DataHelper.session(cluster_factory=LocalCluster, cluster_kwargs={"n_workers": 4}) as client:
1049
1048
  with DataHelper(config, table="events") as helper:
1050
1049
  ddf = helper.dask.load(event_type="purchase", persist=True)
1051
1050
  result = ddf.groupby("user_id").size().compute()
File without changes