continuo-python-runtime 0.7.0__py3-none-any.whl → 0.8.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: continuo-python-runtime
3
- Version: 0.7.0
3
+ Version: 0.8.0
4
4
  Summary: Runtime harness, contract tooling, and CI lint for Continuo python nodes.
5
5
  Author: Simone Carolini
6
6
  Maintainer: Simone Carolini
@@ -41,15 +41,16 @@ Five artifacts come out of this repository:
41
41
  - **The `continuo-engine-contract` PyPI package** — the `WarehouseAdapter`
42
42
  port, the contract schema, the shared SQL/type/config guards, and the
43
43
  sentinel result-block format. Adapter authors outside this repo pin it.
44
- - **The two engine-adapter PyPI packages** (`continuo-postgres-adapter`,
45
- `continuo-trino-adapter`) — one `WarehouseAdapter` implementation per
44
+ - **The three engine-adapter PyPI packages** (`continuo-postgres-adapter`,
45
+ `continuo-trino-adapter`, `continuo-duckdb-adapter`) — one `WarehouseAdapter` implementation per
46
46
  warehouse engine, each published independently under the same tag. A
47
47
  domain repo normally never installs these directly (the engine image
48
48
  already has the matching one baked in); they exist as standalone PyPI
49
49
  packages for the "build your own container" shape (see below) and for
50
50
  third-party adapter authors to reference.
51
51
  - **Per-engine base images**, one per warehouse engine
52
- (`continuo-python-runtime-postgres`, `continuo-python-runtime-trino`), that
52
+ (`continuo-python-runtime-postgres`, `continuo-python-runtime-trino`,
53
+ `continuo-python-runtime-duckdb`), that
53
54
  domain repos build `FROM`. Each image bakes in the runtime and a single
54
55
  `WarehouseAdapter` for that engine, and serves both roles that adapter has:
55
56
  the node harness (`ENTRYPOINT ["continuo-runtime"]`, `CMD ["run"]`) and the
@@ -57,15 +58,17 @@ Five artifacts come out of this repository:
57
58
  - **`template/`** — a copy-ready domain repo: `Dockerfile`, `contracts/`,
58
59
  `scripts/`, and the `release.yml` CI/CD workflow.
59
60
 
60
- One `vX.Y.Z` git tag releases all of it: `publish-pypi.yml` builds all four
61
- PyPI distributions into a single `dist/` and publishes them together, and
62
- `images.yml` builds and pushes both engine images — each installing its
63
- matching pinned adapter version from that same release — multi-arch under
64
- the same tag.
61
+ One `vX.Y.Z` git tag releases all of it: `publish-pypi.yml` builds all five
62
+ PyPI distributions into a single `dist/`, verifies them (and full engine
63
+ images built from them) on amd64 and arm64, and only then publishes them
64
+ together. It then builds all three engine images natively per architecture —
65
+ each installing its matching pinned adapter version from that same release —
66
+ pulls and smoke-tests the exact pushed digests, and finally gives the verified
67
+ amd64 + arm64 digests one multi-arch tag. See `CONTRIBUTING.md` (Releasing).
65
68
 
66
69
  ### What this repo owns
67
70
 
68
- This repository owns the entire python-node surface: the engine contract, both
71
+ This repository owns the entire python-node surface: the engine contract, the three
69
72
  engine adapters, the validation runner, and the node harness. The former
70
73
  `continuo-validation` repository was merged in — there is no longer a separate
71
74
  validation-side port, adapter class, entry-point group, or image. One
@@ -80,16 +83,18 @@ validation-side port, adapter class, entry-point group, or image. One
80
83
  | `continuo-engine-contract` | `continuo_engine_contract` | this repo, `contract/` | The `WarehouseAdapter` port, contract schema, the SQL/type/config guards adapters must run, and the result-block format. Published to PyPI. |
81
84
  | `continuo-postgres-adapter` | `continuo_postgres_adapter` | this repo, `adapters/postgres/` | `PostgresAdapter` — one class, both roles. Published to PyPI. |
82
85
  | `continuo-trino-adapter` | `continuo_trino_adapter` | this repo, `adapters/trino/` | `TrinoAdapter` — one class, both roles, for Trino/Iceberg. Published to PyPI. |
86
+ | `continuo-duckdb-adapter` | `continuo_duckdb_adapter` | this repo, `adapters/duckdb/` | `DuckDBAdapter` — one class, both roles, for DuckDB on a DuckLake (Postgres catalog, Parquet on S3). Published to PyPI. |
83
87
 
84
- All four are uv workspace members (`[tool.uv.workspace]` in the root
88
+ All five are uv workspace members (`[tool.uv.workspace]` in the root
85
89
  `pyproject.toml`), so `uv sync --all-packages --all-groups` at the repo root
86
90
  installs everything for local development.
87
91
 
88
- **All four packages in the table above are published to PyPI**, under the
89
- same `vX.Y.Z` tag. The two engine images then **install the matching pinned
92
+ **All five packages in the table above are published to PyPI**, under the
93
+ same `vX.Y.Z` tag. The three engine images then **install the matching pinned
90
94
  adapter version from PyPI** — `Dockerfile.postgres` installs
91
95
  `continuo-postgres-adapter==X.Y.Z`, `Dockerfile.trino` installs
92
- `continuo-trino-adapter==X.Y.Z` — rather than building it from this repo's
96
+ `continuo-trino-adapter==X.Y.Z` and `Dockerfile.duckdb` installs
97
+ `continuo-duckdb-adapter==X.Y.Z` — rather than building it from this repo's
93
98
  source tree, so each image still ships exactly one adapter and the runtime
94
99
  still discovers it through the `continuo_engine.adapters` entry-point group
95
100
  at run time. The image **name** (`continuo-python-runtime-<engine>`) and the
@@ -97,7 +102,7 @@ adapter's pip **distribution** name (`continuo-<engine>-adapter`) are two
97
102
  different artifacts of the same adapter — same engine, same version, same
98
103
  runtime behavior, different packaging; see "Build your own container" below
99
104
  for a build shape that installs the pip package directly instead of `FROM`
100
- the image. All four packages are still built, type-checked, and tested by CI
105
+ the image. All five packages are still built, type-checked, and tested by CI
101
106
  on every change.
102
107
 
103
108
  ### The result block is a frozen wire contract
@@ -149,7 +154,7 @@ the pre-flight check once before your next release; it reports every affected
149
154
  read at once:
150
155
 
151
156
  ```bash
152
- continuo-runtime validate contracts/ --dialect postgres # or trino
157
+ continuo-runtime validate contracts/ --dialect postgres # or trino, duckdb
153
158
  ```
154
159
 
155
160
  The runtime image does not re-run this gate, so a read that passes here is
@@ -281,9 +286,9 @@ A domain repo picks its warehouse engine by which base image it builds
281
286
  `FROM`:
282
287
 
283
288
  ```dockerfile
284
- FROM ghcr.io/carolsimone/continuo-python-runtime-postgres:v0.7.0
289
+ FROM ghcr.io/carolsimone/continuo-python-runtime-postgres:v0.8.0
285
290
  # or
286
- FROM ghcr.io/carolsimone/continuo-python-runtime-trino:v0.7.0
291
+ FROM ghcr.io/carolsimone/continuo-python-runtime-trino:v0.8.0
287
292
  ```
288
293
 
289
294
  The engine is part of the image **name**; the tag is the bare version, so
@@ -294,7 +299,7 @@ pinned PyPI version of the `continuo-postgres-adapter` or
294
299
  `continuo-trino-adapter` package built from this repo's `adapters/postgres/`
295
300
  or `adapters/trino/` source (see the table above) — registered under the
296
301
  `continuo_engine.adapters` entry-point group (entry names `postgres` /
297
- `trino`). The runtime discovers it via `discover_adapter()` at run time, so a
302
+ `trino` / `duckdb`). The runtime discovers it via `discover_adapter()` at run time, so a
298
303
  single image serves every node in the service and the release-time
299
304
  validation Job for it. The executor injects the warehouse connection as
300
305
  environment variables (engine-native, e.g.
@@ -23,9 +23,9 @@ continuo_python_runtime/csv_readers/s3.py,sha256=zmvHs3TxlN2alPKrdaHzPyREmkve2nB
23
23
  continuo_python_runtime/validation/__init__.py,sha256=hz5oGXsoaUoygR0_pBby9PS6cEfrre518EE0HGB58eE,79
24
24
  continuo_python_runtime/validation/runner.py,sha256=7pbksf7MXfTNcdklCOkOXg9qfRiJtyI_dbgbL3a9LWk,14072
25
25
  continuo_python_runtime/validation/s3.py,sha256=q8nRrT9R7L1-M4dSlDnkL7CUJMPmq86MHY_UKYFlEf8,1785
26
- continuo_python_runtime-0.7.0.dist-info/METADATA,sha256=Uo2XMCZawYbKgpER3qDn-eF_0cKJUZTultaxxcBAhuQ,19281
27
- continuo_python_runtime-0.7.0.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
28
- continuo_python_runtime-0.7.0.dist-info/entry_points.txt,sha256=ZvIwSm9f9B9ZmZMf6CyF5Zt4QONn8rqaIk-u-B1CF2Y,70
29
- continuo_python_runtime-0.7.0.dist-info/licenses/LICENSE,sha256=hfXfFCk-8gnps4YvHA6bjCNaSYqOrq2gAdqkXYycAQc,11345
30
- continuo_python_runtime-0.7.0.dist-info/licenses/NOTICE,sha256=ykgYyQkAMx3uas90FZHzt0aTca9IgJQCLpZ4d74Pl3U,465
31
- continuo_python_runtime-0.7.0.dist-info/RECORD,,
26
+ continuo_python_runtime-0.8.0.dist-info/METADATA,sha256=q2tb518F9n_Bo4LIzbhhGSGm5yJPxbrOkWJKJ6y9gxQ,19874
27
+ continuo_python_runtime-0.8.0.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
28
+ continuo_python_runtime-0.8.0.dist-info/entry_points.txt,sha256=ZvIwSm9f9B9ZmZMf6CyF5Zt4QONn8rqaIk-u-B1CF2Y,70
29
+ continuo_python_runtime-0.8.0.dist-info/licenses/LICENSE,sha256=hfXfFCk-8gnps4YvHA6bjCNaSYqOrq2gAdqkXYycAQc,11345
30
+ continuo_python_runtime-0.8.0.dist-info/licenses/NOTICE,sha256=ykgYyQkAMx3uas90FZHzt0aTca9IgJQCLpZ4d74Pl3U,465
31
+ continuo_python_runtime-0.8.0.dist-info/RECORD,,