emacsからBacklog APIを呼び出すには
Backlogのダッシュボードについては賛否両論あるようですね。
素直に言うと、
『使い難いな』
とはつねづね感じていました。
そんなわけで、少しでもこれを改善出来ればと、
emacsからBacklog APIを呼び出す方法を調べていました。
主にXML-RPCをEmacs 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" . "コメントテスト")))