mirror of
https://github.com/Llewellynvdm/starship.git
synced 2024-12-25 11:20:01 +00:00
feat: implement the ruby module (#131)
This commit is contained in:
parent
f10bfe4616
commit
b06249d61c
@ -30,6 +30,7 @@ The prompt shows information you need while you're working, while staying sleek
|
||||
- Current username if not the same as the logged-in user.
|
||||
- Current Node.js version(`⬢`).
|
||||
- Current Rust version (`🦀`).
|
||||
- Current Ruby version (`💎`).
|
||||
- Current Python version (`🐍`).
|
||||
- Current Go version (`🐹`).
|
||||
- Package version of package in current directory (`📦`).
|
||||
|
@ -4,12 +4,19 @@ steps:
|
||||
inputs:
|
||||
versionSpec: "12.0.0"
|
||||
displayName: "Install a fixed version of Node"
|
||||
|
||||
# Install Go
|
||||
- task: GoTool@0
|
||||
inputs:
|
||||
versionSpec: "1.10"
|
||||
displayName: "Install a fixed version of Go"
|
||||
|
||||
# Install Ruby
|
||||
- task: UseRubyVersion@0
|
||||
inputs:
|
||||
versionSpec: "2.5.5"
|
||||
displayName: "Install a fixed version of Ruby"
|
||||
|
||||
# We are using pyenv to install Python for integration tests
|
||||
# Install Python
|
||||
- script: |
|
||||
|
@ -292,6 +292,29 @@ The `line_break` module separates the prompt into two lines.
|
||||
disabled = true
|
||||
```
|
||||
|
||||
## Ruby
|
||||
|
||||
The `ruby` module shows the currently installed version of NodeJS.
|
||||
The module will be shown if any of the following conditions are met:
|
||||
|
||||
- The current directory contains a `Gemfile` file
|
||||
- The current directory contains a `.rb` file
|
||||
|
||||
### Options
|
||||
|
||||
| Variable | Default | Description |
|
||||
| ---------- | ------- | -------------------------------------------------------- |
|
||||
| `disabled` | `false` | Disables the `ruby` module. |
|
||||
|
||||
### Example
|
||||
|
||||
```toml
|
||||
# ~/.config/starship.toml
|
||||
|
||||
[ruby]
|
||||
disabled = false
|
||||
```
|
||||
|
||||
## NodeJS
|
||||
|
||||
The `nodejs` module shows the currently installed version of NodeJS.
|
||||
|
@ -10,6 +10,7 @@ mod line_break;
|
||||
mod nodejs;
|
||||
mod package;
|
||||
mod python;
|
||||
mod ruby;
|
||||
mod rust;
|
||||
mod username;
|
||||
|
||||
@ -23,6 +24,7 @@ pub fn handle<'a>(module: &str, context: &'a Context) -> Option<Module<'a>> {
|
||||
"nodejs" => nodejs::module(context),
|
||||
"rust" => rust::module(context),
|
||||
"python" => python::module(context),
|
||||
"ruby" => ruby::module(context),
|
||||
"golang" => golang::module(context),
|
||||
"line_break" => line_break::module(context),
|
||||
"package" => package::module(context),
|
||||
|
59
src/modules/ruby.rs
Normal file
59
src/modules/ruby.rs
Normal file
@ -0,0 +1,59 @@
|
||||
use ansi_term::Color;
|
||||
use std::process::Command;
|
||||
|
||||
use super::{Context, Module};
|
||||
|
||||
/// Creates a module with the current Ruby version
|
||||
///
|
||||
/// Will display the Ruby version if any of the following criteria are met:
|
||||
/// - Current directory contains a `.rb` file
|
||||
/// - Current directory contains a `Gemfile` file
|
||||
pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
|
||||
let is_rb_project = context
|
||||
.new_scan_dir()
|
||||
.set_files(&["Gemfile"])
|
||||
.set_extensions(&["rb"])
|
||||
.scan();
|
||||
|
||||
if !is_rb_project {
|
||||
return None;
|
||||
}
|
||||
|
||||
match get_ruby_version() {
|
||||
Some(ruby_version) => {
|
||||
const RUBY_CHAR: &str = "💎 ";
|
||||
let module_color = Color::Red.bold();
|
||||
|
||||
let mut module = context.new_module("ruby")?;
|
||||
module.set_style(module_color);
|
||||
|
||||
let formatted_version = format_ruby_version(&ruby_version)?;
|
||||
module.new_segment("symbol", RUBY_CHAR);
|
||||
module.new_segment("version", &formatted_version);
|
||||
|
||||
Some(module)
|
||||
}
|
||||
None => None,
|
||||
}
|
||||
}
|
||||
|
||||
fn get_ruby_version() -> Option<String> {
|
||||
match Command::new("ruby").arg("-v").output() {
|
||||
Ok(output) => Some(String::from_utf8(output.stdout).unwrap()),
|
||||
Err(_) => None,
|
||||
}
|
||||
}
|
||||
|
||||
fn format_ruby_version(ruby_version: &str) -> Option<String> {
|
||||
let version = ruby_version
|
||||
// split into ["ruby", "2.6.0p0", "linux/amd64"]
|
||||
.split_whitespace()
|
||||
// return "2.6.0p0"
|
||||
.nth(1)?
|
||||
.get(0..5)?;
|
||||
|
||||
let mut formatted_version = String::with_capacity(version.len() + 1);
|
||||
formatted_version.push('v');
|
||||
formatted_version.push_str(version);
|
||||
Some(formatted_version)
|
||||
}
|
@ -27,6 +27,16 @@ RUN git clone https://github.com/syndbg/goenv.git $GOENV_ROOT \
|
||||
# Check that Go was correctly installed
|
||||
RUN go version
|
||||
|
||||
# Install Ruby
|
||||
ENV RUBY_VERSION 2.5.5
|
||||
ENV RBENV_ROOT /home/nonroot/.rbenv
|
||||
ENV PATH $RBENV_ROOT/bin:$RBENV_ROOT/shims:$PATH
|
||||
RUN curl -fsSL https://github.com/rbenv/rbenv-installer/raw/master/bin/rbenv-installer | bash \
|
||||
&& rbenv install $RUBY_VERSION \
|
||||
&& rbenv global $RUBY_VERSION
|
||||
# Check that Ruby was correctly installed
|
||||
RUN ruby --version
|
||||
|
||||
# Install Python
|
||||
ENV PYTHON_VERSION 3.6.9
|
||||
ENV PYENV_ROOT /home/nonroot/.pyenv
|
||||
|
@ -8,4 +8,5 @@ mod jobs;
|
||||
mod line_break;
|
||||
mod nodejs;
|
||||
mod python;
|
||||
mod ruby;
|
||||
mod username;
|
||||
|
52
tests/testsuite/ruby.rs
Normal file
52
tests/testsuite/ruby.rs
Normal file
@ -0,0 +1,52 @@
|
||||
use ansi_term::Color;
|
||||
use std::fs::{self, File};
|
||||
use std::io;
|
||||
|
||||
use crate::common;
|
||||
|
||||
#[test]
|
||||
fn folder_without_ruby_files() -> io::Result<()> {
|
||||
let dir = common::new_tempdir()?;
|
||||
|
||||
let output = common::render_module("ruby")
|
||||
.arg("--path")
|
||||
.arg(dir.path())
|
||||
.output()?;
|
||||
let actual = String::from_utf8(output.stdout).unwrap();
|
||||
|
||||
let expected = "";
|
||||
assert_eq!(expected, actual);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn folder_with_gemfile() -> io::Result<()> {
|
||||
let dir = common::new_tempdir()?;
|
||||
File::create(dir.path().join("Gemfile"))?;
|
||||
|
||||
let output = common::render_module("ruby")
|
||||
.arg("--path")
|
||||
.arg(dir.path())
|
||||
.output()?;
|
||||
let actual = String::from_utf8(output.stdout).unwrap();
|
||||
|
||||
let expected = format!("via {} ", Color::Red.bold().paint("💎 v2.5.5"));
|
||||
assert_eq!(expected, actual);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn folder_with_rb_file() -> io::Result<()> {
|
||||
let dir = common::new_tempdir()?;
|
||||
File::create(dir.path().join("any.rb"))?;
|
||||
|
||||
let output = common::render_module("ruby")
|
||||
.arg("--path")
|
||||
.arg(dir.path())
|
||||
.output()?;
|
||||
let actual = String::from_utf8(output.stdout).unwrap();
|
||||
|
||||
let expected = format!("via {} ", Color::Red.bold().paint("💎 v2.5.5"));
|
||||
assert_eq!(expected, actual);
|
||||
Ok(())
|
||||
}
|
Loading…
Reference in New Issue
Block a user