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 6
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 39
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

    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 69
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) && !File.directory?(full_path)
        result << full_path
        return result unless options[:show_all]
      end
    end
  end

  result
end