class Gem::Commands::WhichCommand

Public Class Methods

new() click to toggle source
Calls superclass method Gem::Command::new
# File lib/rubygems/commands/which_command.rb, line 5
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

Public Instance Methods

execute() click to toggle source
# File lib/rubygems/commands/which_command.rb, line 38
def execute
  found = true

  options[:args].each do |arg|
    arg = arg.sub(/#{Regexp.union(*Gem.suffixes)}$/, '')
    dirs = $LOAD_PATH

    spec = Gem::Specification.find_by_path arg

    if spec
      if options[:search_gems_first]
        dirs = spec.full_require_paths + $LOAD_PATH
      else
        dirs = $LOAD_PATH + spec.full_require_paths
      end
    end

    # TODO: this is totally redundant and stupid
    paths = find_paths arg, dirs

    if paths.empty?
      alert_error "Can't find Ruby library file or shared library #{arg}"

      found &&= false
    else
      say paths
    end
  end

  terminate_interaction 1 unless found
end
find_paths(package_name, dirs) click to toggle source
# File lib/rubygems/commands/which_command.rb, line 70
def find_paths(package_name, dirs)
  result = []

  dirs.each do |dir|
    Gem.suffixes.each do |ext|
      full_path = File.join dir, "#{package_name}#{ext}"
      if File.exist? full_path and not File.directory? full_path
        result << full_path
        return result unless options[:show_all]
      end
    end
  end

  result
end