Skip to content

Commit

Permalink
Fix bug in path truncation
Browse files Browse the repository at this point in the history
Paths with 3 components would truncate to 2 despite the truncation length begin set to 3.
  • Loading branch information
Matan Kushner committed Apr 15, 2019
1 parent 71cac5b commit bca4a70
Show file tree
Hide file tree
Showing 3 changed files with 91 additions and 36 deletions.
88 changes: 57 additions & 31 deletions src/modules/directory.rs
Expand Up @@ -91,57 +91,83 @@ fn truncate(dir_string: String, length: usize) -> String {
let components = dir_string
.split(std::path::MAIN_SEPARATOR)
.collect::<Vec<&str>>();
if components.len() < length {
if components.len() <= length {
return dir_string;
}

let truncated_components = &components[..length];
let truncated_components = &components[components.len() - length..];
truncated_components.join(&std::path::MAIN_SEPARATOR.to_string())
}

#[cfg(test)]
mod tests {
// TODO: Look into stubbing `env` so that tests can be run in parallel
use super::*;
use clap::{App, Arg};
use std::path::Path;

#[test]
fn truncate_home_dir() {
let args = App::new("starship")
.arg(Arg::with_name("status_code"))
.get_matches_from(vec!["starship", "0"]);
// #[test]
// fn truncate_home_dir() {
// let args = App::new("starship")
// .arg(Arg::with_name("status_code"))
// .get_matches_from(vec!["starship", "0"]);

let home_dir = dirs::home_dir().unwrap();
env::set_current_dir(&home_dir).unwrap();
// let home_dir = dirs::home_dir().unwrap();
// env::set_current_dir(&home_dir).unwrap();

let segment = segment(&args);
// assert_eq!(segment.value, "~");
}
// let segment = segment(&args).unwrap();
// assert_eq!(segment.output(), "~");
// }

#[test]
fn dont_truncate_non_home_dir() {
let args = App::new("starship")
.arg(Arg::with_name("status_code"))
.get_matches_from(vec!["starship", "0"]);
// #[test]
// fn dont_truncate_non_home_dir() {
// let args = App::new("starship")
// .arg(Arg::with_name("status_code"))
// .get_matches_from(vec!["starship", "0"]);

// let root_dir = Path::new("/");
// env::set_current_dir(&root_dir).unwrap();

// let segment = segment(&args).unwrap();
// assert_eq!(segment.output(), "/");
// }

// #[test]
// fn do_not_canonicalize_paths() {
// let args = App::new("starship")
// .arg(Arg::with_name("status_code"))
// .get_matches_from(vec!["starship", "0"]);

let root_dir = Path::new("/");
env::set_current_dir(&root_dir).unwrap();
// let root_dir = Path::new("/var");
// env::set_current_dir(&root_dir).unwrap();

let segment = segment(&args);
// assert_eq!(segment.value, "/");
// let segment = segment(&args).unwrap();
// assert_eq!(segment.output(), "/var");
// }

#[test]
fn truncate_smaller_path_than_provided_length() {
let path = "~/starship";
let output = truncate(path.to_string(), 3);
assert_eq!(output, "~/starship")
}

#[test]
fn do_not_canonicalize_paths() {
let args = App::new("starship")
.arg(Arg::with_name("status_code"))
.get_matches_from(vec!["starship", "0"]);
fn truncate_same_path_as_provided_length() {
let path = "~/starship/engines";
let output = truncate(path.to_string(), 3);
assert_eq!(output, "~/starship/engines")
}

let root_dir = Path::new("/var");
env::set_current_dir(&root_dir).unwrap();
#[test]
fn truncate_slightly_larger_path_then_provided_length() {
let path = "~/starship/engines/booster";
let output = truncate(path.to_string(), 3);
assert_eq!(output, "starship/engines/booster")
}

let segment = segment(&args);
// assert_eq!(segment.value, "/var");
#[test]
fn truncate_larger_path_than_provided_length() {
let path = "~/starship/engines/booster/rocket";
let output = truncate(path.to_string(), 3);
assert_eq!(output, "engines/booster/rocket")
}
}
2 changes: 1 addition & 1 deletion src/print.rs
Expand Up @@ -21,6 +21,6 @@ pub fn prompt(args: ArgMatches) {
.map(|module| modules::handle(module, &args)) // Compute segments
.flatten() // Remove segments set to `None`
.enumerate() // Turn segment into tuple with index
.map(|(index, segment)| segment.output(index)) // Generate string outputs
.map(|(index, segment)| segment.output_index(index)) // Generate string outputs
.for_each(|segment_string| write!(handle, "{}", segment_string).unwrap());
}
37 changes: 33 additions & 4 deletions src/segment.rs
Expand Up @@ -76,8 +76,37 @@ impl Segment {
/// Create a string with the formatted contents of a segment
///
/// Will recursively also format the prefix and suffix of the segment being
/// stringified. Skips the prefix of the first segment.
pub fn output(&self, index: usize) -> String {
/// stringified.
pub fn output(&self) -> String {
let Segment {
name: _name,
prefix,
value,
style,
suffix,
} = self;

let mut segment_string = String::new();

// Skip the prefix for the first segment
if let Some(prefix) = prefix {
segment_string += &prefix.output()
}

segment_string += &style.paint(value).to_string();

if let Some(suffix) = suffix {
segment_string += &suffix.output();
}

segment_string
}

/// Create a string with the formatted contents of a segment while skipping the first segment.
///
/// Will recursively also format the prefix and suffix of the segment being
/// stringified.
pub fn output_index(&self, index: usize) -> String {
let Segment {
name: _name,
prefix,
Expand All @@ -91,14 +120,14 @@ impl Segment {
// Skip the prefix for the first segment
if index != 0 {
if let Some(prefix) = prefix {
segment_string += &prefix.output(index)
segment_string += &prefix.output_index(index)
}
}

segment_string += &style.paint(value).to_string();

if let Some(suffix) = suffix {
segment_string += &suffix.output(index);
segment_string += &suffix.output();
}

segment_string
Expand Down

0 comments on commit bca4a70

Please sign in to comment.