diff --git a/CHANGELOG.md b/CHANGELOG.md index 8175613..7beb6c3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,24 @@ Refactors, CI, and formatting land in the git history, not here. escape a value it did not author — an identifier taken from a URL, a name a user typed — and such a value can no longer change the shape of the query. +### Changed + +- **`idc-index` 0.13.3 / `idc-index-data` 25.0.4** (still IDC v25): a missing value in + `index.PatientAge`, `index.SeriesDescription`, `pt_index.SeriesType`, + `collections_index.supporting_data` or `clinical_index.column_label` is now NULL, never an empty + string, so SQL that tested `= ''` must test `IS NULL`. `volume_geometry_index` adds + `origin_patient`, `ImageOrientationPatient` and `slice_spacing_mm`. `GET /v3/version` and + `get_idc_version` report `idc_index_data_version` `25.0.4`; collection, series, and size totals + are unchanged. + +### Fixed + +- `get_table_schema` and `list_attributes` describe 19 columns that had no description, among + them `SeriesInstanceUID` in `index`, `sm_index` and `ann_index`, and `Rows`/`Columns` in + `ct_index`, `mr_index` and `pt_index`. `analysis_result_id` is described as NULL for original + data rather than as "not empty", and `seg_index.segmented_SeriesInstanceUID` says when it is + NULL. + ## [3.0.0b6] — 2026-10-15 Beta iteration: picks up the `idc-index-data` 25.0.1 patch, so `seg_index` covers Label Map diff --git a/dev/deployment.md b/dev/deployment.md index 09803a6..f56b346 100644 --- a/dev/deployment.md +++ b/dev/deployment.md @@ -160,7 +160,7 @@ python3 dev/smoke_openapi_examples.py "$URL" The image installs dependencies from [uv.lock](../uv.lock) (see [Dockerfile](../Dockerfile)), so it bakes exactly the `idc-index-data` the lock records and a rebuild of the same commit is deterministic. To move IDC versions, bump the exact `idc-index` pin in -[pyproject.toml](../pyproject.toml) (e.g. `idc-index==0.13.1`, which pulls a specific +[pyproject.toml](../pyproject.toml) (e.g. `idc-index==0.13.3`, which pulls a specific `idc-index-data`), run `uv lock` and commit both files — CI's `uv sync --locked` fails if the lock is stale — then **rebuild and redeploy** (steps 2–3). The running version is always reported at `/v3/version`. diff --git a/pyproject.toml b/pyproject.toml index 179ef03..0732a7d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,12 +11,12 @@ keywords = ["IDC", "DICOM", "cancer imaging", "MCP", "REST", "idc-index"] dependencies = [ # Query engine + data. # idc-index is pinned EXACTLY, unlike every other dependency here, because it transitively - # pins idc-index-data (0.13.1 -> 25.0.1) — which *is* the IDC data release this server + # pins idc-index-data (0.13.3 -> 25.0.4) — which *is* the IDC data release this server # advertises at /v3/version and documents in the changelog. The image installs from uv.lock, # so the lock alone already fixes it; the exact pin keeps the served IDC release explicit # here and stops a routine `uv lock --upgrade` from silently moving it. Bump this pin (then # `uv lock`) to move IDC versions — see dev/deployment.md § Updating for a new IDC release. - "idc-index==0.13.1", + "idc-index==0.13.3", "duckdb>=1.5.5", "pyarrow>=25.0.0", # Shared models / settings diff --git a/src/idc_api/rest/app.py b/src/idc_api/rest/app.py index d521202..c9495e5 100644 --- a/src/idc_api/rest/app.py +++ b/src/idc_api/rest/app.py @@ -385,7 +385,7 @@ def health(): "summary": "Illustrative — not live values", "value": { "idc_version": "v25", - "idc_index_data_version": "25.0.1", + "idc_index_data_version": "25.0.4", "api_version": "3.0.0", "build": "a1b2c3d", }, diff --git a/uv.lock b/uv.lock index b69ad8b..212e649 100644 --- a/uv.lock +++ b/uv.lock @@ -543,7 +543,7 @@ requires-dist = [ { name = "duckdb", specifier = ">=1.5.5" }, { name = "fastapi", specifier = ">=0.141.1" }, { name = "httpx", marker = "extra == 'dev'", specifier = ">=0.27" }, - { name = "idc-index", specifier = "==0.13.1" }, + { name = "idc-index", specifier = "==0.13.3" }, { name = "mcp", specifier = ">=1.29.0,<2" }, { name = "pip-audit", marker = "extra == 'dev'", specifier = ">=2.7" }, { name = "pyarrow", specifier = ">=25.0.0" }, @@ -558,7 +558,7 @@ provides-extras = ["dev"] [[package]] name = "idc-index" -version = "0.13.1" +version = "0.13.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, @@ -573,18 +573,18 @@ dependencies = [ { name = "s5cmd" }, { name = "tqdm" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8f/4a/25da5cbbdb9d5398d461c4425546186c492e4f432362d829b4e6bb8a94eb/idc_index-0.13.1.tar.gz", hash = "sha256:e1d22c3bc3e50bba9bb423def09220cfdb53fa0c9bcf2a3c3d61e152e2e999a0", size = 61541, upload-time = "2026-10-16T02:16:41.539Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c9/00/b15559ff69a11dc38ebd7b0c1bb433a1949b0c5f5472e60a7dec7f5b505b/idc_index-0.13.3.tar.gz", hash = "sha256:ea5c420ab65c026ff298f0c1c1234c2a56f40edff6f35094b772fa13a70b7180", size = 65167, upload-time = "2026-10-19T20:25:42.885Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c3/39/40f905d70ca5f54b45527ece8965997e108e58f722907f28233a5bda2533/idc_index-0.13.1-py3-none-any.whl", hash = "sha256:1d2e35c0ead24055b28ca6d7d2ead6a8867c7a5e89e877aec8fb348e353e3c02", size = 29686, upload-time = "2026-10-16T02:16:39.917Z" }, + { url = "https://files.pythonhosted.org/packages/71/09/aefa662061248a462f5dfbaa9a690b5e2ae223052ed4888c323ee34fe2b9/idc_index-0.13.3-py3-none-any.whl", hash = "sha256:13132f53788c7a28f65c041679c50cf3460532eb460f780b2974e5d43358dd91", size = 31219, upload-time = "2026-10-19T20:25:41.501Z" }, ] [[package]] name = "idc-index-data" -version = "25.0.1" +version = "25.0.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/42/cc/b5f16660de5795cbb56ac2d869150919b398a94d74ef0de3034806f9e023/idc_index_data-25.0.1.tar.gz", hash = "sha256:0652ae006f7ab7df440d269ca7fb63dc25816f6ae897e7b13f958e46427f3eb7", size = 79281989, upload-time = "2026-10-15T22:17:14.544Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d4/f5/2c8de62a18c1217da9658706705d05f971429390e6e72461045823f37f4e/idc_index_data-25.0.4.tar.gz", hash = "sha256:4e67517d30074ed77d30ba2cc09c8ca26a56d985b3a8487ad828e445d7ecc04b", size = 79260358, upload-time = "2026-10-19T19:13:20.401Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b5/1f/292e3aecd5b35e26268091a64ae2245b54ca62b38a698eb19d183a4a237c/idc_index_data-25.0.1-py3-none-any.whl", hash = "sha256:493b49d3d5ed760da06ae9ccc68124e83631daadd6ca10c2611a1af1eab6c3ea", size = 79243310, upload-time = "2026-10-15T22:17:09.845Z" }, + { url = "https://files.pythonhosted.org/packages/8a/b1/85df4c3c6a2360090b7c39455f0647e17960ed35d8b8685177847d2ccecf/idc_index_data-25.0.4-py3-none-any.whl", hash = "sha256:37292b2225b3c96feaed84dec0957ce094d30ed3b0d3a290f6e09d8f7b37eab3", size = 79222881, upload-time = "2026-10-19T19:13:15.165Z" }, ] [[package]]