bvandeusen and Claude Opus 5
d49e4ad106
CI & Build / Python lint (push) Successful in 2s
CI & Build / Plugin hooks (push) Successful in 9s
CI & Build / integration (push) Successful in 48s
CI & Build / TypeScript typecheck (push) Successful in 52s
CI & Build / Python tests (push) Successful in 1m37s
CI & Build / Build & push image (push) Successful in 15s
refactor(tests): derive the two duplicated test helpers into tests/helpers.py ( #4276 )
...
Derive-first, ahead of the tests shape pay-down. An AST pass over all 2628
definitions under `tests/` found exactly three helper bodies duplicated
across files. Two are real copies and are consolidated here; the third is
not, and is left alone.
`need_tools(*tools)` — byte-identical in three hook-test modules, each
skipping when `jq`/`awk`/`git` is absent from PATH. Now snippet #4277 . The
`import shutil` each file carried existed only to serve it and goes with it.
`rule_row(rule_id)` — byte-identical in two integration modules, reading a
Rule back through a SEPARATE session so the assertion is about what Postgres
holds rather than what the writing session's identity map remembers. Now
snippet #4278 . Its imports are lazy, because `tests/helpers.py` is imported
by unit tests that have no database, which is the same reason
`plugin_config` defers its service imports.
NOT consolidated: `_side(uid, k, d="")` in test_services_plugin_context and
test_write_path_trigger. The body is identical but it closes over a
module-local `stored` dict, so it is not self-contained and "moving" it
would mean inventing a parameter neither call site wants. That is convention
plumbing — two tests independently writing the same one-line side_effect —
and it is dismissed in the ledger rather than lifted.
Worth recording for the next pass: a repeated NAME is not a family. `_row`
is defined in five modules and only two of those share a body; the other
three (test_list_rows_brief, test_calibration_stamp, test_shape_ledger)
build entirely different objects. Grouping by name would have consolidated
three things that have nothing in common.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01821k5B3Ysecp9fNYs92Kuy
2026-09-21 18:27:05 -04:00
..
2026-05-27 22:39:50 -04:00
2026-03-08 18:46:54 -04:00
2026-09-21 08:45:43 -04:00
2026-09-21 18:27:05 -04:00
2026-09-20 12:20:45 -04:00
2026-08-21 12:34:28 -04:00
2026-09-21 13:38:12 -04:00
2026-09-17 12:49:15 -04:00
2026-07-31 14:52:06 -04:00
2026-09-21 13:38:12 -04:00
2026-09-18 12:11:39 -04:00
2026-09-21 18:27:05 -04:00
2026-09-14 08:33:56 -04:00
2026-09-19 13:58:54 -04:00
2026-08-21 11:13:17 -04:00
2026-08-03 11:37:20 -04:00
2026-08-21 11:13:17 -04:00
2026-08-07 13:01:45 -04:00
2026-09-21 11:20:27 -04:00
2026-06-03 16:16:44 -04:00
2026-08-21 11:03:48 -04:00
2026-09-02 14:59:41 -04:00
2026-09-20 22:54:19 -04:00
2026-09-21 02:49:07 -04:00
2026-09-21 18:27:05 -04:00
2026-09-14 18:54:49 -04:00
2026-05-27 22:39:50 -04:00
2026-09-15 12:20:57 -04:00
2026-09-19 12:12:14 -04:00
2026-09-21 02:18:51 -04:00
2026-08-28 15:22:50 -04:00
2026-09-20 23:56:05 -04:00
2026-09-11 16:22:17 -04:00
2026-08-21 11:03:48 -04:00
2026-09-16 14:49:05 -04:00
2026-08-21 11:03:48 -04:00
2026-09-14 22:04:38 -04:00
2026-09-15 12:20:57 -04:00
2026-09-18 15:30:49 -04:00
2026-09-18 16:13:15 -04:00
2026-09-15 13:43:18 -04:00
2026-08-21 11:03:48 -04:00
2026-09-14 08:43:04 -04:00
2026-09-18 12:39:13 -04:00
2026-09-14 08:43:04 -04:00
2026-09-10 21:14:29 -04:00
2026-09-21 18:27:05 -04:00
2026-09-15 12:06:34 -04:00
2026-09-15 12:20:57 -04:00
2026-09-21 18:27:05 -04:00
2026-09-16 14:49:05 -04:00
2026-08-23 21:30:21 -04:00
2026-08-21 11:13:17 -04:00
2026-08-27 15:55:04 -04:00
2026-09-18 15:34:17 -04:00
2026-09-17 11:17:23 -04:00
2026-09-18 16:13:15 -04:00
2026-09-21 16:39:31 -04:00
2026-09-18 16:13:15 -04:00
2026-09-19 14:02:57 -04:00
2026-09-19 13:58:54 -04:00
2026-09-21 02:33:33 -04:00
2026-09-18 18:19:28 -04:00
2026-09-15 16:07:00 -04:00
2026-09-21 09:44:10 -04:00
2026-09-15 12:31:04 -04:00
2026-06-03 15:48:35 -04:00
2026-06-03 15:48:35 -04:00
2026-08-24 01:28:07 -04:00
2026-08-17 12:54:58 -04:00
2026-09-15 13:43:18 -04:00
2026-09-14 22:04:38 -04:00
2026-09-15 16:07:00 -04:00
2026-08-30 13:17:52 -04:00
2026-09-15 13:43:18 -04:00
2026-08-21 11:13:17 -04:00
2026-09-15 12:20:57 -04:00
2026-09-14 17:43:16 -04:00
2026-09-20 23:58:27 -04:00
2026-09-21 11:25:53 -04:00
2026-08-30 13:17:52 -04:00
2026-09-15 16:07:00 -04:00
2026-08-21 11:13:17 -04:00
2026-08-27 15:55:04 -04:00
2026-09-15 16:07:00 -04:00
2026-08-21 11:13:17 -04:00
2026-09-18 12:08:00 -04:00
2026-09-19 23:32:54 -04:00
2026-08-21 11:13:17 -04:00
2026-09-21 02:04:06 -04:00
2026-09-02 00:38:50 -04:00
2026-09-20 12:20:45 -04:00
2026-09-21 00:26:54 -04:00
2026-09-21 00:53:29 -04:00
2026-09-16 14:49:05 -04:00
2026-09-20 18:45:13 -04:00
2026-09-21 08:50:16 -04:00
2026-09-18 18:35:13 -04:00
2026-08-30 13:10:04 -04:00
2026-08-28 16:01:28 -04:00
2026-09-18 11:52:14 -04:00
2026-09-20 12:20:45 -04:00
2026-09-15 15:21:28 -04:00
2026-09-17 12:47:57 -04:00
2026-09-18 00:37:04 -04:00
2026-09-11 20:11:43 -04:00
2026-09-20 20:24:56 -04:00
2026-09-18 12:08:00 -04:00
2026-09-21 00:30:20 -04:00
2026-09-21 14:38:16 -04:00
2026-09-21 14:38:16 -04:00
2026-06-03 15:48:35 -04:00
2026-06-14 17:53:24 -04:00
2026-08-21 11:13:17 -04:00
2026-06-03 15:48:35 -04:00
2026-09-17 11:36:22 -04:00
2026-09-15 12:26:39 -04:00
2026-07-28 18:42:29 -04:00
2026-06-13 23:14:54 -04:00
2026-06-03 15:48:35 -04:00
2026-06-03 15:48:35 -04:00
2026-09-19 12:12:14 -04:00
2026-09-16 17:35:08 -04:00
2026-09-11 16:22:17 -04:00
2026-09-21 01:04:17 -04:00
2026-09-16 14:45:32 -04:00
2026-09-21 00:32:23 -04:00
2026-09-20 12:20:45 -04:00
2026-09-21 11:12:48 -04:00
2026-08-28 12:06:43 -04:00
2026-09-21 02:18:51 -04:00
2026-08-26 12:31:18 -04:00
2026-08-27 18:43:45 -04:00
2026-08-21 11:13:17 -04:00
2026-09-21 11:20:27 -04:00
2026-08-21 11:03:48 -04:00
2026-08-19 11:23:22 -04:00
2026-09-18 15:30:49 -04:00
2026-08-21 11:03:48 -04:00
2026-08-28 16:59:41 -04:00
2026-08-21 11:03:48 -04:00
2026-08-28 15:42:12 -04:00
2026-08-08 23:47:34 -04:00
2026-09-14 08:43:04 -04:00
2026-09-15 12:20:57 -04:00
2026-09-21 09:44:10 -04:00
2026-09-14 22:04:38 -04:00
2026-09-14 08:33:56 -04:00
2026-09-17 11:20:47 -04:00
2026-06-10 01:33:58 -04:00
2026-09-14 18:34:46 -04:00
2026-09-21 00:13:45 -04:00
2026-08-26 15:00:49 -04:00
2026-09-20 23:56:05 -04:00
2026-09-16 14:49:05 -04:00
2026-07-28 18:42:29 -04:00
2026-08-21 11:13:17 -04:00
2026-08-26 13:02:09 -04:00
2026-09-15 12:20:57 -04:00
2026-09-20 12:20:45 -04:00
2026-09-21 01:04:17 -04:00
2026-09-21 18:27:05 -04:00
2026-09-17 11:20:47 -04:00
2026-09-21 01:33:45 -04:00
2026-08-23 21:27:27 -04:00
2026-08-21 11:13:17 -04:00
2026-08-21 11:13:17 -04:00
2026-08-16 13:05:00 -04:00
2026-08-09 10:33:11 -04:00
2026-08-23 22:36:04 -04:00
2026-08-21 15:14:34 -04:00
2026-08-21 11:13:17 -04:00
2026-08-21 11:03:48 -04:00
2026-08-21 11:13:17 -04:00
2026-09-20 23:39:01 -04:00
2026-09-19 10:50:57 -04:00
2026-08-21 11:03:48 -04:00
2026-09-21 11:25:53 -04:00
2026-09-21 16:09:41 -04:00
2026-09-21 11:20:27 -04:00
2026-09-21 08:54:15 -04:00
2026-07-30 12:53:57 -04:00
2026-08-21 11:13:17 -04:00
2026-09-11 11:48:14 -04:00
2026-06-03 15:48:35 -04:00
2026-06-03 15:48:35 -04:00
2026-08-29 00:10:43 -04:00
2026-08-31 00:45:22 -04:00
2026-08-21 11:13:17 -04:00
2026-08-21 11:14:44 -04:00
2026-06-03 15:48:35 -04:00
2026-09-02 11:23:43 -04:00
2026-09-17 12:18:25 -04:00
2026-09-20 21:16:51 -04:00