Skip to content

irb でのオブジェクトの表示を更に見易く - awesome print

Posted on:2012年3月20日 at 23:50

環境を整理していていたついでにメモを残しておく。

irb でシンタックスハイライトなどを行うには Wirble など便利な gem があるが、awesome_print はオブジェクトのデータ構造もわかりやすくインデントして表示してくれる。

Awesome Print is a Ruby library that pretty prints Ruby objects in full color exposing their internal structure with proper indentation. Rails ActiveRecord objects and usage within Rails templates are supported via included mixins.

Table of Contents

Open Table of Contents

インストールと irb でのお試し

インストール。

$ gem install awesome_print
Fetching: awesome_print-1.0.2.gem (100%)
Successfully installed awesome_print-1.0.2
1 gem installed
Installing ri documentation for awesome_print-1.0.2...
Installing RDoc documentation for awesome_print-1.0.2...

irb で試してみる。

$ irb
1.9.3-p125 :001 > require 'awesome_print'
 => true
1.9.3-p125 :002 > data = [ false, 42, %w(forty two), { :now => Time.now, :class => Time.now.class, :distance => 42e42 } ]
 => [false, 42, ["forty", "two"], {:now=>2012-03-20 14:11:20 +0900, :class=>Time, :distance=>4.2e+43}]
1.9.3-p125 :003 > ap data
[
    [0] false,
    [1] 42,
    [2] [
        [0] "forty",
        [1] "two"
    ],
    [3] {
             :now => 2012-03-20 14:11:20 +0900,
           :class => Time < Object,
        :distance => 4.2e+43
    }
]
 => [false, 42, ["forty", "two"], {:now=>2012-03-20 14:11:20 +0900, :class=>Time, :distance=>4.2e+43}]

awesome_print を require 後に、ap メソッドに awesome_print で表示させてたいオブジェクトを預ける。

実際のコンソールの画面も貼りつけておく。

awesome_print-1

irb での出力を常に awesome_print で

先ほどの確認では、awesome_print を使って表示するためには ap にオブジェクトを預ける必要があったが、ap の入力なしに常に awesome_print で表示が行えるようにする。

$HOME/.irbrc に以下を追記。
($HOME はユーザアカウントの HOME 直下。)

$HOME/.irbrc:

# load libraries
require 'rubygems'
require "awesome_print"

unless IRB.version.include?('DietRB')
  IRB::Irb.class_eval do
    def output_value
      ap @context.last_value
    end
  end
else # MacRuby
  IRB.formatter = Class.new(IRB::Formatter) do
    def inspect_object(object)
      object.ai
    end
  end.new
end

試してみる。

$ irb
1.9.3-p125 :001 > data = [ false, 42, %w(forty two), { :now => Time.now, :class => Time.now.class, :distance => 42e42 } ]
[
    [0] false,
    [1] 42,
    [2] [
        [0] "forty",
        [1] "two"
    ],
    [3] {
             :now => 2012-03-20 14:17:37 +0900,
           :class => Time < Object,
        :distance => 4.2e+43
    }
]

実際のコンソールの画面。

awesome_print-2

rails console でも awesome_print

Rails の console でも awesome_print を使いたくなる。

Rails アプリケーションの Gemfileawesome_print を追加してロードできるようにしておく。 開発環境とテスト環境のみで利用可能に。

$RAILS_HOME/Gemfile:

group :development, :test do
  gem 'awesome_print', '~> 1.0.2'
end

Bundler でインストールしておく。

$ bundle install

以下は Refinery CMS で使用した例。

モデルオブジェクトを見てみる。

$ rails c
Loading development environment (Rails 3.2.2)
1.9.3p125 :001 > Refinery::Page
class Refinery::Page < Refinery::Core::BaseModel {
                     :id => :integer,
              :parent_id => :integer,
                   :path => :string,
                   :slug => :string,
           :show_in_menu => :boolean,
               :link_url => :string,
             :menu_match => :string,
              :deletable => :boolean,
                  :draft => :boolean,
    :skip_to_first_child => :boolean,
                    :lft => :integer,
                    :rgt => :integer,
                  :depth => :integer,
          :view_template => :string,
        :layout_template => :string,
             :created_at => :datetime,
             :updated_at => :datetime
}

実際のコンソールの画面。

awesome_print-3

検索結果は以下のような感じ。

1.9.3p125 :002 > Refinery::Page.find(:first)
  Refinery::Page Load (0.5ms)  SELECT "refinery_pages".* FROM "refinery_pages" LIMIT 1
  Refinery::Page::Translation Load (0.3ms)  SELECT "refinery_page_translations".* FROM "refinery_page_translations" WHERE "refinery_page_translations"."refinery_page_id" = 1
#&lt;Refinery::Page:0xa3f780c> {
                     :id => 1,
              :parent_id => nil,
                   :path => "Home",
                   :slug => "home",
           :show_in_menu => true,
               :link_url => "/",
             :menu_match => "^/$",
              :deletable => false,
                  :draft => false,
    :skip_to_first_child => false,
                    :lft => 1,
                    :rgt => 4,
                  :depth => 0,
          :view_template => nil,
        :layout_template => nil,
             :created_at => Sun, 18 Mar 2012 04:20:54 UTC +00:00,
             :updated_at => Sun, 18 Mar 2012 12:27:27 UTC +00:00
}

実際のコンソールの画面。

awesome_print-4