読者です 読者をやめる 読者になる 読者になる

Umi Uyuraのブログ

Titaniumを使ったスマートフォンアプリ開発を中心に、プログラミング関連の作業ログ。

Asana用BitBarプラグインをPythonで書きなおした

先日作った、Macのメニューバーに色々な情報を表示するBitBarに、プロジェクト管理サービスのAsanaのタスクを表示するためのプラグイン

umi-uyura.hatenablog.com

慣れているNode.jsベースで作ってみたものの、 他のBitBarプラグイン を見てみると、基本的に1スクリプトに収めている感じ。

Node版はnpmで事前のインストールが必要だったり、設定ファイルを切り出しているし、そもそもNode.jsはMac標準で入っていないしと、なんとなくBitBarの思想と合わない感じがしたので、OS標準で搭載されていて最近触ってみているPythonで書きなおしてみました。

作るにあたって、Pythonにも Asana公式のクライアントライブラリ があったのですが、依存関係は少ない方が良いだろうということで、これは使いませんでした。

できたもの

とりあえずGitHubにアップ。

umi-uyura/py-bitbar-asana

もう少し使ってみて問題なさそうなら、本家に掲載をお願いしてみようかと画策中。

使い方

動作確認環境

項目 バージョン 備考
Mac OS 10.11.5 (El Capitan)
Python 2.7.11 Homebrew版
BitBar 1.9.1 -

インストール

GitHubリポジトリ から bitbar-tasks.py をダウンロードして、BitBarプラグインフォルダへコピーします。

実行間隔を含めたファイル名に変更し、実行権限も付与します。

詳細は Installing plugins を参照。

設定

設定項目は、 import がたくさん並んだ下のあたりにある以下の変数です。

Key Value
PERSONAL_ACCESS_TOKEN Personal Access Token
Asanaのサイトから取得します(後述)
WORKSPACE_ID ワークスペースID
はじめはブランクでOK
DISPLAY_RANGE_MONTH (optional) 表示範囲
月単位で、◯ヶ月先までの締め切りが設定されているタスクを表示します。
未指定の場合は 2 としています
LOCALE (optional) 日付フォーマットを決めるロケール指定
ja_JP を指定すれば YYYY/MM/DD(曜日) 形式で表示します
MENUBAR_IMAGE (optional) メニューバーに表示するアイコンイメージ
Base64エンコードした画像データ

前回設定していたAssignee ID(担当者ID)はPersona Access Tokenがわかれば取得できるので、今回は設定は不要としました。

Persona Access Tokenの取得

これについては 前回の記事 参照。

ワークスペースIDの取得

Node版は別コマンドを用意していましたが、単独のスクリプトなるとそうもいかないので、どうしようかと他のプラグインなどを見ていたところ、メニュー選択時に外部スクリプトを呼び出す機能を使って自分自身をを再度呼び出すことで追加の処理を行うような仕組みを使っていたので、それを利用してみることにしました。

というわけで、初回にスクリプトワークスペースIDをブランクで実行すると、Persona Access Tokenに紐付いたワークスペース情報が表示されます。

f:id:umi-uyura:20160524234338p:plain

表示したいワークスペースを選択すると、そのワークスペースIDがクリップボードにコピーされます。

f:id:umi-uyura:20160524234347p:plain

コピーされたワークスペースIDを、上記のスクリプト内の WORKSPACE_ID にセットしてください。

タスク一覧の表示

ワークスペースIDをセットして再実行すると、タスクが表示されると思います。

f:id:umi-uyura:20160524234357p:plain

Node版と少しだけ変更したのは、ワークスペース名の横に表示タスクの担当者(Assignee)を出してみたのと、当日のタスクは緑色で表示するようにしたこと。自分がAsanaを複数アカウント使うようになったので、パッと見でどのアカウントのワークスペースだったかを知りたかったからというのがあります。

それ以外の表示内容については、Node版 と同じです。

複数ワークスペースを扱う

1スクリプトにしたおかげで、この点もシンプルになりました。

複数ワークスペース分のタスク表示が必要な場合は、別ファイル名でコピーして、表示したいワークスペースIDをセットすればOKです。

感想

Asana APIとはUTF-8でやりとりしますが、Pythonの文字列はUnicodeとなるということで、その文字列エンコーディングの扱いに少しハマりました。

結局、日本語が入る可能性がある担当者やワークスペース名前関連を扱うところで .encode("utf-8") をしまくっているのですが、もう少しスマートな方法がありそう。

Pythonチュートリアル 第3版

Pythonチュートリアル 第3版