pub fn to_r_version(version: &str) -> String {
let Some((base, pre)) = version.split_once('-') else {
return version.to_string();
};
let numeric_offset: u32 = if pre.starts_with("rc") {
pre.split('.')
.filter_map(|part| part.parse::<u32>().ok())
.next_back()
.unwrap_or(0)
} else {
0
};
format!("{base}.{}", 9000 + numeric_offset)
}
pub fn to_rubygems_prerelease(version: &str) -> String {
if let Some((base, pre)) = version.split_once('-') {
let normalized_pre = pre.replace(['-', '_'], ".");
format!("{base}.pre.{normalized_pre}")
} else {
version.to_string()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn release_version_is_unchanged() {
assert_eq!(to_rubygems_prerelease("1.8.0"), "1.8.0");
assert_eq!(to_rubygems_prerelease("0.1.0"), "0.1.0");
}
#[test]
fn rc_prerelease_uses_pre_dot_form() {
assert_eq!(to_rubygems_prerelease("1.8.0-rc.2"), "1.8.0.pre.rc.2");
}
#[test]
fn alpha_and_beta_prereleases_normalize() {
assert_eq!(to_rubygems_prerelease("0.1.0-alpha.2"), "0.1.0.pre.alpha.2");
assert_eq!(to_rubygems_prerelease("0.1.0-beta.3"), "0.1.0.pre.beta.3");
}
#[test]
fn dashes_in_prerelease_become_dots() {
assert_eq!(to_rubygems_prerelease("1.0.0-pre-rc-2"), "1.0.0.pre.pre.rc.2");
}
#[test]
fn r_release_version_is_unchanged() {
assert_eq!(to_r_version("1.8.0"), "1.8.0");
assert_eq!(to_r_version("0.1.0"), "0.1.0");
assert_eq!(to_r_version("4.10.0"), "4.10.0");
}
#[test]
fn r_rc_prerelease_gets_9000_offset() {
assert_eq!(to_r_version("4.10.0-rc.1"), "4.10.0.9001");
assert_eq!(to_r_version("4.10.0-rc.15"), "4.10.0.9015");
assert_eq!(to_r_version("1.8.0-rc.2"), "1.8.0.9002");
}
#[test]
fn r_alpha_without_number_gets_9000() {
assert_eq!(to_r_version("0.1.0-alpha"), "0.1.0.9000");
}
#[test]
fn r_alpha_with_number_uses_offset() {
assert_eq!(to_r_version("0.1.0-alpha.2"), "0.1.0.9000");
}
}