class Gem::Commands::ContentsCommand

Public Class Methods

new() click to toggle source
Calls superclass method Gem::Command::new
# File lib/rubygems/commands/contents_command.rb, line 9
def initialize
  super "contents", "Display the contents of the installed gems",
        specdirs: [], lib_only: false, prefix: true,
        show_install_dir: false

  add_version_option

  add_option("--all",
             "Contents for all gems") do |all, options|
    options[:all] = all
  end

  add_option("-s", "--spec-dir a,b,c", Array,
             "Search for gems under specific paths") do |spec_dirs, options|
    options[:specdirs] = spec_dirs
  end

  add_option("-l", "--[no-]lib-only",
             "Only return files in the Gem's lib_dirs") do |lib_only, options|
    options[:lib_only] = lib_only
  end

  add_option("--[no-]prefix",
             "Don't include installed path prefix") do |prefix, options|
    options[:prefix] = prefix
  end

  add_option("--[no-]show-install-dir",
             "Show only the gem install dir") do |show, options|
    options[:show_install_dir] = show
  end

  @path_kind = nil
  @spec_dirs = nil
  @version   = nil
end

Public Instance Methods

execute() click to toggle source
# File lib/rubygems/commands/contents_command.rb, line 66
def execute
  @version   = options[:version] || Gem::Requirement.default
  @spec_dirs = specification_directories
  @path_kind = path_description @spec_dirs

  names = gem_names

  names.each do |name|
    found =
      if options[:show_install_dir]
        gem_install_dir name
      else
        gem_contents name
      end

    terminate_interaction 1 unless found || names.length > 1
  end
end
files_in(spec) click to toggle source
# File lib/rubygems/commands/contents_command.rb, line 85
def files_in(spec)
  if spec.default_gem?
    files_in_default_gem spec
  else
    files_in_gem spec
  end
end
files_in_default_gem(spec) click to toggle source
# File lib/rubygems/commands/contents_command.rb, line 104
def files_in_default_gem(spec)
  spec.files.map do |file|
    if file.start_with?("#{spec.bindir}/")
      [RbConfig::CONFIG["bindir"], file.delete_prefix("#{spec.bindir}/")]
    else
      gem spec.name, spec.version

      require_path = spec.require_paths.find do |path|
        file.start_with?("#{path}/")
      end

      requirable_part = file.delete_prefix("#{require_path}/")

      resolve = $LOAD_PATH.resolve_feature_path(requirable_part)&.last
      next unless resolve

      [resolve.delete_suffix(requirable_part), requirable_part]
    end
  end.compact
end
files_in_gem(spec) click to toggle source
# File lib/rubygems/commands/contents_command.rb, line 93
def files_in_gem(spec)
  gem_path  = spec.full_gem_path
  extra     = "/{#{spec.require_paths.join ","}}" if options[:lib_only]
  glob      = "#{gem_path}#{extra}/**/*"
  prefix_re = %r{#{Regexp.escape(gem_path)}/}

  Dir[glob].map do |file|
    [gem_path, file.sub(prefix_re, "")]
  end
end
gem_contents(name) click to toggle source
# File lib/rubygems/commands/contents_command.rb, line 125
def gem_contents(name)
  spec = spec_for name

  return false unless spec

  files = files_in spec

  show_files files

  true
end
gem_install_dir(name) click to toggle source
# File lib/rubygems/commands/contents_command.rb, line 137
def gem_install_dir(name)
  spec = spec_for name

  return false unless spec

  say spec.gem_dir

  true
end
show_files(files) click to toggle source
# File lib/rubygems/commands/contents_command.rb, line 163
def show_files(files)
  files.sort.each do |prefix, basename|
    absolute_path = File.join(prefix, basename)
    next if File.directory? absolute_path

    if options[:prefix]
      say absolute_path
    else
      say basename
    end
  end
end
spec_for(name) click to toggle source
# File lib/rubygems/commands/contents_command.rb, line 176
def spec_for(name)
  spec = Gem::Specification.find_all_by_name(name, @version).first

  return spec if spec

  say "Unable to find gem '#{name}' in #{@path_kind}"

  if Gem.configuration.verbose
    say "\nDirectories searched:"
    @spec_dirs.sort.each {|dir| say dir }
  end

  nil
end