emacsからBacklog APIを呼び出すには

Backlogのダッシュボードについては賛否両論あるようですね。


素直に言うと、
『使い難いな』
とはつねづね感じていました。


そんなわけで、少しでもこれを改善出来ればと、
emacsからBacklog APIを呼び出す方法を調べていました。

主にXML-RPCEmacs Lispで扱う方法ですが、
xml-rpc.elを使ってBacklog APIを呼び出す方法をまとめときます。




ひとまず、

  • プロジェクト一覧取得
  • タスクにコメントの追加

ができるものを作ってみました。

; -*- Emacs-Lisp -*-
; backlog-mode
;; (load-file "~/site-lisp/backlog.el")
;; (backlog-mode)

(defconst SPACE_ID "ログイン時のIDを指定")
(defconst XML_RPC_URL (format "https://%s.backlog.jp/XML-RPC" SPACE_ID))

; キーマップの作成
(defvar backlog-mode-map (make-keymap))

; メジャーモードとしてのメイン関数
(defun backlog-mode ()
  (interactive)
  (setq major-mode 'backlog-mode mode-name "backlog-mode")

  (get-buffer-create "backlog-mode")
  (switch-to-buffer "backlog-mode")
  (erase-buffer)

  (define-key backlog-mode-map "p" 'show-my-projects)
  (define-key backlog-mode-map "P" 'show-my-project)
  (define-key backlog-mode-map "c" 'comment-task)

  (use-local-map backlog-mode-map)

  ;; 使えるコマンド一覧を表示
  (show-help))

(defun show-help ()
  (insert "*** Command List ***\n")
  (insert "p -- show projects\n")
  (insert "P -- show project\n")
  (insert "c -- send comment\n")
  
  (insert "\n\n\n\n\n")
  (insert "----\n\n"))

(defun show-sets (xml-left)
  (while (not (null (setq xml-set (car xml-left))))
    (setq xml-left (cdr xml-left))
    (show-terms xml-set)
    (insert "--\n")))

(defun show-terms (xml-set)
  (while (not (null (setq xml-term (car xml-set))))
    (setq xml-set (cdr xml-set))

    (setq xml-term-name (car xml-term))
    (if (null (cdr xml-term))
      (progn
        (setq xml-term-value xml-term-name)
        (setq xml-term-name "None"))
      (setq xml-term-value (cdr xml-term)))

    (insert xml-term-name)
    (insert "  ")
    (if (numberp xml-term-value)
      (insert (format "%d" xml-term-value))
      (insert xml-term-value))
    (insert "\n")))

(defun show-my-projects ()
  (interactive)
  (erase-buffer)
  (show-help)

  (setq xml-left (xml-rpc-method-call XML_RPC_URL 'backlog.getProjects))
  (show-sets xml-left))

(defun show-my-project ()
  (interactive)
  (erase-buffer)
  (show-help)

  (setq project-key (read-from-minibuffer "ProjectKey> "))
  (setq xml-left (xml-rpc-method-call XML_RPC_URL 'backlog.getProject project-key))
  (show-terms xml-left))

(defun comment-task ()
  (interactive)
  (setq ct-key (read-from-minibuffer "key> "))
  (setq ct-content (read-from-minibuffer "content> "))
  (setq ct-list (list (cons "key" ct-key) (cons "content" ct-content)))
  (insert (format "タスクキー[%s] に、コメント「%s」を送信。。。" ct-key ct-content))
  (xml-rpc-method-call XML_RPC_URL 'backlog.addComment ct-list))

(provide 'backlog)

インストールするもの

このスクリプト内では『xml-rpc.el』が大活躍しています。
なので、これがインストールされていないとままなりません。


こちらよりインストールしても良いのですが、
今後のことを考えると『ELPA』というEmacs用のパッケージマネージャからもインストールできます。



ちなみに、ELPAは『auto-install.el』がインストールされていれば

M-x install-elisp http://tromey.com/elpa/package-install.el

でインストールできます。


auto-install.el のインストール方法は・・・

こちらをご覧ください。




使い方

スクリプト冒頭の

(defconst SPACE_ID "ログイン時のIDを指定")
(defconst XML_RPC_URL (format "https://%s.backlog.jp/XML-RPC" SPACE_ID))

の部分で、「ログイン時のIDを指定」とある部分に
Backlogにログイン時入力するIDを記述してください。
例えば、IDが「cupnes」の場合は次のようになります。

(defconst SPACE_ID "cupnes")
(defconst XML_RPC_URL (format "https://%s.backlog.jp/XML-RPC" SPACE_ID))

すると、

M-x backlog-mode

でbacklog-modeを起動できます。



起動すると次のような画面になります。

*** Command List ***
p -- show projects
P -- getProject
c -- send comment





----

「----」で区切られた上部に表示されている「p」・「P」・「c」が
このサンプルで使用できるコマンドで、それぞれ次の機能を持っています。

  • p -- プロジェクトの一覧を表示
  • P -- ひとつのプロジェクトについて表示
  • c -- タスクにコメントを追加

これらのうち「P」・「c」のコマンドでは
コマンドの実行時にいくつかミニバッファで尋ねてきます。


【Pについて】
ProjectKey>

このようなプロンプトが表示されます。
ここではプロジェクトのキーを入力してください。
プロジェクトのキーは、プロジェクト作成時に各タスクIDの接頭辞として用いられるものです。
例えばタスクのURLが
https://cupnes.backlog.jp/view/CNS-103
であった場合、「CNS」がそのプロジェクトのキーになります。


【cについて】
key>

まずこのプロンプトでコメントを追加するタスクIDを入力してください。
タスクのURLが
https://cupnes.backlog.jp/view/CNS-103
であった場合、「CNS-103」と入力してください。


続いて、

content>

このようなプロンプトが表示されますので、
追加するコメントを入力してください。




プログラムについて

Emacs LispからXML-RPCで実装されているリモート上のメソッドを呼び出す方法」
というのを少しメモしておきます。ここでは、「Backlog API」を対象とします。



といっても、xml-rpc.elがほとんどの処理を請け負ってくれるので、

(xml-rpc-method-call "https://[プロジェクトキー].backlog.jp/XML-RPC" 'backlog.[メソッド名])

でメソッドを呼び出すことができます。
また、メソッドに引数が必要な場合は例えば次のように指定します。

;; 「CNS-60」の課題を取得する
(xml-rpc-method-call "https://cupnes.backlog.jp/XML-RPC" 'backlog.getIssue "CNS-60")

もしくは、複数の引数が必要な場合は

;; 「CNS-60」の課題にコメントを追加する
(xml-rpc-method-call "https://cupnes.backlog.jp/XML-RPC" 'backlog.addComment '(("key" . "CNS-60") ("content" . "コメントテスト")))