class Gem::Commands::ContentsCommand - rubygems: Ruby Standard Library Documentation

# class Gem::Commands::ContentsCommand

### Public Class Methods

new() click to toggle source
Calls superclass method `Gem::Command::new`

    # File 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 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 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 rubygems/commands/contents_command.rb, line 104
    def files_in_default_gem(spec)
      spec.files.filter_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
    end

files_in_gem(spec) click to toggle source

    # File 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 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 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 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 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