diff options
author | marcybell <marcelinebelardo@gmail.com> | 2024-03-21 00:57:26 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-20 22:57:26 +0100 |
commit | 938ea3c40145af68d8e28b2ef0275531f1123202 (patch) | |
tree | d797c9a1984f4238d8116dae2cbb1b4e92e78333 /src/modules | |
parent | 0e49f04a6b249090cf3703c5dac041a51e6bf530 (diff) |
feat: $gemset variable for Ruby module (#5429)
* $gemset variable for Ruby module
* typo
* Added test for no GEM_HOME env set
* Formatting
* Uses `rvm current` for gemset, no more version num
Diffstat (limited to 'src/modules')
-rw-r--r-- | src/modules/ruby.rs | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/src/modules/ruby.rs b/src/modules/ruby.rs index 498fefc3f..da056246d 100644 --- a/src/modules/ruby.rs +++ b/src/modules/ruby.rs @@ -1,3 +1,5 @@ +use regex::Regex; + use super::{Context, Module, ModuleConfig}; use crate::configs::ruby::RubyConfig; @@ -45,6 +47,9 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> { config.version_format, ) .map(Ok), + "gemset" => { + format_rvm_gemset(&context.exec_cmd("rvm", &["current"])?.stdout).map(Ok) + } _ => None, }) .parse(None, Some(context)) @@ -81,10 +86,21 @@ fn format_ruby_version(ruby_version: &str, version_format: &str) -> Option<Strin } } +fn format_rvm_gemset(current: &str) -> Option<String> { + let gemset_re = Regex::new(r"@(\S+)").unwrap(); + if let Some(gemset) = gemset_re.captures(current) { + let gemset_name = gemset.get(1)?.as_str(); + return Some(gemset_name.to_string()); + } + + None +} + #[cfg(test)] mod tests { use super::*; use crate::test::ModuleRenderer; + use crate::utils::CommandOutput; use nu_ansi_term::Color; use std::fs::File; use std::io; @@ -164,6 +180,58 @@ mod tests { } #[test] + fn rvm_gemset_active() -> io::Result<()> { + let dir = tempfile::tempdir()?; + File::create(dir.path().join("any.rb"))?.sync_all()?; + + let actual = ModuleRenderer::new("ruby") + .path(dir.path()) + .cmd( + "rvm current", + Some(CommandOutput { + stdout: String::from("ruby-2.5.1@test\n"), + stderr: String::default(), + }), + ) + .config(toml::toml! { + [ruby] + format = "via [$symbol($version)@($gemset )]($style)" + version_format = "${raw}" + }) + .collect(); + let expected = Some(format!("via {}", Color::Red.bold().paint("💎 2.5.1@test "))); + + assert_eq!(expected, actual); + dir.close() + } + + #[test] + fn rvm_gemset_not_active() -> io::Result<()> { + let dir = tempfile::tempdir()?; + File::create(dir.path().join("any.rb"))?.sync_all()?; + + let actual = ModuleRenderer::new("ruby") + .path(dir.path()) + .cmd( + "rvm current", + Some(CommandOutput { + // with no gemset, `rvm current` outputs an empty string + stdout: String::default(), + stderr: String::default(), + }), + ) + .config(toml::toml! { + [ruby] + format = "via [$symbol($version)(@$gemset) ]($style)" + }) + .collect(); + let expected = Some(format!("via {}", Color::Red.bold().paint("💎 v2.5.1 "))); + + assert_eq!(expected, actual); + dir.close() + } + + #[test] fn test_format_ruby_version() { let config = RubyConfig::default(); assert_eq!( |