読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

特定のファイルを含むGemを探索する。

Gem::GemPathSearcherを使うと、ローカルにインストールされたGemの中から、特定のファイルを含むGemを探索することができます。

  • findで最初に見つかった1つを、
  • find_allでマッチするもの全てを取得できます。
  • find_allの方は旧バージョンのものもヒットするので注意。findでは最新のGemが返されます。
  • 内部的には、各gemのlibディレクトリをglobして探索しているだけなので、ワイルドカードも使えたりします。
require 'rubygems'

searcher = Gem::GemPathSearcher.new

# "httpclient"を含む gem spec を探索。
spec = searcher.find("httpclient")
puts "#{spec.name} : #{spec.version}"

puts "---"

# "javaclass/class.rb"を含む gem spec を全て探索。
specs = searcher.find_all("javaclass/class.rb")
specs.each {|spec|
  puts "#{spec.name} : #{spec.version}"
}

puts "---"

# 内部的には 各gemのlibディレクトリをglobして探索しているだけなので、
# ワイルドカードも使えたりする。
# ↓は hで始まるファイルを含むgem specを探索する例。
specs = searcher.find_all("h*")
specs.each {|spec|
  puts "#{spec.name} : #{spec.version}"
}

実行結果です。

httpclient : 2.1.4
---
unageanu-javaclass : 0.2.0
unageanu-javaclass : 0.1.1
---
highline : 1.5.0
hoe : 1.11.0
hoe : 1.10.0
hoe : 1.9.0
hoe : 1.5.1
hpricot : 0.6
httpclient : 2.1.4
httpclient : 2.1.2
rubyforge : 0.4.5

gemのバージョン取得もこれを使った方がよい気がする。requireとかをしなくてもいいし。