In Files

  • rubygems/commands/query_command.rb

Class/Module Index [+]

Quicksearch

Gem::Commands::QueryCommand

Public Class Methods

new(name = 'query', summary = 'Query gem information in local or remote repositories') click to toggle source
 
               # File rubygems/commands/query_command.rb, line 13
def initialize(name = 'query',
               summary = 'Query gem information in local or remote repositories')
  super name, summary,
       :name => //, :domain => :local, :details => false, :versions => true,
       :installed => false, :version => Gem::Requirement.default

  add_option('-i', '--[no-]installed',
             'Check for installed gem') do |value, options|
    options[:installed] = value
  end

  add_version_option command, "for use with --installed"

  add_option('-n', '--name-matches REGEXP',
             'Name of gem(s) to query on matches the',
             'provided REGEXP') do |value, options|
    options[:name] = /#{value}/i
  end

  add_option('-d', '--[no-]details',
             'Display detailed information of gem(s)') do |value, options|
    options[:details] = value
  end

  add_option(      '--[no-]versions',
             'Display only gem names') do |value, options|
    options[:versions] = value
    options[:details] = false unless value
  end

  add_option('-a', '--all',
             'Display all gem versions') do |value, options|
    options[:all] = value
  end

  add_option(      '--[no-]prerelease',
             'Display prerelease versions') do |value, options|
    options[:prerelease] = value
  end

  add_local_remote_options
end
            

Public Instance Methods

execute() click to toggle source
 
               # File rubygems/commands/query_command.rb, line 60
def execute
  exit_code = 0

  name = options[:name]
  prerelease = options[:prerelease]

  if options[:installed] then
    if name.source.empty? then
      alert_error "You must specify a gem name"
      exit_code |= 4
    elsif installed? name, options[:version] then
      say "true"
    else
      say "false"
      exit_code |= 1
    end

    raise Gem::SystemExitException, exit_code
  end

  dep = Gem::Dependency.new name, Gem::Requirement.default

  if local? then
    if prerelease and not both? then
      alert_warning "prereleases are always shown locally"
    end

    if ui.outs.tty? or both? then
      say
      say "*** LOCAL GEMS ***"
      say
    end

    specs = Gem.source_index.search dep

    spec_tuples = specs.map do |spec|
      [[spec.name, spec.version, spec.original_platform, spec], :local]
    end

    output_query_results spec_tuples
  end

  if remote? then
    if ui.outs.tty? or both? then
      say
      say "*** REMOTE GEMS ***"
      say
    end

    all = options[:all]

    begin
      fetcher = Gem::SpecFetcher.fetcher
      spec_tuples = fetcher.find_matching dep, all, false, prerelease

      spec_tuples += fetcher.find_matching dep, false, false, true if
        prerelease and all
    rescue Gem::RemoteFetcher::FetchError => e
      if prerelease then
        raise Gem::OperationNotSupportedError,
              "Prereleases not supported on legacy repositories"
      end

      raise unless fetcher.warn_legacy e do
        require 'rubygems/source_info_cache'

        dep.name = '' if dep.name == //

        specs = Gem::SourceInfoCache.search_with_source dep, false, all

        spec_tuples = specs.map do |spec, source_uri|
          [[spec.name, spec.version, spec.original_platform, spec],
           source_uri]
        end
      end
    end

    output_query_results spec_tuples
  end
end