From a8a24b877c92cf45e4a4b79413310ffe41b6e0dc Mon Sep 17 00:00:00 2001 From: Zac Farrell Date: Thu, 1 Oct 2026 10:45:32 -0700 Subject: [PATCH] chore(deps): require hotdata 0.11 and hotdata-ibis 0.6 hotdata-ibis 0.6 requires hotdata>=0.11,<0.12, and uv resolves the [ibis] extra into the same lockfile, so the two must move together. None of the symbols removed in hotdata 0.10/0.11 (JWT exchange, Secrets/Refresh/ConnectionTypes APIs, connection health) are used here. --- CHANGELOG.md | 3 +++ docs/sql-client-spec.md | 10 +++++----- pyproject.toml | 18 ++++++++---------- uv.lock | 16 ++++++++-------- 4 files changed, 24 insertions(+), 23 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b7946c..74ffe37 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,9 @@ Changelog style — terse "bullet + brief why": - Require `hotdata-framework>=0.14.1,<0.15` (was `>=0.14.0`); 0.14.1 allows `hotdata<0.12`, a prerequisite for adopting hotdata 0.11. +- Require `hotdata>=0.11,<0.12` (was `>=0.9.0,<0.10`) and, for the `[ibis]` extra, + `hotdata-ibis>=0.6,<0.7` (was `>=0.5.0,<0.6`); hotdata 0.10 drops the JWT key + exchange (the API token is sent as the bearer directly). - Diagnostic CLI retry defaults aligned with the destination's: `max_retries` 8 (was 5), `retry_backoff_seconds` 1.5 (was 1.0). diff --git a/docs/sql-client-spec.md b/docs/sql-client-spec.md index a63d76e..725ba7f 100644 --- a/docs/sql-client-spec.md +++ b/docs/sql-client-spec.md @@ -346,13 +346,13 @@ moves between dlt **minors** — method signatures, the cursor's `iter_arrow`/`i import location of `WithSqlClient`. A minor bump can change the base-class contract out from under us. Built/verified against `dlt==1.28.1`. -**Why cap the Hotdata SDKs — `hotdata>=0.9.0,<0.10`, -`hotdata-framework>=0.13.0,<0.14`.** The read path uses query/result API models, +**Why cap the Hotdata SDKs — `hotdata>=0.11,<0.12`, +`hotdata-framework>=0.14.1,<0.15`.** The read path uses query/result API models, managed-table layout metadata, and the framework load helpers that carry native append/delete/update/upsert support. These SDKs move quickly, so the destination tracks one tested minor at a time. -The framework floor sits at 0.13 because every load on the `append`/`replace` +The framework floor is ≥0.13 because every load on the `append`/`replace` path goes out as `mode="append"`, and an earlier framework runs an append at most once — leaving the loads this package issues most, dlt's `_dlt_pipeline_state` / `_dlt_loads` / `_dlt_version` bookkeeping among them, outside the caller's retry @@ -364,8 +364,8 @@ all: a transitive cap here bounds them whatever their own pin says. ```toml dependencies = [ "dlt>=1.28.1,<1.29", # subclass dlt internals -> cap the minor - "hotdata>=0.9.0,<0.10", # generated client: query/results APIs - "hotdata-framework>=0.13.0,<0.14", # managed-table load and layout helpers + "hotdata>=0.11,<0.12", # generated client: query/results APIs + "hotdata-framework>=0.14.1,<0.15", # managed-table load and layout helpers ... ] ``` diff --git a/pyproject.toml b/pyproject.toml index 9660309..8cd7288 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,7 +20,7 @@ dependencies = [ # create_managed_database(keys=) / add_managed_table(key=) (framework 0.8.0), # for native delete/update/upsert. # - # The floors are held ABOVE that on purpose: hotdata 0.9 is where the rest of + # The floors are held ABOVE that on purpose: hotdata 0.11 is where the rest of # the toolchain has moved, and admitting older versions would mean supporting # a matrix nothing tests. The framework floor is the one with a hard reason. # @@ -40,7 +40,7 @@ dependencies = [ # The cap stays at the minor for the reason above it, and widening it is # what lets a consumer of this package adopt a newer framework at all: a # transitive cap here is what blocks them, not their own pin. - "hotdata>=0.9.0,<0.10", + "hotdata>=0.11,<0.12", "hotdata-framework>=0.14.1,<0.15", "pandas>=2.0", "pyarrow>=14", @@ -50,14 +50,12 @@ dependencies = [ # Live ibis backend for dataset().ibis(). Pulls the out-of-tree ibis.hotdata # backend and ibis itself; the base install stays ibis-free. # -# hotdata-ibis 0.5.0 is the first release without a `hotdata<0.9` cap. That cap -# is why this floor is worth recording: uv resolves a project's own extras into -# one universal lockfile, so hotdata-ibis bounded `hotdata` in uv.lock here even -# for `uv sync` without `--extra ibis`. A plain `pip install` of the base package -# is unaffected — pip reads an extra's requirements only when the extra is -# requested. So this cap blocked THIS repo from adopting hotdata 0.9; what blocked -# consumers downstream was the core `hotdata-framework` cap above. -ibis = ["hotdata-ibis>=0.5.0,<0.6", "ibis-framework>=12,<13"] +# hotdata-ibis caps `hotdata` (0.6 requires hotdata>=0.11,<0.12), and uv +# resolves a project's own extras into one universal lockfile, so that cap bounds +# `hotdata` in uv.lock here even for `uv sync` without `--extra ibis`. Bump the +# two together. A plain `pip install` of the base package is unaffected — pip +# reads an extra's requirements only when the extra is requested. +ibis = ["hotdata-ibis>=0.6,<0.7", "ibis-framework>=12,<13"] [project.urls] Homepage = "https://hotdata.dev" diff --git a/uv.lock b/uv.lock index 51a19cb..e09a241 100644 --- a/uv.lock +++ b/uv.lock @@ -306,7 +306,7 @@ wheels = [ [[package]] name = "hotdata" -version = "0.9.0" +version = "0.11.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic" }, @@ -314,9 +314,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6e/db/91d0e8f8a8bfc9a76b588c8dc2ecb054d3e70ebf2ee7a70cd6e4a99a7dec/hotdata-0.9.0.tar.gz", hash = "sha256:35e4a569b7223e025c26b0d3299c8b4cd493276f32826682de6df9e583cea4ef", size = 217368, upload-time = "2026-08-11T14:09:08.166Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/10/1a21c58de1fee8c63bf983db9531704e9b0611c63fd7a849a9ffdf9cc8c7/hotdata-0.11.0.tar.gz", hash = "sha256:a0e9fd242baa51b9350a969222319bcdf2c6ede1cf2e8a99e3f81d608af7b6fc", size = 207167, upload-time = "2026-09-18T20:58:41.802Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/48/9b2f5cbbcc92e6dc06a6980fcf4413b83484af302a78263381a22236c308/hotdata-0.9.0-py3-none-any.whl", hash = "sha256:9d942a0d78979552ad641419e5706c9703d5165db0cf3497ae49344cd032e635", size = 316070, upload-time = "2026-08-11T14:09:06.589Z" }, + { url = "https://files.pythonhosted.org/packages/ac/a4/cc71105c5971d29b40cfff76ab592fed95e1d433903631f9d2fccede50a4/hotdata-0.11.0-py3-none-any.whl", hash = "sha256:4ece2f43bac9a4f43ad32c305aa93042aa4a4f68a5bbdec4f2c6ae0b29f591d6", size = 292742, upload-time = "2026-09-18T20:58:40.049Z" }, ] [[package]] @@ -349,9 +349,9 @@ dev = [ [package.metadata] requires-dist = [ { name = "dlt", specifier = ">=1.28.1,<1.29" }, - { name = "hotdata", specifier = ">=0.9.0,<0.10" }, + { name = "hotdata", specifier = ">=0.11,<0.12" }, { name = "hotdata-framework", specifier = ">=0.14.1,<0.15" }, - { name = "hotdata-ibis", marker = "extra == 'ibis'", specifier = ">=0.5.0,<0.6" }, + { name = "hotdata-ibis", marker = "extra == 'ibis'", specifier = ">=0.6,<0.7" }, { name = "ibis-framework", marker = "extra == 'ibis'", specifier = ">=12,<13" }, { name = "pandas", specifier = ">=2.0" }, { name = "pyarrow", specifier = ">=14" }, @@ -383,7 +383,7 @@ wheels = [ [[package]] name = "hotdata-ibis" -version = "0.5.0" +version = "0.6.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "hotdata" }, @@ -393,9 +393,9 @@ dependencies = [ { name = "pyarrow-hotfix" }, { name = "sqlglot" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/58/13/447c2c76dad2d4cfa0c1b1216c57525d5ea1546e23cfe4d92cb90d618366/hotdata_ibis-0.5.0.tar.gz", hash = "sha256:d5e26381779628422ca9bf8cbaccf1dcbfdc589407593b71afcf580afc411c8f", size = 28386, upload-time = "2026-08-11T17:32:10.751Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a6/fa/bb91fc802d3adc9a7c2c5916f0486b2af4c3464c95b7493433de646d6198/hotdata_ibis-0.6.0.tar.gz", hash = "sha256:4238b9ed7fee950a01e4ecd50b99f50bec6db55f40e5dc6081344a036d81fa91", size = 28596, upload-time = "2026-10-01T17:40:54.958Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/67/4a0e129396b3719a264d0d4888aeb2f4c9741ba53995bb6e837b9ee5295e/hotdata_ibis-0.5.0-py3-none-any.whl", hash = "sha256:e41c6ea4fc944486e443e0f4d7864cb5a870fecbbbf8b9954c6860fae843067c", size = 19693, upload-time = "2026-08-11T17:32:09.528Z" }, + { url = "https://files.pythonhosted.org/packages/5f/a6/f6fb10233ab153030bb69fd7bb6961900a847883f5ef02eacf4a635b073c/hotdata_ibis-0.6.0-py3-none-any.whl", hash = "sha256:89faccffaf1af9f3b09ce64c441cc6bb65c2709155ab213e3f432a900aa3302a", size = 19835, upload-time = "2026-10-01T17:40:53.506Z" }, ] [[package]]