فهرست منبع

bin/tau: events log show action author and comments as well, and timestamp alignment

Dastan-glitch 4 سال پیش
والد
کامیت
e0ccf945aa
6فایلهای تغییر یافته به همراه58 افزوده شده و 21 حذف شده
  1. 21 0
      Cargo.lock
  2. 1 0
      bin/tau/tau-cli/Cargo.toml
  3. 2 0
      bin/tau/tau-cli/src/primitives.rs
  4. 21 9
      bin/tau/tau-cli/src/view.rs
  5. 3 3
      bin/tau/taud/src/jsonrpc.rs
  6. 10 9
      bin/tau/taud/src/task_info.rs

+ 21 - 0
Cargo.lock

@@ -3699,6 +3699,12 @@ version = "1.9.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "2fd0db749597d91ff862fd1d55ea87f7855a744a8425a64695b6fca237d1dad1"
 
+[[package]]
+name = "smawk"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f67ad224767faa3c7d8b6d91985b78e70a1324408abcb1cfcc2be4c06bc06043"
+
 [[package]]
 name = "smol"
 version = "1.2.5"
@@ -3995,6 +4001,7 @@ dependencies = [
  "serde_json",
  "simplelog",
  "term_grid",
+ "textwrap 0.15.0",
  "url",
 ]
 
@@ -4107,6 +4114,11 @@ name = "textwrap"
 version = "0.15.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb"
+dependencies = [
+ "smawk",
+ "unicode-linebreak",
+ "unicode-width",
+]
 
 [[package]]
 name = "thiserror"
@@ -4299,6 +4311,15 @@ version = "1.0.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "c4f5b37a154999a8f3f98cc23a628d850e154479cd94decf3414696e12e31aaf"
 
+[[package]]
+name = "unicode-linebreak"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3a52dcaab0c48d931f7cc8ef826fa51690a08e1ea55117ef26f89864f532383f"
+dependencies = [
+ "regex",
+]
+
 [[package]]
 name = "unicode-normalization"
 version = "0.1.21"

+ 1 - 0
bin/tau/tau-cli/Cargo.toml

@@ -23,4 +23,5 @@ serde = {version = "1.0.142", features = ["derive"]}
 serde_json = "1.0.83"
 simplelog = "0.12.0"
 term_grid = { git = "https://github.com/Dastan-glitch/rust-term-grid.git" }
+textwrap = "0.15.0"
 url = "2.2.2"

+ 2 - 0
bin/tau/tau-cli/src/primitives.rs

@@ -77,6 +77,7 @@ pub struct TaskInfo {
 #[derive(Clone, serde::Serialize, serde::Deserialize, Debug)]
 pub struct TaskEvent {
     pub action: String,
+    pub author: String,
     pub content: String,
     pub timestamp: Timestamp,
 }
@@ -91,6 +92,7 @@ impl Default for TaskEvent {
     fn default() -> Self {
         Self {
             action: State::Open.to_string(),
+            author: "".to_string(),
             content: "".to_string(),
             timestamp: Timestamp::current_time(),
         }

+ 21 - 9
bin/tau/tau-cli/src/view.rs

@@ -10,6 +10,7 @@ use darkfi::{
     util::time::{timestamp_to_date, DateFormat},
     Result,
 };
+use textwrap::fill;
 
 use crate::{
     filter::apply_filter,
@@ -123,7 +124,8 @@ pub fn print_task_info(taskinfo: TaskInfo) -> Result<()> {
     table.set_titles(row!["Name", "Value"]);
     table.printstd();
 
-    let mut event_table = table!(["events", &events_as_string(taskinfo.events)]);
+    let (events, timestamps) = &events_as_string(taskinfo.events);
+    let mut event_table = table!([events, timestamps]);
     event_table.set_format(*FORMAT_NO_COLSEP);
     event_table.printstd();
 
@@ -139,24 +141,34 @@ pub fn comments_as_string(comments: Vec<Comment>) -> String {
     comments_str
 }
 
-pub fn events_as_string(events: Vec<TaskEvent>) -> String {
+pub fn events_as_string(events: Vec<TaskEvent>) -> (String, String) {
     let mut events_str = String::new();
+    let mut timestamps_str = String::new();
+    let long_comment_width = 50;
     for event in events {
+        writeln!(timestamps_str, "{}", event.timestamp).unwrap();
         match event.action.as_str() {
             "state" => {
-                writeln!(events_str, "State changed to {} at {}", event.content, event.timestamp)
-                    .unwrap()
+                writeln!(events_str, "- {} changed state to {}", event.author, event.content)
+                    .unwrap();
             }
             "assign" => {
-                writeln!(events_str, "Assigned to {} at {}", event.content, event.timestamp)
-                    .unwrap();
+                writeln!(events_str, "- {} assigned {}", event.author, event.content).unwrap();
             }
             "comment" => {
-                writeln!(events_str, "{} added a comment at {}", event.content, event.timestamp)
-                    .unwrap();
+                // wrap long comments
+                let ev_content = fill(
+                    &event.content,
+                    textwrap::Options::new(long_comment_width).subsequent_indent("  "),
+                );
+                // skip wrapped lines to align timestamp with the first line
+                for _ in 1..ev_content.lines().collect::<Vec<&str>>().len() {
+                    writeln!(timestamps_str, " ").unwrap();
+                }
+                writeln!(events_str, "- {} made a comment: {}", event.author, ev_content).unwrap();
             }
             _ => {}
         }
     }
-    events_str
+    (events_str, timestamps_str)
 }

+ 3 - 3
bin/tau/taud/src/jsonrpc.rs

@@ -109,7 +109,7 @@ impl JsonRpcInterface {
             &self.dataset_path,
         )?;
         new_task.set_project(&task.project);
-        new_task.set_assign(&task.assign);
+        new_task.set_assign(&task.assign, &self.nickname);
 
         self.notify_queue_sender.send(new_task).await.map_err(Error::from)?;
         Ok(json!(true))
@@ -164,7 +164,7 @@ impl JsonRpcInterface {
         let mut task: TaskInfo = self.load_task_by_id(&params[0], ws)?;
 
         if states.contains(&state.as_str()) {
-            task.set_state(&state);
+            task.set_state(&state, &self.nickname);
         }
 
         self.notify_queue_sender.send(task).await.map_err(Error::from)?;
@@ -374,7 +374,7 @@ impl JsonRpcInterface {
             let assign = fields.get("assign").unwrap().clone();
             let assign: Vec<String> = serde_json::from_value(assign)?;
             if !assign.is_empty() {
-                task.set_assign(&assign);
+                task.set_assign(&assign, &self.nickname);
             }
         }
 

+ 10 - 9
bin/tau/taud/src/task_info.rs

@@ -22,13 +22,14 @@ use crate::{
 #[derive(Clone, Debug, Serialize, Deserialize, SerialEncodable, SerialDecodable, PartialEq, Eq)]
 struct TaskEvent {
     action: String,
+    author: String,
     content: String,
     timestamp: Timestamp,
 }
 
 impl TaskEvent {
-    fn new(action: String, content: String) -> Self {
-        Self { action, content, timestamp: Timestamp::current_time() }
+    fn new(action: String, author: String, content: String) -> Self {
+        Self { action, author, content, timestamp: Timestamp::current_time() }
     }
 }
 
@@ -182,10 +183,10 @@ impl TaskInfo {
         self.desc = desc.into();
     }
 
-    pub fn set_assign(&mut self, assign: &[String]) {
+    pub fn set_assign(&mut self, assign: &[String], owner: &str) {
         debug!(target: "tau", "TaskInfo::set_assign()");
         self.assign = TaskAssigns(assign.to_owned());
-        self.set_event("assign", &assign.join(", "));
+        self.set_event("assign", owner, &assign.join(", "));
     }
 
     pub fn set_project(&mut self, project: &[String]) {
@@ -196,7 +197,7 @@ impl TaskInfo {
     pub fn set_comment(&mut self, c: Comment) {
         debug!(target: "tau", "TaskInfo::set_comment()");
         self.comments.0.push(c.clone());
-        self.set_event("comment", &c.author);
+        self.set_event("comment", &c.author, &c.content);
     }
 
     pub fn set_rank(&mut self, r: f32) {
@@ -209,20 +210,20 @@ impl TaskInfo {
         self.due = d;
     }
 
-    pub fn set_event(&mut self, action: &str, content: &str) {
+    pub fn set_event(&mut self, action: &str, owner: &str, content: &str) {
         debug!(target: "tau", "TaskInfo::set_event()");
         if !content.is_empty() {
-            self.events.0.push(TaskEvent::new(action.into(), content.into()));
+            self.events.0.push(TaskEvent::new(action.into(), owner.into(), content.into()));
         }
     }
 
-    pub fn set_state(&mut self, state: &str) {
+    pub fn set_state(&mut self, state: &str, owner: &str) {
         debug!(target: "tau", "TaskInfo::set_state()");
         if self.get_state() == state {
             return
         }
         self.state = state.to_string();
-        self.set_event("state", state);
+        self.set_event("state", owner, state);
     }
 }