Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
b4bb11e
docs: design spec for generic-default dialect operations (upsert + re…
discreteds Jun 29, 2026
620cbee
docs: apply Codex adversarial review to generic-default dialect ops spec
discreteds Jun 29, 2026
ea88152
docs: settle three open semantics Qs in dialect-ops spec
discreteds Jun 29, 2026
88caab2
docs: apply Codex 2nd-pass review to dialect-ops spec (11 findings)
discreteds Jun 29, 2026
106edb3
docs: implementation plan for generic-default dialect operations
discreteds Jun 29, 2026
91287e8
docs: apply Codex plan review (3 CRITICAL + 4 HIGH) to dialect-ops plan
discreteds Jun 29, 2026
e502004
docs: apply Codex plan verification pass (2 CRITICAL + 2 HIGH + MEDIUM)
discreteds Jun 29, 2026
75a61a2
feat(ibis): extract shared _render.py primitives; migrate add_columns
discreteds Jun 29, 2026
84b01b2
test(infra): docker postgres+mariadb services, live fixtures, ibis>=1…
discreteds Jun 29, 2026
c3f458b
fix(deps): postgres/all extras use psycopg3 (ibis 12 dropped psycopg2)
discreteds Jun 29, 2026
6c86931
feat(ibis): add UpsertStyle enum + upsert_style field; assign per matrix
discreteds Jun 29, 2026
b600daf
feat(ibis): generic sqlglot rename_table (works on every dialect)
discreteds Jun 29, 2026
818647e
feat(ibis): conditional-predicate compiler (sentinel join->AST->remap)
discreteds Jun 29, 2026
c3ef853
test(ibis): isolate window-only predicate (rank) + assert alias remap…
discreteds Jun 29, 2026
893c152
feat(ibis): generic upsert ON CONFLICT branch + compiled-subquery sta…
discreteds Jun 29, 2026
3bd2553
fix(ibis): validate schema identifier in _generic_upsert; clarify NOT…
discreteds Jun 29, 2026
fca343d
feat(ibis): generic upsert MERGE branch (composite keys + conflict_ac…
discreteds Jun 29, 2026
5a7f687
test(ibis): drop dead mysql member from MERGE backtick set; enable lo…
discreteds Jun 29, 2026
3bc46af
feat(ibis): generic upsert ON DUPLICATE KEY + MySQL prove-safe preflight
discreteds Jun 29, 2026
850b8d2
fix(ibis): harden mysql preflight against injection; assert ODK self-…
discreteds Jun 29, 2026
c8e6da3
feat(ibis): cutover upsert to generic dispatch; retire duckdb_family_…
discreteds Jun 29, 2026
49362d8
docs(ibis): annotate upsert_style=None as the unsupported sentinel
discreteds Jun 29, 2026
66348ef
fix(ibis): close MySQL-preflight injection surface (allowlist + escap…
discreteds Jun 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 46 additions & 0 deletions .github/workflows/python-run-pytest.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,47 @@ jobs:
os: [ubuntu-24.04]
python-version: ["3.12"]

env:
MOUNTAINASH_REQUIRE_LIVE_DB: "1"
IBIS_TEST_POSTGRES_HOST: localhost
IBIS_TEST_POSTGRES_PORT: "5432"
IBIS_TEST_POSTGRES_USER: postgres
IBIS_TEST_POSTGRES_PASSWORD: postgres
IBIS_TEST_POSTGRES_DATABASE: ibis_testing
IBIS_TEST_MYSQL_HOST: localhost
IBIS_TEST_MYSQL_PORT: "3306"
IBIS_TEST_MYSQL_USER: ibis
IBIS_TEST_MYSQL_PASSWORD: ibis
IBIS_TEST_MYSQL_DATABASE: ibis_testing

services:
postgres:
image: postgres:18-alpine
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: ibis_testing
ports:
- 5432:5432
options: >-
--health-cmd "pg_isready -U postgres"
--health-interval 1s
--health-retries 20

mysql:
image: mariadb:12.1.2
env:
MYSQL_ALLOW_EMPTY_PASSWORD: "true"
MYSQL_DATABASE: ibis_testing
MYSQL_USER: ibis
MYSQL_PASSWORD: ibis
ports:
- 3306:3306
options: >-
--health-cmd "mariadb-admin ping -h localhost"
--health-interval 1s
--health-retries 20

steps:
- name: Set fallback branch
run: |
Expand All @@ -48,6 +89,11 @@ jobs:
python-version: ${{ matrix.python-version }}
check-latest: true

- name: Install system dependencies for live-db drivers
run: |
sudo apt-get update -q
sudo apt-get install -y libmariadb-dev

- name: Display SQLite version
run: |
python -c "import sqlite3; print(f'SQLite version: {sqlite3.sqlite_version}')"
Expand Down
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ src/mountainash_data/
## Dependencies

### Core Dependencies
- **ibis-framework[polars,pandas,sqlite,duckdb]** == 10.4.0 - Core data processing framework
- **ibis-framework[polars,pandas,sqlite,duckdb]** >= 12.0.0 - Core data processing framework
- **numpy** >=1.23.2,<3 - Numerical computing
- **pandas** >=2.2.0 - Data manipulation and analysis
- **polars** ==1.16.0 - Fast DataFrame library
Expand Down
26 changes: 26 additions & 0 deletions compose.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
services:
postgres:
image: postgres:18-alpine
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: ibis_testing
healthcheck:
test: ["CMD", "pg_isready", "-U", "postgres"]
interval: 1s
retries: 20
ports:
- "5432:5432"
mysql:
image: mariadb:12.1.2
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: "true"
MYSQL_DATABASE: ibis_testing
MYSQL_USER: ibis
MYSQL_PASSWORD: ibis
healthcheck:
test: ["CMD", "mariadb-admin", "ping", "-h", "localhost"]
interval: 1s
retries: 20
ports:
- "3306:3306"
Loading
Loading