123456789_123456789_123456789_123456789_123456789_

Class: Gem::Commands::QueryCommand

Relationships & Source Files
Extension / Inclusion / Inheritance Descendants
Subclasses:
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
Instance Chain:
Inherits: Gem::Command
Defined in: lib/rubygems/commands/query_command.rb

Class Attribute Summary

::Gem::Command - Inherited

.build_args

Arguments used when building gems.

.build_args=, .extra_args, .extra_args=

Class Method Summary

::Gem::Command - Inherited

.add_common_option,
.add_specific_extra_args

Add a list of extra arguments for the given command.

.common_options,
.new

Initializes a generic gem command named command.

.specific_extra_args

Return an array of extra arguments for the command.

.specific_extra_args_hash

Accessor for the specific extra args hash (self initializing).

Instance Attribute Summary

::Gem::LocalRemoteOptions - Included

#both?

Is fetching of local and remote information enabled?

#local?

Is local fetching enabled?

#remote?

Is remote fetching enabled?

::Gem::Command - Inherited

#defaults

The default options for the command.

#program_name

The name of the command for command-line invocation.

#summary

A short description of the command.

#command

The name of the command.

#options

The options for the command.

::Gem::DefaultUserInteraction - Included

Instance Method Summary

::Gem::VersionOption - Included

#add_platform_option

Add the –platform option to the option parser.

#add_prerelease_option

Add the –prerelease option to the option parser.

#add_version_option

Add the –version option to the option parser.

::Gem::LocalRemoteOptions - Included

#accept_uri_http

Allows OptionParser to handle HTTP URIs.

#add_bulk_threshold_option

Add the –bulk-threshold option.

#add_clear_sources_option

Add the –clear-sources option.

#add_local_remote_options

Add local/remote options to the command line parser.

#add_proxy_option

Add the –http-proxy option.

#add_source_option

Add the –source option.

#add_update_sources_option

Add the –update-sources option.

::Gem::Command - Inherited

#add_extra_args

Adds extra args from ~/.gemrc.

#add_option

Add a command-line option and handler to the command.

#arguments

Override to provide details of the arguments a command takes.

#begins?

True if long begins with the characters from short.

#defaults_str

Override to display the default values of the command options.

#description

Override to display a longer description of what this command does.

#execute

Override to provide command handling.

#get_all_gem_names

Get all gem names from the command line.

#get_all_gem_names_and_versions

Get all [gem, version] from the command line.

#get_one_gem_name

Get a single gem name from the command line.

#get_one_optional_argument

Get a single optional argument from the command line.

#handle_options

Handle the given list of arguments by parsing them and recording the results.

#handles?

True if the command handles the given argument list.

#invoke

Invoke the command with the given list of arguments.

#invoke_with_build_args

Invoke the command with the given list of normal arguments and additional build arguments.

#merge_options

Merge a set of command options with the set of default options (without modifying the default option hash).

#remove_option

Remove previously defined command-line argument name.

#show_help

Display the help message for the command.

#show_lookup_failure

Display to the user that a gem couldn't be found and reasons why.

#usage

Override to display the usage for an individual gem command.

#when_invoked

Call the given block when invoked.

#add_parser_run_info

Adds a section with title and content to the parser help view.

#configure_options,
#create_option_parser

Creates an option parser and fills it in with the help info for the command.

#parser

Create on demand parser.

#wrap

Wraps text to width

::Gem::UserInteraction - Included

#alert

Displays an alert statement.

#alert_error

Displays an error statement to the error output location.

#alert_warning

Displays a warning statement to the warning output location.

#ask

Asks a question and returns the answer.

#ask_for_password

Asks for a password with a prompt

#ask_yes_no

Asks a yes or no question.

#choose_from_list

Asks the user to answer question with an answer from the given list.

#say

Displays the given statement on the standard output (or equivalent).

#terminate_interaction

Terminates the RubyGems process with the given exit_code

#verbose

Calls say with msg or the results of the block if really_verbose is true.

::Gem::DefaultUserInteraction - Included

::Gem::Text - Included

#clean_text

Remove any non-printable characters and make the text suitable for printing.

#format_text

Wraps text to wrap characters and optionally indents by indent characters.

#levenshtein_distance

This code is based directly on the ::Gem::Text gem implementation Returns a value representing the “cost” of transforming str1 into str2.

#truncate_text

Constructor Details

.new(name = 'query', summary = 'Query gem information in local or remote repositories') ⇒ QueryCommand

[ GitHub ]

  
# File 'lib/rubygems/commands/query_command.rb', line 14

def initialize(name = 'query',
               summary = 'Query gem information in local or remote repositories')
  super name, summary,
       :name => //, :domain => :local, :details => false, :versions => true,
       :installed => nil, :version => Gem::Requirement.default

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

  add_option('-I', 'Equivalent to --no-installed') do |value, options|
    options[:installed] = false
  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('-e', '--exact',
             'Name of gem(s) to query on matches the',
             'provided STRING') do |value, options|
    options[:exact] = value
  end

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

  add_local_remote_options
end

Instance Method Details

#display_header(type) (private)

[ GitHub ]

  
# File 'lib/rubygems/commands/query_command.rb', line 122

def display_header type
  if (ui.outs.tty? and Gem.configuration.verbose) or both? then
    say
    say "*** #{type} GEMS ***"
    say
  end
end

#entry_details(entry, detail_tuple, specs, platforms) (private)

[ GitHub ]

  
# File 'lib/rubygems/commands/query_command.rb', line 233

def entry_details entry, detail_tuple, specs, platforms
  return unless options[:details]

  name_tuple, spec = detail_tuple

  spec = spec.fetch_spec name_tuple if spec.respond_to? :fetch_spec

  entry << "\n"

  spec_platforms   entry, platforms
  spec_authors     entry, spec
  spec_homepage    entry, spec
  spec_license     entry, spec
  spec_loaded_from entry, spec, specs
  spec_summary     entry, spec
end

#entry_versions(entry, name_tuples, platforms, specs) (private)

[ GitHub ]

  
# File 'lib/rubygems/commands/query_command.rb', line 250

def entry_versions entry, name_tuples, platforms, specs
  return unless options[:versions]

  list =
    if platforms.empty? or options[:details] then
      name_tuples.map { |n| n.version }.uniq
    else
      platforms.sort.reverse.map do |version, pls|
        if pls == [Gem::Platform::RUBY] then
          if options[:domain] == :remote || specs.all? { |spec| spec.is_a? Gem::Source }
            version
          else
            spec = specs.select { |s| s.version == version }
            if spec.first.default_gem?
              "default: #{version}"
            else
              version
            end
          end
        else
          ruby = pls.delete Gem::Platform::RUBY
          platform_list = [ruby, *pls.sort].compact
          "#{version} #{platform_list.join ' '}"
        end
      end
    end

  entry << " (#{list.join ', '})"
end

#execute

[ GitHub ]

  
# File 'lib/rubygems/commands/query_command.rb', line 80

def execute
  exit_code = 0
  if options[:args].to_a.empty? and options[:name].source.empty?
    name = options[:name]
    no_name = true
  elsif !options[:name].source.empty?
    name = Array(options[:name])
  else
    args = options[:args].to_a
    name = options[:exact] ? args.map{|arg| /\A#{Regexp.escape(arg)}\Z/ } : args.map{|arg| /#{arg}/i }
  end

  prerelease = options[:prerelease]

  unless options[:installed].nil? then
    if no_name then
      alert_error "You must specify a gem name"
      exit_code |= 4
    elsif name.count > 1
      alert_error "You must specify only ONE gem!"
      exit_code |= 4
    else
      installed = installed? name.first, options[:version]
      installed = !installed unless options[:installed]

      if installed then
        say "true"
      else
        say "false"
        exit_code |= 1
      end
    end

    terminate_interaction exit_code
  end

  names = Array(name)
  names.each { |n| show_gems n, prerelease }
end

#installed?(name, req = Gem::Requirement.default) ⇒ Boolean (private)

Check if gem name version version is installed.

[ GitHub ]

  
# File 'lib/rubygems/commands/query_command.rb', line 187

def installed?(name, req = Gem::Requirement.default)
  Gem::Specification.any? { |s| s.name =~ name and req =~ s.version }
end

#make_entry(entry_tuples, platforms) (private)

[ GitHub ]

  
# File 'lib/rubygems/commands/query_command.rb', line 280

def make_entry entry_tuples, platforms
  detail_tuple = entry_tuples.first

  name_tuples, specs = entry_tuples.flatten.partition do |item|
    Gem::NameTuple === item
  end

  entry = [name_tuples.first.name]

  entry_versions entry, name_tuples, platforms, specs
  entry_details  entry, detail_tuple, specs, platforms

  entry.join
end

#output_query_results(spec_tuples) (private)

[ GitHub ]

  
# File 'lib/rubygems/commands/query_command.rb', line 191

def output_query_results(spec_tuples)
  output = []
  versions = Hash.new { |h,name| h[name] = [] }

  spec_tuples.each do |spec_tuple, source|
    versions[spec_tuple.name] << [spec_tuple, source]
  end

  versions = versions.sort_by do |(n,_),_|
    n.downcase
  end

  output_versions output, versions

  say output.join(options[:details] ? "\n\n" : "\n")
end

#output_versions(output, versions) (private)

[ GitHub ]

  
# File 'lib/rubygems/commands/query_command.rb', line 208

def output_versions output, versions
  versions.each do |gem_name, matching_tuples|
    matching_tuples = matching_tuples.sort_by { |n,_| n.version }.reverse

    platforms = Hash.new { |h,version| h[version] = [] }

    matching_tuples.each do |n, _|
      platforms[n.version] << n.platform if n.platform
    end

    seen = {}

    matching_tuples.delete_if do |n,_|
      if seen[n.version] then
        true
      else
        seen[n.version] = true
        false
      end
    end

    output << clean_text(make_entry(matching_tuples, platforms))
  end
end

#show_gems(name, prerelease) (private)

Guts of original execute

[ GitHub ]

  
# File 'lib/rubygems/commands/query_command.rb', line 131

def show_gems name, prerelease
  req = Gem::Requirement.default
  # TODO: deprecate for real
  dep = Gem::Deprecate.skip_during { Gem::Dependency.new name, req }
  dep.prerelease = prerelease

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

    display_header 'LOCAL'

    specs = Gem::Specification.find_all { |s|
      s.name =~ name and req =~ s.version
    }

    spec_tuples = specs.map do |spec|
      [spec.name_tuple, spec]
    end

    output_query_results spec_tuples
  end

  if remote? then
    display_header 'REMOTE'

    fetcher = Gem::SpecFetcher.fetcher

    type = if options[:all]
             if options[:prerelease]
               :complete
             else
               :released
             end
           elsif options[:prerelease]
             :prerelease
           else
             :latest
           end

    if name.respond_to?(:source) && name.source.empty?
      spec_tuples = fetcher.detect(type) { true }
    else
      spec_tuples = fetcher.detect(type) do |name_tuple|
        name === name_tuple.name
      end
    end

    output_query_results spec_tuples
  end
end

#spec_authors(entry, spec) (private)

[ GitHub ]

  
# File 'lib/rubygems/commands/query_command.rb', line 295

def spec_authors entry, spec
  authors = "Author#{spec.authors.length > 1 ? 's' : ''}: ".dup
  authors << spec.authors.join(', ')
  entry << format_text(authors, 68, 4)
end

#spec_homepage(entry, spec) (private)

[ GitHub ]

  
# File 'lib/rubygems/commands/query_command.rb', line 301

def spec_homepage entry, spec
  return if spec.homepage.nil? or spec.homepage.empty?

  entry << "\n" << format_text("Homepage: #{spec.homepage}", 68, 4)
end

#spec_license(entry, spec) (private)

[ GitHub ]

  
# File 'lib/rubygems/commands/query_command.rb', line 307

def spec_license entry, spec
  return if spec.license.nil? or spec.license.empty?

  licenses = "License#{spec.licenses.length > 1 ? 's' : ''}: ".dup
  licenses << spec.licenses.join(', ')
  entry << "\n" << format_text(licenses, 68, 4)
end

#spec_loaded_from(entry, spec, specs) (private)

[ GitHub ]

  
# File 'lib/rubygems/commands/query_command.rb', line 315

def spec_loaded_from entry, spec, specs
  return unless spec.loaded_from

  if specs.length == 1 then
    default = spec.default_gem? ? ' (default)' : nil
    entry << "\n" << "    Installed at#{default}: #{spec.base_dir}"
  else
    label = 'Installed at'
    specs.each do |s|
      version = s.version.to_s
      version << ', default' if s.default_gem?
      entry << "\n" << "    #{label} (#{version}): #{s.base_dir}"
      label = ' ' * label.length
    end
  end
end

#spec_platforms(entry, platforms) (private)

[ GitHub ]

  
# File 'lib/rubygems/commands/query_command.rb', line 332

def spec_platforms entry, platforms
  non_ruby = platforms.any? do |_, pls|
    pls.any? { |pl| pl != Gem::Platform::RUBY }
  end

  return unless non_ruby

  if platforms.length == 1 then
    title = platforms.values.length == 1 ? 'Platform' : 'Platforms'
    entry << "    #{title}: #{platforms.values.sort.join ', '}\n"
  else
    entry << "    Platforms:\n"
    platforms.sort_by do |version,|
      version
    end.each do |version, pls|
      label = "        #{version}: "
      data = format_text pls.sort.join(', '), 68, label.length
      data[0, label.length] = label
      entry << data << "\n"
    end
  end
end

#spec_summary(entry, spec) (private)

[ GitHub ]

  
# File 'lib/rubygems/commands/query_command.rb', line 355

def spec_summary entry, spec
  summary = truncate_text(spec.summary, "the summary for #{spec.full_name}")
  entry << "\n\n" << format_text(summary, 68, 4)
end