SSブログ

【Rails(3.2系)開発】GWも終盤だし社会復帰を兼ねてpryを使ってみる [rails]

GWなので何かやってみようと思い、irbより便利と噂に聞いてたpryを導入してみる。

まずはインストール。
% gem install pry pry-doc
Fetching: coderay-1.0.9.gem (100%)
Fetching: slop-3.4.4.gem (100%)
Fetching: method_source-0.8.1.gem (100%)
Fetching: pry-0.9.12.1.gem (100%)
Successfully installed coderay-1.0.9
Successfully installed slop-3.4.4
Successfully installed method_source-0.8.1
Successfully installed pry-0.9.12.1
Fetching: yard-0.8.6.1.gem (100%)
Fetching: pry-doc-0.4.5.gem (100%)
Successfully installed yard-0.8.6.1
Successfully installed pry-doc-0.4.5
6 gems installed
Installing ri documentation for coderay-1.0.9...
Installing ri documentation for slop-3.4.4...
Installing ri documentation for method_source-0.8.1...
Installing ri documentation for pry-0.9.12.1...

RDoc::Parser::Ruby failure around line 25 of
lib/pry/commands/ls.rb

Before reporting this, could you check that the file you're documenting
has proper syntax:

  /Users/******/.rbenv/versions/1.9.3-p374/bin/ruby -c lib/pry/commands/ls.rb

RDoc is not a full Ruby parser and will fail when fed invalid ruby programs.

The internal error was:

     (NoMethodError) undefined method `name' for #

ERROR:  While generating documentation for pry-0.9.12.1
... MESSAGE:   undefined method `name' for #
... RDOC args: --ri --op /Users/******/.rbenv/versions/1.9.3-p374/lib/ruby/gems/1.9.1/doc/pry-0.9.12.1/ri lib --title pry-0.9.12.1 Documentation --quiet

エラーが。。。RDoc関連で怒られてる。

RDocをインストールしないようにオプションを付けて再チャレンジ。
1回アンインストールして"--no-ri --no-rdoc"オプションを付けて再インストール。
% gem uninstall pry pry-doc

You have requested to uninstall the gem:
     pry-0.9.12.1
pry-doc-0.4.5 depends on [pry (>= 0.9)]
If you remove this gems, one or more dependencies will not be met.
Continue with Uninstall? [Yn]  Y
Remove executables:
     pry

in addition to the gem? [Yn]  Y
Removing pry
Successfully uninstalled pry-0.9.12.1
Successfully uninstalled pry-doc-0.4.5

% gem install pry --no-ri --no-rdoc
Fetching: pry-0.9.12.1.gem (100%)
Successfully installed pry-0.9.12.1
1 gem installed

今度はうまくいったかな。

早速叩いてみる。
% pry
zsh: command not found: pry

コマンドが見つからない。
ってrbenvで管理されているからrehash忘れてた。
% rbenv rehash
% pry
[1] pry(main)>

無事に動くようになりました。

こっからはpryの便利さについて検証。


■ハイライト
適当なハッシュを定義してみる。
スクリーンショット 2013-05-05 15.15.50.png

おぉ。確かに色付けされた! これはいい。

# irbで同じハッシュを定義した場合
スクリーンショット 2013-05-05 15.16.50.png


■シェルコマンド
コマンドラインで直接シェルが叩けるようになってるみたいです。
シェルコマンドの場合は頭に「.(ドット)」を付けて実行。
[1] pry(main)> .pwd
/Users/******/.rbenv/versions/1.9.3-p374
[2] pry(main)> .ls
bin     include lib     share
[3] pry(main)> .cd bin
[4] pry(main)> .ls | grep passen
passenger
passenger-config
passenger-install-apache2-module
passenger-install-nginx-module
passenger-memory-stats
passenger-status

頭に「.(ドット)」を入れないとならないので、普段の感じで叩くとNameErrorが連発。。。w
でも、ターミナルで別タブで立ち上げなくてもlsやgrepなどお馴染みコマンドを叩けるのは便利。


■Tab補完
個人的には目玉と言ってもいい機能。これを見て入れることを決心したと言っても過言じゃない。
[1] pry(main)> a = "hoge"
=> "hoge"

[2] pry(main)> a.len

# ここでタブを押す↓↓↓

[2] pry(main)> a.length

残り文字が補完される!
さらに候補が複数ある場合は、その候補が表示される。
[3] pry(main)> a.to_
a.to_c     a.to_enum  a.to_f     a.to_i     a.to_r     a.to_s     a.to_str   a.to_sym 

もう鬼便利。


■オブジェクトの実装が読める
定義されたオブジェクトの中身、rubyだけじゃなくcで書かれたコードも読めるらしい。
読むためには"show-method"コマンドを叩く。
[1] pry(main)> show-method Array#each
Error: Cannot locate this method: each. Try `gem-install pry-doc` to get access to Ruby Core documentation.

あらエラーが。。。
どうやらCで書かれたコードを読むためには'pry-doc'を入れないとダメらしい。

そういえば'pry-doc'は、インストール時にエラーが出て外してた。
エラーはRDocで関係ないし'pry-doc'も入れる事にする。
% gem install pry-doc --no-ri --no-rdoc
Fetching: pry-doc-0.4.5.gem (100%)
Successfully installed pry-doc-0.4.5
1 gem installed
% rbenv rehash

もう一度叩く。"show-method"もタブ補完が効くので便利ですね。
[1] pry(main)> show-method Array#each

From: array.c (C Method):
Owner: Array
Visibility: public
Number of lines: 12

VALUE
rb_ary_each(VALUE array)
{
    long i;
    volatile VALUE ary = array;

    RETURN_ENUMERATOR(ary, 0, 0);
    for (i=0; i<RARRAY_LEN(ary); i++){
      rb_yield(RARRAY_PTR(ary)[i]);
    }
    return ary;
}

# うまくブログに表示されなかったのでコードの一部を全角化してます

もちろん独自実装したメソッドの中身も。
[2] pry(main)> def hoge
[2] pry(main)*   return "test"
[2] pry(main)* end 
=> nil
[3] pry(main)> show-method hoge

From: (pry) @ line 1:
Owner: Object
Visibility: private
Number of lines: 3

def hoge
  return "test"
end

これでデバック作業が捗りそう。


■Rails Consoleで利用する
思っていた以上に便利なpryですが、"rails console"では普段通り"irb"が利用されてしまいます。
切り替える方法がないと調べたら、いくつか方法はあるみたいです。

その中でも'pry-rails' gemを利用したやり方が一番ラクそうだったのでそれでやってみる事にします。
# ただしRails3.0以上
% vim Gemfile
---------------------------------------------------------------
# rails console をpryで起動
gem 'pry-rails'
---------------------------------------------------------------

bundleでインストールする。
% bundle install --path vendor/bundle
(中略)
Installing method_source (0.8.1)
Installing slop (3.4.4)
Installing pry (0.9.12.1)
Installing pry-rails (0.2.2) 

"rails console"を立ち上げる。
% bundle exec rails console
Loading development environment (Rails 3.2.13)
[1] pry(main)>

"pry"に変わった!
Railsオブジェクトの中身を見れるようになりますね。
[2] pry(main)> show-method ActiveRecord::Base#initialize

From: /Users/*******/Development/my_app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.13/lib/active_record/base.rb @ line 481:
Owner: ActiveRecord::Base
Visibility: private
Number of lines: 22

def initialize(attributes = nil, options = {})
  defaults = Hash[self.class.column_defaults.map { |k, v| [k, v.duplicable? ? v.dup : v] }]
  @attributes = self.class.initialize_attributes(defaults)
  @association_cache = {}
  @aggregation_cache = {}
  @attributes_cache = {}
  @new_record = true
  @readonly = false
  @destroyed = false
  @marked_for_destruction = false
  @previously_changed = {}
  @changed_attributes = {}

  ensure_proper_type

  populate_with_current_scope_attributes

  assign_attributes(attributes, options) if attributes

  yield self if block_given?
  run_callbacks :initialize
end

さらに"show-routes"でroutes情報が見れるらしい。
[3] pry(main)> show-routes 

          user_session POST   /users/sign_in(.:format)       devise/sessions#create
  destroy_user_session DELETE /users/sign_out(.:format)      devise/sessions#destroy
    edit_user_password GET    /users/password/edit(.:format) devise/passwords#edit
edit_user_registration DELETE /users(.:format)               devise/registrations#destroy
                  root        /                              top#index

"grep"も使える・・やだなにこれ便利。
[8] pry(main)> show-routes --grep devise
          user_session POST   /users/sign_in(.:format)       devise/sessions#create
  destroy_user_session DELETE /users/sign_out(.:format)      devise/sessions#destroy
    edit_user_password GET    /users/password/edit(.:format) devise/passwords#edit
edit_user_registration DELETE /users(.:format)               devise/registrations#destroy

思ってた以上に便利ですね。もっと早く使えば良かった。。。
他にも色々な機能やプラグインなんかもあるみたいなので、これから使いこなしていきたいと思います。

参考にさせて貰ったサイト:
Rubyistよ、irbを捨ててPryを使おう
irbの代わりにPryを使ってみた
【Rails】RailsコンソールがPryで起動できる「pry-rails」

nice!(0)  コメント(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。