# 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

        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 68
    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