From 9e07b9328f4322df3f86eeba3b881fbdf90db3e8 Mon Sep 17 00:00:00 2001 From: Ed Page Date: Thu, 7 Oct 2021 15:51:28 -0500 Subject: [PATCH 1/2] feat: Color support --- Cargo.toml | 12 +++++++----- examples/failure.rs | 12 ++++++++++++ src/assert.rs | 8 +++++++- src/color.rs | 48 +++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 3 +++ 5 files changed, 77 insertions(+), 6 deletions(-) create mode 100644 examples/failure.rs create mode 100644 src/color.rs diff --git a/Cargo.toml b/Cargo.toml index 0aa1dc5..54beb50 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,10 +12,6 @@ categories = ["development-tools::testing"] keywords = ["filesystem", "test", "assert", "fixture"] edition = "2018" -[badges] -codecov = { repository = "assert-rs/assert_fs" } -maintenance = { status = "passively-maintained" } - [package.metadata.release] pre-release-replacements = [ {file="CHANGELOG.md", search="Unreleased", replace="{{version}}", min=1}, @@ -25,10 +21,16 @@ pre-release-replacements = [ {file="CHANGELOG.md", search="", replace="\n[Unreleased]: https://github.com/assert-rs/assert_fs/compare/{{tag_name}}...HEAD", exactly=1}, ] +[features] +color = ["yansi", "concolor-control/std", "predicates/color"] +color-auto = ["color", "concolor-control/auto"] + [dependencies] tempfile = "3.0" globwalk = "0.8" -predicates = { version = "2.0", default-features = false, features = ["diff"] } +predicates = { version = "2.0.3", default-features = false, features = ["diff"] } predicates-core = "1.0" predicates-tree = "1.0" doc-comment = "0.3" +yansi = { version = "0.5.0", optional = true } +concolor-control = { version = "0.0.7", optional = true } diff --git a/examples/failure.rs b/examples/failure.rs new file mode 100644 index 0000000..05269ef --- /dev/null +++ b/examples/failure.rs @@ -0,0 +1,12 @@ +use assert_fs::prelude::*; + +fn main() { + let temp = assert_fs::TempDir::new().unwrap(); + let input_file = temp.child("foo.txt"); + + input_file.write_str("Hello\nWorld!").unwrap(); + + input_file.assert("Goodbye\nWorld!"); + + temp.close().unwrap(); +} diff --git a/src/assert.rs b/src/assert.rs index 0b96a7d..61f64ea 100644 --- a/src/assert.rs +++ b/src/assert.rs @@ -147,7 +147,13 @@ where { let pred = pred.into_path(); if let Some(case) = pred.find_case(false, &path) { - panic!("Unexpected file, failed {}\npath={:?}", case.tree(), path); + let palette = crate::Palette::current(); + panic!( + "Unexpected file, failed {}\n{}={}", + case.tree(), + palette.key.paint("path"), + palette.value.paint(path.display()) + ); } } diff --git a/src/color.rs b/src/color.rs new file mode 100644 index 0000000..92d6736 --- /dev/null +++ b/src/color.rs @@ -0,0 +1,48 @@ +#[derive(Copy, Clone, Debug, Default)] +pub(crate) struct Palette { + pub(crate) key: styled::Style, + pub(crate) value: styled::Style, +} + +impl Palette { + #[cfg(feature = "color")] + pub(crate) fn current() -> Self { + if concolor_control::get(concolor_control::Stream::Either).ansi_color() { + Self { + key: styled::Style(yansi::Style::new(yansi::Color::Blue).bold()), + value: styled::Style(yansi::Style::new(yansi::Color::Yellow).bold()), + } + } else { + Self::default() + } + } + + #[cfg(not(feature = "color"))] + pub(crate) fn current() -> Self { + Self::default() + } +} + +#[cfg(feature = "color")] +mod styled { + #[derive(Copy, Clone, Debug, Default)] + pub(crate) struct Style(pub(crate) yansi::Style); + + impl Style { + pub(crate) fn paint(self, item: T) -> impl std::fmt::Display { + self.0.paint(item) + } + } +} + +#[cfg(not(feature = "color"))] +mod styled { + #[derive(Copy, Clone, Debug, Default)] + pub(crate) struct Style; + + impl Style { + pub(crate) fn paint(self, item: T) -> impl std::fmt::Display { + item + } + } +} diff --git a/src/lib.rs b/src/lib.rs index 57789af..a9a3f68 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -77,6 +77,9 @@ pub mod prelude { pub use crate::fixture::SymlinkToFile; } +mod color; +use color::Palette; + #[macro_use] extern crate doc_comment; doctest!("../README.md"); From 8053839ed52fdb4e2beee8f7d0a15f95cb29bc25 Mon Sep 17 00:00:00 2001 From: Ed Page Date: Thu, 7 Oct 2021 15:55:38 -0500 Subject: [PATCH 2/2] style: Clippy --- src/assert.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/assert.rs b/src/assert.rs index 61f64ea..d364ef6 100644 --- a/src/assert.rs +++ b/src/assert.rs @@ -146,7 +146,7 @@ where P: predicates_core::Predicate, { let pred = pred.into_path(); - if let Some(case) = pred.find_case(false, &path) { + if let Some(case) = pred.find_case(false, path) { let palette = crate::Palette::current(); panic!( "Unexpected file, failed {}\n{}={}",