hirb (0.7.3)のコードリーディングをしました。

irb, ripl, pryあたりに対応していますが、基本的にはHirb::View.view_or_page_output(output)のメソッドが呼び出され、outputのオブジェクトが整形されて出力されることになります。

今回はRailsで利用頻度が高いを思われるoutputにActiveRecord::BaseやActiveRrecord::Relationのインスタンスが入るケースを追ってみます。

Hirb::View.view_or_page_outputメソッドは以下のようにview_output経由でrender_outputを呼び出します。

HirbFormatter#format_outputは整形された文字列を出力しています。

#determine_output_classで出力対象のクラスを取得します。ActiveRecord::Relationの場合は配列化してから、最初の要素のクラスを取り出します

_format_outputでhelper_class.renderが呼び出されます。ActiveRecord::Baseの場合はHirb::Helpers::AutoTable.renderが呼ばれます。

Hirb::Helpers::AutoTable.renderはさらにHirb::Helpers::ObjectTable.renderを呼び出します。

dynamic_optionsによってActiveRecordのカラム一覧がoptions[:fields]に格納されます。

呼び出されるメソッドは出力対象のクラスによって異なりますが、ActiveRecord::Baseの場合はHirb::Views::Railsのactive_record__base_viewが呼ばれます

Hirb::Helpers::ObjectTable.renderメソッドではitem_hashes変数にActiveRecord::BaseやActiveRecord::Relationがハッシュ化された配列が入ります。

この変数を引数にHirb::Helpers::Table.renderでfieldsオプションに従ってテーブルのテキストを表示します。

Hirb::Helpers::Table.renderの処理はやや長いので割愛しますが、Hirb::Helpers::Tableだけでこういった処理ができます。

このように配列とフィールドを指定するだけで良い感じにASCIIなテーブルを出力してくれます。