nanocをデバッグして使ったpryコマンドとか | iii threetreeslight

June 20, 2013

nanocをデバッグして使ったpryコマンドとか

nanoc-sprockets-filterが動かない理由を探るべく。頑張る。

で、入れてるだけpry君でガッツリ頑張ってみようと思い立ち、ちゃんと使うためにも再勉強しつつデバッグを頑張った。

そのとき良く使ったコマンド等々を以下にメモ。

仕込んで


デバッグしたい箇所にbreak pointを仕込んで幸せになる。

$ vim hoge.rb
require 'pry'

module M
  class C
    def initialize
      @foo = 'hoge'
    end

    def m(opt={})
      puts 'hello'
      binding.pry
    end
  end
end

M::C.new.m


$ ruby hoge.rb
    5: def m
    6:   puts 'hello'
 => 7:   binding.pry
    8: end

[1] pry(#<M::C>)>

これだけで結構幸せ。

今どうなってるか調べて


メソッドやインスタンス変数とか洗いざらい出す。

> ls
M::C#methods: m
instance variables: @foo
locals: _  __  _dir_  _ex_  _file_  _in_  _out_  _pry_

> ls self
M::C#methods: m
instance variables: @foo

> ls self -mj

> ls self -M
ー>インスタンスメソッドのみ。

メソッドの内容洗う

> show-method m

From: ./hoge.rb @ line 9:
Owner: M::C
Visibility: public
Number of lines: 4

def m
  puts 'hello'
  binding.pry
end

もちろんドキュメントも見れる。

> show-doc m

From: ./hoge.rb @ line 9:
Owner: M::C
Visibility: public
Signature: m(opt=?)
Number of lines: 1

これだけでも大分捗る。

もちろんirbみたいにオブジェクトへネストできる。

> cd @foo
> self
=> "hoge"
> ls
Comparable#methods: <  <=  >  >=  between?
String#methods:
  %    ===          bytes        center  chr         delete     each_char       encoding        gsub!     inspect  lstrip!  partition  rjust       shellescape  squeeze      sub!       to_c    to_sym  upcase
  *    =~           bytesize     chars   clear       delete!    each_codepoint  end_with?       hash      intern   match    prepend    rpartition  shellsplit   squeeze!     succ       to_f    tr      upcase!
  +    []           byteslice    chomp   codepoints  downcase   each_line       eql?            hex       length   next     replace    rstrip      size         start_with?  succ!      to_i    tr!     upto
  <<   []=          capitalize   chomp!  concat      downcase!  empty?          forc

あーなんという幸せ。

また、良くやりたいgemのディレクトリに直接移動して中も覗ける。

> gem-cd pry
> .pwd
…

> .tree 
.
├── CHANGELOG
├── CONTRIBUTORS
….

> .cat CHENGELOG
10/05/2013 version 0.9.12.2 minor fix
* reload-code (with no args) should reload 'current file', issue #920
…

オブジェクトやクラスのネスト状況も探れる。

[1] pry(#<M::C>)> cd 12
[2] pry(12):1> cd String
[3] pry(String):2> cd Regexp
[4] pry(Regexp):3> nesting
Nesting status:
--
0. #<M::C> (Pry top level)
1. 12
2. String
3. Regexp
[5] pry(Regexp):3> cd ..
[6] pry(String):2>

以下はirbと同じ

それはどんなモジュールやクラスを食べているのか?

> self.class.ancestors
> obj.class
> obj.class.superclass

クラスやインスタンスなどのオブジェクトのメソッド一覧を見たり

(falseはsuperclassのメソッドを無視)

> obj.methods(false)
> obj.instance_methods(false)

直して


ソースコードを編集しつつデバッグ。

> show-method hoge
> edit-method hoge
-> editorで直して再ロードしてくれる幸せ

デバッグしてる位置を確認したり。

> whereami

     9: def m(opt={})
    10:   puts 'hello'
 => 11:   binding.pry
    12: end

で、このメソッドどこよ?っていうのを探したり。

> find-method m
BasicObject
BasicObject#singleton_method_added
BasicObject#singleton_method_removed
…
M::C
M::C#m
Module
…

遊んだり


入力途中の状況も確認できる。

[8] pry(#<M::C>)> def hoge(name)
[8] pry(#<M::C>)*   show-input
1: def hoge(name)

“忘れるとか、]閉め忘れ改行などのあるある問題も、再編集して解決できるとか

[8] pry(#<M::C>)*   amend-line 1 def hoge(name="bar")
1: def hoge(name="bar")

これで


ひたすらgit cloneしてgit grepしまくってうんぬんする現状を打開できたのが超嬉しい。

参考


http://pryrepl.org/