From a750bfdefdef7548fe3de75cb1972333e973933e Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Wed, 14 Jan 2026 17:27:26 +0900 Subject: [PATCH] Allow empty value --- .../changepack_log_0Kb8pyLk1JRzOnqeBEXpJ.json | 1 + Cargo.lock | 20 ++++---- .../vespertide-cli/src/commands/revision.rs | 50 ++++++++++++++++++- 3 files changed, 59 insertions(+), 12 deletions(-) create mode 100644 .changepacks/changepack_log_0Kb8pyLk1JRzOnqeBEXpJ.json diff --git a/.changepacks/changepack_log_0Kb8pyLk1JRzOnqeBEXpJ.json b/.changepacks/changepack_log_0Kb8pyLk1JRzOnqeBEXpJ.json new file mode 100644 index 0000000..35ad285 --- /dev/null +++ b/.changepacks/changepack_log_0Kb8pyLk1JRzOnqeBEXpJ.json @@ -0,0 +1 @@ +{"changes":{"crates/vespertide-config/Cargo.toml":"Patch","crates/vespertide-loader/Cargo.toml":"Patch","crates/vespertide-planner/Cargo.toml":"Patch","crates/vespertide-naming/Cargo.toml":"Patch","crates/vespertide-macro/Cargo.toml":"Patch","crates/vespertide/Cargo.toml":"Patch","crates/vespertide-cli/Cargo.toml":"Patch","crates/vespertide-exporter/Cargo.toml":"Patch","crates/vespertide-core/Cargo.toml":"Patch","crates/vespertide-query/Cargo.toml":"Patch"},"note":"Allow empty value","date":"2026-01-14T08:27:19.993592200Z"} \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index cb236a0..f3c8b4f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2995,7 +2995,7 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "vespertide" -version = "0.1.26" +version = "0.1.27" dependencies = [ "vespertide-core", "vespertide-macro", @@ -3003,7 +3003,7 @@ dependencies = [ [[package]] name = "vespertide-cli" -version = "0.1.26" +version = "0.1.27" dependencies = [ "anyhow", "assert_cmd", @@ -3028,7 +3028,7 @@ dependencies = [ [[package]] name = "vespertide-config" -version = "0.1.26" +version = "0.1.27" dependencies = [ "clap", "schemars", @@ -3038,7 +3038,7 @@ dependencies = [ [[package]] name = "vespertide-core" -version = "0.1.26" +version = "0.1.27" dependencies = [ "rstest", "schemars", @@ -3050,7 +3050,7 @@ dependencies = [ [[package]] name = "vespertide-exporter" -version = "0.1.26" +version = "0.1.27" dependencies = [ "insta", "rstest", @@ -3061,7 +3061,7 @@ dependencies = [ [[package]] name = "vespertide-loader" -version = "0.1.26" +version = "0.1.27" dependencies = [ "anyhow", "rstest", @@ -3076,7 +3076,7 @@ dependencies = [ [[package]] name = "vespertide-macro" -version = "0.1.26" +version = "0.1.27" dependencies = [ "proc-macro2", "quote", @@ -3093,11 +3093,11 @@ dependencies = [ [[package]] name = "vespertide-naming" -version = "0.1.26" +version = "0.1.27" [[package]] name = "vespertide-planner" -version = "0.1.26" +version = "0.1.27" dependencies = [ "insta", "rstest", @@ -3108,7 +3108,7 @@ dependencies = [ [[package]] name = "vespertide-query" -version = "0.1.26" +version = "0.1.27" dependencies = [ "insta", "rstest", diff --git a/crates/vespertide-cli/src/commands/revision.rs b/crates/vespertide-cli/src/commands/revision.rs index de958d7..10ceccf 100644 --- a/crates/vespertide-cli/src/commands/revision.rs +++ b/crates/vespertide-cli/src/commands/revision.rs @@ -83,14 +83,32 @@ fn print_fill_with_item_and_get_prompt( format_fill_with_prompt(table, column) } +/// Wrap a value with single quotes if it contains spaces and isn't already quoted. +fn wrap_if_spaces(value: String) -> String { + if value.is_empty() { + return value; + } + // Already wrapped with single quotes + if value.starts_with('\'') && value.ends_with('\'') { + return value; + } + // Contains spaces: wrap with single quotes + if value.contains(' ') { + return format!("'{}'", value); + } + value +} + /// Prompt the user for a fill_with value using dialoguer. /// This function wraps terminal I/O and cannot be unit tested without a real terminal. #[cfg(not(tarpaulin_include))] fn prompt_fill_with_value(prompt: &str) -> Result { - Input::new() + let value = Input::new() .with_prompt(prompt) + .allow_empty(true) .interact_text() - .context("failed to read input") + .context("failed to read input")?; + Ok(wrap_if_spaces(value)) } /// Collect fill_with values interactively for missing columns. @@ -1097,4 +1115,32 @@ mod tests { _ => panic!("Expected ModifyColumnNullable action"), } } + + #[test] + fn test_wrap_if_spaces_empty() { + assert_eq!(wrap_if_spaces("".to_string()), ""); + } + + #[test] + fn test_wrap_if_spaces_no_spaces() { + assert_eq!(wrap_if_spaces("value".to_string()), "value"); + } + + #[test] + fn test_wrap_if_spaces_with_spaces() { + assert_eq!(wrap_if_spaces("my value".to_string()), "'my value'"); + } + + #[test] + fn test_wrap_if_spaces_already_quoted() { + assert_eq!( + wrap_if_spaces("'already quoted'".to_string()), + "'already quoted'" + ); + } + + #[test] + fn test_wrap_if_spaces_multiple_spaces() { + assert_eq!(wrap_if_spaces("a b c".to_string()), "'a b c'"); + } }