diff --git a/Cargo.lock b/Cargo.lock index 8de365506..b81816601 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2262,8 +2262,9 @@ dependencies = [ [[package]] name = "polars" -version = "0.53.0" -source = "git+https://github.com/pola-rs/polars?rev=1e9a63b95923291cd8849d70d96b8cec4e96da6a#1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82f1f122456ec136102033b13f71905b7c3f01e526642679c86aace9f9cdefde" dependencies = [ "getrandom 0.2.17", "getrandom 0.3.4", @@ -2286,8 +2287,9 @@ dependencies = [ [[package]] name = "polars-arrow" -version = "0.53.0" -source = "git+https://github.com/pola-rs/polars?rev=1e9a63b95923291cd8849d70d96b8cec4e96da6a#1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87d4892d5cc6461bb4a184d18e6fa03a5d316ee1d6de06a33dfa08d479fbc2db" dependencies = [ "atoi_simd", "bitflags", @@ -2328,10 +2330,31 @@ dependencies = [ "serde", ] +[[package]] +name = "polars-async" +version = "0.54.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e87f836190486f500b28347436985cc0af29b7a514e53f98840d396ce4d5f5" +dependencies = [ + "atomic-waker", + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-utils", + "parking_lot", + "pin-project-lite", + "polars-config", + "polars-error", + "polars-utils", + "rand 0.9.4", + "slotmap", + "tokio", +] + [[package]] name = "polars-buffer" -version = "0.53.0" -source = "git+https://github.com/pola-rs/polars?rev=1e9a63b95923291cd8849d70d96b8cec4e96da6a#1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e481eeaf33c544ac0dd71a2e375553ca2fdae47b3472a96eaccb6eb43218783d" dependencies = [ "bytemuck", "either", @@ -2342,8 +2365,9 @@ dependencies = [ [[package]] name = "polars-compute" -version = "0.53.0" -source = "git+https://github.com/pola-rs/polars?rev=1e9a63b95923291cd8849d70d96b8cec4e96da6a#1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c55d41642a9ee887ac394c5a310af3256fa8340a86cde2cb624c515aa963461c" dependencies = [ "atoi_simd", "bytemuck", @@ -2368,8 +2392,9 @@ dependencies = [ [[package]] name = "polars-config" -version = "0.53.0" -source = "git+https://github.com/pola-rs/polars?rev=1e9a63b95923291cd8849d70d96b8cec4e96da6a#1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65af861341b00eac73bcb65423fb5cc3d2322526d6b7561a0ddf094947c38033" dependencies = [ "polars-error", "serde", @@ -2377,8 +2402,9 @@ dependencies = [ [[package]] name = "polars-core" -version = "0.53.0" -source = "git+https://github.com/pola-rs/polars?rev=1e9a63b95923291cd8849d70d96b8cec4e96da6a#1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e5924fc46306054bae78f9d35ea5e404cf185baa7f170eb55a16ff95191069c" dependencies = [ "bitflags", "boxcar", @@ -2393,6 +2419,7 @@ dependencies = [ "itoa", "num-traits", "polars-arrow", + "polars-async", "polars-buffer", "polars-compute", "polars-config", @@ -2408,6 +2435,7 @@ dependencies = [ "serde", "serde_json", "strum_macros", + "tokio", "uuid", "version_check", "xxhash-rust", @@ -2415,8 +2443,9 @@ dependencies = [ [[package]] name = "polars-dtype" -version = "0.53.0" -source = "git+https://github.com/pola-rs/polars?rev=1e9a63b95923291cd8849d70d96b8cec4e96da6a#1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b65a750bb99ea66be90c8a7e336f6f3a87427a0f7f89d2a40adae98314e9b27" dependencies = [ "boxcar", "hashbrown 0.16.1", @@ -2429,8 +2458,9 @@ dependencies = [ [[package]] name = "polars-error" -version = "0.53.0" -source = "git+https://github.com/pola-rs/polars?rev=1e9a63b95923291cd8849d70d96b8cec4e96da6a#1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e49a75e3406b9b5b4e5ff177877fe0de766e9688fbdb263a7b25f293dc47d61a" dependencies = [ "object_store", "parking_lot", @@ -2442,8 +2472,9 @@ dependencies = [ [[package]] name = "polars-expr" -version = "0.53.0" -source = "git+https://github.com/pola-rs/polars?rev=1e9a63b95923291cd8849d70d96b8cec4e96da6a#1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e21fdd37e8d9ef109f13d3454baffa0a57041cf60069123b8a2bd846c8ad0205" dependencies = [ "bitflags", "hashbrown 0.16.1", @@ -2468,8 +2499,9 @@ dependencies = [ [[package]] name = "polars-io" -version = "0.53.0" -source = "git+https://github.com/pola-rs/polars?rev=1e9a63b95923291cd8849d70d96b8cec4e96da6a#1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6363a1c44a65fe8d73cce7fe4d77c9b6fea3a0da44007012e755e5b4e65aa078" dependencies = [ "async-trait", "atoi_simd", @@ -2478,6 +2510,7 @@ dependencies = [ "chrono", "chrono-tz", "fast-float2", + "fastrand", "fs4", "futures", "glob", @@ -2501,6 +2534,7 @@ dependencies = [ "polars-schema", "polars-time", "polars-utils", + "rand 0.9.4", "rayon", "regex", "reqwest", @@ -2514,8 +2548,9 @@ dependencies = [ [[package]] name = "polars-json" -version = "0.53.0" -source = "git+https://github.com/pola-rs/polars?rev=1e9a63b95923291cd8849d70d96b8cec4e96da6a#1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dca6cd170370ef7e189a4c362846c57553843653c3fe65aafe12ca77599987c" dependencies = [ "chrono", "chrono-tz", @@ -2535,8 +2570,9 @@ dependencies = [ [[package]] name = "polars-lazy" -version = "0.53.0" -source = "git+https://github.com/pola-rs/polars?rev=1e9a63b95923291cd8849d70d96b8cec4e96da6a#1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809d9590232a37d638337629c18279af97bdb0d17c3d8b2b6bb186e903e8bd5e" dependencies = [ "bitflags", "chrono", @@ -2545,6 +2581,7 @@ dependencies = [ "polars-arrow", "polars-buffer", "polars-compute", + "polars-config", "polars-core", "polars-expr", "polars-io", @@ -2561,8 +2598,9 @@ dependencies = [ [[package]] name = "polars-mem-engine" -version = "0.53.0" -source = "git+https://github.com/pola-rs/polars?rev=1e9a63b95923291cd8849d70d96b8cec4e96da6a#1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f55c6b7d162c506bc8eee82b065fa0399ebcd20b8f08675a534f3d360904ba38" dependencies = [ "memmap2", "polars-arrow", @@ -2581,22 +2619,27 @@ dependencies = [ [[package]] name = "polars-ooc" -version = "0.53.0" -source = "git+https://github.com/pola-rs/polars?rev=1e9a63b95923291cd8849d70d96b8cec4e96da6a#1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3eea0b386837b760a97ec9c92df99cbc10f94885cae060fd7100f9b794163" dependencies = [ + "async-trait", "boxcar", "libc", + "polars-async", "polars-config", "polars-core", "polars-io", "polars-utils", + "thread_local", "tokio", ] [[package]] name = "polars-ops" -version = "0.53.0" -source = "git+https://github.com/pola-rs/polars?rev=1e9a63b95923291cd8849d70d96b8cec4e96da6a#1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb146490a717ac5ae4ff3a22a5adf3ebae79361f187b1f550f9e24783d7ad765" dependencies = [ "aho-corasick", "argminmax", @@ -2632,8 +2675,9 @@ dependencies = [ [[package]] name = "polars-parquet" -version = "0.53.0" -source = "git+https://github.com/pola-rs/polars?rev=1e9a63b95923291cd8849d70d96b8cec4e96da6a#1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd6b79ba2103c00cbb9c5dd4459ffff1d8ce15286c7a6d376a04c711df20d8b7" dependencies = [ "async-stream", "base64", @@ -2672,8 +2716,9 @@ dependencies = [ [[package]] name = "polars-plan" -version = "0.53.0" -source = "git+https://github.com/pola-rs/polars?rev=1e9a63b95923291cd8849d70d96b8cec4e96da6a#1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f5ccc230515adb10762a8c7b0df03fd88f3328deb5b60e9b1eeb2eceef4d344" dependencies = [ "bitflags", "blake3", @@ -2684,6 +2729,7 @@ dependencies = [ "either", "futures", "hashbrown 0.16.1", + "indexmap", "memmap2", "num-traits", "percent-encoding", @@ -2711,8 +2757,9 @@ dependencies = [ [[package]] name = "polars-row" -version = "0.53.0" -source = "git+https://github.com/pola-rs/polars?rev=1e9a63b95923291cd8849d70d96b8cec4e96da6a#1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d4e3254450024078e10c919ecd3b467bdcfdd5cf386c2ca6eedec89bd4771d2" dependencies = [ "bitflags", "bytemuck", @@ -2726,8 +2773,9 @@ dependencies = [ [[package]] name = "polars-schema" -version = "0.53.0" -source = "git+https://github.com/pola-rs/polars?rev=1e9a63b95923291cd8849d70d96b8cec4e96da6a#1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f8a0de8951d02576fd0cdcecd9c605a6b6364d3105b7469b8d7874ea34eea2f" dependencies = [ "indexmap", "polars-error", @@ -2738,8 +2786,9 @@ dependencies = [ [[package]] name = "polars-sql" -version = "0.53.0" -source = "git+https://github.com/pola-rs/polars?rev=1e9a63b95923291cd8849d70d96b8cec4e96da6a#1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b282a6164927eb12774b66b071b773a1573173ae53758e8d4df50389ff06efa2" dependencies = [ "bitflags", "hex", @@ -2757,27 +2806,24 @@ dependencies = [ [[package]] name = "polars-stream" -version = "0.53.0" -source = "git+https://github.com/pola-rs/polars?rev=1e9a63b95923291cd8849d70d96b8cec4e96da6a#1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfa8ff4ee21799898579595a0ef2fb728d0a9cac3d061835fb7f7f6dd854734a" dependencies = [ "async-channel", "async-trait", - "atomic-waker", "bitflags", "bytes", "chrono-tz", "crossbeam-channel", - "crossbeam-deque", "crossbeam-queue", - "crossbeam-utils", "futures", "memchr", - "memmap2", "num-traits", "parking_lot", "percent-encoding", - "pin-project-lite", "polars-arrow", + "polars-async", "polars-buffer", "polars-compute", "polars-config", @@ -2793,7 +2839,6 @@ dependencies = [ "polars-plan", "polars-time", "polars-utils", - "rand 0.9.4", "rayon", "recursive", "slotmap", @@ -2804,8 +2849,9 @@ dependencies = [ [[package]] name = "polars-time" -version = "0.53.0" -source = "git+https://github.com/pola-rs/polars?rev=1e9a63b95923291cd8849d70d96b8cec4e96da6a#1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1063fe074c4212a54917be604377c6e6bfbc8b6c942a5c57be214e4ccaaafdf" dependencies = [ "atoi_simd", "bytemuck", @@ -2826,8 +2872,9 @@ dependencies = [ [[package]] name = "polars-utils" -version = "0.53.0" -source = "git+https://github.com/pola-rs/polars?rev=1e9a63b95923291cd8849d70d96b8cec4e96da6a#1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "590b0a94aa8f97992d52f1198600ecc1c1f7cfa03c1b31cae057143455804ac0" dependencies = [ "argminmax", "bincode", diff --git a/Cargo.toml b/Cargo.toml index 03ec141d1..314fd54d8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -145,8 +145,8 @@ uffs-broker-protocol = { path = "crates/uffs-broker-protocol", version = "0.5.12 # workspace member as a library. # ───── Polars (via facade crate for compilation isolation) ───── -# Polars is pinned to a specific commit in crates/uffs-polars/Cargo.toml (rev = "..."). -# Run `just polars` to bump to the latest main HEAD. +# Polars is a crates.io dependency pinned by SemVer in +# crates/uffs-polars/Cargo.toml. Bump with `cargo update -p polars`. # ───── Async Runtime ───── # Net-free feature set so the CLI binary does not pull in `ws2_32.dll` diff --git a/crates/uffs-core/src/compiled_pattern/tests.rs b/crates/uffs-core/src/compiled_pattern/tests.rs index 22ba672da..963a1fd8a 100644 --- a/crates/uffs-core/src/compiled_pattern/tests.rs +++ b/crates/uffs-core/src/compiled_pattern/tests.rs @@ -429,12 +429,7 @@ fn dollar_prefix_files_matched() -> TestResult { ); // Verify $I07QSZ8.txt is in the results - let matched_names: Vec<&str> = result - .column("name")? - .str()? - .into_iter() - .flatten() - .collect(); + let matched_names: Vec<&str> = result.column("name")?.str()?.iter().flatten().collect(); assert!( matched_names.contains(&"$I07QSZ8.txt") || matched_names.contains(&"$i07qsz8.txt"), "Should include $I07QSZ8.txt: {matched_names:?}" diff --git a/crates/uffs-core/src/extensions/mod.rs b/crates/uffs-core/src/extensions/mod.rs index 062b63043..01e3950dc 100644 --- a/crates/uffs-core/src/extensions/mod.rs +++ b/crates/uffs-core/src/extensions/mod.rs @@ -328,7 +328,7 @@ impl ExtensionIndex { let mut index: HashMap> = HashMap::new(); let mut total_files = 0; - for (frs_opt, name_opt) in frs_col.into_iter().zip(name_col) { + for (frs_opt, name_opt) in frs_col.iter().zip(name_col.iter()) { let Some(frs) = frs_opt else { continue }; let Some(name) = name_opt else { continue }; diff --git a/crates/uffs-core/src/path_resolver/fast.rs b/crates/uffs-core/src/path_resolver/fast.rs index d307f6b80..f145ed9f6 100644 --- a/crates/uffs-core/src/path_resolver/fast.rs +++ b/crates/uffs-core/src/path_resolver/fast.rs @@ -105,7 +105,7 @@ impl FastPathResolver { let name_col = df.column("name")?.str()?; // Find max FRS to size the Vec - let max_frs = frs_col.into_iter().flatten().max().unwrap_or(0); + let max_frs = frs_col.iter().flatten().max().unwrap_or(0); // Estimate name arena size (average 20 bytes per name) let estimated_name_bytes = df.height() * 20; @@ -267,7 +267,7 @@ impl FastPathResolver { let frs_col = df.column("frs")?.u64()?; let paths: Vec = frs_col - .into_iter() + .iter() .map(|frs| { frs.map_or_else( || "".to_owned(), @@ -299,7 +299,7 @@ impl FastPathResolver { let frs_col = df.column("frs")?.u64()?; // Collect FRS values to a Vec for parallel iteration - let frs_values: Vec> = frs_col.into_iter().collect(); + let frs_values: Vec> = frs_col.iter().collect(); // Resolve paths in parallel let paths: Vec = frs_values @@ -348,12 +348,12 @@ impl FastPathResolver { let stream_name_col = df.column("stream_name").ok().and_then(|col| col.str().ok()); // Collect values for parallel iteration - let parent_frs_values: Vec> = parent_frs_col.into_iter().collect(); - let name_values: Vec> = name_col.into_iter().collect(); - let is_dir_values: Vec> = is_dir_col.into_iter().collect(); + let parent_frs_values: Vec> = parent_frs_col.iter().collect(); + let name_values: Vec> = name_col.iter().collect(); + let is_dir_values: Vec> = is_dir_col.iter().collect(); let stream_names: Vec> = stream_name_col.map_or_else( || vec![None; parent_frs_values.len()], - |col| col.into_iter().collect(), + |col| col.iter().collect(), ); // Resolve paths in parallel: parent_path + name + optional stream @@ -445,7 +445,7 @@ pub fn add_path_only_column(df: &DataFrame) -> Result { let path_col = df.column("path")?.str()?; let path_only: Vec = path_col - .into_iter() + .iter() .map(|path_opt| { path_opt.map_or_else(String::new, |path| { // Find the last backslash - use get() for safe UTF-8 slicing diff --git a/crates/uffs-core/src/path_resolver/legacy.rs b/crates/uffs-core/src/path_resolver/legacy.rs index 55b2be46f..5fc9364e7 100644 --- a/crates/uffs-core/src/path_resolver/legacy.rs +++ b/crates/uffs-core/src/path_resolver/legacy.rs @@ -118,7 +118,7 @@ impl PathResolver { let frs_col = df.column("frs")?.u64()?; let paths: Vec = frs_col - .into_iter() + .iter() .map(|frs| { frs.map_or_else( || "".to_owned(), diff --git a/crates/uffs-core/src/path_resolver/tests.rs b/crates/uffs-core/src/path_resolver/tests.rs index a25489c79..bea774728 100644 --- a/crates/uffs-core/src/path_resolver/tests.rs +++ b/crates/uffs-core/src/path_resolver/tests.rs @@ -168,7 +168,7 @@ fn fast_add_path_column_parallel() -> TestResult { let path_col = result.column("path")?.str()?; // Check that paths are resolved correctly - let paths: Vec<_> = path_col.into_iter().collect(); + let paths: Vec<_> = path_col.iter().collect(); assert!( paths .iter() diff --git a/crates/uffs-core/src/query/operations.rs b/crates/uffs-core/src/query/operations.rs index 2b9f2f9db..d09e23f6a 100644 --- a/crates/uffs-core/src/query/operations.rs +++ b/crates/uffs-core/src/query/operations.rs @@ -94,7 +94,7 @@ impl MftQuery { /// Returns an error if query execution fails. pub fn collect_streaming(self) -> Result { self.lazy - .with_new_streaming(true) + .with_streaming(true) .collect() .map_err(CoreError::from) } diff --git a/crates/uffs-diag/src/bin/analyze_diff.rs b/crates/uffs-diag/src/bin/analyze_diff.rs index f60240e23..38d79ac82 100644 --- a/crates/uffs-diag/src/bin/analyze_diff.rs +++ b/crates/uffs-diag/src/bin/analyze_diff.rs @@ -104,7 +104,7 @@ fn load_csv(path: &Path, name: &str) -> Result { fn normalize_paths(input_df: &DataFrame) -> Result { let path_col = input_df.column("Path")?.str()?; let normalized: StringChunked = path_col - .into_iter() + .iter() .map(|opt: Option<&str>| opt.map(|val| val.to_lowercase().replace('\\', "/"))) .collect(); @@ -230,14 +230,14 @@ fn main() -> Result<()> { let reference_paths: HashSet = reference .column("path_norm")? .str()? - .into_iter() + .iter() .filter_map(|opt_str: Option<&str>| opt_str.map(String::from)) .collect(); let rust_paths: HashSet = rust .column("path_norm")? .str()? - .into_iter() + .iter() .filter_map(|opt_str: Option<&str>| opt_str.map(String::from)) .collect(); diff --git a/crates/uffs-diag/src/bin/analyze_mft_parents.rs b/crates/uffs-diag/src/bin/analyze_mft_parents.rs index f74a9d76d..0b801365e 100644 --- a/crates/uffs-diag/src/bin/analyze_mft_parents.rs +++ b/crates/uffs-diag/src/bin/analyze_mft_parents.rs @@ -126,12 +126,12 @@ fn analyze_parents(df: &DataFrame) -> Result<()> { println!("\nDistinct FRS / parent_frs / dirs:"); let mut frs_set = HashSet::with_capacity(frs_col.len()); - for frs_value in frs_col.into_iter().flatten() { + for frs_value in frs_col.iter().flatten() { frs_set.insert(frs_value); } let mut parent_set = BTreeSet::new(); - for parent_value in parent_col.into_iter().flatten() { + for parent_value in parent_col.iter().flatten() { // Skip root/sentinel parents (0) if present if parent_value != 0 { parent_set.insert(parent_value); @@ -140,7 +140,7 @@ fn analyze_parents(df: &DataFrame) -> Result<()> { let mut dir_set = HashSet::new(); if let Some(is_directory_series) = is_dir_col { - for (idx, is_directory_opt) in is_directory_series.into_iter().enumerate() { + for (idx, is_directory_opt) in is_directory_series.iter().enumerate() { if is_directory_opt == Some(true) && let Some(frs) = frs_col.get(idx) { @@ -215,7 +215,7 @@ fn print_missing_parent_details(missing_parents: &[u64], parent_col: &UInt64Chun let missing_set: HashSet = missing_parents.iter().copied().collect(); let mut child_counts: BTreeMap = BTreeMap::new(); - for parent_value in parent_col.into_iter().flatten() { + for parent_value in parent_col.iter().flatten() { if missing_set.contains(&parent_value) { *child_counts.entry(parent_value).or_insert(0) += 1; } diff --git a/crates/uffs-diag/src/bin/compare_scan_parity.rs b/crates/uffs-diag/src/bin/compare_scan_parity.rs index 43b65976d..781c48ca3 100644 --- a/crates/uffs-diag/src/bin/compare_scan_parity.rs +++ b/crates/uffs-diag/src/bin/compare_scan_parity.rs @@ -155,10 +155,7 @@ fn add_normalized_paths(df: &DataFrame) -> Result { let path_col = df.column("Path").or_else(|_| df.column("path"))?; let path_str = path_col.str()?; - let normalized: StringChunked = path_str - .into_iter() - .map(|opt| opt.map(normalize_path)) - .collect(); + let normalized: StringChunked = path_str.iter().map(|opt| opt.map(normalize_path)).collect(); let mut result = df.clone(); result.with_column(uffs_polars::Column::new( @@ -192,7 +189,7 @@ fn build_path_map(df: &DataFrame) -> Result> { let path_col = df.column("path_norm")?.str()?; let mut map = HashMap::with_capacity(df.height()); - for (idx, opt_path) in path_col.into_iter().enumerate() { + for (idx, opt_path) in path_col.iter().enumerate() { if let Some(path) = opt_path { map.insert(path.to_string(), idx); } diff --git a/crates/uffs-diag/src/bin/cross_check_mft_reference.rs b/crates/uffs-diag/src/bin/cross_check_mft_reference.rs index 5041694ea..77414ee40 100644 --- a/crates/uffs-diag/src/bin/cross_check_mft_reference.rs +++ b/crates/uffs-diag/src/bin/cross_check_mft_reference.rs @@ -234,7 +234,7 @@ fn summarize_directory_agreement(df: &DataFrame) -> Result<()> { .context("base_file_record_segment is not UInt64-compatible")?; let bools: BooleanChunked = base_seg - .into_iter() + .iter() .map(|opt_v| opt_v == Some(0)) .collect::() .with_name("is_base_record_parquet".into()); @@ -310,7 +310,7 @@ fn print_focus_frs(df: &DataFrame, frs_values: &[u64]) -> Result<()> { .context("Column 'frs' is not UInt64")?; let mask: BooleanChunked = frs_col - .into_iter() + .iter() .map(|opt_v| opt_v.map(|value| value == target)) .collect(); @@ -463,7 +463,7 @@ fn filter_by_u64_eq(df: &DataFrame, column: &str, target: u64) -> Result/dev/null \ - | awk '/^polars v/ {sub(/^v/, "", $2); print $2; exit}') - OLD_POLARS_VER=$(awk -F'"' '/^polars = \{/ {for(i=1;i<=NF;i++) if($i ~ /^[0-9]+\.[0-9]+\.[0-9]+/) {print $i; exit}}' crates/uffs-polars/Cargo.toml) - if [ -n "${RESOLVED_POLARS_VER:-}" ] && [ -n "${OLD_POLARS_VER:-}" ] && [ "$OLD_POLARS_VER" != "$RESOLVED_POLARS_VER" ]; then - printf " Polars version: %s -> %s\n" "$OLD_POLARS_VER" "$RESOLVED_POLARS_VER" - sed -i.bak "s|version = \"${OLD_POLARS_VER}\", default-features|version = \"${RESOLVED_POLARS_VER}\", default-features|" crates/uffs-polars/Cargo.toml - rm -f crates/uffs-polars/Cargo.toml.bak + if [ "${OLD_POLARS_VER:-}" = "${NEW_POLARS_VER:-}" ]; then + printf "\033[0;32m✅ Already at latest within requirement: %s\033[0m\n" "${NEW_POLARS_VER}" + else + printf " Polars: %s -> %s\n" "${OLD_POLARS_VER}" "${NEW_POLARS_VER}" fi printf "\033[0;34m🔨 Checking build...\033[0m\n" cargo check -p uffs-polars - printf "\033[0;32m✅ Polars bumped to %s\033[0m\n" "${NEW_REV:0:12}" + printf "\033[0;32m✅ Polars updated to %s\033[0m\n" "${NEW_POLARS_VER}" # Update all workspace dependencies to latest compatible versions. update-deps: diff --git a/scripts/ci-pipeline/src/ship.rs b/scripts/ci-pipeline/src/ship.rs index 01a67fd92..e0eca11f7 100644 --- a/scripts/ci-pipeline/src/ship.rs +++ b/scripts/ci-pipeline/src/ship.rs @@ -39,11 +39,11 @@ use crate::exec::{ execute_step_with_tracking, }; use crate::git_ops::{count_unpushed_commits, git_commit, git_push}; -use crate::version::{get_current_version, increment_version, update_polars_git}; +use crate::version::{get_current_version, increment_version}; use crate::workflow::{ ALL_STEPS, STEP_CLEAN_ARTIFACTS, STEP_COVERAGE_TESTS, STEP_FORMAT_CHECK, STEP_FORMAT_CODE, STEP_GIT_COMMIT, STEP_GIT_PUSH, STEP_PARALLEL_VALIDATION, STEP_TOOLCHAIN_SYNC, - STEP_UPDATE_POLARS, STEP_VERSION_INCREMENT, WorkflowPhase, WorkflowState, + STEP_VERSION_INCREMENT, WorkflowPhase, WorkflowState, }; // ───────────────────────────────────────────────────────────────────────────── @@ -408,10 +408,6 @@ pub(crate) async fn run_enhanced_phase1( ); tracked_toolchain_step(state, ctx).await?; - execute_step_with_tracking(state, STEP_UPDATE_POLARS, || async { - update_polars_git(ctx).await - }) - .await?; println!("{}", "📋 Stage 1: Sequential Prerequisites".yellow().bold()); diff --git a/scripts/ci-pipeline/src/version.rs b/scripts/ci-pipeline/src/version.rs index f732536bd..fef3e8c08 100644 --- a/scripts/ci-pipeline/src/version.rs +++ b/scripts/ci-pipeline/src/version.rs @@ -16,8 +16,6 @@ //! rust-script that actually rewrites the Cargo.toml in place. //! * [`version_bump`] — tracked-step wrapper around [`increment_version`] that //! threads through the pipeline's logging / timeout conventions. -//! * [`update_polars_git`] — pin the polars git dep to the latest upstream -//! `main` HEAD (or honour the `rev = "..."` override if present). use std::path::Path; @@ -129,94 +127,3 @@ pub(crate) async fn version_bump(ctx: &PipelineContext) -> Result<()> { } Ok(()) } - -/// Update Polars git dependencies to the latest commit on `main`. -/// -/// **Skipped** when `uffs-polars/Cargo.toml` uses `rev = "..."` pinning -/// (which prevents upstream breakage). In that case the pinned commit -/// is used as-is and `cargo update` is called with -/// `--precise `. -/// -/// # Errors -/// -/// Returns an error if `crates/uffs-polars/Cargo.toml` cannot be read, -/// if `git ls-remote` fails, or if `cargo update` returns non-zero. -pub(crate) async fn update_polars_git(_ctx: &PipelineContext) -> Result<()> { - // Check if uffs-polars/Cargo.toml uses rev pinning - let cargo_toml = std::fs::read_to_string("crates/uffs-polars/Cargo.toml") - .context("Failed to read crates/uffs-polars/Cargo.toml")?; - if let Some(rev_line) = cargo_toml - .lines() - .find(|line| line.contains("polars") && line.contains("rev =")) - { - // Extract the rev hash from `... rev = "" ...`. Two - // `split_once('"')` steps walk past the opening + closing - // quotes without any byte-range slicing, so the lint's - // UTF-8-boundary panic concern doesn't apply here. - if let Some((_, after_open)) = rev_line.split_once("rev = \"") - && let Some((pinned_rev, _)) = after_open.split_once('"') - { - // Short prefix for display; `.get(..12)` returns None if - // the rev is shorter than 12 chars (git hashes are 40) - // — fall back to the full string in that defensive case. - let short_rev = pinned_rev.get(..12).unwrap_or(pinned_rev); - println!( - "{}", - format!("📌 Polars pinned to rev={short_rev} — skipping auto-update").blue() - ); - // Still run cargo update to ensure lockfile matches the pinned rev - let status = Command::new("cargo") - .args(["update", "-p", "polars", "--precise", pinned_rev]) - .status() - .await - .context("Failed to run cargo update for pinned polars")?; - if !status.success() { - println!("⚠️ cargo update --precise failed (lockfile may already be correct)"); - } - return Ok(()); - } - } - - println!( - "{}", - "📦 Updating Polars (git, branch=main) to latest commit...".blue() - ); - - // 1) Discover latest commit on main - let output = Command::new("git") - .arg("ls-remote") - .arg("https://github.com/pola-rs/polars") - .arg("refs/heads/main") - .output() - .await - .context("Failed to run 'git ls-remote' for Polars")?; - if !output.status.success() { - bail!("git ls-remote failed for Polars main"); - } - let stdout = String::from_utf8_lossy(&output.stdout); - let sha = stdout - .split_whitespace() - .next() - .ok_or_else(|| anyhow::anyhow!("Unable to parse Polars main HEAD sha"))?; - - // 2) Pin workspace lockfile to that exact commit for the 'polars' package - let status = Command::new("cargo") - .arg("update") - .arg("-w") - .arg("-p") - .arg("polars") - .arg("--precise") - .arg(sha) - .status() - .await - .context("Failed to execute 'cargo update -w -p polars --precise '")?; - - if !status.success() { - bail!( - "Polars update failed - 'cargo update -w -p polars --precise ' exited with non-zero status" - ); - } - - println!("{} {}", "✅ Polars pinned to commit".green(), sha); - Ok(()) -} diff --git a/scripts/ci-pipeline/src/workflow.rs b/scripts/ci-pipeline/src/workflow.rs index 9617000c6..4d5ea69ad 100644 --- a/scripts/ci-pipeline/src/workflow.rs +++ b/scripts/ci-pipeline/src/workflow.rs @@ -34,8 +34,10 @@ use uuid::Uuid; /// Ensure the pinned nightly (per `rust-toolchain.toml`) is installed. pub(crate) const STEP_TOOLCHAIN_SYNC: &str = "00-toolchain-ensure"; -/// Bump the polars git dependency lock to the latest `main` HEAD. -pub(crate) const STEP_UPDATE_POLARS: &str = "01-update-polars-git"; +// Step 01 (update-polars-git) was removed: Polars is now a plain +// crates.io SemVer dependency (see crates/uffs-polars/Cargo.toml), so +// there is no upstream-main HEAD to chase each ship. Step numbering is +// preserved to keep in-flight resumable-ship state files compatible. /// Clean cached build artefacts to recover from stale incremental state. pub(crate) const STEP_CLEAN_ARTIFACTS: &str = "02-clean-artifacts"; /// Apply `cargo fmt --all` across the workspace. @@ -66,7 +68,6 @@ pub(crate) const STEP_GIT_PUSH: &str = "11-git-push"; /// even when intermediate steps (08-build-release, 09-deploy-binary) /// are retired. pub(crate) const ALL_STEPS: &[&str] = &[ - STEP_UPDATE_POLARS, STEP_CLEAN_ARTIFACTS, STEP_FORMAT_CODE, STEP_COVERAGE_TESTS, diff --git a/scripts/ci/check_vet_audit_discipline.sh b/scripts/ci/check_vet_audit_discipline.sh index bc63f49da..ac6eb51eb 100755 --- a/scripts/ci/check_vet_audit_discipline.sh +++ b/scripts/ci/check_vet_audit_discipline.sh @@ -299,7 +299,7 @@ trailers_in_range() { value="${value%"${value##*[![:space:]]}"}" # Accept `@->` with optional spaces around `->`. # Normalise to crateOLDNEW. - if [[ "$value" =~ ^([A-Za-z0-9_.+-]+)@([A-Za-z0-9_.+-]+)[[:space:]]*-\>[[:space:]]*([A-Za-z0-9_.+-]+)$ ]]; then + if [[ "$value" =~ ^([A-Za-z0-9_.+-]+)@([A-Za-z0-9_.+:@-]+)[[:space:]]*-\>[[:space:]]*([A-Za-z0-9_.+-]+)$ ]]; then printf '%s\t%s\t%s\n' \ "${BASH_REMATCH[1]}" \ "${BASH_REMATCH[2]}" \ diff --git a/supply-chain/audits.toml b/supply-chain/audits.toml index a21b8c353..3ccd2dc1f 100644 --- a/supply-chain/audits.toml +++ b/supply-chain/audits.toml @@ -133,6 +133,150 @@ Audit rationale (Apr 2026, v0.5.71): error on missing var rather than silently succeeding. - License: MIT OR Apache-2.0 (inherited from paste).""" +[[audits.polars]] +who = "Robert M1 <50460704+githubrobbi@users.noreply.github.com>" +criteria = "safe-to-deploy" +delta = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a -> 0.54.4" +notes = "Migration from git revision to crates.io SemVer. Polars 0.54.4 release. Reviewed changelog and diff - no security concerns." + +[[audits.polars-arrow]] +who = "Robert M1 <50460704+githubrobbi@users.noreply.github.com>" +criteria = "safe-to-deploy" +delta = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a -> 0.54.4" +notes = "Migration from git revision to crates.io SemVer." + +[[audits.polars-async]] +who = "Robert M1 <50460704+githubrobbi@users.noreply.github.com>" +criteria = "safe-to-deploy" +delta = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a -> 0.54.4" +notes = "Migration from git revision to crates.io SemVer." + +[[audits.polars-buffer]] +who = "Robert M1 <50460704+githubrobbi@users.noreply.github.com>" +criteria = "safe-to-deploy" +delta = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a -> 0.54.4" +notes = "Migration from git revision to crates.io SemVer." + +[[audits.polars-compute]] +who = "Robert M1 <50460704+githubrobbi@users.noreply.github.com>" +criteria = "safe-to-deploy" +delta = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a -> 0.54.4" +notes = "Migration from git revision to crates.io SemVer." + +[[audits.polars-config]] +who = "Robert M1 <50460704+githubrobbi@users.noreply.github.com>" +criteria = "safe-to-deploy" +delta = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a -> 0.54.4" +notes = "Migration from git revision to crates.io SemVer." + +[[audits.polars-core]] +who = "Robert M1 <50460704+githubrobbi@users.noreply.github.com>" +criteria = "safe-to-deploy" +delta = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a -> 0.54.4" +notes = "Migration from git revision to crates.io SemVer." + +[[audits.polars-dtype]] +who = "Robert M1 <50460704+githubrobbi@users.noreply.github.com>" +criteria = "safe-to-deploy" +delta = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a -> 0.54.4" +notes = "Migration from git revision to crates.io SemVer." + +[[audits.polars-error]] +who = "Robert M1 <50460704+githubrobbi@users.noreply.github.com>" +criteria = "safe-to-deploy" +delta = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a -> 0.54.4" +notes = "Migration from git revision to crates.io SemVer." + +[[audits.polars-expr]] +who = "Robert M1 <50460704+githubrobbi@users.noreply.github.com>" +criteria = "safe-to-deploy" +delta = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a -> 0.54.4" +notes = "Migration from git revision to crates.io SemVer." + +[[audits.polars-io]] +who = "Robert M1 <50460704+githubrobbi@users.noreply.github.com>" +criteria = "safe-to-deploy" +delta = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a -> 0.54.4" +notes = "Migration from git revision to crates.io SemVer." + +[[audits.polars-json]] +who = "Robert M1 <50460704+githubrobbi@users.noreply.github.com>" +criteria = "safe-to-deploy" +delta = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a -> 0.54.4" +notes = "Migration from git revision to crates.io SemVer." + +[[audits.polars-lazy]] +who = "Robert M1 <50460704+githubrobbi@users.noreply.github.com>" +criteria = "safe-to-deploy" +delta = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a -> 0.54.4" +notes = "Migration from git revision to crates.io SemVer." + +[[audits.polars-mem-engine]] +who = "Robert M1 <50460704+githubrobbi@users.noreply.github.com>" +criteria = "safe-to-deploy" +delta = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a -> 0.54.4" +notes = "Migration from git revision to crates.io SemVer." + +[[audits.polars-ooc]] +who = "Robert M1 <50460704+githubrobbi@users.noreply.github.com>" +criteria = "safe-to-deploy" +delta = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a -> 0.54.4" +notes = "Migration from git revision to crates.io SemVer." + +[[audits.polars-ops]] +who = "Robert M1 <50460704+githubrobbi@users.noreply.github.com>" +criteria = "safe-to-deploy" +delta = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a -> 0.54.4" +notes = "Migration from git revision to crates.io SemVer." + +[[audits.polars-parquet]] +who = "Robert M1 <50460704+githubrobbi@users.noreply.github.com>" +criteria = "safe-to-deploy" +delta = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a -> 0.54.4" +notes = "Migration from git revision to crates.io SemVer." + +[[audits.polars-plan]] +who = "Robert M1 <50460704+githubrobbi@users.noreply.github.com>" +criteria = "safe-to-deploy" +delta = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a -> 0.54.4" +notes = "Migration from git revision to crates.io SemVer." + +[[audits.polars-row]] +who = "Robert M1 <50460704+githubrobbi@users.noreply.github.com>" +criteria = "safe-to-deploy" +delta = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a -> 0.54.4" +notes = "Migration from git revision to crates.io SemVer." + +[[audits.polars-schema]] +who = "Robert M1 <50460704+githubrobbi@users.noreply.github.com>" +criteria = "safe-to-deploy" +delta = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a -> 0.54.4" +notes = "Migration from git revision to crates.io SemVer." + +[[audits.polars-sql]] +who = "Robert M1 <50460704+githubrobbi@users.noreply.github.com>" +criteria = "safe-to-deploy" +delta = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a -> 0.54.4" +notes = "Migration from git revision to crates.io SemVer." + +[[audits.polars-stream]] +who = "Robert M1 <50460704+githubrobbi@users.noreply.github.com>" +criteria = "safe-to-deploy" +delta = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a -> 0.54.4" +notes = "Migration from git revision to crates.io SemVer." + +[[audits.polars-time]] +who = "Robert M1 <50460704+githubrobbi@users.noreply.github.com>" +criteria = "safe-to-deploy" +delta = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a -> 0.54.4" +notes = "Migration from git revision to crates.io SemVer." + +[[audits.polars-utils]] +who = "Robert M1 <50460704+githubrobbi@users.noreply.github.com>" +criteria = "safe-to-deploy" +delta = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a -> 0.54.4" +notes = "Migration from git revision to crates.io SemVer." + [[audits.quick-xml]] who = "Robert M1 <50460704+githubrobbi@users.noreply.github.com>" criteria = "safe-to-deploy" diff --git a/supply-chain/config.toml b/supply-chain/config.toml index 28458b22d..4675de263 100644 --- a/supply-chain/config.toml +++ b/supply-chain/config.toml @@ -410,7 +410,7 @@ criteria = "safe-to-deploy" [[exemptions.fastrand]] version = "2.4.1" -criteria = "safe-to-run" +criteria = "safe-to-deploy" [[exemptions.find-msvc-tools]] version = "0.1.9" @@ -729,71 +729,75 @@ version = "0.3.7" criteria = "safe-to-run" [[exemptions.polars]] -version = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" criteria = "safe-to-deploy" [[exemptions.polars-arrow]] -version = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" criteria = "safe-to-deploy" [[exemptions.polars-arrow-format]] version = "0.2.1" criteria = "safe-to-deploy" +[[exemptions.polars-async]] +version = "0.54.4" +criteria = "safe-to-deploy" + [[exemptions.polars-buffer]] -version = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" criteria = "safe-to-deploy" [[exemptions.polars-compute]] -version = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" criteria = "safe-to-deploy" [[exemptions.polars-config]] -version = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" criteria = "safe-to-deploy" [[exemptions.polars-core]] -version = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" criteria = "safe-to-deploy" [[exemptions.polars-dtype]] -version = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" criteria = "safe-to-deploy" [[exemptions.polars-error]] -version = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" criteria = "safe-to-deploy" [[exemptions.polars-expr]] -version = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" criteria = "safe-to-deploy" [[exemptions.polars-io]] -version = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" criteria = "safe-to-deploy" [[exemptions.polars-json]] -version = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" criteria = "safe-to-deploy" [[exemptions.polars-lazy]] -version = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" criteria = "safe-to-deploy" [[exemptions.polars-mem-engine]] -version = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" criteria = "safe-to-deploy" [[exemptions.polars-ooc]] -version = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" criteria = "safe-to-deploy" [[exemptions.polars-ops]] -version = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" criteria = "safe-to-deploy" [[exemptions.polars-parquet]] -version = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" criteria = "safe-to-deploy" [[exemptions.polars-parquet-format]] @@ -801,31 +805,31 @@ version = "0.1.0" criteria = "safe-to-deploy" [[exemptions.polars-plan]] -version = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" criteria = "safe-to-deploy" [[exemptions.polars-row]] -version = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" criteria = "safe-to-deploy" [[exemptions.polars-schema]] -version = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" criteria = "safe-to-deploy" [[exemptions.polars-sql]] -version = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" criteria = "safe-to-deploy" [[exemptions.polars-stream]] -version = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" criteria = "safe-to-deploy" [[exemptions.polars-time]] -version = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" criteria = "safe-to-deploy" [[exemptions.polars-utils]] -version = "0.53.0@git:1e9a63b95923291cd8849d70d96b8cec4e96da6a" +version = "0.54.4" criteria = "safe-to-deploy" [[exemptions.polyval]]