Haskellのstack-build(test)の結果をGUI通知するsnowtify作ったよ

 Haskell-jpのslackの#questionで 「stack testの結果をGUIの通知デーモンに自動で表示する方法ってないですか?」と聞いたら 「残念だったな!! 無理だ! watchexecとかでガリガリやるんだな!!」(要約)と言われたので 作りました 🐕

screenshot

snowtifyを使う利点

 watchexecなどの、カレントディレクトリ以下のファイルの変更を監視するコマンドと組み合わせることで、 Haskellコードを書きつつファイルを保存、おそらく型が合っていないであろう場所をstack buildやstack ghciにて確認する…… といった手間を無くすことで(自動で行わせて、かつシームレスな領域--通知領域--に表示することで)、 そのようなBDDを加速させることができます。

現在のサポート状況

 Linuxのみです。 というのも僕がmacOSを持っていなくて、Windowsでの開発をしていないからです。 macOSとWindowsのメンテナ募集中です。

snowtifyのインストール方法

 (haskell-stackは導入済みという体で進めていきます)

 stack installで入ると言いたいところなのですが、PullRequestはマージされたもののまだリリースされていないようです。

 cabal installでも入るとは思いますが、一番安定する方法としてはこれだと思います。

$ git clone https://github.com/aiya000/hs-snowtify
$ cd hs-snowtify
$ stack install

snowtifyを試す

 わかりやすい例を見るには、とりあえずtest-suiteが存在しつつ、かつstack testが失敗するようなhaskell-stackプロジェクトで試すのが一番だと思います。

 僕のLisp処理系のdevelopブランチに、ちょうどtestが失敗するようなコミットがあるのでこれで試しましょうか。

$ git clone https://github.com/aiya000/hs-zuramaru
$ cd hs-zuramaru
$ git checkout b884e5
$ watchexec -w . snowtify &
$ touch a

 touch aしてから少しすると、お使いの通知デーモンに(GitHubリポジトリにある画像の例のように) snowtifyのデフォルト挙動であるstack buildの結果が表示されるかと思います。

 stack testをsnowtifyに実行させたい場合はsnowtify testを実行します。

 watchexecをインストールしていない方も、watchexecとtouchの代わりに以下の方法で実行できます。 ただしファイルの監視はなされません(snowtifyはhaskell-stackの--file-watchのようなオプションをサポートしていない)。

$ snowtify

snowtifyにおすすめの通知デーモン

 (この節はsnowtifyについての説明でないので、snowtifyについて知りたい方は読み飛ばして頂いても問題ありません。)

 作者はdunstを使っています。

 dunstは以下のように設定することで、タイムアウトによって勝手に通知が消えず、 Ctrl+.によって通知1つを、 Ctrl+,によって表示されている全ての消すことができる(はず)だからです。

~/.config/dunst/dunstrc

[global]
    font                 = Ricty 15
    format               = "<b>%s</b>\n%b"
    alignment            = left
    word_wrap            = yes
    geometry             = "1000x50-30+20"
    separator_height     = 2
    padding              = 8
    horizontal_padding   = 8
    separator_color      = frame

[frame]
    width = 3
    color = "#aaaaaa"

[shortcuts]
    close     = ctrl+period
    close_all = ctrl+comma

[urgency_low]
    background = "#222222"
    foreground = "#888888"
    timeout    = 0

[urgency_normal]
    background = "#285577"
    foreground = "#ffffff"
    timeout    = 0

[urgency_critical]
    background = "#900000"
    foreground = "#ffffff"
    timeout    = 0

 プロジェクトのファイルに変更を加える
→ stack testの結果が表示される
→ 修正する
→ 通知を消す
→ ...

っていうループが、ほいっちゃほいっちゃ……という感じでできます。


 便利。 使ってみてください 😉

筆者プロフィール

my-latest-logo

aiya000(あいや)

せつラボ 〜圏論の基本〜」 「せつラボ2~雲と天使と関手圏~」 「矢澤にこ先輩といっしょに代数!」を書いています!

強い静的型付けとテストを用いて、バグを防ぐのが好き。Haskell・TypeScript。