From ca0a6b01738a745c04e48c3b5845304a27744c85 Mon Sep 17 00:00:00 2001 From: Altynbek Orumbayev Date: Thu, 27 Nov 2025 14:37:51 +0100 Subject: [PATCH] fix: fixes casing of version strings Addresses an edge case where the `convert_case` crate incorrectly transforms version strings like "v_1" into "V_1". This change introduces a regular expression to correct these patterns, ensuring that version strings are properly cased as "v1". --- src/render.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/render.rs b/src/render.rs index c102008..4a71c63 100644 --- a/src/render.rs +++ b/src/render.rs @@ -1,6 +1,8 @@ use color_eyre::eyre::{eyre, Context, ContextCompat, Result}; use convert_case::{Case, Casing}; +use regex::Regex; use std::path::Path; +use std::sync::LazyLock; use crate::parsing::{find_suite, find_test, get_group_comment, get_groups, get_suite_chunk}; use crate::runner::Runner; @@ -8,6 +10,10 @@ use crate::target::Target; use crate::ConfigMeta; use crate::{document::Document, group::Group, suite::Suite, test::Test}; +// Regex to fix version patterns like v_1, V_2 back to v1, V2 +// This is needed because convert_case treats letter-to-number transitions as word boundaries +static VERSION_PATTERN: LazyLock = LazyLock::new(|| Regex::new(r"([vV])_(\d+)").unwrap()); + fn case_from_str(s: &str) -> Result { match s { "Alternating" => Ok(Case::Alternating), @@ -36,9 +42,11 @@ fn case_from_str(s: &str) -> Result { } fn convert_case_filter(input: &str, case: &str) -> String { - input.to_case(case_from_str(case).unwrap_or_else(|e| { + let result = input.to_case(case_from_str(case).unwrap_or_else(|e| { panic!("failed to convert case: {}", e); - })) + })); + // Fix version patterns like v_1, V_2 back to v1, V2 (preserving case) + VERSION_PATTERN.replace_all(&result, "$1$2").to_string() } pub fn insert_after_keyword(original: &str, to_insert: &str, keyword: &str) -> String {