From a597fe5a5b7f4a27b7132385027bc0b71e447138 Mon Sep 17 00:00:00 2001 From: thekevinbot <248217931+thekevinbot@users.noreply.github.com> Date: Fri, 18 Sep 2026 13:24:04 -0400 Subject: [PATCH 1/3] ci(rust): lint every target and the cli feature with clippy The clippy step ran `cargo clippy --workspace`, which skipped every `#[cfg(test)]` module, everything under `packages/rust/tests/`, and the whole `cli` feature. Widen it to `--all-targets --features cli` and fix the 12 violations that surfaces, including a `MutexGuard` held across an await in `tests/async_sdk.rs`. skip-changelog: lint fixes in test code plus a CI invocation change; no observable behavior change Fixes #1148 --- .github/workflows/dirsql-rust-ci.yml | 2 +- packages/rust/src/lib.rs | 8 +++----- packages/rust/src/vtab_scaffold.rs | 4 +--- packages/rust/tests/async_sdk.rs | 23 ++++++++++++----------- packages/rust/tests/common/mod.rs | 12 ++++++------ packages/rust/tests/persist.rs | 3 +-- packages/rust/tests/schema_inference.rs | 6 ++---- packages/rust/tests/sdk.rs | 2 +- packages/rust/tests/watcher.rs | 8 ++++---- 9 files changed, 31 insertions(+), 37 deletions(-) diff --git a/.github/workflows/dirsql-rust-ci.yml b/.github/workflows/dirsql-rust-ci.yml index a2b21b8b0..13c5301b8 100644 --- a/.github/workflows/dirsql-rust-ci.yml +++ b/.github/workflows/dirsql-rust-ci.yml @@ -161,7 +161,7 @@ jobs: key: ${{ runner.os }}-cargo-stable-${{ hashFiles('Cargo.lock') }} - name: Clippy - run: cargo clippy --workspace -- -D warnings + run: cargo clippy --workspace --all-targets --features cli -- -D warnings - name: Format check run: cargo fmt --all -- --check diff --git a/packages/rust/src/lib.rs b/packages/rust/src/lib.rs index d171938f4..35426a939 100644 --- a/packages/rust/src/lib.rs +++ b/packages/rust/src/lib.rs @@ -2259,7 +2259,7 @@ mod readonly_tests { ); // `watch`, `config`, `matcher` wrap a typed StdError to preserve a // `source()` chain. - let io = || std::io::Error::new(std::io::ErrorKind::Other, "x"); + let io = || std::io::Error::other("x"); let watch_err = DirSqlError::watch(io()); assert_eq!(watch_err.to_string(), "watcher error: x"); assert!(StdError::source(&watch_err).is_some()); @@ -4273,8 +4273,7 @@ mod internal_tests { &mut sources, &mut out, ) - .err() - .expect("duplicate function name must error"); + .expect_err("duplicate function name must error"); let msg = err.to_string(); assert!(msg.contains("'dup'"), "got: {msg}"); assert!(msg.contains("/a/frag.toml"), "got: {msg}"); @@ -4293,8 +4292,7 @@ mod internal_tests { &mut sources, &mut out, ) - .err() - .expect("intra-config duplicate must error"); + .expect_err("intra-config duplicate must error"); assert!(err.to_string().contains("'dup'"), "got: {err}"); } diff --git a/packages/rust/src/vtab_scaffold.rs b/packages/rust/src/vtab_scaffold.rs index f83d8b558..6c37a7137 100644 --- a/packages/rust/src/vtab_scaffold.rs +++ b/packages/rust/src/vtab_scaffold.rs @@ -289,9 +289,7 @@ mod tests { #[test] fn parse_gitignore_rejects_an_unknown_switch() { - let err = parse_gitignore("sometimes") - .err() - .expect("an unknown switch must be rejected"); + let err = parse_gitignore("sometimes").expect_err("an unknown switch must be rejected"); assert!(matches!(err, Error::ModuleError(_)), "got {err:?}"); assert!(err.to_string().contains("no-gitignore"), "got: {err}"); } diff --git a/packages/rust/tests/async_sdk.rs b/packages/rust/tests/async_sdk.rs index 8ff03177e..8b0a59ebe 100644 --- a/packages/rust/tests/async_sdk.rs +++ b/packages/rust/tests/async_sdk.rs @@ -286,17 +286,18 @@ async fn sync_backed_methods_before_ready_error() { // matched `gate.txt`. Prove it arrived, then release it and let it finish // so the background thread does not outlive the TempDir. let (lock, cvar) = &*gate; - let (mut state, wait) = cvar - .wait_timeout_while(lock.lock().unwrap(), PARK_PATIENCE, |s| !s.parked) - .unwrap(); - assert!( - !wait.timed_out(), - "init never reached the extract closure: the scan matched no file, so \ - this test never exercised a parked init", - ); - state.released = true; - cvar.notify_all(); - drop(state); + { + let (mut state, wait) = cvar + .wait_timeout_while(lock.lock().unwrap(), PARK_PATIENCE, |s| !s.parked) + .unwrap(); + assert!( + !wait.timed_out(), + "init never reached the extract closure: the scan matched no file, so \ + this test never exercised a parked init", + ); + state.released = true; + cvar.notify_all(); + } db.ready().await.unwrap(); } diff --git a/packages/rust/tests/common/mod.rs b/packages/rust/tests/common/mod.rs index 6dfd39b89..102da397c 100644 --- a/packages/rust/tests/common/mod.rs +++ b/packages/rust/tests/common/mod.rs @@ -41,12 +41,12 @@ pub fn build_fixture_extension() -> PathBuf { let Ok(msg) = serde_json::from_str::(line) else { continue; }; - if msg["reason"] == "compiler-artifact" { - if let Some(files) = msg["filenames"].as_array() { - for f in files.iter().filter_map(|f| f.as_str()) { - if f.ends_with(".so") || f.ends_with(".dylib") || f.ends_with(".dll") { - artifact = Some(PathBuf::from(f)); - } + if msg["reason"] == "compiler-artifact" + && let Some(files) = msg["filenames"].as_array() + { + for f in files.iter().filter_map(|f| f.as_str()) { + if f.ends_with(".so") || f.ends_with(".dylib") || f.ends_with(".dll") { + artifact = Some(PathBuf::from(f)); } } } diff --git a/packages/rust/tests/persist.rs b/packages/rust/tests/persist.rs index d8e84722e..58de11975 100644 --- a/packages/rust/tests/persist.rs +++ b/packages/rust/tests/persist.rs @@ -6,7 +6,6 @@ //! for files whose filesystem metadata matches the cache. use dirsql::{DirSQL, DirSqlError, Row, Table, Value}; -use rusqlite; use std::collections::HashMap; use std::fs; use std::path::Path; @@ -370,7 +369,7 @@ fn dirsql_directory_excluded_when_persist_disabled() { fn counting_named_table(name: &'static str, col: &'static str, counter: Arc) -> Table { Table::new( name, - &format!("CREATE TABLE {name} ({col} TEXT)"), + format!("CREATE TABLE {name} ({col} TEXT)"), "**/*.csv", move |path| { let content = std::fs::read_to_string(path).unwrap(); diff --git a/packages/rust/tests/schema_inference.rs b/packages/rust/tests/schema_inference.rs index 69b40b663..2d9626809 100644 --- a/packages/rust/tests/schema_inference.rs +++ b/packages/rust/tests/schema_inference.rs @@ -140,12 +140,10 @@ fn a_key_null_in_one_row_takes_its_type_from_another() { let values: Vec> = { let mut stmt = conn.prepare("SELECT n FROM t").unwrap(); - let v = stmt - .query_map([], |r| r.get(0)) + stmt.query_map([], |r| r.get(0)) .unwrap() .map(Result::unwrap) - .collect(); - v + .collect() }; assert_eq!(values, vec![None, Some(7)]); } diff --git a/packages/rust/tests/sdk.rs b/packages/rust/tests/sdk.rs index 0e9908e22..6ec829ff7 100644 --- a/packages/rust/tests/sdk.rs +++ b/packages/rust/tests/sdk.rs @@ -893,7 +893,7 @@ fn fanout_root() -> TempDir { fn table_returning(name: &str, glob: &str, col: &'static str, val: &'static str) -> Table { Table::new( name, - &format!("CREATE TABLE {name} ({col} TEXT)"), + format!("CREATE TABLE {name} ({col} TEXT)"), glob, move |_path| vec![HashMap::from([(col.into(), Value::Text(val.into()))])], ) diff --git a/packages/rust/tests/watcher.rs b/packages/rust/tests/watcher.rs index fdf355448..2d38d697b 100644 --- a/packages/rust/tests/watcher.rs +++ b/packages/rust/tests/watcher.rs @@ -121,11 +121,11 @@ fn drain_row_events( seen } -fn tables_with_action<'a>( - events: &'a [RowEvent], +fn tables_with_action( + events: &[RowEvent], is_action: impl Fn(&RowEvent) -> Option<&str>, -) -> std::collections::HashSet<&'a str> { - events.iter().filter_map(|e| is_action(e)).collect() +) -> std::collections::HashSet<&str> { + events.iter().filter_map(is_action).collect() } #[test] From 69a075bd28096c7647e2d86f13c9268f9bb76a54 Mon Sep 17 00:00:00 2001 From: thekevinbot <248217931+thekevinbot@users.noreply.github.com> Date: Fri, 18 Sep 2026 13:25:42 -0400 Subject: [PATCH 2/3] e2e attestation for claude/1148-clippy-all-targets --- .../e2e-attestations/claude-1148-clippy-all-targets.json | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 packages/python/e2e-attestations/claude-1148-clippy-all-targets.json diff --git a/packages/python/e2e-attestations/claude-1148-clippy-all-targets.json b/packages/python/e2e-attestations/claude-1148-clippy-all-targets.json new file mode 100644 index 000000000..f6ab321e6 --- /dev/null +++ b/packages/python/e2e-attestations/claude-1148-clippy-all-targets.json @@ -0,0 +1,7 @@ +{ + "command": "just test-e2e", + "ran_at": 1789752342, + "exit_code": 0, + "commit": "a597fe5a5b7f4a27b7132385027bc0b71e447138", + "branch": "claude/1148-clippy-all-targets" +} From b912dba0a6718bd6c2d6c4a762b14e4304f05895 Mon Sep 17 00:00:00 2001 From: thekevinbot <248217931+thekevinbot@users.noreply.github.com> Date: Fri, 18 Sep 2026 13:26:55 -0400 Subject: [PATCH 3/3] e2e attestation for claude/1148-clippy-all-targets --- .../e2e-attestations/claude-1148-clippy-all-targets.json | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 packages/ts/e2e-attestations/claude-1148-clippy-all-targets.json diff --git a/packages/ts/e2e-attestations/claude-1148-clippy-all-targets.json b/packages/ts/e2e-attestations/claude-1148-clippy-all-targets.json new file mode 100644 index 000000000..503285d8a --- /dev/null +++ b/packages/ts/e2e-attestations/claude-1148-clippy-all-targets.json @@ -0,0 +1,7 @@ +{ + "command": "pnpm test:e2e", + "ran_at": 1789752415, + "exit_code": 0, + "commit": "69a075bd28096c7647e2d86f13c9268f9bb76a54", + "branch": "claude/1148-clippy-all-targets" +}