From 280058555439aeb4b6f82027ea6aa6a95ef993cf Mon Sep 17 00:00:00 2001 From: jiangxt2 Date: Sun, 16 Aug 2026 14:00:55 +0800 Subject: [PATCH 1/3] refactor(data): migrate Daft SQL bindings to new connectors Replace the daft-olap-connectors integration with per-connector Daft bindings backed by the public daft-clickhouse and daft-doris facades. - Add DaftClickHouseBinding / DaftDorisBinding using daft_clickhouse.read_clickhouse and daft_doris.read_doris; new binding IDs daft_clickhouse.daft.clickhouse and daft_doris.daft.doris - Replace the old distribution identity in descriptors, dependency checks, install hints and capability receipts - Fail closed on explicit 'parallel' sharding (parallel_sql_read_unsupported) and reject unsupported Doris transports - Declare drivers in extras (clickhouse-connect[arrow,async], PyMySQL, ADBC) and lock daft 0.7.23 - Keep the unpublished daft-clickhouse and daft-doris wheels outside uv.lock; E2E and runtimes install them separately - Update tests for fail-closed parallel, mysql/flight transports, descriptor identity and missing-package diagnostics; clear old package references from docs and E2E notes Signed-off-by: jiangxt2 --- README.md | 4 +- docs/architecture/call-chain-inventory.md | 2 +- docs/data/index.md | 4 +- docs/reference/support-matrix.md | 4 +- pyproject.toml | 15 +- src/tributo/data/bindings/__init__.py | 103 ++++++---- .../bindings/{daft_olap.py => _daft_sql.py} | 61 ++++-- src/tributo/data/bindings/daft_clickhouse.py | 5 + src/tributo/data/bindings/daft_doris.py | 5 + src/tributo/data/writing/native_bindings.py | 2 +- tests/data/test_engine_binding.py | 70 ++++++- .../data/test_ingestion_extension_contract.py | 6 +- tests/data/test_parquet_bindings.py | 2 +- tests/data/test_source_bindings.py | 91 ++++++--- tests/integrations/README.md | 7 +- tests/integrations/test_e2e_clickhouse.py | 2 +- tests/integrations/test_e2e_multi_class.py | 2 +- tests/support/algorithm_ingestion.py | 4 +- uv.lock | 186 ++++++++++-------- 19 files changed, 386 insertions(+), 189 deletions(-) rename src/tributo/data/bindings/{daft_olap.py => _daft_sql.py} (72%) create mode 100644 src/tributo/data/bindings/daft_clickhouse.py create mode 100644 src/tributo/data/bindings/daft_doris.py diff --git a/README.md b/README.md index 309918b..cf0fb10 100644 --- a/README.md +++ b/README.md @@ -117,8 +117,8 @@ dialect or backend you use: | Local/S3 Iceberg and Lance | Ray Data / Daft public readers | `tributo[data,data-daft]` | Alpha; real dual-engine Conformance | | PostgreSQL structured table | Ray Data / Daft SQL readers | `tributo[postgresql,data-daft]` | Alpha; real PostgreSQL Conformance | | HDFS Parquet/CSV | Ray Data + PyArrow Hadoop filesystem | Ray runtime with HDFS libraries | Adapter present; cluster gate pending | -| ClickHouse | independent `daft-olap-connectors` | external package | Adapter present; package/infrastructure gates pending | -| Doris | independent `ray-doris` / `daft-olap-connectors` | external packages | Adapters present; package/infrastructure gates pending | +| ClickHouse | independent local `daft-clickhouse` wheel | `tributo[clickhouse]` plus the connector wheel | Adapter present; package/infrastructure gates pending | +| Doris | independent `ray-doris` / local `daft-doris` wheel | `tributo[mysql]` or `tributo[doris-flight]` plus the connector wheel | Adapters present; package/infrastructure gates pending | | ORC / Hive external tables | no locked public reader path | — | Unsupported | Provider/binding presence is not a support claim. ClickHouse, Doris, HDFS, and Hive are diff --git a/docs/architecture/call-chain-inventory.md b/docs/architecture/call-chain-inventory.md index c9745d3..d825e63 100644 --- a/docs/architecture/call-chain-inventory.md +++ b/docs/architecture/call-chain-inventory.md @@ -279,7 +279,7 @@ credential-safe descriptor validation and atomic registration WriteBinding selection; native dependency import occurs at factory/execute ``` -Selected optional integrations (`ray-doris`, `daft-olap-connectors`) also have +Selected optional integrations (`ray-doris`, `daft-doris`, `daft-clickhouse`) also have thin built-in descriptors and explicit install diagnostics. Their adapters are not support claims until their external packages and infrastructure gates pass. diff --git a/docs/data/index.md b/docs/data/index.md index 66cfc24..8994037 100644 --- a/docs/data/index.md +++ b/docs/data/index.md @@ -56,8 +56,8 @@ selects `binding_id` explicitly. | Local/S3 Lance | Native reader | Native reader | Verified | | PostgreSQL structured table | Native SQL reader | Native SQL reader | Verified | | HDFS Parquet/CSV | Native reader with PyArrow HDFS | No locked public reader | Adapted; cluster gate pending | -| ClickHouse | No selected Binding | `daft-olap-connectors` | Adapter only; external package and database gates pending | -| Doris | `ray-doris` | `daft-olap-connectors` | Adapter only; external packages and database gates pending | +| ClickHouse | No selected Binding | External `daft-clickhouse` wheel | Adapter only; external package and database gates pending | +| Doris | `ray-doris` | External `daft-doris` wheel | Adapter only; external package and database gates pending | | ORC or Hive external table | No locked public reader | No locked public reader | Unsupported, fail-closed | “Verified” means the current combination has semantic Conformance and real diff --git a/docs/reference/support-matrix.md b/docs/reference/support-matrix.md index 68bca07..b25b065 100644 --- a/docs/reference/support-matrix.md +++ b/docs/reference/support-matrix.md @@ -44,8 +44,8 @@ compatible profile, while the generated `Validated profiles` column remains | PostgreSQL structured table reads | Verified | Ray uses a single public SQL read and fails closed on parallel shard requirements; Daft may use native partition hints | | ClickHouse/Doris raw SQL | Unsupported | Legacy shapes return a credential-free migration error; use structured table input or execute SQL outside Tributo ingestion | | HDFS Parquet/CSV reads | Adapter only | Ray binding exists; real HDFS/JVM/worker gate is pending | -| ClickHouse reads | Adapter only | Requires unpublished `daft-olap-connectors` and real-database Conformance; provider partition discovery is distinct from engine auto-routing | -| Doris reads | Adapter only | Requires unpublished `ray-doris` or `daft-olap-connectors` and real-database Conformance; tablet planning remains provider/binding-owned | +| ClickHouse reads | Adapter only | Requires an externally installed `daft-clickhouse` wheel and real-database Conformance; provider partition discovery is distinct from engine auto-routing | +| Doris reads | Adapter only | Requires `ray-doris` or an externally installed `daft-doris` wheel and real-database Conformance; tablet planning remains provider/binding-owned | | ORC and Hive external-table reads | Not implemented | Locked Ray/Daft versions expose no validated public reader | | Third-party ingestion Provider/Binding SPI | Implemented | Installed packages use `tributo.ingestion_providers` plus `tributo.ingestion_bindings`; bad plugins are isolated, duplicate routes never replace built-ins, and Binding selection can constrain filesystem, catalog, and storage format | | Lance output | Implemented as a generic ResultSink path | User Predictor owns vector semantics; the sink does not pool, normalize, or automatically invoke the separate vector-index workflow | diff --git a/pyproject.toml b/pyproject.toml index a0299d8..21257e4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -59,7 +59,7 @@ data = [ "pylance==9.0.0", ] data-daft = [ - "daft[lance,ray]>=0.7.0,<0.8.0", + "daft[lance,ray]>=0.7.23,<0.7.24", ] vector-index = [ "tributo[data,s3]", @@ -71,10 +71,15 @@ postgresql = [ "sqlglot<30.9.0", ] clickhouse = [ - "clickhouse-connect>=1.3.0", + "clickhouse-connect[arrow,async]>=1.5,<1.6", ] mysql = [ - "pymysql>=1.1.0", + "PyMySQL>=1.2,<1.3", +] +doris-flight = [ + "PyMySQL>=1.2,<1.3", + "adbc-driver-manager>=1.6,<2", + "adbc-driver-flightsql>=1.6,<2", ] s3 = [ "boto3>=1.42.91", @@ -336,9 +341,9 @@ dev = [ "pytest-asyncio>=1.3.0", "pytest-metadata>=3.1.1", "redis>=8.0.0", - "clickhouse-connect>=1.3.0", "mypy>=2.3.0", - "daft>=0.7.0,<0.8.0", + "clickhouse-connect[arrow,async]>=1.5,<1.6", + "daft>=0.7.23,<0.7.24", "ml-dtypes>=0.5.0", "skl2onnx>=1.17.0", ] diff --git a/src/tributo/data/bindings/__init__.py b/src/tributo/data/bindings/__init__.py index 3a3d3dd..e5af101 100644 --- a/src/tributo/data/bindings/__init__.py +++ b/src/tributo/data/bindings/__init__.py @@ -22,11 +22,19 @@ _DEFAULT_BINDINGS_LOCK = threading.Lock() _RAY_VERSION_SPEC = "==2.55.1" _DAFT_VERSION_SPEC = ">=0.7.0,<0.8.0" +_DAFT_SQL_VERSION_SPEC = ">=0.7.23,<0.7.24" _RAY_INSTALL_HINT = "pip install 'ray[default,serve,tune]==2.55.1'" _DAFT_INSTALL_HINT = "pip install 'tributo[data-daft]'" _DAFT_LANCE_INSTALL_HINT = "pip install 'tributo[data,data-daft]'" _DATA_INSTALL_HINT = "pip install 'tributo[data]'" -_DAFT_OLAP_INSTALL_HINT = "pip install 'daft-olap-connectors[clickhouse,doris]'" +_DAFT_CLICKHOUSE_INSTALL_HINT = ( + "Install a local daft-clickhouse[clickhouse] wheel, then run " + "pip install 'tributo[clickhouse]'" +) +_DAFT_DORIS_INSTALL_HINT = ( + "Install a local daft-doris[doris] wheel (or daft-doris[doris-flight] for Flight), " + "then run pip install 'tributo[mysql]' (or 'tributo[doris-flight]' for Flight)" +) _RAY_DORIS_INSTALL_HINT = "pip install 'ray-doris[mysql,flight]'" _POSTGRESQL_INSTALL_HINT = "pip install 'tributo[postgresql]'" @@ -262,33 +270,49 @@ def _daft_lance_descriptor() -> BindingDescriptor: ) -def _daft_olap_descriptor(connector_id: str) -> BindingDescriptor: - from tributo.data.bindings.daft_olap import ( - DaftClickHouseBinding, - DaftDorisBinding, - ) +def _daft_clickhouse_descriptor() -> BindingDescriptor: + from tributo.data.bindings.daft_clickhouse import DaftClickHouseBinding - factory = ( - DaftClickHouseBinding if connector_id == "clickhouse" else DaftDorisBinding - ) return BindingDescriptor( key=BindingKey( "tributo.daft", ScanKind.SQL, - connector_id, - f"daft_olap.daft.{connector_id}", + "clickhouse", + "daft_clickhouse.daft.clickhouse", ), - factory=factory, + factory=DaftClickHouseBinding, capabilities=frozenset({SourceCapability.PROJECTION}), - distribution_name="daft-olap-connectors", - distribution_version=( - _distribution_version("daft-olap-connectors") or "0.1.0a1" + distribution_name="daft-clickhouse", + distribution_version=_distribution_version("daft-clickhouse") or "0.1.0a1", + engine_version_spec=_DAFT_SQL_VERSION_SPEC, + dependency_distributions=("clickhouse-connect",), + supported_read_hints=frozenset( + {ReadHint.TARGET_PARALLELISM, ReadHint.BATCH_SIZE} ), - engine_version_spec=_DAFT_VERSION_SPEC, + install_hint=_DAFT_CLICKHOUSE_INSTALL_HINT, + ) + + +def _daft_doris_descriptor() -> BindingDescriptor: + from tributo.data.bindings.daft_doris import DaftDorisBinding + + return BindingDescriptor( + key=BindingKey( + "tributo.daft", + ScanKind.SQL, + "doris", + "daft_doris.daft.doris", + ), + factory=DaftDorisBinding, + capabilities=frozenset({SourceCapability.PROJECTION}), + distribution_name="daft-doris", + distribution_version=_distribution_version("daft-doris") or "0.1.0a1", + engine_version_spec=_DAFT_SQL_VERSION_SPEC, + dependency_distributions=("PyMySQL",), supported_read_hints=frozenset( {ReadHint.TARGET_PARALLELISM, ReadHint.BATCH_SIZE} ), - install_hint=_DAFT_OLAP_INSTALL_HINT, + install_hint=_DAFT_DORIS_INSTALL_HINT, ) @@ -570,24 +594,33 @@ def default_engine_bindings() -> EngineBindings: None, ("pylance", "daft-lance"), ), - *( - ( - lambda connector_id=connector_id: _daft_olap_descriptor( - connector_id - ), - BindingKey( - "tributo.daft", - ScanKind.SQL, - connector_id, - f"daft_olap.daft.{connector_id}", - ), - "daft", - _DAFT_VERSION_SPEC, - _DAFT_OLAP_INSTALL_HINT, - None, - ("daft-olap-connectors",), - ) - for connector_id in ("clickhouse", "doris") + ( + _daft_clickhouse_descriptor, + BindingKey( + "tributo.daft", + ScanKind.SQL, + "clickhouse", + "daft_clickhouse.daft.clickhouse", + ), + "daft", + _DAFT_SQL_VERSION_SPEC, + _DAFT_CLICKHOUSE_INSTALL_HINT, + None, + ("daft-clickhouse", "clickhouse-connect"), + ), + ( + _daft_doris_descriptor, + BindingKey( + "tributo.daft", + ScanKind.SQL, + "doris", + "daft_doris.daft.doris", + ), + "daft", + _DAFT_SQL_VERSION_SPEC, + _DAFT_DORIS_INSTALL_HINT, + None, + ("daft-doris", "PyMySQL"), ), ( _ray_doris_descriptor, diff --git a/src/tributo/data/bindings/daft_olap.py b/src/tributo/data/bindings/_daft_sql.py similarity index 72% rename from src/tributo/data/bindings/daft_olap.py rename to src/tributo/data/bindings/_daft_sql.py index 44d8445..0f2959e 100644 --- a/src/tributo/data/bindings/daft_olap.py +++ b/src/tributo/data/bindings/_daft_sql.py @@ -1,4 +1,4 @@ -"""Daft OLAP Bindings delegating to the independent connector package.""" +"""Shared Daft SQL bindings for independent database connector packages.""" from __future__ import annotations @@ -33,7 +33,7 @@ @dataclass(frozen=True) -class _DaftOlapNativePlan: +class _DaftSqlNativePlan: dataframe: Any input_schema: pa.Schema transforms: CompiledPipeline @@ -41,13 +41,25 @@ class _DaftOlapNativePlan: transport_id: str -class _DaftOlapBinding: +class _DaftSqlBinding: connector_id: ClassVar[str] + package_name: ClassVar[str] reader_api: ClassVar[str] def compile(self, request: BindingCompileRequest) -> BindingCompilation: with binding_stage("validate_capabilities"): plan = require_sql_table(request.plan, self.connector_id) + if plan.sharding.mode is SqlShardMode.PARALLEL: + raise BindingStageError.framework_diagnostic( + "validate_capabilities", + error_type=JobConfigurationError, + diagnostic_code="parallel_sql_read_unsupported", + diagnostic=( + "The Daft SQL Binding supports partitioning.mode " + "'single' or 'auto'; explicit 'parallel' with shard " + "columns is unsupported" + ), + ) if ( plan.sharding.mode is SqlShardMode.SINGLE and request.read_options.target_parallelism is not None @@ -58,10 +70,19 @@ def compile(self, request: BindingCompileRequest) -> BindingCompilation: diagnostic_code="single_sql_read_rejects_parallelism_hint", diagnostic=( "A single SQL read cannot honor target_parallelism; " - "set partitioning.mode to 'auto' or 'parallel', or " - "remove target_parallelism" + "set partitioning.mode to 'auto' or remove " + "target_parallelism" ), ) + if self.connector_id == "doris": + protocol = str(request.runtime_options.get("protocol") or "mysql") + if protocol not in {"mysql", "flight"}: + raise BindingStageError.framework_diagnostic( + "validate_capabilities", + error_type=JobConfigurationError, + diagnostic_code="unsupported_doris_transport", + diagnostic=("Doris transport must be 'mysql' or 'flight'"), + ) with binding_stage("classify_transforms"): decisions = residual_decisions(request.transforms) with binding_stage("build_native_plan"): @@ -71,9 +92,7 @@ def compile(self, request: BindingCompileRequest) -> BindingCompilation: def _build( self, request: BindingCompileRequest, plan: SqlScan - ) -> _DaftOlapNativePlan: - from daft_olap import read_clickhouse, read_doris - + ) -> _DaftSqlNativePlan: target = resolve_sql_target(plan, request.runtime_options) options: dict[str, Any] = { "host": target.host, @@ -93,11 +112,16 @@ def _build( ) if target_tasks is not None: options["target_tasks"] = target_tasks + if self.connector_id == "clickhouse": + from daft_clickhouse import read_clickhouse + options["port"] = target.port dataframe = read_clickhouse(**options) transport_id = "clickhouse_native" else: + from daft_doris import read_doris + protocol = str(request.runtime_options.get("protocol") or "mysql") options["transport"] = protocol options["mysql_port"] = target.port @@ -109,11 +133,12 @@ def _build( options["flight_port"] = int(flight_port) dataframe = read_doris(**options) transport_id = protocol + schema = canonical_engine_schema(dataframe.schema()) transforms = ConcreteTransformCompiler().compile( request.transforms, TransformBackend.DAFT, schema ) - return _DaftOlapNativePlan( + return _DaftSqlNativePlan( dataframe, schema, transforms, @@ -121,9 +146,9 @@ def _build( transport_id, ) - @staticmethod def _wrap( - native_plan: _DaftOlapNativePlan, + self, + native_plan: _DaftSqlNativePlan, decisions: tuple[TransformDecision, ...], ) -> BindingCompilation: transformed = apply_pipeline_to_daft_df( @@ -144,17 +169,21 @@ def _wrap( schema_fingerprint=schema_fingerprint(output_schema), metadata_fetched=True, physical_splits=PhysicalSplitSummary( - detail="database splits and batches are delegated to daft-olap-connectors" + detail=( + f"database splits and batches are delegated to {self.package_name}" + ) ), diagnostics=("database metadata I/O was used for schema inference",), ) -class DaftClickHouseBinding(_DaftOlapBinding): +class DaftClickHouseBinding(_DaftSqlBinding): connector_id = "clickhouse" - reader_api = "daft_olap.read_clickhouse" + package_name = "daft-clickhouse" + reader_api = "daft_clickhouse.read_clickhouse" -class DaftDorisBinding(_DaftOlapBinding): +class DaftDorisBinding(_DaftSqlBinding): connector_id = "doris" - reader_api = "daft_olap.read_doris" + package_name = "daft-doris" + reader_api = "daft_doris.read_doris" diff --git a/src/tributo/data/bindings/daft_clickhouse.py b/src/tributo/data/bindings/daft_clickhouse.py new file mode 100644 index 0000000..19c87df --- /dev/null +++ b/src/tributo/data/bindings/daft_clickhouse.py @@ -0,0 +1,5 @@ +"""Daft ClickHouse Binding using the public daft-clickhouse facade.""" + +from tributo.data.bindings._daft_sql import DaftClickHouseBinding + +__all__ = ["DaftClickHouseBinding"] diff --git a/src/tributo/data/bindings/daft_doris.py b/src/tributo/data/bindings/daft_doris.py new file mode 100644 index 0000000..57fd705 --- /dev/null +++ b/src/tributo/data/bindings/daft_doris.py @@ -0,0 +1,5 @@ +"""Daft Doris Binding using the public daft-doris facade.""" + +from tributo.data.bindings._daft_sql import DaftDorisBinding + +__all__ = ["DaftDorisBinding"] diff --git a/src/tributo/data/writing/native_bindings.py b/src/tributo/data/writing/native_bindings.py index c3bc8a0..af3d1a0 100644 --- a/src/tributo/data/writing/native_bindings.py +++ b/src/tributo/data/writing/native_bindings.py @@ -36,7 +36,7 @@ from tributo.data.writing.targets import LogicalWritePlan RAY_ENGINE_VERSION = "2.55.1" -DAFT_ENGINE_VERSION = "0.7.21" +DAFT_ENGINE_VERSION = "0.7.23" def _ray_descriptor( diff --git a/tests/data/test_engine_binding.py b/tests/data/test_engine_binding.py index c5da678..9ec9aa5 100644 --- a/tests/data/test_engine_binding.py +++ b/tests/data/test_engine_binding.py @@ -45,7 +45,7 @@ @pytest.fixture(autouse=True) def installed_versions(monkeypatch: pytest.MonkeyPatch) -> None: versions = { - "daft": "0.7.21", + "daft": "0.7.23", "pyiceberg": "0.11.1", "ray": "2.55.1", "test-binding": "1.2.3", @@ -726,6 +726,70 @@ def test_transform_decision_rejects_inconsistent_state() -> None: ) +def test_daft_sql_descriptors_use_new_package_identity( + monkeypatch: pytest.MonkeyPatch, +) -> None: + monkeypatch.setattr( + builtin_bindings, + "_distribution_version", + lambda name: { + "daft-clickhouse": "0.1.0a1", + "daft-doris": "0.1.0a1", + }.get(name), + ) + + clickhouse = builtin_bindings._daft_clickhouse_descriptor() + doris = builtin_bindings._daft_doris_descriptor() + + assert clickhouse.key.binding_id == "daft_clickhouse.daft.clickhouse" + assert clickhouse.distribution_name == "daft-clickhouse" + assert clickhouse.dependency_distributions == ("clickhouse-connect",) + assert doris.key.binding_id == "daft_doris.daft.doris" + assert doris.distribution_name == "daft-doris" + assert doris.dependency_distributions == ("PyMySQL",) + + +def test_missing_daft_sql_packages_report_new_install_hints( + monkeypatch: pytest.MonkeyPatch, +) -> None: + monkeypatch.setattr(builtin_bindings, "_DEFAULT_BINDINGS", None) + versions = { + "daft": "0.7.23", + "ray": "2.55.1", + "tributo": "1.0.0", + } + monkeypatch.setattr( + builtin_bindings, "_distribution_version", lambda name: versions.get(name) + ) + + bindings = builtin_bindings.default_engine_bindings() + + with pytest.raises( + EngineNotAvailableError, + match=r"daft_clickhouse\.daft\.clickhouse.*local daft-clickhouse.*tributo\[clickhouse\]", + ): + bindings.resolve( + BindingKey( + "tributo.daft", + ScanKind.SQL, + "clickhouse", + "daft_clickhouse.daft.clickhouse", + ) + ) + with pytest.raises( + EngineNotAvailableError, + match=r"daft_doris\.daft\.doris.*local daft-doris.*tributo\[mysql\]", + ): + bindings.resolve( + BindingKey( + "tributo.daft", + ScanKind.SQL, + "doris", + "daft_doris.daft.doris", + ) + ) + + def test_incompatible_optional_daft_does_not_disable_ray( monkeypatch: pytest.MonkeyPatch, ) -> None: @@ -773,7 +837,7 @@ def test_incompatible_ray_does_not_disable_daft( monkeypatch: pytest.MonkeyPatch, ) -> None: monkeypatch.setattr(builtin_bindings, "_DEFAULT_BINDINGS", None) - versions = {"ray": "2.54.0", "daft": "0.7.21", "tributo": "1.0.0"} + versions = {"ray": "2.54.0", "daft": "0.7.23", "tributo": "1.0.0"} monkeypatch.setattr( builtin_bindings, "_distribution_version", lambda name: versions.get(name) ) @@ -815,7 +879,7 @@ def test_missing_postgresql_dependency_does_not_disable_daft( monkeypatch.setattr(builtin_bindings, "_DEFAULT_BINDINGS", None) versions = { "ray": "2.55.1", - "daft": "0.7.21", + "daft": "0.7.23", "tributo": "1.0.0", "psycopg": "3.3.4", "psycopg-binary": "3.3.4", diff --git a/tests/data/test_ingestion_extension_contract.py b/tests/data/test_ingestion_extension_contract.py index d61f82d..778237c 100644 --- a/tests/data/test_ingestion_extension_contract.py +++ b/tests/data/test_ingestion_extension_contract.py @@ -129,7 +129,7 @@ def compile(self, request: Any) -> BindingCompilation: engine_version = "2.55.1" else: handle = DaftDataFrameHandle(object()) - engine_version = "0.7.21" + engine_version = "0.7.23" return BindingCompilation( handle=handle, engine_version=engine_version, @@ -153,7 +153,7 @@ def test_new_hive_provider_and_bindings_require_no_consumer_change( expected_handle: type[RayDataHandle] | type[DaftDataFrameHandle], ) -> None: versions = { - "daft": "0.7.21", + "daft": "0.7.23", "external-hive-connector": "1.0.0", "ray": "2.55.1", } @@ -181,7 +181,7 @@ def test_new_hive_provider_and_bindings_require_no_consumer_change( distribution_name="external-hive-connector", distribution_version="1.0.0", engine_version_spec=( - "==2.55.1" if engine_id.endswith("ray_data") else "==0.7.21" + "==2.55.1" if engine_id.endswith("ray_data") else "==0.7.23" ), constraints=BindingPlanConstraints( catalog_ids=frozenset({"hive"}), diff --git a/tests/data/test_parquet_bindings.py b/tests/data/test_parquet_bindings.py index 2a961e9..0381d87 100644 --- a/tests/data/test_parquet_bindings.py +++ b/tests/data/test_parquet_bindings.py @@ -222,7 +222,7 @@ def read_parquet(path: str, **kwargs: Any) -> _DaftDataFrame: monkeypatch.setattr("daft.read_parquet", read_parquet) monkeypatch.setattr( "tributo.data.bindings.daft_parquet.importlib.metadata.version", - lambda name: "0.7.21", + lambda name: "0.7.23", ) result = DaftParquetBinding().compile(_request()) diff --git a/tests/data/test_source_bindings.py b/tests/data/test_source_bindings.py index f431418..1114eb2 100644 --- a/tests/data/test_source_bindings.py +++ b/tests/data/test_source_bindings.py @@ -11,13 +11,11 @@ from tributo.data.bindings._postgresql import compile_table_query from tributo.data.bindings._sql_shared import resolve_sql_target +from tributo.data.bindings.daft_clickhouse import DaftClickHouseBinding from tributo.data.bindings.daft_csv import DaftCsvBinding +from tributo.data.bindings.daft_doris import DaftDorisBinding from tributo.data.bindings.daft_iceberg import DaftIcebergBinding from tributo.data.bindings.daft_lance import DaftLanceBinding -from tributo.data.bindings.daft_olap import ( - DaftClickHouseBinding, - DaftDorisBinding, -) from tributo.data.bindings.daft_postgresql import DaftPostgreSqlBinding from tributo.data.bindings.ray_csv import RayCsvBinding from tributo.data.bindings.ray_doris import RayDorisBinding @@ -105,7 +103,7 @@ def _request( ("binding", "engine_version", "handle_type"), [ (RayCsvBinding(), "2.55.1", RayDataHandle), - (DaftCsvBinding(), "0.7.21", DaftDataFrameHandle), + (DaftCsvBinding(), "0.7.23", DaftDataFrameHandle), ], ) def test_csv_bindings_use_public_engine_readers( @@ -259,7 +257,7 @@ def load_table(self, identifier: str) -> object: ) monkeypatch.setattr( "tributo.data.bindings.daft_iceberg.importlib.metadata.version", - lambda name: "0.7.21", + lambda name: "0.7.23", ) plan = _iceberg_plan() @@ -292,7 +290,7 @@ def load_table(self, identifier: str) -> object: ("binding", "engine_version", "handle_type"), [ (RayLanceBinding(), "2.55.1", RayDataHandle), - (DaftLanceBinding(), "0.7.21", DaftDataFrameHandle), + (DaftLanceBinding(), "0.7.23", DaftDataFrameHandle), ], ) def test_lance_bindings_use_public_engine_readers( @@ -347,17 +345,16 @@ def test_lance_bindings_reject_iceberg_snapshot_refs( assert exc_info.value.diagnostic_code == "unsupported_lance_snapshot_ref" -def test_daft_olap_default_auto_sharding_is_delegated( +def test_daft_sql_default_auto_sharding_is_delegated( monkeypatch: pytest.MonkeyPatch, ) -> None: calls: list[dict[str, Any]] = [] - module = ModuleType("daft_olap") + module = ModuleType("daft_clickhouse") module.read_clickhouse = lambda **kwargs: calls.append(kwargs) or _DaftDataFrame() - module.read_doris = lambda **kwargs: _DaftDataFrame() - monkeypatch.setitem(sys.modules, "daft_olap", module) + monkeypatch.setitem(sys.modules, "daft_clickhouse", module) monkeypatch.setattr( - "tributo.data.bindings.daft_olap.importlib.metadata.version", - lambda name: "0.7.21", + "tributo.data.bindings._daft_sql.importlib.metadata.version", + lambda name: "0.7.23", ) plan = SqlScan( provider_id="tributo.clickhouse", @@ -380,7 +377,7 @@ def test_daft_olap_default_auto_sharding_is_delegated( assert calls[0]["split"] == "auto" -def test_daft_olap_single_read_rejects_parallelism_with_actionable_modes() -> None: +def test_daft_sql_single_read_rejects_parallelism_with_actionable_modes() -> None: plan = SqlScan( provider_id="tributo.clickhouse", connector_id="clickhouse", @@ -389,7 +386,7 @@ def test_daft_olap_single_read_rejects_parallelism_with_actionable_modes() -> No with pytest.raises( BindingStageError, - match=("partitioning.mode to 'auto' or 'parallel'.*remove target_parallelism"), + match=("partitioning.mode to 'auto'.*remove target_parallelism"), ) as exc_info: DaftClickHouseBinding().compile( _request(plan, read_options=ReadOptions(target_parallelism=4)) @@ -398,6 +395,23 @@ def test_daft_olap_single_read_rejects_parallelism_with_actionable_modes() -> No assert exc_info.value.diagnostic_code == "single_sql_read_rejects_parallelism_hint" +@pytest.mark.parametrize( + ("binding", "connector_id"), + [(DaftClickHouseBinding(), "clickhouse"), (DaftDorisBinding(), "doris")], +) +def test_daft_sql_parallel_reads_fail_closed( + binding: EngineBinding, + connector_id: str, +) -> None: + with pytest.raises( + BindingStageError, + match="explicit 'parallel'.*unsupported", + ) as exc_info: + binding.compile(_request(_sql_plan(connector_id))) + + assert exc_info.value.diagnostic_code == "parallel_sql_read_unsupported" + + def test_sql_binding_port_error_is_structured( monkeypatch: pytest.MonkeyPatch, ) -> None: @@ -425,50 +439,65 @@ def _sql_plan(connector_id: str) -> SqlScan: ) +def _daft_auto_sql_plan(connector_id: str) -> SqlScan: + return SqlScan( + provider_id=f"tributo.{connector_id}", + connector_id=connector_id, + target=SqlTableRead(schema="analytics", table="events", projection=("id",)), + sharding=SqlShardRequirement( + mode=SqlShardMode.AUTO, + target_partitions=6, + ), + ) + + @pytest.mark.parametrize( - ("binding", "connector_id", "reader_name", "transport_id"), + ("binding", "connector_id", "reader_name", "transport_id", "protocol"), [ ( DaftClickHouseBinding(), "clickhouse", "read_clickhouse", "clickhouse_native", + "mysql", ), - (DaftDorisBinding(), "doris", "read_doris", "mysql"), + (DaftDorisBinding(), "doris", "read_doris", "mysql", "mysql"), + (DaftDorisBinding(), "doris", "read_doris", "flight", "flight"), ], ) -def test_daft_olap_bindings_delegate_to_external_connector( +def test_daft_sql_bindings_delegate_to_public_connector_facades( monkeypatch: pytest.MonkeyPatch, binding: EngineBinding, connector_id: str, reader_name: str, transport_id: str, + protocol: str, ) -> None: calls: list[dict[str, Any]] = [] - module = ModuleType("daft_olap") + module_name = f"daft_{connector_id}" + module = ModuleType(module_name) def reader(**kwargs: Any) -> _DaftDataFrame: calls.append(kwargs) return _DaftDataFrame() - module.read_clickhouse = reader - module.read_doris = reader - monkeypatch.setitem(sys.modules, "daft_olap", module) + setattr(module, reader_name, reader) + monkeypatch.setitem(sys.modules, module_name, module) monkeypatch.setattr( - "tributo.data.bindings.daft_olap.importlib.metadata.version", - lambda name: "0.7.21", + "tributo.data.bindings._daft_sql.importlib.metadata.version", + lambda name: "0.7.23", ) result = binding.compile( _request( - _sql_plan(connector_id), + _daft_auto_sql_plan(connector_id), runtime_options={ "host": "db.example", "port": 8123 if connector_id == "clickhouse" else 9030, "database": "analytics", "user": "reader", "password": "secret", - "protocol": "mysql", + "protocol": protocol, }, read_options=ReadOptions(batch_size=128), ) @@ -478,7 +507,13 @@ def reader(**kwargs: Any) -> _DaftDataFrame: assert calls[0]["host"] == "db.example" assert calls[0]["table"] == "events" assert calls[0]["target_tasks"] == 6 - assert result.reader_api == f"daft_olap.{reader_name}" + assert calls[0]["batch_rows"] == 128 + if connector_id == "clickhouse": + assert calls[0]["port"] == 8123 + else: + assert calls[0]["mysql_port"] == 9030 + assert calls[0]["transport"] == protocol + assert result.reader_api == f"{module_name}.{reader_name}" assert result.transport_id == transport_id @@ -521,7 +556,7 @@ def test_ray_doris_binding_delegates_to_external_connector( ("binding", "engine_version", "handle_type"), [ (RayPostgreSqlBinding(), "2.55.1", RayDataHandle), - (DaftPostgreSqlBinding(), "0.7.21", DaftDataFrameHandle), + (DaftPostgreSqlBinding(), "0.7.23", DaftDataFrameHandle), ], ) def test_postgresql_bindings_delegate_to_public_sql_readers( diff --git a/tests/integrations/README.md b/tests/integrations/README.md index 96250d3..94c706a 100644 --- a/tests/integrations/README.md +++ b/tests/integrations/README.md @@ -6,6 +6,11 @@ project. They never reuse a host Ray runtime, an existing MLflow server, or a pre-existing container. `ci/test-suites.json` owns their impact rules and reports required evidence, but no GitHub Actions event executes these suites. +The data-ingestion image installs database drivers through Tributo extras. The +unpublished `daft-clickhouse` and `daft-doris` connectors are external wheel +prerequisites and are not resolved by Tributo's `uv.lock`; the relevant runtime +must install the local wheel before running the corresponding E2E entry point. + --- ## Test List @@ -16,7 +21,7 @@ reports required evidence, but no GitHub Actions event executes these suites. | First-party export conformance | `../training/exporters/test_first_party_conformance.py` | `manual_external` | XGBoost, Torch, Hugging Face, quantizer, validator, and checkpoint-source contracts in the pinned Linux image | Docker only; executed by the model-export runner | | S3/MinIO contract | `../integration/test_export_s3.py`, `../integration/test_minio_compat.py` | `ci_fast` Moto / `manual_external` MinIO | Manifest-last publication, Lease/CAS, alias, GC, path-style access, and conditional writes | Ephemeral Moto in CI; run-owned MinIO externally | | MLflow Hook | `test_e2e_mlflow.py` | `manual_external` | Committed Bundle upload, replay deduplication, explicit run reuse, and failure semantics | Isolated model-export runner | -| ClickHouse E2E | `test_e2e_clickhouse.py` | `quarantine` | ClickHouse table → Daft OLAP Binding → explicit Daft-to-Ray adapter → XGBoost distributed training → MLflow → ONNX | Lifecycle and ownership contract pending | +| ClickHouse E2E | `test_e2e_clickhouse.py` | `quarantine` | ClickHouse table → Daft ClickHouse Binding → explicit Daft-to-Ray adapter → XGBoost distributed training → MLflow → ONNX | Lifecycle and ownership contract pending | | Dual-engine Docker | `test_data_ingestion_dual_engine.py` | `manual_external` | Local Parquet, full ETL chain, typed handles, worker-version evidence | Docker Ray cluster + Daft | | Lance vector index | `test_lance_vector_index.py` | `manual_external` | Distributed IVF_FLAT/IVF_PQ build, append coverage, global Top-K, fallback, optimization, compaction, Ray Jobs, and S3 result delivery | Docker Ray cluster + Lance-Ray + MinIO | | File conformance | `../integration/test_data_ingestion_conformance.py` | `manual_external` | Local/MinIO Parquet and CSV through Ray Data and Daft | Local Ray runtime + MinIO | diff --git a/tests/integrations/test_e2e_clickhouse.py b/tests/integrations/test_e2e_clickhouse.py index a9a3be9..ae27029 100644 --- a/tests/integrations/test_e2e_clickhouse.py +++ b/tests/integrations/test_e2e_clickhouse.py @@ -5,7 +5,7 @@ 运行方式: docker exec ray-head python /opt/tributo/tests/integration/test_e2e_clickhouse.py -前提:Docker 集群已启动,含 Ray / Daft / daft-olap-connectors / +前提:Docker 集群已启动,含 Ray / Daft / 已安装本地 wheel 的 daft-clickhouse / ClickHouse (8123) / MinIO / MLflow (5000)。 """ diff --git a/tests/integrations/test_e2e_multi_class.py b/tests/integrations/test_e2e_multi_class.py index 4b9bbea..220cb57 100644 --- a/tests/integrations/test_e2e_multi_class.py +++ b/tests/integrations/test_e2e_multi_class.py @@ -5,7 +5,7 @@ 运行方式: docker exec ray-head python /opt/tributo/tests/integration/test_e2e_multi_class.py -前提:Docker 集群已启动,含 Ray / Daft / daft-olap-connectors / +前提:Docker 集群已启动,含 Ray / Daft / 已安装本地 wheel 的 daft-clickhouse / ClickHouse (8123) / MLflow (5000)。 """ diff --git a/tests/support/algorithm_ingestion.py b/tests/support/algorithm_ingestion.py index 814db82..23da9e5 100644 --- a/tests/support/algorithm_ingestion.py +++ b/tests/support/algorithm_ingestion.py @@ -139,7 +139,7 @@ def describe(self, request: IngestionRequest) -> IngestionDescriptor: binding_distribution=distribution, binding_distribution_version="2.55.1" if distribution == "ray" - else "0.7.21", + else "0.7.23", capability_version=1, ) @@ -157,7 +157,7 @@ def open( else: self.last_daft_frame = StubDaftFrame(self.columns) handle = DaftDataFrameHandle(self.last_daft_frame) - engine_version = "0.7.21" + engine_version = "0.7.23" receipt = IngestionPlanReceipt( request_digest=descriptor.request_digest, engine_id=descriptor.engine_id, diff --git a/uv.lock b/uv.lock index 9b41cd0..ae5592e 100644 --- a/uv.lock +++ b/uv.lock @@ -34,6 +34,44 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a8/db/253133d7e7cb40d3af384bb2f5c0b4a2b7fdcffbc95c688cc67a20a3c103/accelerate-1.14.0-py3-none-any.whl", hash = "sha256:e94390c2863b873be18f623f9df48a0d8fe5eff13ea7f1a00092b0a7904888c6", size = 389246, upload-time = "2026-06-11T13:45:50.477Z" }, ] +[[package]] +name = "adbc-driver-flightsql" +version = "1.12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "adbc-driver-manager" }, + { name = "importlib-resources" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/65/91/605b35b97aa5972a8026c0687e9996658d1d10ff7a0624173a0d0c7c5b93/adbc_driver_flightsql-1.12.0.tar.gz", hash = "sha256:300f67801ea016578e0c4bb798fc2b9024e405cfdd3f79fd77e37481a5767e45", size = 22097, upload-time = "2026-07-28T00:43:02.432Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7a/a4/5ad52abf0c4830585b86d68cff8ce07779cdee9b8cf390dff0ee21a29fa7/adbc_driver_flightsql-1.12.0-py3-none-macosx_10_15_x86_64.whl", hash = "sha256:c2c7209407c180d9d0dd94846203f184ab91e116782585bf29cb968c2686ba75", size = 8146345, upload-time = "2026-07-28T00:41:22.824Z" }, + { url = "https://files.pythonhosted.org/packages/61/36/49267a4fc8c07c066dd8c36b9c3d27265a4dc0fc478cb5acb7bd6a551d80/adbc_driver_flightsql-1.12.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:fb37efefceb7ceca64840c76c55e6280f3811b54dca305ec1781f9cc1a6da21e", size = 7552045, upload-time = "2026-07-28T00:41:27.147Z" }, + { url = "https://files.pythonhosted.org/packages/2b/5b/f8566aa6d05eb40225f5874f8f5f5e8b8b4a4ce866d817a5ff352f326302/adbc_driver_flightsql-1.12.0-py3-none-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:69742e4f8fcc254490aa7f8e254a3b704c24bde9d5d827a0926ea90a6b4c3a6d", size = 14981635, upload-time = "2026-07-28T00:41:33.2Z" }, + { url = "https://files.pythonhosted.org/packages/57/45/6468fb425f3c0ae868c1ca9ab8e15cba76b59e941edd7e80e892e5476728/adbc_driver_flightsql-1.12.0-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9adfb5e46abc77347476d09ee76dfc835fef2b4dcb0c76d08d6d35aa3a4cce17", size = 13699634, upload-time = "2026-07-28T00:41:38.232Z" }, + { url = "https://files.pythonhosted.org/packages/dc/c7/6773dedc54fad73277ee2d767dd817e203e949972b0cfb197df99e00b784/adbc_driver_flightsql-1.12.0-py3-none-win_amd64.whl", hash = "sha256:098f2498778fd3efd671fbeacba80987de98ebfeb0291da77fe0a26c6fa78532", size = 15033803, upload-time = "2026-07-28T00:41:42.483Z" }, +] + +[[package]] +name = "adbc-driver-manager" +version = "1.12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9c/f8/ed6475b49a7cf35ea888d5c95e7d4bc9dc6568f9d741f14c0573d622cc1e/adbc_driver_manager-1.12.0.tar.gz", hash = "sha256:45991f0c2de369d330c6a211ca2edbcce6389c5dc81cde70461bdeb6f8f7b268", size = 217579, upload-time = "2026-07-28T00:43:03.512Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/8c/cd3fe16df716719116a6c79e64a768fe994f6ded55d5a8f091bb4f42d6f0/adbc_driver_manager-1.12.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:fd02364c65b8b376c5627e3b77410f457fcbbf983e52e8d15ca099da3a7ae314", size = 599054, upload-time = "2026-07-28T00:42:04.072Z" }, + { url = "https://files.pythonhosted.org/packages/49/4a/2f060ff6bd61420ea1613670e1f85a22a8714934c235186dc3803de8ddac/adbc_driver_manager-1.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d8dcf62621090e8d9c8216e08dfc4043f16331872522186af61a5de9478e9c63", size = 609964, upload-time = "2026-07-28T00:42:05.82Z" }, + { url = "https://files.pythonhosted.org/packages/8a/f1/0746db149828ae91e4a6cf49f8d0e49210eec20c03ad80044454139c8240/adbc_driver_manager-1.12.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:efa5dbbf101962d212b176f25e6fc509dacf07afd4cf70b5027d81ec6871bdec", size = 4685726, upload-time = "2026-07-28T00:42:08.1Z" }, + { url = "https://files.pythonhosted.org/packages/b9/c3/f8e9c5157b19e986df719259eb3502dad1268df9f7a1034f65ca220ab2ea/adbc_driver_manager-1.12.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8b340679a005a8adf6b0b58754dbc638dff00db7b2559c140406a1d92678b48c", size = 4768774, upload-time = "2026-07-28T00:42:10.359Z" }, + { url = "https://files.pythonhosted.org/packages/92/51/f8e625af691e6b4c54945790854524356a02a0a69063e888f7cfee1b2e50/adbc_driver_manager-1.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:47f428a922d224fd486b661deeaf9520e5faec558b3d144832bed09a080cac88", size = 760087, upload-time = "2026-07-28T00:42:11.871Z" }, + { url = "https://files.pythonhosted.org/packages/9a/f9/674c5bbc5093617d72c4f58a5dab67982710b2320cc9aa826050a6aaa131/adbc_driver_manager-1.12.0-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:c42ca4d9caa22b3a5ce76bde8729169f403bb7393e3671734b9416634c207125", size = 596815, upload-time = "2026-07-28T00:42:13.64Z" }, + { url = "https://files.pythonhosted.org/packages/56/5f/c1d888d787330801edae282d2a9def3765e8157547cc20e71154ff38c1bb/adbc_driver_manager-1.12.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c894117c8f5c484b902c8b070bcfd9d31d90efe0288b2b58a3ddab97c80f66e7", size = 608277, upload-time = "2026-07-28T00:42:15.643Z" }, + { url = "https://files.pythonhosted.org/packages/06/4b/ee799babf171e39690ef45560451096f869d9e7387bc0e5a754bb243ed2a/adbc_driver_manager-1.12.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:214f80f9b65562f08b4d1c52a756b5db557530e3c0652f587c43aaa80039579a", size = 4667230, upload-time = "2026-07-28T00:42:17.97Z" }, + { url = "https://files.pythonhosted.org/packages/00/c6/a35e38ef5e0db391be79e0e14c019ce378b87d9d7e31d1dfcd451e9d291f/adbc_driver_manager-1.12.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:532ab290b3d923ce0a75bca21dc6e13f55835625f78808e1664755939f3ebdf6", size = 4745299, upload-time = "2026-07-28T00:42:20.189Z" }, + { url = "https://files.pythonhosted.org/packages/16/e2/62bacd6844859036d79ea229401b5200056fb5050c82dc3a2e28b08ff49b/adbc_driver_manager-1.12.0-cp313-cp313-win_amd64.whl", hash = "sha256:034da82c1a6e195d67ca1f0c97a1a517046037ec3029ab9a0ea8f7ccb14056e4", size = 758878, upload-time = "2026-07-28T00:42:21.598Z" }, +] + [[package]] name = "aiobotocore" version = "3.9.0" @@ -270,53 +308,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ef/c3/f30a7a63e664acc7c2545ca0491b6ce8264536e0e5cad3965f1d1b91e960/aws_xray_sdk-2.15.0-py2.py3-none-any.whl", hash = "sha256:422d62ad7d52e373eebb90b642eb1bb24657afe03b22a8df4a8b2e5108e278a3", size = 103228, upload-time = "2025-10-29T21:00:24.12Z" }, ] -[[package]] -name = "backports-zstd" -version = "1.6.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8e/b5/5a873da082bd08acd6a497f7aae224e94a7c27fa8f24488089cc50a16c84/backports_zstd-1.6.0.tar.gz", hash = "sha256:80a7859ffe70bf239d7a2ce15293bdeb5b4280ff7dc326ffab312b0e254dbb24", size = 1000009, upload-time = "2026-06-14T10:50:58.555Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/bb/009af3a9532d4cc66d5385391c512210fae32ab2442605f26aca1d8d2957/backports_zstd-1.6.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0466b14723f3b7697669c00ee66fe16e30e25636b286b0a923fa86fa3d8a753c", size = 437407, upload-time = "2026-06-14T10:49:50.155Z" }, - { url = "https://files.pythonhosted.org/packages/0c/76/f7c02efde81ebb9993586f9e435d2fd1191a6f806f640e4eeb8d004493ed/backports_zstd-1.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1d146926e997d2d3de8212bdcbf4985344a2622ca3bec458d8908000a84fd883", size = 363519, upload-time = "2026-06-14T10:49:51.383Z" }, - { url = "https://files.pythonhosted.org/packages/2e/5e/0cf66f12472fe3e082cc4134395a7e0b8746cfb30aabd74251ce8fafa9a7/backports_zstd-1.6.0-cp312-cp312-manylinux2010_i686.manylinux_2_12_i686.manylinux_2_28_i686.whl", hash = "sha256:460fd6b3f338c659507ae36cfd6b58ac9942a2ff233c5cf574416dfec0451a84", size = 507756, upload-time = "2026-06-14T10:49:52.497Z" }, - { url = "https://files.pythonhosted.org/packages/03/95/7ed25c90369360f96f8bfa961540845e063377c32a43b775201af66a588c/backports_zstd-1.6.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7c2b1f4a640c51130caa92cef5bf72bd3c3dbbcfbf814c37403aa0601b1811b0", size = 477578, upload-time = "2026-06-14T10:49:53.887Z" }, - { url = "https://files.pythonhosted.org/packages/e3/75/f16b1d3e33ca396525847c81d96e3de7bc74d2c6f9ca2ddee76b0c450697/backports_zstd-1.6.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:beb43e9885202c8d4f3762319ed4d5e98e197622afbff8439fbbdd81d08938b9", size = 583029, upload-time = "2026-06-14T10:49:55.132Z" }, - { url = "https://files.pythonhosted.org/packages/e1/2b/a17b111b631e1c79a0e570881c1a266c661b936585afa395435a458b1991/backports_zstd-1.6.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fbb746522ebfc11155f1cd688e2c48ef3d74125e38b63eabdaab068a055c3e88", size = 641741, upload-time = "2026-06-14T10:49:56.42Z" }, - { url = "https://files.pythonhosted.org/packages/6b/b2/d17b2722c636d64b4e77ddc68d8d0625719d39f94021be8719a218af4c0a/backports_zstd-1.6.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a99710fbb225d459d66def4dc2bb2cd4a9a0bdc8b799fc0621cfdd863be9c93", size = 495554, upload-time = "2026-06-14T10:49:57.652Z" }, - { url = "https://files.pythonhosted.org/packages/63/12/2853e8b6c03f03795b6548ea61f82cc104d4f7ff2523a04bc69f46984663/backports_zstd-1.6.0-cp312-cp312-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f69365ee2b836939137de024a302395a1cb8654fb6dc5ffef6381105259c8f87", size = 570027, upload-time = "2026-06-14T10:49:59.003Z" }, - { url = "https://files.pythonhosted.org/packages/18/aa/83f37b81f3b8c6ea035bf260ec374648bd59372894c02323dc9de3cbdf77/backports_zstd-1.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:66cf8038893c7708ec345ffb3ac63c775d10f430f323ac2f0334fdb6a397c57c", size = 483594, upload-time = "2026-06-14T10:50:00.49Z" }, - { url = "https://files.pythonhosted.org/packages/f5/6a/d77f8cd2ff642d3b3652c1ccab5b6583114dbf10f8cb0143531357c83998/backports_zstd-1.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e514c71ca72f3b56bd8fbda1a6a5b7d1100a2764b42a3c74a38841f25f9b00ab", size = 511206, upload-time = "2026-06-14T10:50:01.86Z" }, - { url = "https://files.pythonhosted.org/packages/56/b2/99a60fe4d1aac8053769d2463271d5df37a7c11c387072fdbb0b16aed7f7/backports_zstd-1.6.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7741e44f7938ec94f9a52678c8d19b7bc548522ffdc39c9e4481af8db545fa9a", size = 587416, upload-time = "2026-06-14T10:50:03.236Z" }, - { url = "https://files.pythonhosted.org/packages/ec/1e/a9c003fe4d14bd4bf671598d4c7dcc1cef51e3513d9d7111ba1d07b6f07b/backports_zstd-1.6.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:97e8a9674652496c7612b528085dd5a296c052a2edc466ca1bfb7b0b27820413", size = 567615, upload-time = "2026-06-14T10:50:04.524Z" }, - { url = "https://files.pythonhosted.org/packages/ec/b9/955bd604f692c550c7cb66d00bd7691ead5c86df8ebd23d7254eeaa90789/backports_zstd-1.6.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:23a793f2fed4dbf0517319759a2cded0b0dd8e8d3797fe30badd5693e320c175", size = 632269, upload-time = "2026-06-14T10:50:05.86Z" }, - { url = "https://files.pythonhosted.org/packages/18/d7/9f61f612f8a4193484c78a1f26db82a50141234189885113ef0085a8a961/backports_zstd-1.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b951113113ed4b8d173418a4f155c14b739dace626b3fa3f82be1831958d39e4", size = 500066, upload-time = "2026-06-14T10:50:07.446Z" }, - { url = "https://files.pythonhosted.org/packages/81/a3/19fb8c48d94139481c5ccaf2fb54c31b543fa635fd7bd7399aadd15752ac/backports_zstd-1.6.0-cp312-cp312-win32.whl", hash = "sha256:6430b34a2ae6fcc604672f4f913102563473d9a015bdca1ce8c95041cc1f2677", size = 291825, upload-time = "2026-06-14T10:50:08.762Z" }, - { url = "https://files.pythonhosted.org/packages/58/38/40ba081c6c71f0f22c64d3d54b912ad75a4e6812caa1397cbb15b5693b12/backports_zstd-1.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:08793876172551a930ce4d65c712cd516184d1a97070d4a1193e05bf0cf7040d", size = 329201, upload-time = "2026-06-14T10:50:09.979Z" }, - { url = "https://files.pythonhosted.org/packages/2b/6c/f7116dd2edc6f960545f0d8616939eae3a20031b3b6669697d4f9fd83b2e/backports_zstd-1.6.0-cp312-cp312-win_arm64.whl", hash = "sha256:03b7c59c71f7a597e2bcb3f8368371e9a660a1bdf1c37afc1f1ad1496a013c19", size = 291901, upload-time = "2026-06-14T10:50:11.198Z" }, - { url = "https://files.pythonhosted.org/packages/38/06/c430537d59c55d49bcd15ecf4b1aa965453219caad810a4f2b484816f4be/backports_zstd-1.6.0-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:2ace939e4d620e119423606f2d3d7115f8707733bf57f279ad9a9383f875986f", size = 400327, upload-time = "2026-06-14T10:50:12.446Z" }, - { url = "https://files.pythonhosted.org/packages/36/48/2f8323bb0e3ebba88b54877a2979afeb83983fb2ca572f09ad61aae2d3a0/backports_zstd-1.6.0-cp313-cp313-android_24_x86_64.whl", hash = "sha256:4c68a9ed2df0cca51d774c521e68a34d2e3d9ebfc687ef8096adfd4f345b551d", size = 454276, upload-time = "2026-06-14T10:50:13.667Z" }, - { url = "https://files.pythonhosted.org/packages/7c/39/87a665244a65f5b87a06b848c29a8cce07e91d59c5988ee2a32c0293a21c/backports_zstd-1.6.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:30576f49b82328ec8af16c11100efe52ca88526f71bbe100ef6b4e707dc13bf2", size = 357457, upload-time = "2026-06-14T10:50:14.906Z" }, - { url = "https://files.pythonhosted.org/packages/7f/8b/854d4a47bb8b7a48bfb2ed381c7b03a70efb4fc49f0e4a1509b38a2e1727/backports_zstd-1.6.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:b4bddfcfb6679215d6f4dc5f79a1f9301af339480d70527a14b57a1f2e6b6cbf", size = 366139, upload-time = "2026-06-14T10:50:16.399Z" }, - { url = "https://files.pythonhosted.org/packages/8f/de/c3af43eb8df6f2581e157e18a3e0121eadb826055b2fde3f91ec188689cb/backports_zstd-1.6.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:65048ed08c5124f05ff9f355ab9703014bb2dbe7f8d9948ce193685b1775f442", size = 446683, upload-time = "2026-06-14T10:50:17.633Z" }, - { url = "https://files.pythonhosted.org/packages/5c/39/87cf3d883d386c10ac52f5322604fb9afdd204229f4c47d4a820a839b8ff/backports_zstd-1.6.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5918fc6b31437208721276964323933cd86077b8d5b469c59c1b3fd2c8220a05", size = 436869, upload-time = "2026-06-14T10:50:19.113Z" }, - { url = "https://files.pythonhosted.org/packages/5e/b6/9479e6f0f18824ad38e8d7dd85161ab0842a198be669421232925bb30960/backports_zstd-1.6.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4b6c8b02ab0ccb2431bb7bc238be91d158b308915e7b07937388e540466fe7e7", size = 363090, upload-time = "2026-06-14T10:50:20.302Z" }, - { url = "https://files.pythonhosted.org/packages/d9/74/a5e98fe108e17c91d9bc590a19e77f5d47d579e34d3f5bc098a949d6c27c/backports_zstd-1.6.0-cp313-cp313-manylinux2010_i686.manylinux_2_12_i686.manylinux_2_28_i686.whl", hash = "sha256:711e6b98f8924e8b4a61ff97ab6321f33de024e1ed6a32f5123763aeda8459be", size = 507070, upload-time = "2026-06-14T10:50:21.536Z" }, - { url = "https://files.pythonhosted.org/packages/69/f5/392bb7dce7363b77bc5403060f418fad438b9cfdd3edd10d65cee7d8fd11/backports_zstd-1.6.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2ba9ac10fc393e5123a08802e0e895a107cb4a66b9973d2844dbd8a343111e59", size = 477200, upload-time = "2026-06-14T10:50:22.91Z" }, - { url = "https://files.pythonhosted.org/packages/e4/4d/dfb665806ba4f74bc48071d32006843b53568c4a17ff627a3061de5eaa09/backports_zstd-1.6.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2f723219335387d7546412d8141e0303590600949b4184a1391a0c6a3c756058", size = 582724, upload-time = "2026-06-14T10:50:24.28Z" }, - { url = "https://files.pythonhosted.org/packages/57/b2/beeca7393a8310debd82ee2f0ce5c1801e8d7cb673f7f226f4a0866ca238/backports_zstd-1.6.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:64b94d7a836568926a3309ff510c7f8261b881b341fd4992cabf4f0998878f8a", size = 643493, upload-time = "2026-06-14T10:50:25.736Z" }, - { url = "https://files.pythonhosted.org/packages/38/26/ce90e9eed6f25aaa4a4fa305a2aaf2d2ad81fd69de8eb248ddd91c80d1e0/backports_zstd-1.6.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e39258a09b1c7ca70b5e94a5c5ccfe4700b4250b8077cfeab31d0f79565d4c9b", size = 492190, upload-time = "2026-06-14T10:50:27.205Z" }, - { url = "https://files.pythonhosted.org/packages/17/9b/37b9b146df1f5452419a96071a7017cbac212ec9b137d7a88ca46dc2aa9e/backports_zstd-1.6.0-cp313-cp313-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:15b1aae0f64cd742df4bba1d989d0a09a6ec619202543fdba684640454541fd3", size = 567432, upload-time = "2026-06-14T10:50:28.386Z" }, - { url = "https://files.pythonhosted.org/packages/06/66/81b30991be83237529f36335ac3682bce26409064b906ac6122874575196/backports_zstd-1.6.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:25b5ddc789480072551af571a746e9500356b2aff0499861cf2ca07ea7431e68", size = 483021, upload-time = "2026-06-14T10:50:29.654Z" }, - { url = "https://files.pythonhosted.org/packages/49/2a/792c65dcc1e45eb0c1bdc012ee94b84867186bfe27a860d0813bd216f03b/backports_zstd-1.6.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:a13cfa3410a75e4cb87abdb669aaf79da861cb79299159054ff8f77b9671bc40", size = 510596, upload-time = "2026-06-14T10:50:31.657Z" }, - { url = "https://files.pythonhosted.org/packages/1d/22/01b92a600505620e4cb5f20429e181f30458b7207ca8b52ca5ca6068c35f/backports_zstd-1.6.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:2ddab55a5f54dec8acfad68ef70f1c704fd21919990ddc238afbd6f496e61c6a", size = 587143, upload-time = "2026-06-14T10:50:32.868Z" }, - { url = "https://files.pythonhosted.org/packages/d8/60/4672f5110b9eb01388cc6225a739e3a5fcd749a63a9c4c1450a04fa27113/backports_zstd-1.6.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:fa305a84087e10d7a85e8a8a3dcba8cdbda4868f2180173b264b7b488fd37c55", size = 565238, upload-time = "2026-06-14T10:50:34.173Z" }, - { url = "https://files.pythonhosted.org/packages/5c/3b/19928d60ea7d25820bf12ef88de74534ca85b56ff7cf13c1b0e74e3a3d7c/backports_zstd-1.6.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:df27b57d214a3124fbe4e933ef5a903d4567f154260d9aece8c797a987f2a205", size = 633970, upload-time = "2026-06-14T10:50:35.506Z" }, - { url = "https://files.pythonhosted.org/packages/df/97/c4cecb3e0ff53563ef9819f0395d919ceaae9c5147392ac23bac7afdb20f/backports_zstd-1.6.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:28fecd73459d74910ae1987ab84b7bef690d3dd860948430dd5555108b006daf", size = 496539, upload-time = "2026-06-14T10:50:37.015Z" }, - { url = "https://files.pythonhosted.org/packages/eb/f4/46b2f29d2938a80e56e61a19f11ab093f531a9f8cd0ec8eeaac1246bcd99/backports_zstd-1.6.0-cp313-cp313-win32.whl", hash = "sha256:3e689af303df287142770abe3a48bbefd24dab4a09da5807d0e1fa8c75bab026", size = 291451, upload-time = "2026-06-14T10:50:38.518Z" }, - { url = "https://files.pythonhosted.org/packages/d1/ad/b529f92166da61f496621345f95d2dc583c8ca5ac553c084a4ef6c12cd71/backports_zstd-1.6.0-cp313-cp313-win_amd64.whl", hash = "sha256:b067b1ef9c8e41fb0882c828aa37829938b5c0dab067eca72b23fc24c563b9da", size = 329023, upload-time = "2026-06-14T10:50:39.742Z" }, - { url = "https://files.pythonhosted.org/packages/30/d8/6be904d20345fbebec583ca83676e01f30c76118b283eb666d8ec8291ca1/backports_zstd-1.6.0-cp313-cp313-win_arm64.whl", hash = "sha256:a838296f5b84c920172fb579cac894d255c1fc25457c7234613ddcfa385e49b7", size = 291636, upload-time = "2026-06-14T10:50:41.004Z" }, -] - [[package]] name = "blinker" version = "1.9.0" @@ -528,35 +519,43 @@ wheels = [ [[package]] name = "clickhouse-connect" -version = "1.6.0" +version = "1.5.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "backports-zstd" }, { name = "certifi" }, { name = "lz4" }, { name = "tzdata", marker = "sys_platform == 'win32'" }, { name = "urllib3" }, + { name = "zstandard" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ac/31/aeda81546adc2004742933ed7b741716e3581fea5e4fd6c4dd8a196f82cd/clickhouse_connect-1.6.0.tar.gz", hash = "sha256:e4eb8b83b848f4ca4b984899acd62b0a60f310cbaa559d83519b7477968392ed", size = 193965, upload-time = "2026-07-23T18:03:16.783Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/23/0e/9c6a165ecfd0708df9bec011b6adedb2e627b5778b041f7e35ca4bf942b9/clickhouse_connect-1.6.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7043480f1459ddd791480e3ea560a1def81dfd6462eab0c9ada54946e72918af", size = 385950, upload-time = "2026-07-23T18:02:09.475Z" }, - { url = "https://files.pythonhosted.org/packages/ea/8d/11521bebc3c89c8f47e94bdaa5abea49b15946c1d0b9d1464e0efd6623d9/clickhouse_connect-1.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:064144e1a7f6075ade3c13b8ce49517ca92f86c0c4842bd2abb52a475c026025", size = 374386, upload-time = "2026-07-23T18:02:10.959Z" }, - { url = "https://files.pythonhosted.org/packages/ea/1f/66ed0c9fa39be881f6e1b5b0f570564f6a03b5ee938c614a9e7aa967f63b/clickhouse_connect-1.6.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:069f105173cd04263d3bb710381edae341dc9a3aa42fb4673017a617a5a1237a", size = 1335168, upload-time = "2026-07-23T18:02:12.247Z" }, - { url = "https://files.pythonhosted.org/packages/c7/bb/78a23f75d3750e10a6740c9643505f4b5c5e2cdb2fee558b3f2af4803b39/clickhouse_connect-1.6.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:30bb77e7aa842550d5265c4aaa3e432b01440fd116d63e7e79ae79c380971ade", size = 1358890, upload-time = "2026-07-23T18:02:13.807Z" }, - { url = "https://files.pythonhosted.org/packages/90/91/e809ac0953394009137eba72bb2f727c6a63e55a1c019a07a8f834589ae2/clickhouse_connect-1.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4372dbcbd7b1c897c8d7062832468f82af27fa731c7488421ec7f0a882e1580b", size = 1312423, upload-time = "2026-07-23T18:02:15.314Z" }, - { url = "https://files.pythonhosted.org/packages/66/6b/3cf46e7c270852673307f61d5206875beb6a367853b4d0787bd6d97fb01a/clickhouse_connect-1.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a5285b9005d5a3ba41d6f148c957e4df8e37a38ad27835a4ad9c31fe21083149", size = 1354991, upload-time = "2026-07-23T18:02:17.216Z" }, - { url = "https://files.pythonhosted.org/packages/12/1e/793672cd06e32ba16d09e11b687651bda05c9e82e8a64c34c5ebb9f0a7a6/clickhouse_connect-1.6.0-cp312-cp312-win32.whl", hash = "sha256:bd8de68d176a807fd16b85c3c5639c25bbdc81c203217f9e985e9560357fecd5", size = 349053, upload-time = "2026-07-23T18:02:18.736Z" }, - { url = "https://files.pythonhosted.org/packages/45/72/e939a153b6266a4ae4ef32820567a5cc5aa4069b3adbc59b02b861fd140f/clickhouse_connect-1.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:2f8b8060a8277509db77b14a01ed70683a0d9becba7a9994a5e59e42e9f98b37", size = 368135, upload-time = "2026-07-23T18:02:20.235Z" }, - { url = "https://files.pythonhosted.org/packages/fe/4e/c5bf9989371204cfeca68b7f1663509b62662fd25134cd31b81be3cae2cc/clickhouse_connect-1.6.0-cp312-cp312-win_arm64.whl", hash = "sha256:cf66e5bcfba8a183e40485efcfc80329ec75104e22dd02485fe73c0ab9073b19", size = 349140, upload-time = "2026-07-23T18:02:21.935Z" }, - { url = "https://files.pythonhosted.org/packages/e0/58/6daab3e2c2e5e12bb3f658a665c8b36b635b45bf2bb879c429ab736455ba/clickhouse_connect-1.6.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8128dfe4a17aef265d5ba2bb5f2f5a0d5fa76e6aca357c71a17da378c1b30ea6", size = 384027, upload-time = "2026-07-23T18:02:23.482Z" }, - { url = "https://files.pythonhosted.org/packages/f5/6e/abc3575964f6f737274619362cdf83a9c1f21d75febff9eda6301167c15e/clickhouse_connect-1.6.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8d4303987b36ca075cbbe2cff3439ad017f56e1cf2bd936f83b2e6be222ae62f", size = 372729, upload-time = "2026-07-23T18:02:24.855Z" }, - { url = "https://files.pythonhosted.org/packages/8a/eb/afc65f349ef9b38a865ffe58b8fcc9e5bcb14e5a0aa1fb663f07e9c71f99/clickhouse_connect-1.6.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a34e72d1ae6f71be491b2d44bd10d082d04c9e2e2a04d4774498e965d933b21d", size = 1306563, upload-time = "2026-07-23T18:02:26.36Z" }, - { url = "https://files.pythonhosted.org/packages/1a/12/3a6d1b11c01bf936af1168868a2d953e72494537ef142d247fe1fa62d1da/clickhouse_connect-1.6.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:444564bad257b8923005431d661e347e5360cd686aae67091de3796a465cfec1", size = 1330861, upload-time = "2026-07-23T18:02:28.135Z" }, - { url = "https://files.pythonhosted.org/packages/33/0c/31ce83989fa10606c7108c04caf1d9b662048918e9f2ac0aa2a4fa407929/clickhouse_connect-1.6.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:794735a62d0a46688d50652876bcb50116c5e912577e9a469ef6ed1aa52b4d7b", size = 1283562, upload-time = "2026-07-23T18:02:29.82Z" }, - { url = "https://files.pythonhosted.org/packages/c5/53/9613b4b70b66d662e1a0cffecd55fce5eedc398c3aefd08422298c3e88ab/clickhouse_connect-1.6.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:75390e6ff6b398a88e0cac4907f785763fc9e476314cbafcfb24553bdbd92d28", size = 1326848, upload-time = "2026-07-23T18:02:31.67Z" }, - { url = "https://files.pythonhosted.org/packages/93/1e/6569d51fea552e69af33feec06f3236c450329ef8f9d19b107888ca574fd/clickhouse_connect-1.6.0-cp313-cp313-win32.whl", hash = "sha256:1a84eb6d545e2647a51b3b4ffa0da4a49f308aaaa096e58c44fb749c171a7d4a", size = 348445, upload-time = "2026-07-23T18:02:33.188Z" }, - { url = "https://files.pythonhosted.org/packages/42/8a/0f13f9f02af1c564fab34346c1496a8254eaa5cb81f10111e72550ea5472/clickhouse_connect-1.6.0-cp313-cp313-win_amd64.whl", hash = "sha256:483e34a7841dbf3d2863e784a129503cc37a910a05464f2f48ce3e9b2f0fc007", size = 366668, upload-time = "2026-07-23T18:02:34.663Z" }, - { url = "https://files.pythonhosted.org/packages/20/46/75a37ee92929327870ab371e3186074cd4806ed16cd5ae604cfd0f54f674/clickhouse_connect-1.6.0-cp313-cp313-win_arm64.whl", hash = "sha256:cd4c1dee496ad3a811237ff8066084c18cdaa46a046f9e0eeacce107ac29c83c", size = 348490, upload-time = "2026-07-23T18:02:36.489Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/76/93/132dbe34873ec16e9457558ec5ef2fda1196572d51146cc7fad6b5fc98b6/clickhouse_connect-1.5.0.tar.gz", hash = "sha256:5dfaf610c1912410d59078eba76e50efeefc72e378085abc8df9025cc692949a", size = 176611, upload-time = "2026-07-15T17:14:52.661Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b5/86/c1e91b22e61d1450b45d6393c9e16e2c1e708c19906275bab911e9e696f5/clickhouse_connect-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:82fe8cedc302e819f091aa88d0ea26da37ea490fbb12a1200469ddf06c83bf82", size = 359209, upload-time = "2026-07-15T17:13:47.794Z" }, + { url = "https://files.pythonhosted.org/packages/83/25/37e6fdc26e8f354d99b56aa206eb6ef58675ed90a29653c1e2d64dd72edf/clickhouse_connect-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dbd5c5dd7c0ea76696c30b6a2d0e2f8131e51278daed4a3eb9b5866440307dab", size = 347643, upload-time = "2026-07-15T17:13:49.176Z" }, + { url = "https://files.pythonhosted.org/packages/f6/06/5953240089f0b20fd1421f44bcb8aae287a1a73f3ea7f8b8022480093d07/clickhouse_connect-1.5.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fd7d8241411cc0e674fa0558cc1171b7765adabc0bf1f5f193ca08cd5715f6ac", size = 1308435, upload-time = "2026-07-15T17:13:50.525Z" }, + { url = "https://files.pythonhosted.org/packages/f9/5f/c20d4c834548d79fd1ae67bd6c38361e0f1b132c53139cbae6b1b9083705/clickhouse_connect-1.5.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9b1562ec469502db3ea3d5da7e81b468b769bc7f701d25e665c44e5b3d17235", size = 1332156, upload-time = "2026-07-15T17:13:52.277Z" }, + { url = "https://files.pythonhosted.org/packages/78/dc/4b6e4d16c9d9eb3cf40478d9d5b47ca7eaf7ca9129655646ad5ffccd562e/clickhouse_connect-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a4ac7197a8aa2be5b190d64ed2f3e7dc3f5c2d532ffad53f7fdddecf82127353", size = 1285691, upload-time = "2026-07-15T17:13:53.878Z" }, + { url = "https://files.pythonhosted.org/packages/45/43/51dcb5f72f2695e4fb32208df824ec9dab22de4e48c2c4f103761f9bea39/clickhouse_connect-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f866640a0c688b511e57ccb67174b54510b716e097560a3bc0c7736e9526defb", size = 1328257, upload-time = "2026-07-15T17:13:55.504Z" }, + { url = "https://files.pythonhosted.org/packages/9a/bb/a903f5a10c1050bcc803f2327302fe2a886a74472fa027b9772d32465041/clickhouse_connect-1.5.0-cp312-cp312-win32.whl", hash = "sha256:ee1f8c15f2450bfd540c9e9d78f4735c14185df58bdde909812742dc6f38baab", size = 322204, upload-time = "2026-07-15T17:13:57.008Z" }, + { url = "https://files.pythonhosted.org/packages/96/fa/0f1c7e4ebd3b966fcffafea7f2947d30e2aa66b72018f0a65096d56bb07f/clickhouse_connect-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:e09c1cc8c7da18fc272652182ec627be2ce548c0cbcc7dd3f07f3333a247522b", size = 341288, upload-time = "2026-07-15T17:13:58.385Z" }, + { url = "https://files.pythonhosted.org/packages/3e/ca/5b87f2cc89ea981527759a5a4588cd7acb6e9888fb1d7a3df2318e1e5c15/clickhouse_connect-1.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:fea0fcd885be5507a59d6bc9864fb97f1e44fead1be9f351f4902e3ec4cacbf3", size = 322291, upload-time = "2026-07-15T17:13:59.718Z" }, + { url = "https://files.pythonhosted.org/packages/e5/0a/efcd4018b47901348de0689066d33e78b8d9d9280c37c19baabbc9bc7c12/clickhouse_connect-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:aa22e0b547f5087c7ad29ea5a1d90c3fb1adbe13ca818ee6acfa2386ee14d8a0", size = 357291, upload-time = "2026-07-15T17:14:01.289Z" }, + { url = "https://files.pythonhosted.org/packages/d5/6c/6a00b3a51d684a5f9ed537241532baa56afa860f915e9557b1afb8680261/clickhouse_connect-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9a860c6882f2d55aca8c38d80c834524c508b84c689854776ea42fac02611080", size = 345988, upload-time = "2026-07-15T17:14:02.971Z" }, + { url = "https://files.pythonhosted.org/packages/41/ee/7fd7927f0f7987661cb9d571ed2e8fa9b81363c4d178b40bd8ce2e590395/clickhouse_connect-1.5.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:202f7da7d32f1c390b9c38d04e7c0c343ddf668f1a5a436c0fcfdb9f6c0da3d3", size = 1279830, upload-time = "2026-07-15T17:14:04.552Z" }, + { url = "https://files.pythonhosted.org/packages/26/bb/a47c0c49aa5d36a2e85d5fe860ac4af42902be728d15e561815d95260064/clickhouse_connect-1.5.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6375b2198f1e419dc04d74cacd568adf746d8051791aa8efd3175978e467ca5d", size = 1304130, upload-time = "2026-07-15T17:14:06.091Z" }, + { url = "https://files.pythonhosted.org/packages/a9/38/6fa8b7e1e383f64ae4ef50cb7d3166533cdc5976c0b2ce98757fb8ed9d90/clickhouse_connect-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:eb85acb5a7cd047d42673a8edd0bd74d7ebb253beb157aa3607391d9c980065f", size = 1256833, upload-time = "2026-07-15T17:14:07.662Z" }, + { url = "https://files.pythonhosted.org/packages/af/ed/a0bcfa09f782d3bc954edc232411baedf389911e05f5f0e36863518ce1c5/clickhouse_connect-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c4453c225dc41036d4b7ae373d0b23213cfd21972ff0d0bb4325a287e6f5954e", size = 1300115, upload-time = "2026-07-15T17:14:09.218Z" }, + { url = "https://files.pythonhosted.org/packages/9b/16/6d07b4ac1f128213d5470be03cd4722ef0dd8664ed1fe61c1aa83520e3a8/clickhouse_connect-1.5.0-cp313-cp313-win32.whl", hash = "sha256:dc7098a783c0424f6af2362a79e005143bd95c60d817874598ca7a5f4850d49d", size = 321597, upload-time = "2026-07-15T17:14:10.678Z" }, + { url = "https://files.pythonhosted.org/packages/f1/90/b9e1c1142843dff138ab2e7f227de1b9283b4b4bb35dbc3bb5c5bf7ab435/clickhouse_connect-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:7d47c9c42e1498ecbf4a114607038e36a573d4ee80059aee9e109ceed1cafcb9", size = 339819, upload-time = "2026-07-15T17:14:12.292Z" }, + { url = "https://files.pythonhosted.org/packages/1f/d4/7d11691d710cf23a9e5fb88ed8039c22eba4efadea3611abd1f1526b21c1/clickhouse_connect-1.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:853abae44729fac14f184ea7cc14677fef42d5ffc8ac5a23ef618838bfd711ff", size = 321640, upload-time = "2026-07-15T17:14:13.748Z" }, +] + +[package.optional-dependencies] +arrow = [ + { name = "pyarrow" }, +] +async = [ + { name = "aiohttp" }, ] [[package]] @@ -823,7 +822,7 @@ wheels = [ [[package]] name = "daft" -version = "0.7.21" +version = "0.7.23" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "fsspec" }, @@ -832,11 +831,11 @@ dependencies = [ { name = "tqdm" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/12/8a/015e9461493aa47652348881480a9e311aa52aff955501ef1a3f5833e429/daft-0.7.21-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:e399b7f680d31c6d8b3e7cbfefc6d0a78410b565b46ab64970e54536e7246c12", size = 55709805, upload-time = "2026-07-17T20:35:45.494Z" }, - { url = "https://files.pythonhosted.org/packages/88/c1/876bcfb45dc64640f956e9322e4b195cf816679fbb0ea75e149c199768c0/daft-0.7.21-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:8c58be1665e19339f2748e7bc03c7fb3667a5e2ef5735696eefc31e85661fb7f", size = 51558429, upload-time = "2026-07-17T20:35:48.959Z" }, - { url = "https://files.pythonhosted.org/packages/61/26/e7820790b286aa7711846a40408aab09692b72ada10a9481e92ca14ee2f0/daft-0.7.21-cp310-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:bad1a622db5ad592a84409171b8555b0020e46af6a1480286bb545355f570b75", size = 53880723, upload-time = "2026-07-17T20:35:51.869Z" }, - { url = "https://files.pythonhosted.org/packages/e7/8b/152f56f6da4315f6f09067368c8838c414dd1410e034c70c80e2d71b032e/daft-0.7.21-cp310-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:12f4dc2df39a1849d350112a5088e12af5223ef45b558b355e3b874d473733c3", size = 56083959, upload-time = "2026-07-17T20:35:55.47Z" }, - { url = "https://files.pythonhosted.org/packages/e0/41/6a0814ebb930c21c6ad9b600d3778b7bb44ce72d60b3ccbeec131626a989/daft-0.7.21-cp310-abi3-win_amd64.whl", hash = "sha256:3295dedaf132e1e4fc04a1e0b1c2577546f24c6289d32cd60566af357a1b5cc3", size = 55190558, upload-time = "2026-07-17T20:35:58.435Z" }, + { url = "https://files.pythonhosted.org/packages/ea/3d/19621ac6b75b0a05860f1300bbf51f0afab77d6fa89eee33d863522ce996/daft-0.7.23-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:2e0401ab2b6aba0c44356e80898522d81570c5e923a721a720c4d16f559c1098", size = 55747933, upload-time = "2026-08-05T21:58:19.94Z" }, + { url = "https://files.pythonhosted.org/packages/3a/a7/68d72113e10b32068675b22e75d2d76ce947fa8317a3e13af5ff3161db3b/daft-0.7.23-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:2884b0e15f31107edf745e4cd58fef3fc083face532f52120f97dfd3669cc552", size = 51602439, upload-time = "2026-08-05T21:58:23.112Z" }, + { url = "https://files.pythonhosted.org/packages/5e/82/e004e73e781fa2e7da6362531bbbd305f0d04d10ee61a1f2cb6c5a6b5b35/daft-0.7.23-cp310-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:bb73eaa39c317284e1e8cbfb85dc71bbb9e6de400455e865e1bff92dd721e949", size = 53911416, upload-time = "2026-08-05T21:58:26.246Z" }, + { url = "https://files.pythonhosted.org/packages/98/7a/3b52af66b5cc1be79cf15403b9db2677f14e76fa637844bfa6d85ce5d78e/daft-0.7.23-cp310-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:4fd93b1d39308f7e06dd56cd92abbcf0bc0d13cedc51f189bf9a7ca1074945be", size = 56126245, upload-time = "2026-08-05T21:58:29.964Z" }, + { url = "https://files.pythonhosted.org/packages/40/f2/9fdbe7132e63d69a6906b04524b927b96581e0436d8b74e91d3f176e0710/daft-0.7.23-cp310-abi3-win_amd64.whl", hash = "sha256:d90e2c4832ec2df622109a43884055187ad1fd8de3cdd77fe7abcd47f4fbc36b", size = 55232502, upload-time = "2026-08-05T21:58:32.997Z" }, ] [package.optional-dependencies] @@ -1440,6 +1439,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7d/f9/97f2ca8bb3ec6e4b1d64f983ebe98b9a192faddff67fac3d6303a537e670/importlib_metadata-8.9.0-py3-none-any.whl", hash = "sha256:e0f761b6ea91ced3b0844c14c9d955224d538105921f8e6754c00f6ca79fba7f", size = 27220, upload-time = "2026-03-20T16:56:25.07Z" }, ] +[[package]] +name = "importlib-resources" +version = "7.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/06/b56dfa750b44e86157093bc8fca0ab81dccbf5260510de4eaf1cb69b5b99/importlib_resources-7.1.0.tar.gz", hash = "sha256:0722d4c6212489c530f2a145a34c0a7a3b4721bc96a15fada5930e2a0b760708", size = 44985, upload-time = "2026-04-12T16:36:09.232Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/db/55a262f3606bebcae07cc14095338471ad7c0bbcaa37707e6f0ee49725b7/importlib_resources-7.1.0-py3-none-any.whl", hash = "sha256:1bd7b48b4088eddb2cd16382150bb515af0bd2c70128194392725f82ad2c96a1", size = 37232, upload-time = "2026-04-12T16:36:08.219Z" }, +] + [[package]] name = "iniconfig" version = "2.3.0" @@ -4475,7 +4483,7 @@ causal = [ { name = "econml" }, ] clickhouse = [ - { name = "clickhouse-connect" }, + { name = "clickhouse-connect", extra = ["arrow", "async"] }, ] data = [ { name = "lance-ray" }, @@ -4497,6 +4505,11 @@ dev = [ { name = "ruff" }, { name = "types-pyyaml" }, ] +doris-flight = [ + { name = "adbc-driver-flightsql" }, + { name = "adbc-driver-manager" }, + { name = "pymysql" }, +] explainability = [ { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64' and sys_platform == 'darwin'" }, { name = "numpy", version = "2.5.2", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, @@ -4589,7 +4602,7 @@ streaming-inference = [ ] test-integration = [ { name = "boto3" }, - { name = "clickhouse-connect" }, + { name = "clickhouse-connect", extra = ["arrow", "async"] }, { name = "daft", extra = ["lance", "ray"] }, { name = "lance-ray" }, { name = "ml-dtypes" }, @@ -4611,7 +4624,7 @@ test-integration = [ ] training = [ { name = "boto3" }, - { name = "clickhouse-connect" }, + { name = "clickhouse-connect", extra = ["arrow", "async"] }, { name = "daft", extra = ["lance", "ray"] }, { name = "lance-ray" }, { name = "ml-dtypes" }, @@ -4639,7 +4652,7 @@ vector-index = [ [package.dev-dependencies] dev = [ { name = "boto3" }, - { name = "clickhouse-connect" }, + { name = "clickhouse-connect", extra = ["arrow", "async"] }, { name = "daft" }, { name = "grpcio-tools" }, { name = "ml-dtypes" }, @@ -4657,12 +4670,14 @@ dev = [ [package.metadata] requires-dist = [ { name = "accelerate", marker = "extra == 'streaming'", specifier = ">=0.20.0" }, + { name = "adbc-driver-flightsql", marker = "extra == 'doris-flight'", specifier = ">=1.6,<2" }, + { name = "adbc-driver-manager", marker = "extra == 'doris-flight'", specifier = ">=1.6,<2" }, { name = "aiohttp", specifier = ">=3.13.4" }, { name = "boto3", marker = "extra == 's3'", specifier = ">=1.42.91" }, { name = "click", specifier = ">=8.0.0" }, - { name = "clickhouse-connect", marker = "extra == 'clickhouse'", specifier = ">=1.3.0" }, + { name = "clickhouse-connect", extras = ["arrow", "async"], marker = "extra == 'clickhouse'", specifier = ">=1.5,<1.6" }, { name = "confluent-kafka", marker = "extra == 'streaming-inference'", specifier = ">=2.3.0" }, - { name = "daft", extras = ["lance", "ray"], marker = "extra == 'data-daft'", specifier = ">=0.7.0,<0.8.0" }, + { name = "daft", extras = ["lance", "ray"], marker = "extra == 'data-daft'", specifier = ">=0.7.23,<0.7.24" }, { name = "dowhy", marker = "extra == 'causal'", specifier = ">=0.11.0" }, { name = "econml", marker = "extra == 'causal'", specifier = ">=0.15.0" }, { name = "grpcio", marker = "extra == 'grpc'", specifier = ">=1.60.0" }, @@ -4689,7 +4704,8 @@ requires-dist = [ { name = "pydantic", specifier = ">=2.0.0" }, { name = "pyiceberg", marker = "extra == 'data'", specifier = ">=0.11.1,<0.12.0" }, { name = "pylance", marker = "extra == 'data'", specifier = "==9.0.0" }, - { name = "pymysql", marker = "extra == 'mysql'", specifier = ">=1.1.0" }, + { name = "pymysql", marker = "extra == 'doris-flight'", specifier = ">=1.2,<1.3" }, + { name = "pymysql", marker = "extra == 'mysql'", specifier = ">=1.2,<1.3" }, { name = "pytest", marker = "extra == 'dev'", specifier = ">=7.0.0" }, { name = "pytest", marker = "extra == 'test-integration'", specifier = ">=7.0.0" }, { name = "pytest-asyncio", marker = "extra == 'dev'", specifier = ">=0.21.0" }, @@ -4723,13 +4739,13 @@ requires-dist = [ { name = "types-pyyaml", marker = "extra == 'dev'", specifier = ">=6.0.12.20250516" }, { name = "xgboost", marker = "extra == 'training'", specifier = ">=2.1.0" }, ] -provides-extras = ["dev", "data", "data-daft", "vector-index", "postgresql", "clickhouse", "mysql", "s3", "model-export", "model-export-torch", "hf", "model-export-hf", "training", "explainability", "identity", "streaming", "grpc", "registry", "graph", "causal", "streaming-inference", "test-integration"] +provides-extras = ["dev", "data", "data-daft", "vector-index", "postgresql", "clickhouse", "mysql", "doris-flight", "s3", "model-export", "model-export-torch", "hf", "model-export-hf", "training", "explainability", "identity", "streaming", "grpc", "registry", "graph", "causal", "streaming-inference", "test-integration"] [package.metadata.requires-dev] dev = [ { name = "boto3", specifier = ">=1.42.91" }, - { name = "clickhouse-connect", specifier = ">=1.3.0" }, - { name = "daft", specifier = ">=0.7.0,<0.8.0" }, + { name = "clickhouse-connect", extras = ["arrow", "async"], specifier = ">=1.5,<1.6" }, + { name = "daft", specifier = ">=0.7.23,<0.7.24" }, { name = "grpcio-tools", specifier = ">=1.60.0" }, { name = "ml-dtypes", specifier = ">=0.5.0" }, { name = "moto", extras = ["server"], specifier = ">=5.1.0" }, From 846449391ef5992eeb31d5fefd11acd2d18e8729 Mon Sep 17 00:00:00 2001 From: jiangxt2 Date: Sun, 16 Aug 2026 14:37:02 +0800 Subject: [PATCH 2/3] fix(data): annotate Daft SQL binding classes as public API The CI public-API checker requires every __all__ export to carry a @PublicAPI annotation; DaftClickHouseBinding and DaftDorisBinding were exported by the new facade modules without one, failing the Lint job. - Mark both classes @PublicAPI(stability=Stability.ALPHA), matching their adapter-level support status Signed-off-by: jiangxt2 --- src/tributo/data/bindings/_daft_sql.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/tributo/data/bindings/_daft_sql.py b/src/tributo/data/bindings/_daft_sql.py index 0f2959e..74b21ad 100644 --- a/src/tributo/data/bindings/_daft_sql.py +++ b/src/tributo/data/bindings/_daft_sql.py @@ -30,6 +30,7 @@ apply_pipeline_to_daft_df, ) from tributo.exceptions import JobConfigurationError +from tributo.util.annotations import PublicAPI, Stability @dataclass(frozen=True) @@ -177,12 +178,14 @@ def _wrap( ) +@PublicAPI(stability=Stability.ALPHA) class DaftClickHouseBinding(_DaftSqlBinding): connector_id = "clickhouse" package_name = "daft-clickhouse" reader_api = "daft_clickhouse.read_clickhouse" +@PublicAPI(stability=Stability.ALPHA) class DaftDorisBinding(_DaftSqlBinding): connector_id = "doris" package_name = "daft-doris" From 207031319422914b805536900e5842df9dcf60be Mon Sep 17 00:00:00 2001 From: jiangxt2 Date: Sun, 16 Aug 2026 14:56:43 +0800 Subject: [PATCH 3/3] docs: regenerate public API reference for Daft SQL bindings DaftClickHouseBinding and DaftDorisBinding are now @PublicAPI targets; the generated data.md page was stale, failing the docs contracts check in Unit Tests and Documentation Build jobs. - Regenerate docs/reference/api/data.md via tools/generate_public_api_reference.py Signed-off-by: jiangxt2 --- docs/reference/api/data.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/docs/reference/api/data.md b/docs/reference/api/data.md index 47acba0..7539936 100644 --- a/docs/reference/api/data.md +++ b/docs/reference/api/data.md @@ -9,6 +9,17 @@ a public annotation or moving a public object. Stable, Beta, and Alpha objects appear because Ray-style API policy requires documentation for every public stability tier. +## `tributo.data.bindings._daft_sql` + +```{autoclass} tributo.data.bindings._daft_sql.DaftClickHouseBinding +:no-members: +``` + +```{autoclass} tributo.data.bindings._daft_sql.DaftDorisBinding +:no-members: +``` + + ## `tributo.data.contracts.handles` ```{autoclass} tributo.data.contracts.handles.DaftDataFrameHandle