diff --git a/Cargo.lock b/Cargo.lock index 021c8d0f..1d4977d6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -146,6 +146,15 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "arbitrary" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" +dependencies = [ + "derive_arbitrary", +] + [[package]] name = "arc-swap" version = "1.6.0" @@ -159,7 +168,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00ad3f3a942eee60335ab4342358c161ee296829e0d16ff42fc1d6cb07815467" dependencies = [ "anstyle", - "bstr", + "bstr 1.9.0", "doc-comment", "predicates", "predicates-core", @@ -167,12 +176,6 @@ dependencies = [ "wait-timeout", ] -[[package]] -name = "atomic" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59bdb34bc650a32731b31bd8f0829cc15d24a708ee31559e0bb34f2bc320cba" - [[package]] name = "autocfg" version = "1.1.0" @@ -206,6 +209,17 @@ version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +[[package]] +name = "bstr" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223" +dependencies = [ + "lazy_static", + "memchr", + "regex-automata 0.1.10", +] + [[package]] name = "bstr" version = "1.9.0" @@ -372,6 +386,17 @@ version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +[[package]] +name = "derive_arbitrary" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.49", +] + [[package]] name = "dialoguer" version = "0.11.0" @@ -633,8 +658,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi", + "wasm-bindgen", ] [[package]] @@ -673,9 +700,9 @@ dependencies = [ [[package]] name = "hashlink" -version = "0.8.4" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" +checksum = "692eaaf7f7607518dd3cef090f1474b61edc5301d8012f09579920df68b725ee" dependencies = [ "hashbrown", ] @@ -790,9 +817,9 @@ dependencies = [ [[package]] name = "libsqlite3-sys" -version = "0.27.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716" +checksum = "0c10584274047cb335c23d3e61bcef8e323adae7c5c8c760540f73610177fc3f" dependencies = [ "cc", "pkg-config", @@ -955,6 +982,7 @@ dependencies = [ "predicates", "serde", "serde_derive", + "similar-asserts", "tempfile", "thiserror", "toml 0.8.10", @@ -977,6 +1005,7 @@ dependencies = [ name = "pace_core" version = "0.8.0" dependencies = [ + "arbitrary", "chrono", "directories", "displaydoc", @@ -989,12 +1018,13 @@ dependencies = [ "rusqlite", "serde", "serde_derive", + "similar-asserts", "strum", "strum_macros", "thiserror", "toml 0.8.10", "typed-builder", - "uuid", + "ulid", ] [[package]] @@ -1248,9 +1278,9 @@ dependencies = [ [[package]] name = "rusqlite" -version = "0.30.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a78046161564f5e7cd9008aff3b2990b3850dc8e0349119b98e8f251e099f24d" +checksum = "b838eba278d213a8beaf485bd313fd580ca4505a00d5871caeb1457c55322cae" dependencies = [ "bitflags 2.4.2", "chrono", @@ -1369,6 +1399,27 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" +[[package]] +name = "similar" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32fea41aca09ee824cc9724996433064c89f7777e60762749a4170a14abbfa21" +dependencies = [ + "bstr 0.2.17", + "unicode-segmentation", +] + +[[package]] +name = "similar-asserts" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e041bb827d1bfca18f213411d51b665309f1afb37a04a5d1464530e13779fc0f" +dependencies = [ + "console", + "serde", + "similar", +] + [[package]] name = "slab" version = "0.4.9" @@ -1647,12 +1698,30 @@ dependencies = [ "syn 2.0.49", ] +[[package]] +name = "ulid" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34778c17965aa2a08913b57e1f34db9b4a63f5de31768b55bf20d2795f921259" +dependencies = [ + "getrandom", + "rand", + "serde", + "web-time", +] + [[package]] name = "unicode-ident" version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +[[package]] +name = "unicode-segmentation" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" + [[package]] name = "unicode-width" version = "0.1.11" @@ -1677,10 +1746,7 @@ version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f00cc9702ca12d3c81455259621e676d0f7251cec66a21e98fe2e9a37db93b2a" dependencies = [ - "atomic", "getrandom", - "rand", - "serde", ] [[package]] @@ -1770,6 +1836,16 @@ version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4f186bd2dcf04330886ce82d6f33dd75a7bfcf69ecf5763b89fcde53b6ac9838" +[[package]] +name = "web-time" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ee269d72cc29bf77a2c4bc689cc750fb39f5cbd493d2205bbb3f5c7779cf7b0" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "winapi" version = "0.3.9" diff --git a/Cargo.toml b/Cargo.toml index 9765c04b..4f0534ec 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,6 +15,7 @@ eyre = "0.6.12" pace_cli = { path = "crates/cli", version = "0" } pace_core = { path = "crates/core", version = "0" } pace_server = { path = "crates/server", version = "0" } +similar-asserts = { version = "1.5.0", features = ["serde"] } [package] name = "pace-rs" @@ -54,6 +55,7 @@ pace_cli = { workspace = true } pace_core = { workspace = true } serde = "1" serde_derive = "1" + thiserror = "1.0.57" toml = { version = "0.8.10", features = ["preserve_order"] } @@ -68,6 +70,7 @@ abscissa_core = { version = "0.7.0", features = ["testing"] } assert_cmd = "2.0.13" once_cell = "1.19" predicates = "3.1.0" +similar-asserts = { workspace = true } tempfile = "3.10.0" # The profile that 'cargo dist' will build with diff --git a/config/projects.pace.toml b/config/projects.pace.toml index 5654e42d..3226c848 100644 --- a/config/projects.pace.toml +++ b/config/projects.pace.toml @@ -7,7 +7,7 @@ # TODO: Add a `pace projects init` command to generate a new project configuration file. [project] -id = "018d84a0-7847-7b2b-9cdb-6ba213f99a1d" +id = "01HPY7F03JBVKSWDNTM2RSBXSJ" name = "Pace Project" description = "An example project managed with Pace." root_tasks_file = "tasks.toml" # Path to the root tasks file @@ -15,30 +15,30 @@ filters = ["*pace*"] # Optional: Define default filters for your project [defaults] # Optional: Define a default category for your project -category = { id = "018d85c0-a46f-7e95-8b95-f0bc961d4ee9", name = "Uncategorized", description = "Uncategorized Content" } +category = { id = "01HPY7F03K4AZMA0DVW3A1M0TG", name = "Uncategorized", description = "Uncategorized Content" } [[categories]] # Optional: Define categories for your project -id = "018d85c0-7823-7038-8e96-bc9c9330174a" +id = "01HPY7F03K3JCWK5ZJJ02TT12G" name = "Development" description = "Development related tasks" # Optional: Define subcategories for your category # TODO: Add support for subcategories subcategories = [ - { id = "018d85d5-e29d-7995-afc9-34175e0ce7b6", name = "Frontend", description = "Frontend Development" }, - { id = "018d85d5-fa35-7bc3-a347-8284843c4188", name = "Backend", description = "Backend Development" }, - { id = "018d85d6-110b-771b-828d-8cd68934fb61", name = "Fullstack", description = "Fullstack Development" }, + { id = "01HPY7F03K1H1A8A7S0K1ZCFX3", name = "Frontend", description = "Frontend Development" }, + { id = "01HPY7F03KSF8TXQQWZDF63DFD", name = "Backend", description = "Backend Development" }, + { id = "01HPY7F03KK3FGAJTHP2MBZA37", name = "Fullstack", description = "Fullstack Development" }, ] [[categories]] # Optional: Define categories for your project -id = "018d85c0-629b-737b-8f53-c307504d1c0a" +id = "01HPY7F03KS1YHKT86BXSMMEMX" name = "Design" description = "Design related tasks" [[subprojects]] # Optional: Define subprojects or directories with their own tasks -id = "018d84a0-a2d1-7450-98ef-8b47e0ff42b5" +id = "01HPY7F03K6TT2KKFEYVJT79ZB" name = "Pace Subproject A" description = "" tasks_file = "subproject-a/tasks.toml" @@ -49,7 +49,7 @@ filters = [ [[subprojects]] # Optional: Define subprojects or directories with their own tasks -id = "018d84a0-cc74-71b4-8dd4-d7d26d1f5924" +id = "01HPY7F03KF7VE3K9E51P0H1TB" name = "Pace Subproject B" description = "" tasks_file = "subproject-b/tasks.toml" diff --git a/config/tasks.pace.toml b/config/tasks.pace.toml index 2ac288e8..156d73ee 100644 --- a/config/tasks.pace.toml +++ b/config/tasks.pace.toml @@ -6,7 +6,7 @@ # TODO: Add a `pace tasks init` command to generate a new project configuration file. [[tasks]] -id = "018d84a1-4540-7992-89f2-d87d9ee73524" +id = "01HPY7H596FT2R880SEKH7KN25" title = "Implement feature X" created_at = "2024-02-04T12:34:56" finished_at = "2024-02-05T13:34:56" @@ -16,7 +16,7 @@ status = "Pending" tags = ["feature", "X"] [[tasks]] -id = "018d84a1-6cc8-7791-a92c-a077ef09de7f" +id = "01HPY7F03JQ6SJF5C97H7G7E0E" title = "Fix bug Y" created_at = "2024-02-06T12:34:56" description = "Detailed description of bug Y to be fixed." diff --git a/crates/core/Cargo.toml b/crates/core/Cargo.toml index b5e27334..658afd1a 100644 --- a/crates/core/Cargo.toml +++ b/crates/core/Cargo.toml @@ -18,7 +18,14 @@ include = [ "Cargo.toml", ] +# TODO!: Use features for adding optional dependencies for testing and merging etc. +# [features] +# default = [] +# testing = ["dep:arbitrary"] + [dependencies] +# We'd rather have this only for testing but we do integration tests, and this wouldn't be build then +arbitrary = { version = "1", features = ["derive"] } chrono = { version = "0.4.34", features = ["serde"] } directories = "5.0.1" displaydoc = "0.2.4" @@ -27,7 +34,7 @@ itertools = "0.12.1" log = "0.4.20" merge = "0.1.0" rayon = "1.8.1" -rusqlite = { version = "0.30.0", features = ["bundled", "chrono", "uuid"] } +rusqlite = { version = "0.31.0", features = ["bundled", "chrono", "uuid"] } serde = "1.0.196" serde_derive = "1.0.196" strum = "0.26.1" @@ -35,10 +42,11 @@ strum_macros = "0.26.1" thiserror = "1.0.57" toml = { version = "0.8.10", features = ["indexmap", "preserve_order"] } typed-builder = "0.18.1" -uuid = { version = "1.7.0", features = ["serde", "fast-rng", "v7"] } +ulid = { version = "1.1.2", features = ["serde"] } [dev-dependencies] rstest = "0.18.2" +similar-asserts = { workspace = true } [lints.rust] unsafe_code = "forbid" diff --git a/crates/core/src/domain/activity.rs b/crates/core/src/domain/activity.rs index db08b2ba..f2d51490 100644 --- a/crates/core/src/domain/activity.rs +++ b/crates/core/src/domain/activity.rs @@ -7,7 +7,7 @@ use merge::Merge; use serde_derive::{Deserialize, Serialize}; use std::{fmt::Display, time::Duration}; use typed_builder::TypedBuilder; -use uuid::Uuid; +use ulid::Ulid; use crate::{ domain::{ @@ -136,7 +136,7 @@ impl Default for Activity { /// The unique identifier of an activity #[derive(Debug, Clone, Serialize, Deserialize, Ord, PartialEq, PartialOrd, Eq, Copy, Hash)] -pub struct ActivityId(Uuid); +pub struct ActivityId(Ulid); impl Display for ActivityId { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { @@ -146,7 +146,7 @@ impl Display for ActivityId { impl Default for ActivityId { fn default() -> Self { - Self(Uuid::now_v7()) + Self(Ulid::new()) } } @@ -171,13 +171,13 @@ impl Display for Activity { impl rusqlite::types::FromSql for ActivityId { fn column_result(value: rusqlite::types::ValueRef<'_>) -> rusqlite::types::FromSqlResult { let bytes = <[u8; 16]>::column_result(value)?; - Ok(Self(uuid::Uuid::from_u128(u128::from_be_bytes(bytes)))) + Ok(Self(Ulid::from(u128::from_be_bytes(bytes)))) } } impl rusqlite::types::ToSql for ActivityId { fn to_sql(&self) -> rusqlite::Result> { - self.0.as_ref().to_sql() + Ok(rusqlite::types::ToSqlOutput::from(self.0.to_string())) } } diff --git a/crates/core/src/domain/category.rs b/crates/core/src/domain/category.rs index 5e0567d1..fa3a83c8 100644 --- a/crates/core/src/domain/category.rs +++ b/crates/core/src/domain/category.rs @@ -2,7 +2,7 @@ use serde_derive::{Deserialize, Serialize}; use typed_builder::TypedBuilder; -use uuid::Uuid; +use ulid::Ulid; /// The category entity #[derive(Debug, Serialize, Deserialize, TypedBuilder, Clone)] @@ -55,11 +55,11 @@ pub fn extract_categories(category_string: &str, separator: &str) -> (Category, /// The category id #[derive(Debug, Serialize, Deserialize, Clone, Copy)] -pub struct CategoryId(Uuid); +pub struct CategoryId(Ulid); impl Default for CategoryId { fn default() -> Self { - Self(Uuid::now_v7()) + Self(Ulid::new()) } } @@ -73,3 +73,16 @@ impl Default for Category { } } } + +impl rusqlite::types::FromSql for CategoryId { + fn column_result(value: rusqlite::types::ValueRef<'_>) -> rusqlite::types::FromSqlResult { + let bytes = <[u8; 16]>::column_result(value)?; + Ok(Self(Ulid::from(u128::from_be_bytes(bytes)))) + } +} + +impl rusqlite::types::ToSql for CategoryId { + fn to_sql(&self) -> rusqlite::Result> { + Ok(rusqlite::types::ToSqlOutput::from(self.0.to_string())) + } +} diff --git a/crates/core/src/domain/project.rs b/crates/core/src/domain/project.rs index e9c4a250..5c065fe2 100644 --- a/crates/core/src/domain/project.rs +++ b/crates/core/src/domain/project.rs @@ -1,6 +1,6 @@ use serde_derive::{Deserialize, Serialize}; use typed_builder::TypedBuilder; -use uuid::Uuid; +use ulid::Ulid; use crate::domain::task::Task; @@ -11,11 +11,24 @@ pub struct ProjectConfig { } #[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Hash, PartialOrd, Ord)] -pub struct ProjectId(Uuid); +pub struct ProjectId(Ulid); impl Default for ProjectId { fn default() -> Self { - Self(Uuid::now_v7()) + Self(Ulid::new()) + } +} + +impl rusqlite::types::FromSql for ProjectId { + fn column_result(value: rusqlite::types::ValueRef<'_>) -> rusqlite::types::FromSqlResult { + let bytes = <[u8; 16]>::column_result(value)?; + Ok(Self(Ulid::from(u128::from_be_bytes(bytes)))) + } +} + +impl rusqlite::types::ToSql for ProjectId { + fn to_sql(&self) -> rusqlite::Result> { + Ok(rusqlite::types::ToSqlOutput::from(self.0.to_string())) } } diff --git a/crates/core/src/domain/tag.rs b/crates/core/src/domain/tag.rs index 4510ce09..a4213220 100644 --- a/crates/core/src/domain/tag.rs +++ b/crates/core/src/domain/tag.rs @@ -1,14 +1,27 @@ use serde_derive::{Deserialize, Serialize}; use typed_builder::TypedBuilder; -use uuid::Uuid; +use ulid::Ulid; #[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Hash, Clone)] -pub struct TagId(Uuid); +pub struct TagId(Ulid); impl Default for TagId { fn default() -> Self { - Self(Uuid::now_v7()) + Self(Ulid::new()) + } +} + +impl rusqlite::types::FromSql for TagId { + fn column_result(value: rusqlite::types::ValueRef<'_>) -> rusqlite::types::FromSqlResult { + let bytes = <[u8; 16]>::column_result(value)?; + Ok(Self(Ulid::from(u128::from_be_bytes(bytes)))) + } +} + +impl rusqlite::types::ToSql for TagId { + fn to_sql(&self) -> rusqlite::Result> { + Ok(rusqlite::types::ToSqlOutput::from(self.0.to_string())) } } diff --git a/crates/core/src/domain/task.rs b/crates/core/src/domain/task.rs index f40ddc96..ea6f1113 100644 --- a/crates/core/src/domain/task.rs +++ b/crates/core/src/domain/task.rs @@ -3,16 +3,16 @@ use chrono::NaiveDateTime; use serde_derive::{Deserialize, Serialize}; use typed_builder::TypedBuilder; -use uuid::Uuid; +use ulid::Ulid; use crate::domain::{priority::ItemPriority, status::ItemStatus}; #[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Hash, PartialOrd, Ord, Clone)] -pub struct TaskId(Uuid); +pub struct TaskId(Ulid); impl Default for TaskId { fn default() -> Self { - Self(Uuid::now_v7()) + Self(Ulid::new()) } } @@ -34,3 +34,16 @@ pub struct Task { pub struct TaskList { tasks: Vec, } + +impl rusqlite::types::FromSql for TaskId { + fn column_result(value: rusqlite::types::ValueRef<'_>) -> rusqlite::types::FromSqlResult { + let bytes = <[u8; 16]>::column_result(value)?; + Ok(Self(Ulid::from(u128::from_be_bytes(bytes)))) + } +} + +impl rusqlite::types::ToSql for TaskId { + fn to_sql(&self) -> rusqlite::Result> { + Ok(rusqlite::types::ToSqlOutput::from(self.0.to_string())) + } +} diff --git a/crates/core/tests/activity_store.rs b/crates/core/tests/activity_store.rs index 5f8c7eb8..316308b9 100644 --- a/crates/core/tests/activity_store.rs +++ b/crates/core/tests/activity_store.rs @@ -4,8 +4,8 @@ use pace_core::{ Activity, ActivityFilter, ActivityId, ActivityLog, ActivityReadOps, ActivityStore, ActivityWriteOps, InMemoryActivityStorage, TestResult, }; - use rstest::{fixture, rstest}; +use similar_asserts::assert_eq; #[fixture] fn activity_log_empty() -> ActivityLog { diff --git a/crates/core/tests/find_configs.rs b/crates/core/tests/find_configs.rs index 68c0d5a4..cc07e567 100644 --- a/crates/core/tests/find_configs.rs +++ b/crates/core/tests/find_configs.rs @@ -1,5 +1,5 @@ use pace_core::{find_root_config_file_path, TestResult}; - +use similar_asserts::assert_eq; use std::env; use rstest::rstest; diff --git a/data/activity_2024-02.pace.toml b/data/activity_2024-02.pace.toml index dca37a0b..9702e04e 100644 --- a/data/activity_2024-02.pace.toml +++ b/data/activity_2024-02.pace.toml @@ -1,40 +1,40 @@ [[activities]] -id = "018d9086-4028-7a41-a084-48d386cab766" +id = "01HPY705770QKPC8D7AA8W4FNT" category = "MyCategory::SubCategory" description = "This is my task description" begin = "2024-02-10T01:58:54" kind = "activity" [[activities]] -id = "018d9086-35a3-7e56-b2f7-7d3b50045fb2" +id = "01HPY70577HNJPA7MC2NKW5JT1" category = "MyCategory::SubCategory" description = "This is my task description" begin = "2024-02-10T01:58:51" kind = "activity" [[activities]] -id = "018d9086-2f8f-7c9d-b94c-2ff4ba96aabc" +id = "01HPY7057730PYEPN7R3Q9TWC7" category = "MyCategory::SubCategory" description = "This is my task description" begin = "2024-02-10T01:58:50" kind = "activity" [[activities]] -id = "018d9065-7020-7ee8-a14b-f92b23078479" +id = "01HPY7057761DVHMFW64P1YXQ8" category = "MyCategory::SubCategory" description = "This is my task description" begin = "2024-02-10T01:23:03" kind = "activity" [[activities]] -id = "018d84a4-f5d0-7dd8-a170-c8febe6d93e4" +id = "01HPY70577MQYQXTR4YFJ6NB1Y" category = "intermission" end = "2024-02-04T00:15:00" begin = "2024-02-03T22:30:00" kind = "intermission" [[activities]] -id = "018d84a5-03f4-755a-943a-5572a846f347" +id = "01HPY70577HJBZ20NQR15AR9G0" category = "design::pace" description = "Initial design process and requirements analysis." end = "2024-02-04T00:15:00" @@ -42,7 +42,7 @@ begin = "2024-02-03T22:30:00" kind = "task" [[activities]] -id = "018d84a5-134a-7809-803b-7017ae638055" +id = "01HPY70577H375FDKT9XXAT7VB" category = "development::pace" description = "Implemented the login feature." end = "2024-02-04T10:30:00" @@ -50,7 +50,7 @@ begin = "2024-02-04T09:00:00" kind = "task" [[activities]] -id = "018d84a5-233f-7f41-b0a7-535c76b85afc" +id = "01HPY70577PMEY35A8V8FV30VC" category = "research::pace" description = "Researched secure authentication methods." end = "2024-02-04T12:00:00" diff --git a/tests/cli.rs b/tests/cli.rs index 5ad48aeb..2aedced3 100644 --- a/tests/cli.rs +++ b/tests/cli.rs @@ -2,6 +2,7 @@ use assert_cmd::Command; // use pace_core::ActivityLog; use predicates::prelude::predicate; // use tempfile::tempdir; +// use similar_asserts::assert_eq; pub type TestResult = Result>;