Improve test coverage related to 'bracket-color'#68
Conversation
📝 WalkthroughWalkthroughThis PR adds comprehensive test infrastructure to bracket-color, implements RGB↔XpColor conversions, fixes lerp iterator length reporting, refactors color-module tests to use shared helpers and parameterized test generation, and reorganizes terminal/example imports to decouple XpColor types from the local prelude. ChangesColor Test Infrastructure and XP Integration
Terminal and Example Import Reorganization
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Possibly related issues
Suggested labels
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Tip 💬 Introducing Slack Agent: The best way for teams to turn conversations into code.Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.
Built for teams:
One agent for your entire SDLC. Right inside Slack. Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 2
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
bracket-color/src/lib.rs (1)
46-59:⚠️ Potential issue | 🔴 CriticalAdd
pub mod xpcolor;tolib.rs.The file
bracket-color/src/xpcolor.rsexists with multiple test functions that depend oncrate::prelude::RGB, but it has no corresponding module declaration inlib.rs. Without it, the file is never compiled and the tests never run.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@bracket-color/src/lib.rs` around lines 46 - 59, The file xpcolor.rs isn't declared as a module so it's never compiled; add a module declaration "pub mod xpcolor;" to lib.rs alongside the existing module declarations (e.g., near pub mod test_utils or the other pub mod lines) so the xpcolor module is compiled and its tests run; if xpcolor exports types that should be re-exported to the prelude, also add the appropriate pub use into the prelude block (e.g., add pub use crate::xpcolor::*;) so those symbols are available as crate::prelude::... .
🧹 Nitpick comments (3)
bracket-color/src/test_utils.rs (1)
8-25: ⚡ Quick win
assert_rgb_eq,assert_rgba_eq, andassert_hsv_eqare missing the#[allow(clippy::missing_panics_doc)]attribute.
assert_approx_eq(line 4) already carries the annotation to suppress theclippy::missing_panics_doclint, but the three wrappers that delegate to it do not. All three can panic throughassert_approx_eq→assert!, and the crate enablesclippy::pedanticglobally, so clippy may flag them under-D warnings.🔧 Proposed fix
+#[allow(clippy::missing_panics_doc)] pub fn assert_rgb_eq(rgb: RGB, r: f32, g: f32, b: f32) { +#[allow(clippy::missing_panics_doc)] pub fn assert_rgba_eq(rgba: RGBA, r: f32, g: f32, b: f32, a: f32) { +#[allow(clippy::missing_panics_doc)] pub fn assert_hsv_eq(hsv: HSV, h: f32, s: f32, v: f32) {🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@bracket-color/src/test_utils.rs` around lines 8 - 25, The three test helper functions assert_rgb_eq, assert_rgba_eq, and assert_hsv_eq can panic via assert_approx_eq and need the clippy suppression; add the attribute #[allow(clippy::missing_panics_doc)] above each of these function definitions (i.e., immediately before the signatures of assert_rgb_eq, assert_rgba_eq, and assert_hsv_eq) so clippy won't flag missing panics documentation while keeping the existing behavior.bracket-color/src/rgb.rs (1)
456-468: 💤 Low value
make_rgb_minimalandnew_rgb_is_blackcover identical behavior.Both assert that
RGB::new()produces a zero/black value. The old test was not removed when the refactored helper-based version was added, leaving two tests that provide no additional coverage.🔧 Proposed fix — remove the now-redundant manual test
- #[test] - // Tests that we make an RGB triplet at defaults and it is black. - fn make_rgb_minimal() { - let black = RGB::new(); - assert!(black.r < f32::EPSILON); - assert!(black.g < f32::EPSILON); - assert!(black.b < f32::EPSILON); - } - #[test] fn new_rgb_is_black() { assert_rgb_eq(RGB::new(), 0.0, 0.0, 0.0); }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@bracket-color/src/rgb.rs` around lines 456 - 468, Remove the redundant test make_rgb_minimal since new_rgb_is_black already verifies that RGB::new() yields black; delete the make_rgb_minimal function (the three-assert test) so only the helper-based test new_rgb_is_black remains, keeping test coverage concise and avoiding duplicate assertions on RGB::new().bracket-color/src/rgba.rs (1)
480-493: 💤 Low value
make_rgba_minimalandnew_rgba_is_transparent_blackcover identical behavior.Same duplication as in
rgb.rs: the old per-channel epsilon test was not removed when the new helper-based version was added.🔧 Proposed fix
- #[test] - // Tests that we make an RGB triplet at defaults and it is black. - fn make_rgba_minimal() { - let black = RGBA::new(); - assert!(black.r < f32::EPSILON); - assert!(black.g < f32::EPSILON); - assert!(black.b < f32::EPSILON); - assert!(black.a < f32::EPSILON); - } - #[test] fn new_rgba_is_transparent_black() { assert_rgba_eq(RGBA::new(), 0.0, 0.0, 0.0, 0.0); }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@bracket-color/src/rgba.rs` around lines 480 - 493, The two tests duplicate behavior: remove the older per-channel epsilon test and keep the helper-based assertion; delete the make_rgba_minimal test and rely on new_rgba_is_transparent_black which uses assert_rgba_eq to validate RGBA::new() == (0,0,0,0); also scan for any other per-channel epsilon assertions for RGBA::new elsewhere and replace them with assert_rgba_eq to avoid redundant tests.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@bracket-color/src/lerpit.rs`:
- Around line 299-307: The test rgb_lerp_len_returns_configured_steps is
asserting a wrong hard-coded length (2) while RgbLerp::new(..., 2) actually
yields 3 items; update the test to avoid cementing the incorrect behavior by
replacing the fixed assert with a check that compares len() against the actual
remaining item count (e.g., consume/clone the iterator and assert lerp.len() ==
lerp.clone().count() or similar) or remove the strict numeric expectation so the
test no longer validates the off-by-one; reference RgbLerp::new, len(),
Iterator::next, self.step and self.n_steps when locating the code to update.
In `@bracket-color/src/xpcolor.rs`:
- Around line 126-131: The tests and From implementations reference missing
methods on RGB—implement RGB::to_xp(&self) -> XpColor and RGB::from_xp(xp:
XpColor) -> Self (or equivalent associated functions) so the From<RGB> impl that
calls rgb.to_xp() and the From<XpColor> impl that calls RGB::from_xp(xp)
compile; ensure the implementations perform the correct conversion matching
XpColor::new(255,128,0) expectations and update or add signatures used by
XpColor::from/XpColor::new; also export the xpcolor module from the crate root
(lib.rs) so xpcolor.rs is part of the public library, or if this conversion is
incomplete, remove the From impls and the convert_rgb_to_xp test instead.
---
Outside diff comments:
In `@bracket-color/src/lib.rs`:
- Around line 46-59: The file xpcolor.rs isn't declared as a module so it's
never compiled; add a module declaration "pub mod xpcolor;" to lib.rs alongside
the existing module declarations (e.g., near pub mod test_utils or the other pub
mod lines) so the xpcolor module is compiled and its tests run; if xpcolor
exports types that should be re-exported to the prelude, also add the
appropriate pub use into the prelude block (e.g., add pub use
crate::xpcolor::*;) so those symbols are available as crate::prelude::... .
---
Nitpick comments:
In `@bracket-color/src/rgb.rs`:
- Around line 456-468: Remove the redundant test make_rgb_minimal since
new_rgb_is_black already verifies that RGB::new() yields black; delete the
make_rgb_minimal function (the three-assert test) so only the helper-based test
new_rgb_is_black remains, keeping test coverage concise and avoiding duplicate
assertions on RGB::new().
In `@bracket-color/src/rgba.rs`:
- Around line 480-493: The two tests duplicate behavior: remove the older
per-channel epsilon test and keep the helper-based assertion; delete the
make_rgba_minimal test and rely on new_rgba_is_transparent_black which uses
assert_rgba_eq to validate RGBA::new() == (0,0,0,0); also scan for any other
per-channel epsilon assertions for RGBA::new elsewhere and replace them with
assert_rgba_eq to avoid redundant tests.
In `@bracket-color/src/test_utils.rs`:
- Around line 8-25: The three test helper functions assert_rgb_eq,
assert_rgba_eq, and assert_hsv_eq can panic via assert_approx_eq and need the
clippy suppression; add the attribute #[allow(clippy::missing_panics_doc)] above
each of these function definitions (i.e., immediately before the signatures of
assert_rgb_eq, assert_rgba_eq, and assert_hsv_eq) so clippy won't flag missing
panics documentation while keeping the existing behavior.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 32394625-6a81-41c5-bb79-27c9e513c525
📒 Files selected for processing (7)
bracket-color/src/hsv.rsbracket-color/src/lerpit.rsbracket-color/src/lib.rsbracket-color/src/rgb.rsbracket-color/src/rgba.rsbracket-color/src/test_utils.rsbracket-color/src/xpcolor.rs
📜 Review details
🧰 Additional context used
📓 Path-based instructions (1)
**/*.rs
📄 CodeRabbit inference engine (AGENTS.md)
**/*.rs: Format all Rust code usingcargo fmt --all
Fix allcargo clippywarnings — the CI enforces-D warnings
Add tests for new functionality in the relevant module; for split domains, prefer colocatedtests.rs
Files:
bracket-color/src/lib.rsbracket-color/src/rgba.rsbracket-color/src/hsv.rsbracket-color/src/rgb.rsbracket-color/src/test_utils.rsbracket-color/src/lerpit.rsbracket-color/src/xpcolor.rs
🔇 Additional comments (1)
bracket-color/src/hsv.rs (1)
152-218: HSV test additions LGTM.All new test cases (primary colors, grayscale, alpha preservation,
Fromtrait delegates) are correctly computed against the productionto_rgb()implementation and make good use of the shared helpers.
utilForever
left a comment
There was a problem hiding this comment.
Can you check my comments? Thanks.
bracket-color tests|
그리고 해당하는 이슈를 찾아서 |
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
bracket-color/src/rgb.rs (1)
475-486:⚠️ Potential issue | 🟡 Minor | ⚡ Quick winRemove duplicate test for RGB::new().
Both
make_rgb_minimal()(lines 475-481) andnew_rgb_is_black()(lines 484-486) test the same behavior: thatRGB::new()creates a black color. The newer version usingassert_rgb_eqis cleaner and should be kept.🧹 Proposed fix
- #[test] - // Tests that we make an RGB triplet at defaults and it is black. - fn make_rgb_minimal() { - let black = RGB::new(); - assert!(black.r < f32::EPSILON); - assert!(black.g < f32::EPSILON); - assert!(black.b < f32::EPSILON); - } - #[test] fn new_rgb_is_black() { assert_rgb_eq(RGB::new(), 0.0, 0.0, 0.0);🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@bracket-color/src/rgb.rs` around lines 475 - 486, Remove the duplicate test function make_rgb_minimal which asserts RGB::new() yields black; keep the cleaner test new_rgb_is_black that uses assert_rgb_eq. Locate the redundant test by the function name make_rgb_minimal and delete it (along with its assertions referencing black.r/black.g/black.b), ensuring only new_rgb_is_black remains to verify RGB::new().
♻️ Duplicate comments (1)
bracket-color/src/lerpit.rs (1)
301-304:⚠️ Potential issue | 🟡 Minor | ⚡ Quick winRemove the extra blank line between
#[case]attributes.There's an unnecessary blank line (line 303) between the two
#[case]parameters, which is inconsistent with the formatting in other test functions in this file.🧹 Proposed fix
fn rgba_lerp_iterates_from_start_to_end( #[case] steps: usize, - #[case] expected_values: Vec<f32>, ) {As per coding guidelines, format all Rust code using
cargo fmt --all.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@bracket-color/src/lerpit.rs` around lines 301 - 304, In the test function rgba_lerp_iterates_from_start_to_end remove the stray blank line between the two #[case] attributes so the attributes for steps and expected_values are adjacent (#[case] steps: usize, #[case] expected_values: Vec<f32>), then run cargo fmt --all to apply consistent formatting across the file.
🧹 Nitpick comments (1)
bracket-color/Cargo.toml (1)
23-23: ⚡ Quick winConsider using a more specific version constraint for byteorder.
The version constraint
"1"permits any1.xrelease, which could introduce unexpected API changes or behavior differences. Rust best practice is to use tilde requirements like"~1.5"or caret requirements like"^1.5"to lock the minor version.📦 Recommended version constraint
Check which specific byteorder version your code relies on and update:
-byteorder = "1" +byteorder = "~1.5"or use caret if you prefer semver semantics:
-byteorder = "1" +byteorder = "^1.5"🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@bracket-color/Cargo.toml` at line 23, The dependency declaration for byteorder currently uses the broad constraint "1"; replace it with a specific semver constraint (e.g. a caret "^1.x" or tilde "~1.x" pinned to the minor your code expects) in Cargo.toml to avoid pulling incompatible 1.y changes—verify the exact minor version your code needs by checking Cargo.lock or tests, update the byteorder entry accordingly, and run cargo build/test to confirm compatibility (refer to the byteorder dependency line in Cargo.toml).
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@bracket-terminal/src/lib.rs`:
- Around line 33-34: The re-export list for the rex module omits XpColor causing
a breaking change; update the public re-export to include XpColor (i.e., add
XpColor alongside xp_to_console, xp_to_draw_batch, XpCell, XpFile, XpLayer) so
consumers using use bracket_terminal::prelude::*; still get XpColor, or
alternatively document this removal as an intentional breaking change and add
migration guidance explaining users should import XpColor from
bracket_rex::prelude if you choose to remove it.
---
Outside diff comments:
In `@bracket-color/src/rgb.rs`:
- Around line 475-486: Remove the duplicate test function make_rgb_minimal which
asserts RGB::new() yields black; keep the cleaner test new_rgb_is_black that
uses assert_rgb_eq. Locate the redundant test by the function name
make_rgb_minimal and delete it (along with its assertions referencing
black.r/black.g/black.b), ensuring only new_rgb_is_black remains to verify
RGB::new().
---
Duplicate comments:
In `@bracket-color/src/lerpit.rs`:
- Around line 301-304: In the test function rgba_lerp_iterates_from_start_to_end
remove the stray blank line between the two #[case] attributes so the attributes
for steps and expected_values are adjacent (#[case] steps: usize, #[case]
expected_values: Vec<f32>), then run cargo fmt --all to apply consistent
formatting across the file.
---
Nitpick comments:
In `@bracket-color/Cargo.toml`:
- Line 23: The dependency declaration for byteorder currently uses the broad
constraint "1"; replace it with a specific semver constraint (e.g. a caret
"^1.x" or tilde "~1.x" pinned to the minor your code expects) in Cargo.toml to
avoid pulling incompatible 1.y changes—verify the exact minor version your code
needs by checking Cargo.lock or tests, update the byteorder entry accordingly,
and run cargo build/test to confirm compatibility (refer to the byteorder
dependency line in Cargo.toml).
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 1fce47be-9f22-4db5-a282-7e3aa9c07b90
📒 Files selected for processing (8)
bracket-color/Cargo.tomlbracket-color/src/hsv.rsbracket-color/src/lerpit.rsbracket-color/src/lib.rsbracket-color/src/rgb.rsbracket-color/src/rgba.rsbracket-color/src/test_utils.rsbracket-terminal/src/lib.rs
🚧 Files skipped from review as they are similar to previous changes (4)
- bracket-color/src/lib.rs
- bracket-color/src/test_utils.rs
- bracket-color/src/hsv.rs
- bracket-color/src/rgba.rs
📜 Review details
🧰 Additional context used
📓 Path-based instructions (1)
**/*.rs
📄 CodeRabbit inference engine (AGENTS.md)
**/*.rs: Format all Rust code usingcargo fmt --all
Fix allcargo clippywarnings — the CI enforces-D warnings
Add tests for new functionality in the relevant module; for split domains, prefer colocatedtests.rs
Files:
bracket-color/src/lerpit.rsbracket-terminal/src/lib.rsbracket-color/src/rgb.rs
🔇 Additional comments (5)
bracket-color/src/lerpit.rs (2)
78-78: Excellent fix to the ExactSizeIterator contract violation!The updated
len()implementation correctly returns the remaining item count (n_steps + 1 - step) rather than the fixedn_steps. This resolves the pre-existing bug whereRgbLerp::new(..., 2)yielded 3 items butlen()returned 2.
251-346: Comprehensive test coverage with good use of rstest parameterization.The new tests effectively validate:
- Iterator progression for all lerp types (RGB, HSV, RGBA, Alpha)
len()tracking behavior (for RGB and HSV)- Termination with
Noneafter completion- Panic behavior for invalid step values
The parameterized approach reduces duplication and improves maintainability.
bracket-color/src/rgb.rs (3)
301-305: LGTM! Clean XpColor → RGB conversion.The
from_xpmethod correctly delegates tofrom_u8, maintaining consistency with existing RGB construction patterns.
352-361: LGTM! RGB → XpColor conversion with proper clamping.The
to_xpmethod correctly clamps each component to[0.0, 1.0]before scaling to0..=255and casting tou8. The clippy allows are appropriate for this conversion.
488-557: Excellent test refactoring with rstest and shared assertions.The conversion to parameterized tests using
rstestand the adoption of shared assertion helpers (assert_rgb_eq,assert_hsv_eq,assert_approx_eq) significantly improves:
- Test coverage (more edge cases, grayscale scenarios, multiple hex inputs)
- Maintainability (reduced duplication, clearer intent)
- Consistency (uniform assertion patterns across modules)
This aligns well with the PR objectives to strengthen test coverage and clarify test responsibilities.
2151429 to
22f424e
Compare
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@bracket-terminal/src/rex.rs`:
- Line 4: The change removed public re-exports of XpCell, XpColor, XpFile, and
XpLayer from the crate prelude (breaking downstream imports); either reintroduce
the re-exports or document and version the breaking change. To fix, restore
public re-exports by adding pub use bracket_rex::prelude::{XpCell, XpColor,
XpFile, XpLayer} in the rex/prelude module (or equivalent), or if the removal is
intentional, update the crate’s CHANGELOG and bump the major version and update
README/examples to import these symbols from bracket_rex::prelude instead so
consumers know to change their imports.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 3bbde16d-f192-400c-b53f-ffeda7665ce7
📒 Files selected for processing (17)
bracket-color/src/lerpit.rsbracket-color/src/lib.rsbracket-color/src/test_utils.rsbracket-color/src/xpcolor.rsbracket-terminal/examples/postprocess.rsbracket-terminal/examples/rex.rsbracket-terminal/examples/textsprites.rsbracket-terminal/src/bterm.rsbracket-terminal/src/consoles/console.rsbracket-terminal/src/consoles/flexible_console.rsbracket-terminal/src/consoles/simple_console.rsbracket-terminal/src/consoles/sparse_console.rsbracket-terminal/src/consoles/sprite_console.rsbracket-terminal/src/consoles/text/multi_tile_sprite.rsbracket-terminal/src/consoles/virtual_console.rsbracket-terminal/src/rex.rssrc/lib.rs
💤 Files with no reviewable changes (1)
- src/lib.rs
✅ Files skipped from review due to trivial changes (7)
- bracket-terminal/examples/textsprites.rs
- bracket-terminal/src/consoles/text/multi_tile_sprite.rs
- bracket-terminal/src/consoles/flexible_console.rs
- bracket-terminal/src/consoles/console.rs
- bracket-terminal/src/consoles/sparse_console.rs
- bracket-terminal/src/consoles/sprite_console.rs
- bracket-terminal/src/consoles/virtual_console.rs
🚧 Files skipped from review as they are similar to previous changes (3)
- bracket-color/src/xpcolor.rs
- bracket-color/src/test_utils.rs
- bracket-color/src/lerpit.rs
📜 Review details
🧰 Additional context used
📓 Path-based instructions (1)
**/*.rs
📄 CodeRabbit inference engine (AGENTS.md)
**/*.rs: Format all Rust code usingcargo fmt --all
Fix allcargo clippywarnings — the CI enforces-D warnings
Add tests for new functionality in the relevant module; for split domains, prefer colocatedtests.rs
Files:
bracket-terminal/src/consoles/simple_console.rsbracket-terminal/src/rex.rsbracket-terminal/src/bterm.rsbracket-terminal/examples/postprocess.rsbracket-color/src/lib.rsbracket-terminal/examples/rex.rs
🔇 Additional comments (8)
bracket-terminal/src/consoles/simple_console.rs (1)
1-7: LGTM!bracket-terminal/examples/postprocess.rs (1)
1-5: LGTM!bracket-terminal/src/bterm.rs (2)
1-13: LGTM!
289-291: LGTM!bracket-terminal/examples/rex.rs (1)
1-4: LGTM!bracket-color/src/lib.rs (3)
48-49: Consider making visibility explicit (duplicate).A past review comment suggested using
pub(crate) mod test_utils;instead ofmod test_utils;for explicitness, though both are functionally equivalent at the crate root. While the current code works correctly, being explicit about crate-level visibility improves clarity.
45-46: LGTM!
61-61: LGTM!
utilForever
left a comment
There was a problem hiding this comment.
LGTM now. Thanks for your work! 🎉
What
Added shared test utilities to reduce duplicated assertion logic.
Refactored and extended existing tests so that each module validates only its own responsibilities.
Added missing edge case and error handling tests.
Why
Checklist
Required
cargo check --allpassescargo fmt --all -- --checkpassescargo clippy --workspace --all-targets -- -D warnings -A clippy::multiple-crate-versionspassescargo test --allpassesCloses #26)Functional Validation
Configuration & Docs
README.md,ARCHITECTURE.md, or relevant manual pages, if applicable)If Applicable
cargo auditlocally if needed)Summary by CodeRabbit
New Features
Bug Fixes
Tests
Chores