読者です 読者をやめる 読者になる 読者になる

requireできるファイルを調べるメソッド

ライブラリの名前がうろ覚えだったりするときにirbでちょちょっと調べられるように次のようなメソッドを書いてみました。もっと良さそうな名前があれば募集中です。*1

def requirable_files(regex=nil)
  load_path = $LOAD_PATH.reject {|i| i =~ /^\.$/ }
  load_path = load_path.inject([]) do |arr,dir|
    arr.concat(
      Dir.glob("#{dir}/**/*.{rb, so}").map do |i|
        i.sub("#{dir}/", "").sub(/\.(rb|so)/, "")
      end)
  end
  
  load_path = load_path.select {|i| i =~ regex } unless regex.nil?
  
  load_path.each {|i| p i}
end

if $0 == __FILE__

p requirable_files(/test/)
end

# "runit/testresult"  
# "runit/testcase"    
# "runit/testsuite"   
# .....
# => ["runit/testresult", "runit/testcase", "runit/testsuite", "runit/cui/testrunner", "test/unit", "test/unit/assertionfailederror", "test/unit/assertions", "test/unit/autorunner", "test/unit/collector", "test/unit/error", "test/unit/failure", "test/unit/testcase, ...]

Dir.globで再帰的に探索してるので$LOAD_PATHからカレントディレクトリは除外してあります。

ちなみに戻り値は正規表現に合致したパスの配列なので、そのまままとめてrequireとかも出来そうです。

それにしてもメソッドチェーンが長くなるとどうやってうまく書こうか悩むなぁ。あまり長いと分かりづらいので結局短めに区切ったけど。

*1:irbだから補完は効くのだけどちょっと長いので。