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

In Files

  • rubygems/dependency_list.rb

Class/Module Index [+]

Quicksearch

Gem::DependencyList

Gem::DependencyList is used for installing and uninstalling gems in the correct order to avoid conflicts.

Attributes

development[RW]

Allows enabling/disabling use of development dependencies

Public Class Methods

from_source_index(source_index) click to toggle source

Creates a DependencyList from a Gem::SourceIndex source_index

 
               # File rubygems/dependency_list.rb, line 26
def self.from_source_index(source_index)
  list = new

  source_index.each do |full_name, spec|
    list.add spec
  end

  list
end
            
new(development = false) click to toggle source

Creates a new DependencyList. If development is true, development dependencies will be included.

 
               # File rubygems/dependency_list.rb, line 40
def initialize development = false
  @specs = []

  @development = development
end
            

Public Instance Methods

add(*gemspecs) click to toggle source

Adds gemspecs to the dependency list.

 
               # File rubygems/dependency_list.rb, line 49
def add(*gemspecs)
  @specs.push(*gemspecs)
end
            
dependency_order() click to toggle source

Return a list of the gem specifications in the dependency list, sorted in order so that no gemspec in the list depends on a gemspec earlier in the list.

This is useful when removing gems from a set of installed gems. By removing them in the returned order, you don’t get into as many dependency issues.

If there are circular dependencies (yuck!), then gems will be returned in order until only the circular dependents and anything they reference are left. Then arbitrary gemspecs will be returned until the circular dependency is broken, after which gems will be returned in dependency order again.

 
               # File rubygems/dependency_list.rb, line 68
def dependency_order
  sorted = strongly_connected_components.flatten

  result = []
  seen = {}

  sorted.each do |spec|
    if index = seen[spec.name] then
      if result[index].version < spec.version then
        result[index] = spec
      end
    else
      seen[spec.name] = result.length
      result << spec
    end
  end

  result.reverse
end
            
each(&block) click to toggle source

Iterator over #dependency_order

 
               # File rubygems/dependency_list.rb, line 91
def each(&block)
  dependency_order.each(&block)
end
            
find_name(full_name) click to toggle source
 
               # File rubygems/dependency_list.rb, line 95
def find_name(full_name)
  @specs.find { |spec| spec.full_name == full_name }
end
            
ok?() click to toggle source

Are all the dependencies in the list satisfied?

 
               # File rubygems/dependency_list.rb, line 106
def ok?
  @specs.all? do |spec|
    spec.runtime_dependencies.all? do |dep|
      @specs.find { |s| s.satisfies_requirement? dep }
    end
  end
end
            
ok_to_remove?(full_name) click to toggle source

Is is ok to remove a gemspec from the dependency list?

If removing the gemspec creates breaks a currently ok dependency, then it is NOT ok to remove the gemspec.

 
               # File rubygems/dependency_list.rb, line 120
def ok_to_remove?(full_name)
  gem_to_remove = find_name full_name

  siblings = @specs.find_all { |s|
    s.name == gem_to_remove.name &&
      s.full_name != gem_to_remove.full_name
  }

  deps = []

  @specs.each do |spec|
    spec.dependencies.each do |dep|
      deps << dep if gem_to_remove.satisfies_requirement?(dep)
    end
  end

  deps.all? { |dep|
    siblings.any? { |s|
      s.satisfies_requirement? dep
    }
  }
end
            
remove_by_name(full_name) click to toggle source

Removes the gemspec matching full_name from the dependency list

 
               # File rubygems/dependency_list.rb, line 146
def remove_by_name(full_name)
  @specs.delete_if { |spec| spec.full_name == full_name }
end
            
spec_predecessors() click to toggle source

Return a hash of predecessors. result[spec] is an Array of gemspecs that have a dependency satisfied by the named gemspec.

 
               # File rubygems/dependency_list.rb, line 154
def spec_predecessors
  result = Hash.new { |h,k| h[k] = [] }

  specs = @specs.sort.reverse

  specs.each do |spec|
    specs.each do |other|
      next if spec == other

      other.dependencies.each do |dep|
        if spec.satisfies_requirement? dep then
          result[spec] << other
        end
      end
    end
  end

  result
end
            
tsort_each_child(node, &block) click to toggle source
 
               # File rubygems/dependency_list.rb, line 178
def tsort_each_child(node, &block)
  specs = @specs.sort.reverse

  dependencies = node.runtime_dependencies
  dependencies.push(*node.development_dependencies) if @development

  dependencies.each do |dep|
    specs.each do |spec|
      if spec.satisfies_requirement? dep then
        begin
          yield spec
        rescue TSort::Cyclic
        end
        break
      end
    end
  end
end
            
tsort_each_node(&block) click to toggle source
 
               # File rubygems/dependency_list.rb, line 174
def tsort_each_node(&block)
  @specs.each(&block)
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