Extended maintenance of Ruby versions 1.8.7 and 1.9.2 will end on July 31, 2014. Read more

In Files

  • rubygems/commands/dependency_command.rb

Class/Module Index [+]

Quicksearch

Gem::Commands::DependencyCommand

Public Class Methods

new() click to toggle source
 
               # File rubygems/commands/dependency_command.rb, line 11
def initialize
  super 'dependency',
        'Show the dependencies of an installed gem',
        :version => Gem::Requirement.default, :domain => :local

  add_version_option
  add_platform_option
  add_prerelease_option

  add_option('-R', '--[no-]reverse-dependencies',
             'Include reverse dependencies in the output') do
    |value, options|
    options[:reverse_dependencies] = value
  end

  add_option('-p', '--pipe',
             "Pipe Format (name --version ver)") do |value, options|
    options[:pipe_format] = value
  end

  add_local_remote_options
end
            

Public Instance Methods

execute() click to toggle source
 
               # File rubygems/commands/dependency_command.rb, line 46
def execute
  options[:args] << '' if options[:args].empty?
  specs = {}

  source_indexes = Hash.new do |h, source_uri|
    h[source_uri] = Gem::SourceIndex.new
  end

  pattern = if options[:args].length == 1 and
               options[:args].first =~ /\A\/(.*)\/(i)?\z/m then
              flags = $2 ? Regexp::IGNORECASE : nil
              Regexp.new $1, flags
            else
              /\A#{Regexp.union(*options[:args])}/
            end

  dependency = Gem::Dependency.new pattern, options[:version]
  dependency.prerelease = options[:prerelease]

  if options[:reverse_dependencies] and remote? and not local? then
    alert_error 'Only reverse dependencies for local gems are supported.'
    terminate_interaction 1
  end

  if local? then
    Gem.source_index.search(dependency).each do |spec|
      source_indexes[:local].add_spec spec
    end
  end

  if remote? and not options[:reverse_dependencies] then
    fetcher = Gem::SpecFetcher.fetcher

    begin
      specs_and_sources = fetcher.find_matching(dependency, false, true,
                                                dependency.prerelease?)

      specs_and_sources.each do |spec_tuple, source_uri|
        spec = fetcher.fetch_spec spec_tuple, URI.parse(source_uri)

        source_indexes[source_uri].add_spec spec
      end
    rescue Gem::RemoteFetcher::FetchError => e
      raise unless fetcher.warn_legacy e do
        require 'rubygems/source_info_cache'

        specs = Gem::SourceInfoCache.search_with_source dependency, false

        specs.each do |spec, source_uri|
          source_indexes[source_uri].add_spec spec
        end
      end
    end
  end

  if source_indexes.empty? then
    patterns = options[:args].join ','
    say "No gems found matching #{patterns} (#{options[:version]})" if
      Gem.configuration.verbose

    terminate_interaction 1
  end

  specs = {}

  source_indexes.values.each do |source_index|
    source_index.gems.each do |name, spec|
      specs[spec.full_name] = [source_index, spec]
    end
  end

  reverse = Hash.new { |h, k| h[k] = [] }

  if options[:reverse_dependencies] then
    specs.values.each do |_, spec|
      reverse[spec.full_name] = find_reverse_dependencies spec
    end
  end

  if options[:pipe_format] then
    specs.values.sort_by { |_, spec| spec }.each do |_, spec|
      unless spec.dependencies.empty?
        spec.dependencies.sort_by { |dep| dep.name }.each do |dep|
          say "#{dep.name} --version '#{dep.requirement}'"
        end
      end
    end
  else
    response = ''

    specs.values.sort_by { |_, spec| spec }.each do |_, spec|
      response << print_dependencies(spec)
      unless reverse[spec.full_name].empty? then
        response << "  Used by\n"
        reverse[spec.full_name].each do |sp, dep|
          response << "    #{sp} (#{dep})\n"
        end
      end
      response << "\n"
    end

    say response
  end
end
            
find_gems(name, source_index) click to toggle source
 
               # File rubygems/commands/dependency_command.rb, line 182
def find_gems(name, source_index)
  specs = {}

  spec_list = source_index.search name, options[:version]

  spec_list.each do |spec|
    specs[spec.full_name] = [source_index, spec]
  end

  specs
end
            
find_reverse_dependencies(spec) click to toggle source

Returns an Array of [specification, dep] that are satisfied by spec.

 
               # File rubygems/commands/dependency_command.rb, line 165
def find_reverse_dependencies(spec)
  result = []

  Gem.source_index.each do |name, sp|
    sp.dependencies.each do |dep|
      dep = Gem::Dependency.new(*dep) unless Gem::Dependency === dep

      if spec.name == dep.name and
         dep.requirement.satisfied_by?(spec.version) then
        result << [sp.full_name, dep]
      end
    end
  end

  result
end
            

Commenting is here to help enhance the documentation. For example, code samples, or clarification of the documentation.

If you have questions about Ruby or the documentation, please post to one of the Ruby mailing lists. You will get better, faster, help that way.

If you wish to post a correction of the docs, please do so, but also file bug report so that it can be corrected for the next release. Thank you.

If you want to help improve the Ruby documentation, please visit Documenting-ruby.org.

blog comments powered by Disqus