diff --git a/.githooks/pre-commit b/.githooks/pre-commit new file mode 100755 index 0000000..398202d --- /dev/null +++ b/.githooks/pre-commit @@ -0,0 +1,37 @@ +#!/usr/bin/env bash +# Canonical CAVA pre-commit hook: keeps uv.lock in sync with pyproject.toml. +# +# If pyproject.toml is staged, finds the specific dependency line(s) that +# changed (added, removed, or had their version spec edited) and refreshes +# only those packages in uv.lock via `uv lock --upgrade-package`. Does not +# touch any other package -- this is a targeted sync, not a blanket +# `uv lock`, so it never pulls in an unrelated upstream release. +set -euo pipefail + +if ! git diff --cached --name-only | grep -q '^pyproject\.toml$'; then + exit 0 +fi + +if ! command -v uv >/dev/null 2>&1; then + echo "pre-commit: uv not found on PATH, skipping uv.lock sync" >&2 + exit 0 +fi + +changed_names=$(git diff --cached -- pyproject.toml \ + | grep -E '^[+-]\s*"[A-Za-z0-9][A-Za-z0-9._-]*' \ + | sed -E 's/^[+-]\s*"([A-Za-z0-9][A-Za-z0-9._-]*).*/\1/' \ + | sort -u) + +if [ -z "$changed_names" ]; then + exit 0 +fi + +upgrade_args=() +while IFS= read -r name; do + upgrade_args+=(--upgrade-package "$name") +done <<< "$changed_names" + +echo "pre-commit: syncing uv.lock for changed dependencies:" +echo "$changed_names" | sed 's/^/ - /' +uv lock "${upgrade_args[@]}" +git add uv.lock diff --git a/pyproject.toml b/pyproject.toml index f2457fd..7a9d39b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,26 +33,26 @@ classifiers = [ ] dependencies = [ - "omop-alchemy==0.8.0", + "omop-alchemy>=0.8.0,<1.0.0", "typing-extensions>=4.15.0", "typer>=0.12", "rich>=13.0", "oaklib", - "oa-configurator==0.1.2" + "oa-configurator>=0.1.2,<1.0.0" ] [project.optional-dependencies] emb = [ - "omop-emb==1.1.1", + "omop-emb>=1.1.1,<2.0.0", ] faiss-cpu = [ - "omop-emb[faiss-cpu]==1.1.1", + "omop-emb[faiss-cpu]>=1.1.1,<2.0.0", ] pgvector = [ - "omop-emb[pgvector]==1.1.1", + "omop-emb[pgvector]>=1.1.1,<2.0.0", ] postgres = [ - "omop-alchemy[postgres]", + "omop-alchemy[postgres]>=0.8.0,<1.0.0", ] @@ -70,7 +70,7 @@ dev = [ "mkdocs-mermaid2-plugin", "mkdocs-table-reader-plugin", "mkdocs-macros-plugin", - "oa-configurator[postgres]>=0.1.1", + "oa-configurator[postgres]>=0.1.2,<1.0.0", ] [project.scripts] diff --git a/uv.lock b/uv.lock index 7fee82f..db05e12 100644 --- a/uv.lock +++ b/uv.lock @@ -1861,18 +1861,18 @@ requires-dist = [ { name = "mkdocs-mermaid2-plugin", marker = "extra == 'dev'" }, { name = "mkdocs-table-reader-plugin", marker = "extra == 'dev'" }, { name = "mkdocstrings", extras = ["python"], marker = "extra == 'dev'" }, - { name = "oa-configurator", specifier = "==0.1.2" }, - { name = "oa-configurator", extras = ["postgres"], marker = "extra == 'dev'", specifier = ">=0.1.1" }, + { name = "oa-configurator", specifier = ">=0.1.2,<1.0.0" }, + { name = "oa-configurator", extras = ["postgres"], marker = "extra == 'dev'", specifier = ">=0.1.2,<1.0.0" }, { name = "oaklib" }, - { name = "omop-alchemy", specifier = "==0.8.0" }, + { name = "omop-alchemy", specifier = ">=0.8.0,<1.0.0" }, { name = "omop-alchemy", extras = ["postgres"], marker = "extra == 'dev'" }, { name = "omop-alchemy", extras = ["postgres"], marker = "extra == 'postgres'" }, - { name = "omop-emb", marker = "extra == 'dev'", specifier = "==1.1.1" }, - { name = "omop-emb", marker = "extra == 'emb'", specifier = "==1.1.1" }, - { name = "omop-emb", extras = ["faiss-cpu"], marker = "extra == 'dev'", specifier = "==1.1.1" }, - { name = "omop-emb", extras = ["faiss-cpu"], marker = "extra == 'faiss-cpu'", specifier = "==1.1.1" }, - { name = "omop-emb", extras = ["pgvector"], marker = "extra == 'dev'", specifier = "==1.1.1" }, - { name = "omop-emb", extras = ["pgvector"], marker = "extra == 'pgvector'", specifier = "==1.1.1" }, + { name = "omop-emb", marker = "extra == 'dev'", specifier = ">=1.1.1,<2.0.0" }, + { name = "omop-emb", marker = "extra == 'emb'", specifier = ">=1.1.1,<2.0.0" }, + { name = "omop-emb", extras = ["faiss-cpu"], marker = "extra == 'dev'", specifier = ">=1.1.1,<2.0.0" }, + { name = "omop-emb", extras = ["faiss-cpu"], marker = "extra == 'faiss-cpu'", specifier = ">=1.1.1,<2.0.0" }, + { name = "omop-emb", extras = ["pgvector"], marker = "extra == 'dev'", specifier = ">=1.1.1,<2.0.0" }, + { name = "omop-emb", extras = ["pgvector"], marker = "extra == 'pgvector'", specifier = ">=1.1.1,<2.0.0" }, { name = "pytest", marker = "extra == 'dev'", specifier = ">=9.0.2" }, { name = "pytest-cov", marker = "extra == 'dev'", specifier = ">=7.0.0" }, { name = "rich", specifier = ">=13.0" },