ruby-anythingとpry-pipelineで快適コードリーディングかもな話(on pry)

$

ここで出てくる $ っていうのは pry> $ Pry.run_command とかってやるとPry.run_commandのソースを表示するpryのコマンドです。

ruby-anything

rubyの配列からanything風のインターフェースで一個要素選択するみたいなやつ。Kernel_anything_ ってメソッド生えてて_anything_ Pry.methodsとかって使う。 EnumerableとかにしてPry.methods._anything_みたいな感じにすれば良かった気はする。

pry-pipeline

pryの $ とか ? ってコマンドを良く使う。でもそれに変数とかメソッドの戻り値を渡したいみたいな時があって、それをデフォルトでうまくやる方法ないと思う。そんな時に使えるものとして作ったのがこれ。
StringSymbol_pipe_(aliased to |)が生えてる。pryのcommandはnilが戻ってくるので今のとこ繋げれない。

便利

で快適コードリーディングという話だけども、メソッド名曖昧にしか覚えてないけどメソッドのソースみたいみたいな要求がまあまああると思う。ないかもしれない。

こんなのを ~/.pryrcとかに書いとく。メソッド名は好きなように短くすれば良いと思う。

begin
  require 'ruby-anything'
  require 'pry-pipeline'
rescue LoadError => err
  puts "Failed to require. in #{__FILE__}"
end

def method_source(obj)
  "#{obj.inspect}." + _anything_(obj.methods) | '$'
end

def instance_method_source(cls)
  "#{cls.inspect}#" + _anything_(cls.instance_methods) | '$'
end

で、

$ pry
[1] pry(main)> method_source Pry
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
anything風のインターフェースでメソッドを選択
例えば `run_command` ってメソッドを選択した場合
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
From: /Users/toqoz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/pry-0.9.10/lib/pry/pry_class.rb @ line 217:
Number of lines: 12
Owner: #<Class:Pry>
Visibility: public

def self.run_command(command_string, options={})
  options = {
    :context => TOPLEVEL_BINDING,
    :show_output => true,
    :output => Pry.output,
    :commands => Pry.commands
  }.merge!(options)

  output = options[:show_output] ? options[:output] : StringIO.new

  Pry.new(:output => output, :input => StringIO.new(command_string), :commands => options[:commands], :prompt => proc {""}, :hooks => Pry::Hooks.new).rep(options[:context])
end
=> nil

ちまちま Pry.methods.grep(/hoge/) って、ああ、違うか、あ、これだ、pry> $ これみたいな過程が減る。pry-pipeline作るときに使ったPry.run_command っていうメソッドも、ruby-anything使って、多分commandとかexec/runとかってメソッドがPryに生えてるだろと思って、_anything_ Pry.methods ってやって発見した。

まあこの話はこのメソッド見たいって明確に決まってる時はこれはあんま関係ないが、
ruby-anythingは一覧から何かを選択させたいみたいな時、 pry-pipelineもpryのコマンドになんかの結果を返したいみたいな時に汎用的に使えると思う。適当に組み合わせたらもっと便利なのできると思う。