cargo testで大きめの構造体をassertすると↑のbefore画像みたいにとても長い出力になる。 長すぎてどこに差分があるかわからなくてとても苦労する。 そこで、afterのように色をつけるスクリプトを作ってみた。
#!/usr/bin/env ruby require 'tempfile' while line = gets unless line.start_with?(" left:") puts line next end left = Tempfile.open("color-assert-left") {|fp| fp.puts line; fp} right = Tempfile.open("color-assert-right") {|fp| fp.puts gets; fp} puts `diff -u #{left.path} #{right.path} | delta --no-gitconfig --file-style=omit --hunk-header-style=omit --max-line-length=65535 --minus-style="red bold" --plus-style="green bold" | tail +2` left.delete right.delete end
内部的にはdiffとdeltaを使っている。 deltaを選んだのは手元の環境で単語単位で色付けできるdiffツールがこれだけだったからである。 diffを介しているのはなぜかRubyから直接deltaを呼び出すとうまく動かなかったからである。謎い。
使い方は単純にcargo testの出力をパイプするだけである。
$ cargo test | ./color-assert.rb
出力例↓
シュッと作れるのでRubyで作ってしまったがcargoのサブコマンドで作るか〜っと考えたけど、色付けが必要な場面ってそんなに多いかなぁっと思いそして、今作っている自作シェルの方の開発を優先したく見送った。 また、同じ場面がでたら考えよう。