You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Add a Snowflake warehouse engine: one WarehouseAdapter implementation, published as continuo-snowflake-adapter, with a continuo-python-runtime-snowflake base image.
Part of the warehouse-engines rollout tracked in carolsimone/continuo#517. Sibling engines: BigQuery (#57), Redshift (#59).
Scope
Mirror adapters/postgres/ and adapters/trino/. A new engine is one WarehouseAdapter subclass serving both roles (data plane + validation) and one image that runs both.
New uv workspace member adapters/snowflake/: continuo_snowflake_adapter/ (the adapter class), pyproject.toml, tests/, README.md. Add it to [tool.uv.workspace] in the root pyproject.toml.
Implement the data-plane methods: fetch, ensure_table, load.
Implement the validation methods: ensure_schema, drop_schema, build_empty_from_sql, build_empty_from_columns, clone_empty_from_prod, check_binds.
Register the adapter under the continuo_engine.adapters entry-point group (so the runtime discovers it at run time).
Publish continuo-snowflake-adapter on the shared vX.Y.Z tag (wire into publish-pypi.yml).
Add Dockerfile.snowflake + image-requirements-snowflake.txt; wire into images.yml → base image continuo-python-runtime-snowflake (installs the pinned continuo-snowflake-adapter==X.Y.Z).
Tests: adapter unit tests + the shared adapter conformance suite.
clone_empty_from_prod: Snowflake has zero-copy CREATE TABLE ... LIKE — the cheapest, most faithful path.
Identifier casing: Snowflake upper-cases unquoted identifiers — decide and document the quoting policy so check_binds and schema names round-trip.
Types: map the contract type set to Snowflake types.
Do not touch
The result-block wire contract is frozen (docs/boundary-contract.md, continuo_engine_contract.result). The Go side (pkg/validationresult in carolsimone/continuo) parses it byte-for-byte. Reuse it as-is.
Reference
adapters/trino/ and adapters/postgres/ — the two existing engines to copy from.
docs/boundary-contract.md — the external boundary contract.
continuo-engine-contract (contract/) — the WarehouseAdapter port and the shared SQL/type/config guards.
Add a Snowflake warehouse engine: one
WarehouseAdapterimplementation, published ascontinuo-snowflake-adapter, with acontinuo-python-runtime-snowflakebase image.Part of the warehouse-engines rollout tracked in carolsimone/continuo#517. Sibling engines: BigQuery (#57), Redshift (#59).
Scope
Mirror
adapters/postgres/andadapters/trino/. A new engine is oneWarehouseAdaptersubclass serving both roles (data plane + validation) and one image that runs both.adapters/snowflake/:continuo_snowflake_adapter/(the adapter class),pyproject.toml,tests/,README.md. Add it to[tool.uv.workspace]in the rootpyproject.toml.fetch,ensure_table,load.ensure_schema,drop_schema,build_empty_from_sql,build_empty_from_columns,clone_empty_from_prod,check_binds.continuo_engine.adaptersentry-point group (so the runtime discovers it at run time).continuo-snowflake-adapteron the sharedvX.Y.Ztag (wire intopublish-pypi.yml).Dockerfile.snowflake+image-requirements-snowflake.txt; wire intoimages.yml→ base imagecontinuo-python-runtime-snowflake(installs the pinnedcontinuo-snowflake-adapter==X.Y.Z).Engine notes
snowflake-connector-python).clone_empty_from_prod: Snowflake has zero-copyCREATE TABLE ... LIKE— the cheapest, most faithful path.check_bindsand schema names round-trip.Do not touch
The result-block wire contract is frozen (
docs/boundary-contract.md,continuo_engine_contract.result). The Go side (pkg/validationresultincarolsimone/continuo) parses it byte-for-byte. Reuse it as-is.Reference
adapters/trino/andadapters/postgres/— the two existing engines to copy from.docs/boundary-contract.md— the external boundary contract.continuo-engine-contract(contract/) — theWarehouseAdapterport and the shared SQL/type/config guards.