From 03717a1bb0161b7bdcf7198dc882747beeb87993 Mon Sep 17 00:00:00 2001 From: abrahamanavhoeba-alt Date: Wed, 19 Nov 2025 16:05:15 -0500 Subject: [PATCH 1/2] fix clippy warnings Remove unit value let-bindings and assert_eq comparisons in tests. Use matches! macro instead of match expression in lexer. --- src/tests.rs | 21 +++++++-------------- src/version/lexer.rs | 5 +---- 2 files changed, 8 insertions(+), 18 deletions(-) diff --git a/src/tests.rs b/src/tests.rs index cdbd910..e39f26d 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -184,14 +184,13 @@ async fn remove_docs_success() { let mut config = Config::new(); config.api_base = http::Uri::try_from(server.url()).unwrap(); - let result = crate::api_remove_docs_response( + crate::api_remove_docs_response( http_send(crate::api_remove_docs_request(package, version, key, &config).unwrap()) .await .unwrap(), ) .unwrap(); - assert_eq!(result, ()); mock.assert(); } @@ -217,14 +216,13 @@ async fn revert_release_success() { let mut config = Config::new(); config.api_base = http::Uri::try_from(server.url()).unwrap(); - let result = crate::api_revert_release_response( + crate::api_revert_release_response( http_send(crate::api_revert_release_request(package, version, key, &config).unwrap()) .await .unwrap(), ) .unwrap(); - assert_eq!(result, ()); mock.assert(); } @@ -255,7 +253,7 @@ async fn add_owner_success() { let mut config = Config::new(); config.api_base = http::Uri::try_from(server.url()).unwrap(); - let result = crate::api_add_owner_response( + crate::api_add_owner_response( http_send(crate::api_add_owner_request( package, owner, level, key, &config, )) @@ -264,7 +262,6 @@ async fn add_owner_success() { ) .unwrap(); - assert_eq!(result, ()); mock.assert(); } @@ -294,7 +291,7 @@ async fn transfer_owner_success() { let mut config = Config::new(); config.api_base = http::Uri::try_from(server.url()).unwrap(); - let result = crate::api_transfer_owner_response( + crate::api_transfer_owner_response( http_send(crate::api_transfer_owner_request( package, owner, key, &config, )) @@ -303,7 +300,6 @@ async fn transfer_owner_success() { ) .unwrap(); - assert_eq!(result, ()); mock.assert(); } @@ -329,7 +325,7 @@ async fn remove_owner_success() { let mut config = Config::new(); config.api_base = http::Uri::try_from(server.url()).unwrap(); - let result = crate::api_remove_owner_response( + crate::api_remove_owner_response( http_send(crate::api_remove_owner_request( package, owner, key, &config, )) @@ -338,7 +334,6 @@ async fn remove_owner_success() { ) .unwrap(); - assert_eq!(result, ()); mock.assert(); } @@ -360,14 +355,13 @@ async fn remove_key_success() { let mut config = Config::new(); config.api_base = http::Uri::try_from(server.url()).unwrap(); - let result = crate::api_remove_api_key_response( + crate::api_remove_api_key_response( http_send(crate::api_remove_api_key_request(name, key, &config)) .await .unwrap(), ) .unwrap(); - assert_eq!(result, ()); mock.assert(); } @@ -389,14 +383,13 @@ async fn remove_key_success_2() { let mut config = Config::new(); config.api_base = http::Uri::try_from(server.url()).unwrap(); - let result = crate::api_remove_api_key_response( + crate::api_remove_api_key_response( http_send(crate::api_remove_api_key_request(name, key, &config)) .await .unwrap(), ) .unwrap(); - assert_eq!(result, ()); mock.assert(); } diff --git a/src/version/lexer.rs b/src/version/lexer.rs index 1c4811f..235e7be 100644 --- a/src/version/lexer.rs +++ b/src/version/lexer.rs @@ -74,10 +74,7 @@ pub enum Token<'input> { impl<'input> Token<'input> { /// Check if the current token is a whitespace token. pub fn is_whitespace(&self) -> bool { - match *self { - Whitespace(..) => true, - _ => false, - } + matches!(*self, Whitespace(..)) } } From 15351b900b943da5c9f30b598031192a5881529b Mon Sep 17 00:00:00 2001 From: abrahamanavhoeba-alt Date: Wed, 19 Nov 2025 16:17:13 -0500 Subject: [PATCH 2/2] improve error messages for incomplete version specifications Make error messages more user-friendly and actionable when version specifications are missing components (e.g., '0.34' instead of '0.34.0'). Before: 'missing patch version: 0.34' After: 'incomplete version: 0.34.x - versions must follow MAJOR.MINOR.PATCH format (e.g., 0.34.0)' Also added tests for range parsing with incomplete versions to ensure these error cases are properly covered. Addresses issue #35 --- src/version/parser.rs | 12 ++++++++++-- src/version/tests.rs | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/src/version/parser.rs b/src/version/parser.rs index b38110a..bcd3c38 100644 --- a/src/version/parser.rs +++ b/src/version/parser.rs @@ -48,10 +48,18 @@ impl fmt::Display for Error { EmptyPredicate => write!(fmt, "encountered empty predicate"), EmptyRange => write!(fmt, "encountered empty range"), MinorVersionMissing(major) => { - write!(fmt, "missing minor and patch versions: {:?}", major) + write!( + fmt, + "incomplete version: {}.x.x - versions must follow MAJOR.MINOR.PATCH format (e.g., {}.0.0)", + major, major + ) } PatchVersionMissing(major, minor) => { - write!(fmt, "missing patch version: {:?}.{:?}", major, minor) + write!( + fmt, + "incomplete version: {}.{}.x - versions must follow MAJOR.MINOR.PATCH format (e.g., {}.{}.0)", + major, minor, major, minor + ) } } } diff --git a/src/version/tests.rs b/src/version/tests.rs index b9732d6..2f84c15 100644 --- a/src/version/tests.rs +++ b/src/version/tests.rs @@ -469,3 +469,39 @@ fn missing_minor_has_correct_error_type() { fn missing_patch_has_correct_error_type() { assert_eq!(Version::parse("1.2"), Err(Error::PatchVersionMissing(1, 2))) } + +// Tests for improved error messages from issue #35 +#[test] +fn range_incomplete_patch_left_side() { + let error = Range::new(">= 0.34".to_string()).unwrap_err(); + let error_msg = error.to_string(); + assert!(error_msg.contains("incomplete version")); + assert!(error_msg.contains("0.34")); + assert!(error_msg.contains("MAJOR.MINOR.PATCH")); +} + +#[test] +fn range_incomplete_patch_right_side() { + let error = Range::new("< 2.0".to_string()).unwrap_err(); + let error_msg = error.to_string(); + assert!(error_msg.contains("incomplete version")); + assert!(error_msg.contains("2.0")); + assert!(error_msg.contains("MAJOR.MINOR.PATCH")); +} + +#[test] +fn range_incomplete_patch_both_sides() { + let error = Range::new(">= 0.34 and < 2.0.0".to_string()).unwrap_err(); + let error_msg = error.to_string(); + assert!(error_msg.contains("incomplete version")); + assert!(error_msg.contains("0.34")); +} + +#[test] +fn range_incomplete_major_only() { + let error = Range::new(">= 1".to_string()).unwrap_err(); + let error_msg = error.to_string(); + assert!(error_msg.contains("incomplete version")); + assert!(error_msg.contains("1.x.x")); + assert!(error_msg.contains("1.0.0")); +}