git.fiddlerwoaroof.com
test-client.lisp
19bc25d1
 #!/usr/bin/env sbcl --script
f9607eae
 (require :sb-posix)
 (load #p"~/quicklisp/setup.lisp")
19bc25d1
 
f9607eae
 (eval-when (:load-toplevel :compile-toplevel :execute)
   (push (truename ".") asdf:*central-registry*)
   (ql:quickload :ubiquitous)
   (sb-posix:setenv "CC" "gcc" 1)
19bc25d1
   (ql:quickload :net.didierverna.clon))
 
 (eval-when (:load-toplevel :compile-toplevel :execute)
   (push (truename ".") asdf:*central-registry*)
f9607eae
   (ql:quickload :jira-api))
 
 (defpackage #:jira-api.client
   (:use #:cl #:serapeum #:alexandria #:fw.lu #:jira-api.cli #:jira-api #:net.didierverna.clon))
 
 (in-package #:jira-api.client)
0c0e0fb8
 (defparameter *version* (format nil "0.1-init"))
f9607eae
 
19bc25d1
 (defparameter *endpoint-template* "https://~a/rest/api/2/")
f9607eae
 
 (eval-when (:compile-toplevel :load-toplevel :execute)
   (ubiquitous:restore :jira-api))
 
 (defsynopsis (:postfix "ARGUMENTS...")
19bc25d1
     (text :contents "A command line client for Jira issues")
f9607eae
   (group (:header "Main actions")
          (flag :short-name "lp" :long-name "list-projects"
                :description "List available JIRA projects")
          (flag :short-name "is"
                :long-name "get-issues"
                :description "list issues")
          (flag :short-name "i"
                :long-name "get-issue"
                :description "show an issue")
19bc25d1
          ;;(flag :short-name "pi" :long-name "post-issue"
          ;;      :description "post and issue")
0c0e0fb8
          )
f9607eae
   (group (:header "JIRA options")
          (stropt :long-name "jira-account"
                  :description "The jira account to use."
19bc25d1
                  :argument-name "URL-SUBDOMAIN"))
f9607eae
   (group (:header "Filtering Issues")
3460d29f
          (flag :short-name "c" :long-name "with-comments"
19bc25d1
                :description "Show the issue's comments")
f9607eae
          (stropt :short-name "s" :long-name "status"
                  :description "Only show issues with a certain status"))
   (group (:header "Other options")
0c0e0fb8
          (flag :short-name "dc" :long-name "dump-configuration"
                :description "Dump the current configuration")
          (flag :short-name "g" :long-name "configure"
                :description "Configure the default values")
f9607eae
          (flag :short-name "h" :long-name "help"
0c0e0fb8
                :description "Show this help")
f9607eae
          (flag :short-name "v" :long-name "version"
                :description "Show the program version")))
 
 (defvar *auth*)
 
0c0e0fb8
 (defun dump-configuration ()
   (format t "~&~s~&"
           (hash-table-alist
19bc25d1
            (ubiquitous:value :jira))))
 
 (defun get-track-eng-issues (auth)
   (let ((jql
           (concatenate 'string
                        "project = CJPM AND status"
                        "  in (Open, \"In Progress\", Resolved, Closed, \"Needs QR\","
                        "      \"Needs Demo\", \"Needs SOX\", \"Dev Done\")"
                        " AND component = EMPTY"
                        " AND \"Product Domain\" = Insights"
                        " ORDER BY Rank ASC")))
     (jira-api:get-issues auth :jql jql)))
 
 (defun get-needsqr-issues (auth)
   (let ((jql
           (concatenate 'string
                        "project = CJPM"
                        " AND status in (\"Needs QR\")"
                        " AND \"Product Domain\" = Insights"
                        " ORDER BY Rank ASC")))
     (jira-api:get-issues auth :jql jql)))
 
 (defun get-insights-issues (auth)
   (let ((jql
           (concatenate 'string
                        "project = CJPM"
                        " AND status in (Open, \"In Progress\", Resolved, \"Needs QR\","
                        "                \"Needs Demo\", \"Needs SOX\", \"Dev Done\")"
                        " AND \"Product Domain\" = Insights"
                        " ORDER BY Rank ASC")))
     (jira-api:get-issues auth :jql jql)))
0c0e0fb8
 
f9607eae
 (defun main ()
0c0e0fb8
   (ubiquitous:restore :jira-api)
f9607eae
   (setf *auth* (ubiquitous:value :jira :creds))
   (make-context)
0c0e0fb8
 
19bc25d1
   (let ((configure (getopt :long-name "configure"))
         (help (getopt :long-name "help")))
     (unless (or configure help)
       (jira-api::update-hostname (ubiquitous:value :jira :account)))
     (cond
       (help (help))
       ((getopt :long-name "version") (format t "~&~a~%" *version*))
       ((getopt :long-name "dump-configuration") (dump-configuration))
       (configure (let ((creds (prompt :creds))
                        (account (prompt :jira-account)))
                    (setf (ubiquitous:value :jira :creds) creds)
                    (setf (ubiquitous:value :jira :account) account)
                    (dump-configuration)))
       ((getopt :long-name "get-issue") (let ((options (remainder)))
                                          (format t "~&~a~&"
                                                  (jira-api::show
                                                   (jira-api::json2sheeple
9fbca987
                                                    (jira-api::get-issue *auth*
                                                                         (format nil "~a-~a"
                                                                                 (car options)
                                                                                 (cadr options)))
3460d29f
                                                    jira-api::=issue=)
19bc25d1
                                                   (getopt :long-name "with-comments")))))
       ((getopt :long-name "get-issues")
        (let ((options (remainder)))
          (let ((issues (jira-api::sort-issues-by-status (jira-api::json2sheeple (get-insights-issues *auth*)
                                                                                 jira-api::=issues=))))
            (alexandria:if-let ((status (getopt :long-name "status")))
                (setf issues
                      (sheeple:defobject ()
                          ((jira-api::issues
                            (apply 'vector
                                   (gethash status
                                            (jira-api::classify-issues issues))))))))
            (jira-api::show-issues issues))))
 
       ((getopt :long-name "list-projects") (jira-api::show-projects
                                             (jira-api::json2sheeple
9fbca987
                                              (jira-api::get-projects *auth*))))
19bc25d1
       #+nil((getopt :long-name "post-issue") (yason:encode (jira-api::read-issue)))
       (t  (help) (exit)))))
f9607eae
 
19bc25d1
 ;;#+nil
f9607eae
 (dump "jira-client" main)