From a4d0991519718d4b85711ac293d148538132a6ac Mon Sep 17 00:00:00 2001 From: Chaitanya Gupta Date: Sun, 18 Nov 2018 16:08:21 +0530 Subject: [PATCH] Multiple fixes - show task, comments, task details --- deftask-cli.lisp | 84 +++++++++++++++++++++++++++++++++++++++--------- deftask.lisp | 25 ++++++++------ utils.lisp | 5 ++- 3 files changed, 89 insertions(+), 25 deletions(-) diff --git a/deftask-cli.lisp b/deftask-cli.lisp index 85f29fd..83baa0b 100644 --- a/deftask-cli.lisp +++ b/deftask-cli.lisp @@ -285,20 +285,25 @@ :arg-parser #'identity :meta-var "DETAIL")) -(defun print-task (task &key detailed project-labels project-members) +(defun print-task (task &key times labels assignees description project-labels project-members) (termcolor:with-color (:style :bright) (format t "#~D" (assocrv :task-id task))) (format t "~:[ ✅~;~] ~A~%" (string= (assocrv :state task) "open") (assocrv :title task)) - (when detailed - (flet ((show-time (time-string field-name) - (let ((time (local-time:parse-timestring time-string))) - (format t "~A ~A" field-name (relative-time time))))) + (when times + (let* ((creator-id (assocrv :creator task)) + (creator (if project-members + (assocrv :user (find creator-id project-members :key (assocrv-fn '(:user :user-id)))) + (deftask:get-user creator-id))) + (created-at (local-time:parse-timestring (assocrv :created-at task))) + (updated-at (local-time:parse-timestring (assocrv :updated-at task)))) (termcolor:with-color (:style :dim) - (write-string " ") - (show-time (assocrv :created-at task) "Created") - (write-string ", ") - (show-time (assocrv :updated-at task) "last updated") - (terpri))) + (format t " Created by ~A ~A~%" + (assocrv :name creator) + (relative-time created-at))) + (when (not (roughly-same-time-p created-at updated-at)) + (termcolor:with-color (:style :dim) + (format t " Last updated ~A~%" (relative-time updated-at)))))) + (when labels (when-let (label-ids (assocrv :label-ids task)) (setf project-labels (or project-labels (deftask:get-labels))) (let* ((task-labels (mapcar (lambda (label-id) @@ -306,7 +311,8 @@ label-ids)) (task-label-names (mapcar (assocrv-fn :name) task-labels))) (termcolor:with-color (:style :dim) - (format t " Labels: ~{~A~^, ~}~%" task-label-names)))) + (format t " Labels: ~{~A~^, ~}~%" task-label-names))))) + (when assignees (when-let (assignee-ids (assocrv :assignee-ids task)) (setf project-members (or project-members (deftask:get-project-members deftask:*project-id*))) @@ -315,7 +321,12 @@ assignee-ids)) (assignee-names (mapcar (assocrv-fn '(:user :name)) assignees))) (termcolor:with-color (:style :dim) - (format t " Assignees: ~{~A~^, ~}~%" assignee-names)))))) + (format t " Assignees: ~{~A~^, ~}~%" assignee-names))))) + (when description + (when-let (task-description (assocrv :description task)) + (terpri) + (write-string task-description) + (terpri)))) (defun subcommand-ls (argv) (with-options-and-free-args (*ls-opts* argv) @@ -324,9 +335,10 @@ (get-project-config-value :order-by) "updated-at-desc")) (page (or (get-opt-value :page) 1)) - (response (deftask:list-tasks :query (get-opt-value :query) + (response (deftask:get-tasks :query (get-opt-value :query) :order-by order-by - :page page)) + :page page + :page-info t)) (tasks (assocrv :tasks response)) (labels (when (some (assocrv-fn :label-ids) tasks) (deftask:get-labels))) @@ -349,11 +361,53 @@ (dolist (task tasks) (if (or (null detail) (string= detail "detailed")) (print-task task - :detailed t + :times t + :labels t + :assignees t :project-labels labels :project-members members) (print-task task))))))) +(defun print-comment (comment &key project-members) + (let* ((creator-id (assocrv :creator comment)) + (creator (find creator-id project-members + :key (assocrv-fn '(:user :user-id))))) + (unless creator + (error "Couldn't find member with id: ~A" creator-id)) + (termcolor:with-color (:style :dim) + (format t "Comment #~A by ~A~%" + (assocrv :comment-id comment) + (assocrv '(:user :name) creator))) + (termcolor:with-color (:style :dim) + (let ((created-at (local-time:parse-timestring (assocrv :created-at comment))) + (updated-at (local-time:parse-timestring (assocrv :updated-at comment)))) + (format t "Created ~A" (relative-time created-at)) + (when (not (roughly-same-time-p created-at updated-at)) + (format t " (updated ~A)" (relative-time updated-at))) + (terpri))) + (terpri) + (write-string (assocrv :body comment)) + (terpri))) + +(defun subcommand-show (argv) + (with-token-and-project-id + (let* ((task-id (second argv)) + (task (deftask:get-task task-id)) + (comments (deftask:get-comments task-id)) + (project-members (deftask:get-project-members deftask:*project-id*))) + (print-task task + :times t + :labels t + :assignees t + :description t + :project-members project-members) + (when comments + (dolist (comment comments) + (termcolor:with-color (:style :dim) + (write-string "---")) + (terpri) + (print-comment comment :project-members project-members)))))) + (defun subcommand-close (argv) (with-options-and-free-args (*main-opts* argv) (with-token-and-project-id diff --git a/deftask.lisp b/deftask.lisp index e1903ed..20ee858 100644 --- a/deftask.lisp +++ b/deftask.lisp @@ -4,8 +4,8 @@ #:current-user #:get-user #:get-org #:get-org-members #:get-orgs #:*project-id* #:get-project #:get-project-members #:get-projects - #:deftask #:list-tasks #:get-task #:close-task #:open-task #:edit-task - #:comment #:edit-comment + #:deftask #:get-tasks #:get-task #:close-task #:open-task #:edit-task + #:get-comments #:comment #:edit-comment #:get-labels)) (in-package #:deftask) @@ -56,7 +56,7 @@ `(("name" . ,name))))) (defun get-orgs () - (api-request :get #?"/orgs")) + (assocrv :orgs (api-request :get #?"/orgs"))) (defvar *project-id*) @@ -81,12 +81,15 @@ ,@(alist-for-sequence "label-id" label-ids) ,@(alist-for-sequence "assignee-id" assignee-ids)))) -(defun list-tasks (&key query page order-by (project-id *project-id*)) - (api-request :get #?"/projects/$(project-id)/tasks" - `(("query" . ,query) - ("page" . ,(when page (format nil "~A" page))) - ("order-by" . ,(when order-by - (string-downcase order-by)))))) +(defun get-tasks (&key query page order-by page-info (project-id *project-id*)) + (let ((response (api-request :get #?"/projects/$(project-id)/tasks" + `(("query" . ,query) + ("page" . ,(when page (format nil "~A" page))) + ("order-by" . ,(when order-by + (string-downcase order-by))))))) + (if page-info + response + (assocrv :tasks response)))) (defun get-task (task-id &key (project-id *project-id*)) (api-request :get #?"/projects/$(project-id)/tasks/$(task-id)")) @@ -104,6 +107,10 @@ `(("title" . ,title) ("description" . ,description)))) +(defun get-comments (task-id &key (project-id *project-id*)) + (assocrv :comments + (api-request :get #?"/projects/$(project-id)/tasks/$(task-id)/comments"))) + (defun comment (task-id body &key (project-id *project-id*)) (api-request :post #?"/projects/$(project-id)/tasks/$(task-id)/comments" `(("body" . ,body)))) diff --git a/utils.lisp b/utils.lisp index 6bbb283..b7bb3a5 100644 --- a/utils.lisp +++ b/utils.lisp @@ -1,7 +1,7 @@ (defpackage #:deftask-utils (:use #:cl) (:export #:assocr #:assocrv #:assocrv-fn - #:relative-time)) + #:relative-time #:roughly-same-time-p)) (in-package #:deftask-utils) @@ -54,3 +54,6 @@ (cl-l10n:with-locale (find-locale locale) ;; FIXME: pattern should be locale specific (format nil "~:[~;in ~]~A" sentencep (cl-l10n:format-date nil t1 :pattern "MMM yyyy"))))))) + +(defun roughly-same-time-p (t1 t2) + (< (abs (local-time:timestamp-difference t1 t2)) 1))