Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,7 @@ plan documents one change, `CLAUDE.md` documents the invariant it established.
- `tests/unit/test_export_client.py` - Unit tests for ExportClient (`ExportFormat` mapping and unreachable `UNSPECIFIED`, `calculations_spec()`, the zero-source rejection, three-tier error handling)
- `tests/unit/test_annotation_client.py` - Unit tests pinning the `AnnotationClient` facade wiring (every feature client present, one shared channel, one stub apiece)
- `tests/integration/test_datasets_annotations_integration.py` - Live-server round trip for datasets/annotations/calculations; ingests its own samples first, because `saveDataSet` requires archived PVs
- `tests/integration/test_query_helper_relaxations_integration.py` - Live-server coverage for the #40 key-only `attributes()` search and the #41 browse-all `criteria`, on PV metadata, configurations, activations, and the v2 `PvQuery.attr` selector. Both rest on server behavior a unit test cannot reach: a unit test asserts the request carries `values == []`, but only a real server distinguishes an existence filter from an `$in: []` that matches nothing. Each test therefore stores an attribute value, asserts the key-only form finds the record, and asserts a query for a *different* value does not -- that pairing is what makes the first assertion meaningful. The v2 class ingests its own samples (the selector needs archived data) and polls for bucket visibility rather than sleeping; it establishes that visibility with a *name-list* selector before asserting the negative case, so an empty result can only mean the attribute selector matched nothing. Catalogue records are torn down per run, but the ingested samples are not -- the archive has no delete RPC, so each run leaves a few samples under a run-unique PV name, the same residue `test_datasets_annotations_integration.py` leaves
- `tests/unit/test_time_conversions.py` - Unit tests for the shared time converters (`to_timestamp()` input forms and the naive-datetime/bool/unsupported-type rejections; `to_epoch_nanos()` exactness and its round trip with `to_timestamp()`)
- `tests/unit/test_data_frame.py` - Unit tests for the data_frame builders (axis relocation, each typed column, `data_column()` bool-before-int and unset-oneof handling, provenance helpers, and every `data_frame()` shape rule incl. array dims and serialized-column name-only checks)
- `tests/unit/test_data_frame_conversions.py` - Unit tests for data_frame_conversions (nanosecond-exact expansion, per-column conversion incl. array reshaping, duplicate-name fail-loud, and — skipping cleanly without `[analysis]` — the pandas round trip, dtype mapping, and NaN fail-loud)
Expand Down
6 changes: 6 additions & 0 deletions plan/tickets/40/plan.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,12 @@
same upstream commits `plan/tickets/6/plan.md` was verified against). Triage verified every premise in the
ticket body against the protos, the server source, and this repo's own history; three corrections to the
ticket are recorded below and folded into [Implementation tasks](#implementation-tasks).
- **Integration coverage added 2026-09-10**, after PR #47 merged: this plan verified server behavior by
*reading* dp-service, and `tests/integration/test_query_helper_relaxations_integration.py` now asserts it
against a live ecosystem. The load-bearing shape is a pair — the key-only query must find a record, and a
query for a value that record does *not* have must not. Alone, the first assertion cannot distinguish a
working existence filter from a match-all. Confirmed non-vacuous by temporarily reintroducing the old
behavior and watching the test fail.

## Overview

Expand Down
6 changes: 6 additions & 0 deletions plan/tickets/41/plan.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,12 @@
- **Status**: written 2026-09-10 against dp-python-lib `e7a77db` (the #40 commit), dp-grpc `6dfff3f`,
dp-service `fddf692`. Every premise verified against the protos and the server source; two attribution
errors in the ticket body are corrected below.
- **Integration coverage added 2026-09-10**, after PR #47 merged: this plan verified server behavior by
*reading* dp-service, and `tests/integration/test_query_helper_relaxations_integration.py` now asserts it
against a live ecosystem. For this ticket that is the browse-all form on all three families — an omitted
criteria list is accepted rather than rejected (T2), and `iter_*` with no arguments reaches a record the
test just saved. A unit test can only assert the request carries an empty `criteria` list; whether the
server treats that as match-all or as a business error is exactly what needed a live server.

## Overview

Expand Down
Loading