Skip to content
Open
Show file tree
Hide file tree
Changes from 104 commits
Commits
Show all changes
117 commits
Select commit Hold shift + click to select a range
97b3ed1
Merge rules-registry (squash): Rules Registry, Table Spaces, dqlake r…
OGordon100 Jul 13, 2026
2364585
Merge ui-tweaks (squash): DQX Studio UI/UX overhaul, fixes + features
OGordon100 Jul 13, 2026
c185402
Align Genie response header flush-left with the bubble body (B2-110)
OGordon100 Jul 13, 2026
023b905
Crisp error empty-state icons on TS/MT overviews (B2-111)
OGordon100 Jul 13, 2026
e884c0a
Fix new registry-rule page header actions to sit inline with title (B…
OGordon100 Jul 13, 2026
5902881
Fix B2-113: re-provision seeded defaults after full database reset
OGordon100 Jul 13, 2026
17ce641
Remove invalid `clusters` Apps user-API scope (unbreaks deploy)
OGordon100 Jul 13, 2026
600164f
Move "As JSON" into a ⋮ overflow menu on the new-rule create page (B2…
OGordon100 Jul 13, 2026
84ef551
Fix blurry empty-state icons: clear FadeIn's lingering transform layer
OGordon100 Jul 13, 2026
a45536f
Batch 5 Studio UI/UX fixes (B2-115..B2-130)
OGordon100 Jul 13, 2026
a231a9b
Remove visible 'Already applied' badge from add-rule picker (B2-131)
OGordon100 Jul 13, 2026
d74ec0d
Batch 6 Studio fixes: results/draft-review + AI low-code builder (B2-…
OGordon100 Jul 13, 2026
fe7efa6
Batch Monitored Tables N+1 fix + hide Review&Approve when approvals o…
OGordon100 Jul 13, 2026
c3942a4
Apply DQ rules by tag: governed-tag auto-mapping + suggestions (apply…
OGordon100 Jul 14, 2026
b742308
DQX Studio demo content + rule-name/column-attribution fixes
OGordon100 Jul 15, 2026
862ce33
Demo: embed seeded rules so they appear in suggest-rules
OGordon100 Jul 15, 2026
e7870d7
Registry rule import/export, per-rule filter+threshold, bulk contract…
berrybluecode Jul 15, 2026
fac5ac4
Merge branch 'dqx-dqlake-integration' of github.com:databrickslabs/dq…
berrybluecode Jul 15, 2026
0cee06a
Stage oversized task-runner run configs on UC volume (bypass 10k job-…
berrybluecode Jul 15, 2026
cd08dc0
Demo: assign governed column tags via the admin's OBO client
OGordon100 Jul 16, 2026
fcd49fa
Demo: assign governed tags via SET TAG SQL (no unity-catalog OBO scope)
OGordon100 Jul 16, 2026
80463c6
Demo + Apply Rules: unmapped tag rules + matched-tag chips
OGordon100 Jul 16, 2026
a68087b
Apply Rules by-rule: matched tag chip below the column chip, not besi…
OGordon100 Jul 16, 2026
ddd63f7
feat(settings): redesign admin settings page
OGordon100 Jul 17, 2026
a58b5a6
DQX Studio: rule-creation & Condition Builder improvements
OGordon100 Jul 18, 2026
7608f13
docs: handoff — record push to origin + open items
OGordon100 Jul 18, 2026
1fdc644
DQX Studio: bulk-bar export + revert-to-draft & view-changes on detai…
OGordon100 Jul 18, 2026
847640a
DQX Studio: pass-threshold rework + breach surfacing (rules-threshold…
OGordon100 Jul 20, 2026
29219ad
DQX Studio: Mini Bug Bash v4 — 46 UI/UX + backend fixes
OGordon100 Jul 20, 2026
8d35d38
DQX Studio: Mini Bug Bash v4 follow-ups (items 52-55 + revisions)
OGordon100 Jul 20, 2026
4ffe3a8
DQX Studio: entitlements privileged-principals via OBO-first lookup (…
OGordon100 Jul 20, 2026
1ef3a80
DQX Studio: fix Generate test data floating beside grid (item 54 redo)
OGordon100 Jul 20, 2026
85f7e37
DQX Studio: Genie rework, Collections rename, chart-zoom + run-failur…
OGordon100 Jul 21, 2026
2ebe9d0
DQX Studio: Genie rebuild, failed-records fix, demo-profile-all + pol…
OGordon100 Jul 21, 2026
2c55e34
DQX Studio: by-rule slot-tag mirror + Genie Drilldown question & pane…
OGordon100 Jul 21, 2026
29651f8
DQX Studio: Collections by-table filter fix, Global Results catalog/s…
OGordon100 Jul 21, 2026
f2243da
DQX Studio: size low-code condition operator box to content (simple +…
OGordon100 Jul 21, 2026
197bdd7
DQX Studio: match native/page-load condition grid to LowcodeRow for c…
OGordon100 Jul 21, 2026
ff143b1
DQX Studio: revert all condition-builder spacing changes to original …
OGordon100 Jul 21, 2026
296b118
DQX Studio: fixed condition column/function box widths + live table-c…
OGordon100 Jul 21, 2026
ac6f0f3
DQX Studio: Condition Builder compact row — content-sized operator + …
OGordon100 Jul 21, 2026
0592015
DQX Studio: cap Condition Builder value box (restore max-w-2xl row cap)
OGordon100 Jul 21, 2026
9f61675
DQX Studio: fix double-click-to-reset-zoom dead zone over trend-chart…
OGordon100 Jul 21, 2026
3fc45ac
docs: design spec for new DQX Core + Studio docs and landing zone
OGordon100 Jul 21, 2026
2815329
DQX Studio item 42 + low-code authoring fixes: reference a column in …
OGordon100 Jul 21, 2026
772d6d5
docs: capture themed DQX Studio screenshots from fe-sandbox app
OGordon100 Jul 21, 2026
d23d573
docs: new DQX Studio guide (20 pages) + Core/Studio nav split + landi…
OGordon100 Jul 21, 2026
e10c7e1
perf(app): pin session-stable current-user & timezone queries to stal…
OGordon100 Jul 21, 2026
ebdab76
docs: revise Studio docs + homepage per review feedback
OGordon100 Jul 21, 2026
bb036f5
BYO SQL Warehouse
berrybluecode Jul 22, 2026
55d5d47
Merge branch 'dqx-dqlake-integration' of github-personal:databricksla…
berrybluecode Jul 22, 2026
d510380
Temp-view cleanup + Genie schema move
OGordon100 Jul 22, 2026
03991fb
perf(app): speed up Collections list + lazy runs fetch
OGordon100 Jul 22, 2026
c8d1183
fix(app): qualify own columns in low-code join rules (fixes AMBIGUOUS…
OGordon100 Jul 22, 2026
fc0660f
docs: restructure Studio section — merge governance, add running/geni…
OGordon100 Jul 22, 2026
e2e0008
docs: move built-in demo into the main Demos section
OGordon100 Jul 22, 2026
3beb8f6
docs: surface Run checks & schedule as its own page in Run & review
OGordon100 Jul 22, 2026
889d7d3
docs: restructure Monitor your tables + point app docs link at Studio
OGordon100 Jul 22, 2026
4487285
docs: add profiling & scheduling screenshots, fix single-mode images
OGordon100 Jul 22, 2026
2b1cd1b
docs: add comments & Ask-Genie screenshots (light + dark)
OGordon100 Jul 22, 2026
790c075
docs: update Studio permissions docs for the RBAC overhaul
OGordon100 Jul 22, 2026
8b7bbdb
docs: order top nav as Core, Studio, Demos, Reference
OGordon100 Jul 22, 2026
7b09a34
docs: fix left-sidebar order to Core, Studio, Demos, Reference
OGordon100 Jul 22, 2026
893c590
feat(app): DQX Studio bug-bash-5 — permissions rework, roles, profile…
OGordon100 Jul 22, 2026
d0a406e
docs: add "coming soon" Cost Calculator to the Studio homepage tab
OGordon100 Jul 23, 2026
bfcba96
docs: add DQX Studio "What's new" page + require entries on major cha…
OGordon100 Jul 23, 2026
8a88519
docs: link What's-new feature headlines to their docs pages
OGordon100 Jul 23, 2026
0856de3
docs: expand Ask Genie intro + add suggested-questions screenshot
OGordon100 Jul 23, 2026
afd5b10
feat(app): native rule tests, owner UX, and monitored-tables polish
berrybluecode Jul 23, 2026
20a96d8
Merge branch 'dqx-dqlake-integration' of github-personal:databricksla…
berrybluecode Jul 23, 2026
5913ca0
feat(app): DQX Studio bug-bash-5 — permissions/steward rework, AI & U…
OGordon100 Jul 24, 2026
d6f940a
docs(studio): address doc feedback — severity mapping, ODCS, contract…
OGordon100 Jul 28, 2026
aa32152
feat(app): cross-table rule authoring — table slots, custom-condition…
berrybluecode Jul 28, 2026
c7dda32
feat(app): retire table slots, rework DQ score, polish rule authoring
berrybluecode Jul 29, 2026
e740946
feat(app): quarantine table liquid clustering + periodic OPTIMIZE sweep
OGordon100 Jul 27, 2026
b438d6f
feat(app): SQL-pushdown failed-rows filtering + Results scroll-to-top…
OGordon100 Jul 27, 2026
4a11b89
fix(app): dimension/severity dropdowns open downward + left-aligned
OGordon100 Jul 28, 2026
7bb6b4a
feat(app): add rule About details panel, neutralise table-level tag
berrybluecode Jul 30, 2026
00cd36e
feat(app): rule Implementation-tab UX fixes
OGordon100 Jul 30, 2026
bd031a1
Merge remote-tracking branch 'origin/dqx-studio/new-docs-wt' into dqx…
berrybluecode Jul 30, 2026
f09376a
feat(app): animate the visual-builder/SQL toggle with a sliding thumb
OGordon100 Jul 30, 2026
1c0a4aa
feat(app): Rules Marketplace — import curated reusable rule packs
OGordon100 Aug 3, 2026
2e02ce5
refactor(app): drop `from __future__ import annotations`
OGordon100 Aug 3, 2026
22197ba
feat(marketplace): disable already-added rules, Marketplace source, r…
OGordon100 Aug 3, 2026
6a1fa18
feat(marketplace): checked+tooltip for added rules, embed on import, …
OGordon100 Aug 3, 2026
5bea6a1
feat(marketplace): remove Marketplace card from the home screen
OGordon100 Aug 3, 2026
c1e7a22
feat(app): AI SQL granularity, mandatory tags, rule form fixes, and c…
berrybluecode Aug 5, 2026
dab3f99
feat(app): let authors revoke pending rule submissions and document D…
berrybluecode Aug 5, 2026
02c68ef
feat(app): cursor-following marketplace tooltip; rule Details to the …
OGordon100 Aug 5, 2026
29d48a0
fix(app): cursor-following marketplace tooltip, wider rule Details, C…
OGordon100 Aug 5, 2026
24b4c33
fix(app): Details ID label reads "ID" for rules and collections
OGordon100 Aug 5, 2026
3ad8a43
docs(studio): trim, restructure & mark DQX Studio Beta
OGordon100 Aug 6, 2026
869cc3f
chore: stop tracking docs/superpowers scratch, ignore it
OGordon100 Aug 6, 2026
8e8140d
feat(app): describe-a-rule AI, duplicate-create confirm, and Studio a…
berrybluecode Aug 8, 2026
b197413
Merge branch 'main' of github-personal:databrickslabs/dqx into dqx-st…
berrybluecode Aug 9, 2026
c7f700a
feat(app): rename steward to owner and harden ODCS import + deploy
berrybluecode Aug 12, 2026
0721a81
Merge branch 'main' into dqx-studio/dqlake-integration
berrybluecode Aug 12, 2026
193f950
fix make fmt
berrybluecode Aug 12, 2026
c1309d1
fix(app): axios 1.19 export typing and SelectGroup for settings selects
berrybluecode Aug 12, 2026
a946425
Remove slow CLI-only venv unit smoke test that stalls CI near complet…
berrybluecode Aug 13, 2026
1d58fbf
Use -n auto for unit tests and dump stacks if CI hangs after teardown.
berrybluecode Aug 13, 2026
32947fc
Merge branch 'main' into dqx-studio/dqlake-integration
mwojtyczka Aug 14, 2026
7ee38df
feat(app): sync DQX version into Studio bundle; built wheel in dev, p…
mwojtyczka Aug 14, 2026
c36a039
fix(app): address review comments — clamp DQ score + cleanup
mwojtyczka Aug 14, 2026
900512d
refactor(app): remove Vector Search and simplify Studio AI/settings UX
berrybluecode Aug 14, 2026
e9fd3fa
refactor(app): drop mandatory AI rule-suggestion UX
berrybluecode Aug 14, 2026
93f007c
feat(app): add sample size for manual runs and schedules
berrybluecode Aug 14, 2026
ff022c8
test(app): add a golden-set evaluation harness for the AI rule suggester
vb-dbrks Aug 14, 2026
1f5bc20
test(app): assert per-column retrieval stays a single embedding batch
vb-dbrks Aug 14, 2026
eed613e
test(app): grow the suggester eval to 82 rules and 8 tables, and spli…
vb-dbrks Aug 14, 2026
d1f0cd2
test(app): add the live tier for the suggester eval, plus make app-te…
vb-dbrks Aug 14, 2026
760e8bf
test(app): record the field-eng live results, and fix two defects the…
vb-dbrks Aug 14, 2026
16158e1
test(app): rename the live eval to ai_eval, and gate it on recall not…
vb-dbrks Aug 14, 2026
af6588c
refactor(app): collapse OLTP migrations to baseline CREATE TABLE
berrybluecode Aug 15, 2026
28e63ba
feat(app): auto-grant USE CATALOG to the app SP via uc_securable
berrybluecode Aug 15, 2026
6adce19
Merge branch 'dqx-studio/dqlake-integration' of github-personal:datab…
berrybluecode Aug 15, 2026
87e899b
chore: retrigger CI
berrybluecode Aug 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
19 changes: 18 additions & 1 deletion .github/workflows/push.yml
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,24 @@ jobs:

- name: Run unit tests
if: env.IS_FORK_PR != 'true'
run: make test
env:
# Lets the watchdog's SIGABRT print a stack for every thread of every process.
PYTHONFAULTHANDLER: "1"
run: |
# This step has hung *after* the last test completed, inside pytest-xdist's session
# teardown. No pytest timeout covers that phase (--timeout only guards a test's
# setup/call/teardown), so the job emitted minutes of silence and then died on the
# runner's shutdown signal with nothing to debug. Abort before the runner reclaims the
# VM instead, so faulthandler shows where each thread is parked. The budget has to
# clear a normal run (dependency sync dominates, tests are ~1min) while still landing
# before the shutdown signal.
( sleep 480
echo "::error::unit tests still running after 8m - dumping thread stacks"
pkill -ABRT -f '[p]ython'
) &
watchdog=$!
trap 'kill "$watchdog" 2>/dev/null || true' EXIT
make test

- name: Publish unit test coverage
# 3.12 only to avoid duplicate uploads.
Expand Down
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -192,3 +192,8 @@ docs/dqx/docs/reference/api
app/bun.lock
app/package-lock.json
/uv.toml
.playwright-mcp/

# Superpowers brainstorm scratch (mockups, session state)
.superpowers/
docs/superpowers/
16 changes: 12 additions & 4 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,21 +30,29 @@ The Studio is a separate uv sub-project with its own pyproject + lockfile under
```bash
make app-install # yarn install --frozen-lockfile
make app-build # OpenAPI dump + orval + Vite build + wheels
make app-check # bun tsc -b + basedpyright (type-check only, no lint)
make app-check # bun tsc -b + basedpyright + bun UI unit tests (app-test-ui)
make app-test # backend pytest
make app-test-ui # UI unit tests only (bun test)
make app-start-dev # uvicorn (:9002) + Vite (:9001), foreground
make app-stop-dev # pkill the two dev servers
make app-regen-api # dump OpenAPI + run orval (after backend model changes)
make app-deploy PROFILE=<p> TARGET=<t> # build + bundle deploy (creates resources + native UC grants) + bundle run
make lock-app-dependencies # refresh app/uv.lock + app/yarn.lock
make lock-app-dependencies # refresh app/uv.lock + app/yarn.lock (+ app/.build-constraints.txt)
```

App docs (read these before touching `app/`): [`app/CLAUDE.md`](app/CLAUDE.md), [`app/DEPLOYMENT.md`](app/DEPLOYMENT.md), [`app/DEVELOPMENT.md`](app/DEVELOPMENT.md), [`app/README.md`](app/README.md), and the backend / UI CLAUDEs under `app/src/databricks_labs_dqx_app/`.
App docs (read these before touching `app/`): [`app/AGENTS.md`](app/AGENTS.md) (agent + architecture context; thin `CLAUDE.md` stubs under `app/` link here), [`app/DEPLOYMENT.md`](app/DEPLOYMENT.md), [`app/DEVELOPMENT.md`](app/DEVELOPMENT.md), [`app/README.md`](app/README.md).

**Contributing to DQX Studio** (separate from DQX Core):

- **Code** lives under [`app/`](app/) (its own `pyproject.toml` / lockfiles). Prefer `make app-*` targets from the repo root.
- **User docs** live under [`docs/dqx/docs/studio/`](docs/dqx/docs/studio/) (published at `/docs/studio/`). Do not bury Studio how-tos in Core guide pages — link to `/docs/studio/` instead. See [Authoring Documentation](https://databrickslabs.github.io/dqx/docs/dev/docs_authoring/).
- **Issues / PRs** that touch Studio should use the GitHub label **`DQX App`** (use **`DQX Core`** for the Python library under `src/`). See [Contributing](https://databrickslabs.github.io/dqx/docs/dev/contributing/).
- **What's new:** major, user-facing Studio features are summarized in the pull request that ships them (for release notes). There is no in-docs "What's new" page.

### Dependency installs and lock files

- Use **`make dev`** from the repo root to create `.venv` and install Python dependencies. Do **not** run `uv sync`, `uv lock`, or `uv add` for normal setup — that bypasses `UV_FROZEN=1` and may modify `uv.lock` or bake in internal registry URLs.
- To **update lock files** after intentional dependency changes: `make lock-dependencies` (root `uv.lock` and `.build-constraints.txt`) and/or `make lock-app-dependencies` (`app/uv.lock`) of the app.
- To **update lock files** after intentional dependency changes: `make lock-dependencies` (root `uv.lock` and `.build-constraints.txt`) and/or `make lock-app-dependencies` (`app/uv.lock`, `app/yarn.lock`, and `app/.build-constraints.txt`).

---

Expand Down
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ BREAKING CHANGES!
* Allow custom check failure messages ([#1092](https://github.com/databrickslabs/dqx/issues/1092)). `DQRule` now accepts an optional `message_expr` parameter that lets users define custom failure messages as a Spark `Column` or a SQL expression string. The same option is supported for checks defined declaratively in metadata (YAML/JSON), specified as a top-level `message_expr` key on the check definition alongside `criticality` and `check`. When omitted, the default message behavior is preserved; when provided, the custom message replaces the default message for failed rows.
* Added a Query Results Cookbook and aligned stored check names and fingerprints ([#1193](https://github.com/databrickslabs/dqx/issues/1193)). A new reference page provides "copy-paste" SQL and PySpark recipes for querying DQX result tables (summary metrics, output, quarantine, and checks) to trace errors and warnings across runs, rows, and check definitions. To make the cookbook's fingerprint and name joins reliable, checks saved without an explicit `name` now store the same autogenerated name and name-inclusive `rule_fingerprint` that `apply_checks` writes to `_errors`/`_warnings` (named checks and `for_each_column` rules are byte-identical to before). Requesting summary metrics via `metrics_config` without a configured observer now fails fast with an `InvalidParameterError` instead of silently skipping the metrics table.
* Added in-app language switching to DQX Studio ([#1172](https://github.com/databrickslabs/dqx/issues/1172)). DQX Studio now ships with four locales (English, Brazilian Portuguese, Italian, and Spanish), selectable from a new Preferences card on the user's Profile page. The choice is persisted per-browser via `localStorage` with no server-side or table changes, and the change is frontend-only. Non-English translations are AI-assisted and not yet reviewed by native speakers.
* DQX Studio: replaced the apx build framework with first-party build and dev scripts ([#1223](https://github.com/databrickslabs/dqx/issues/1223)). The app no longer depends on the `apx` package. `scripts/build_app.py` generates the FastAPI OpenAPI schema, runs orval, builds the frontend with Vite, and produces the application wheel (with a build-tagged local-version segment so successive deploys at the same commit always reinstall fresh code). `scripts/dev.py` runs uvicorn with reload alongside the Vite dev server, forwarding signals and tearing down both processes together. The bundle and warehouse-grant scripts were updated to support both bundle-managed and external (reuse) SQL warehouse modes. There is no runtime behavior change in the app itself.
* DQX Studio: replaced the previous third-party build framework with first-party build and dev scripts ([#1223](https://github.com/databrickslabs/dqx/issues/1223)). The app no longer depends on that external build package. `scripts/build_app.py` generates the FastAPI OpenAPI schema, runs orval, builds the frontend with Vite, and produces the application wheel (with a build-tagged local-version segment so successive deploys at the same commit always reinstall fresh code). `scripts/dev.py` runs uvicorn with reload alongside the Vite dev server, forwarding signals and tearing down both processes together. The bundle and warehouse-grant scripts were updated to support both bundle-managed and external (reuse) SQL warehouse modes. There is no runtime behavior change in the app itself.
* DQX Studio: added Lakebase storage backend to improve app latency with declarative storage and destroy protection ([#1173](https://github.com/databrickslabs/dqx/issues/1173)). Schemas, the wheels volume, and the Lakebase instance and logical database are now declared in the bundle with `prevent_destroy` lifecycle protection, and `make app-bind` adopts pre-existing resources. OLTP tables (rules, settings, RBAC, comments, schedules) move to Postgres via a migration runner, while analytical tables (validation runs, profiling, quarantine, metrics) stay on Delta. Error, warning, and input row counts from the DQX observer are now persisted and surfaced in the UI, label badges and label filtering were added to rule selection and scheduling, and a Spark Connect `Observation.get` mutability bug that overwrote total row counts was fixed.
* Fixed quarantine-only writes when no output table is configured ([#1183](https://github.com/databrickslabs/dqx/issues/1183)). `apply_checks_and_save_in_table` and `apply_checks_by_metadata_and_save_in_table` previously raised `AttributeError` when called with `output_config=None` and a `quarantine_config`. `output_config` is now optional and skipped when unset, so quarantine-only runs write just the invalid records; passing neither configuration raises a clear `InvalidParameterError`.
* Allow special characters in catalog and schema names ([#1232](https://github.com/databrickslabs/dqx/issues/1232)). The validation regex for storage locations now accepts catalog and schema names that contain characters such as hyphens, which were previously rejected.
Expand Down
30 changes: 26 additions & 4 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,11 @@ export UV_FROZEN := 1
export UV_BUILD_CONSTRAINT := .build-constraints.txt

UV_RUN := uv run --exact --all-extras
UV_TEST := $(UV_RUN) pytest -n 10 --timeout 60 --durations 20
# xdist worker count. Recursively expanded so a target can override it (see ``test``).
# Workspace-backed suites (integration/e2e) keep the fixed high count: they are bound by
# control-plane latency rather than CPU, so oversubscribing the runner is what keeps them fast.
TEST_WORKERS ?= 10
UV_TEST = $(UV_RUN) pytest -n $(TEST_WORKERS) --timeout 60 --durations 20

# ``make help`` parses ``##`` annotations next to each target and ``##@``
# section headers so the listing stays in sync with the Makefile
Expand Down Expand Up @@ -53,6 +57,10 @@ fmt: ## Format and auto-fix Python (black, ruff --fix, mypy, pylint, version syn

##@ Tests (DQX library)

# One worker per core. The unit suite is CPU-bound, so a fixed ``-n 10`` oversubscribes the
# CI runners and only widens the surface xdist has to tear down at session end. Override with
# ``make test TEST_WORKERS=10`` to restore the old count.
test: TEST_WORKERS := auto
test: ## Run unit tests (writes coverage-unit.xml)
$(UV_TEST) --cov --cov-report=xml:coverage-unit.xml tests/unit/

Expand Down Expand Up @@ -160,11 +168,21 @@ open('.build/openapi.json', 'w').write(json.dumps(app.openapi(), indent=2))"
# (``-b``) so subsequent runs only re-check changed files; the Python
# pass runs basedpyright at ``error`` level only (per the existing
# pyproject configuration excluding tests, see [tool.basedpyright]).
app-check: ## Type-check app: tsc -b (TypeScript) + basedpyright (Python)
app-check: ## Type-check app: tsc -b (TypeScript) + basedpyright (Python) + bun UI unit tests
@echo "🔍 Checking TypeScript..."
cd app && bun run tsc -b --incremental
@echo "🔍 Checking Python..."
cd app && $(UV_RUN) basedpyright --level error
# basedpyright lives in the app ``dev`` dependency group — do not use
# root ``UV_RUN`` (``--all-extras``) here; the app has no extras and that
# sync would strip the dev tools from app/.venv.
cd app && uv run --exact --group dev basedpyright --level error
@$(MAKE) app-test-ui

# Front-end unit tests (bun's built-in test runner — runs *.test.ts natively,
# no extra config). Kept fast + dependency-free so it can run inside app-check.
app-test-ui: ## Run app UI unit tests (bun test)
@echo "🧪 Testing UI (bun test)..."
cd app && bun test src/databricks_labs_dqx_app/ui

# Run the app's backend unit-test suite (pytest, no Databricks dependencies).
# Usage: make app-test # run everything
Expand Down Expand Up @@ -361,6 +379,10 @@ lock-app-dependencies: ## Regenerate app/uv.lock, app/yarn.lock, app/.build-cons
yarn --cwd app install
perl -ni -e 'print unless /^ resolved /' app/yarn.lock
cd app && uv lock --exclude-newer "7 days"
# Normalize the lock so contributors inside Databricks (private proxy) and outside (public PyPI)
# produce an identical file. A proxy mirrors PyPI with identical paths, so rewrite the registry
# index and every per-package "/packages/..." download URL to the public hosts. Also drop the
# "size" field: the private proxy never reports it, so it is the only form both can reproduce.
perl -pi -e 's|registry = "https://[^"]*"|registry = "https://pypi.org/simple"|g; s|url = "https://[^/"]+/packages/|url = "https://files.pythonhosted.org/packages/|g; s|, size = \d+||g' app/uv.lock
# UV_FROZEN=1 for the helper below: this target sets UV_FROZEN=0 to re-lock app/uv.lock, but the
# `uv run` here executes from the repo root and would otherwise re-lock (and proxy-taint) the root
Expand Down Expand Up @@ -402,4 +424,4 @@ fork-sync: ## Mirror a fork PR to a branch in the main repo for full CI (PR=<num
./.github/scripts/fork-sync-pr.sh $(PR)

.DEFAULT: all
.PHONY: help all clean dev lint fmt test integration e2e perf anomaly coverage combine-coverage docs-build docs-serve-dev docs-install docs-serve docs-clean app-install app-build app-start-dev app-stop-dev app-regen-api app-check app-test app-check-cli app-deploy fork-sync build lock-dependencies lock-app-dependencies
.PHONY: help all clean dev lint fmt test integration e2e perf anomaly coverage combine-coverage docs-build docs-serve-dev docs-install docs-serve docs-clean app-install app-build app-start-dev app-stop-dev app-regen-api app-check app-test app-test-ui app-check-cli app-deploy fork-sync build lock-dependencies lock-app-dependencies
Loading
Loading