ruby--ruby/lib/rubygems/commands/which_command.rb

88 lines
1.9 KiB
Ruby
Raw Normal View History

require 'rubygems/command'
require 'rubygems/gem_path_searcher'
class Gem::Commands::WhichCommand < Gem::Command
EXT = %w[.rb .rbw .so .dll .bundle] # HACK
def initialize
super 'which', 'Find the location of a library file you can require',
:search_gems_first => false, :show_all => false
add_option '-a', '--[no-]all', 'show all matching files' do |show_all, options|
options[:show_all] = show_all
end
add_option '-g', '--[no-]gems-first',
'search gems before non-gems' do |gems_first, options|
options[:search_gems_first] = gems_first
end
end
def arguments # :nodoc:
"FILE name of file to find"
end
def defaults_str # :nodoc:
"--no-gems-first --no-all"
end
def usage # :nodoc:
"#{program_name} FILE [FILE ...]"
end
def execute
searcher = Gem::GemPathSearcher.new
options[:args].each do |arg|
dirs = $LOAD_PATH
spec = searcher.find arg
if spec then
if options[:search_gems_first] then
dirs = gem_paths(spec) + $LOAD_PATH
else
dirs = $LOAD_PATH + gem_paths(spec)
end
say "(checking gem #{spec.full_name} for #{arg})" if
Gem.configuration.verbose
end
paths = find_paths arg, dirs
if paths.empty? then
say "Can't find ruby library file or shared library #{arg}"
else
say paths
end
end
end
def find_paths(package_name, dirs)
result = []
dirs.each do |dir|
EXT.each do |ext|
full_path = File.join dir, "#{package_name}#{ext}"
if File.exist? full_path then
result << full_path
return result unless options[:show_all]
end
end
end
result
end
def gem_paths(spec)
spec.require_paths.collect { |d| File.join spec.full_gem_path, d }
end
def usage # :nodoc:
"#{program_name} FILE [...]"
end
end