In Files

  • rubygems/resolver.rb
  • rubygems/resolver/activation_request.rb
  • rubygems/resolver/api_set.rb
  • rubygems/resolver/api_specification.rb
  • rubygems/resolver/best_set.rb
  • rubygems/resolver/composed_set.rb
  • rubygems/resolver/conflict.rb
  • rubygems/resolver/current_set.rb
  • rubygems/resolver/dependency_request.rb
  • rubygems/resolver/git_set.rb
  • rubygems/resolver/git_specification.rb
  • rubygems/resolver/index_set.rb
  • rubygems/resolver/index_specification.rb
  • rubygems/resolver/installed_specification.rb
  • rubygems/resolver/installer_set.rb
  • rubygems/resolver/local_specification.rb
  • rubygems/resolver/lock_set.rb
  • rubygems/resolver/lock_specification.rb
  • rubygems/resolver/molinillo/lib/molinillo.rb
  • rubygems/resolver/molinillo/lib/molinillo/delegates/resolution_state.rb
  • rubygems/resolver/molinillo/lib/molinillo/delegates/specification_provider.rb
  • rubygems/resolver/molinillo/lib/molinillo/dependency_graph.rb
  • rubygems/resolver/molinillo/lib/molinillo/dependency_graph/action.rb
  • rubygems/resolver/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb
  • rubygems/resolver/molinillo/lib/molinillo/dependency_graph/add_vertex.rb
  • rubygems/resolver/molinillo/lib/molinillo/dependency_graph/delete_edge.rb
  • rubygems/resolver/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb
  • rubygems/resolver/molinillo/lib/molinillo/dependency_graph/log.rb
  • rubygems/resolver/molinillo/lib/molinillo/dependency_graph/set_payload.rb
  • rubygems/resolver/molinillo/lib/molinillo/dependency_graph/tag.rb
  • rubygems/resolver/molinillo/lib/molinillo/dependency_graph/vertex.rb
  • rubygems/resolver/molinillo/lib/molinillo/errors.rb
  • rubygems/resolver/molinillo/lib/molinillo/gem_metadata.rb
  • rubygems/resolver/molinillo/lib/molinillo/modules/specification_provider.rb
  • rubygems/resolver/molinillo/lib/molinillo/modules/ui.rb
  • rubygems/resolver/molinillo/lib/molinillo/resolution.rb
  • rubygems/resolver/molinillo/lib/molinillo/resolver.rb
  • rubygems/resolver/molinillo/lib/molinillo/state.rb
  • rubygems/resolver/requirement_list.rb
  • rubygems/resolver/set.rb
  • rubygems/resolver/source_set.rb
  • rubygems/resolver/spec_specification.rb
  • rubygems/resolver/specification.rb
  • rubygems/resolver/stats.rb
  • rubygems/resolver/vendor_set.rb
  • rubygems/resolver/vendor_specification.rb
  • rubygems/source.rb
  • rubygems/test_case.rb

Class/Module Index [+]

Quicksearch

Gem::Resolver

Given a set of Gem::Dependency objects as needed and a way to query the set of available specs via set, calculates a set of ActivationRequest objects which indicate all the specs that should be activated to meet the all the requirements.

Constants

DEBUG_RESOLVER

If the DEBUG_RESOLVER environment variable is set then debugging mode is enabled for the resolver. This will display information about the state of the resolver while a set of dependencies is being resolved.

SINGLE_POSSIBILITY_CONSTRAINT_PENALTY

Attributes

development[RW]

Set to true if all development dependencies should be considered.

development_shallow[RW]

Set to true if immediate development dependencies should be considered.

ignore_dependencies[RW]

When true, no dependencies are looked up for requested gems.

missing[R]

List of dependencies that could not be found in the configured sources.

skip_gems[RW]

Hash of gems to skip resolution. Keyed by gem name, with arrays of gem specifications as values.

soft_missing[RW]

When a missing dependency, don’t stop. Just go on and record what was missing.

stats[R]

Public Class Methods

compose_sets(*sets) click to toggle source

Combines sets into a ComposedSet that allows specification lookup in a uniform manner. If one of the sets is itself a ComposedSet its sets are flattened into the result ComposedSet.

 
               # File rubygems/resolver.rb, line 63
def self.compose_sets(*sets)
  sets.compact!

  sets = sets.map do |set|
    case set
    when Gem::Resolver::BestSet then
      set
    when Gem::Resolver::ComposedSet then
      set.sets
    else
      set
    end
  end.flatten

  case sets.length
  when 0 then
    raise ArgumentError, 'one set in the composition must be non-nil'
  when 1 then
    sets.first
  else
    Gem::Resolver::ComposedSet.new(*sets)
  end
end
            
for_current_gems(needed) click to toggle source

Creates a Resolver that queries only against the already installed gems for the needed dependencies.

 
               # File rubygems/resolver.rb, line 91
def self.for_current_gems(needed)
  new needed, Gem::Resolver::CurrentSet.new
end
            
new(needed, set = nil) click to toggle source

Create Resolver object which will resolve the tree starting with needed Dependency objects.

set is an object that provides where to look for specifications to satisfy the Dependencies. This defaults to IndexSet, which will query rubygems.org.

 
               # File rubygems/resolver.rb, line 103
def initialize(needed, set = nil)
  @set = set || Gem::Resolver::IndexSet.new
  @needed = needed

  @development         = false
  @development_shallow = false
  @ignore_dependencies = false
  @missing             = []
  @skip_gems           = {}
  @soft_missing        = false
  @stats               = Gem::Resolver::Stats.new
end
            

Public Instance Methods

allow_missing?(dependency) click to toggle source
 
               # File rubygems/resolver.rb, line 273
def allow_missing?(dependency)
  @missing << dependency
  @soft_missing
end
            
debug?() click to toggle source
 
               # File rubygems/resolver.rb, line 181
def debug?
  DEBUG_RESOLVER
end
            
dependencies_for(specification) click to toggle source
 
               # File rubygems/resolver.rb, line 259
def dependencies_for(specification)
  return [] if @ignore_dependencies
  spec = specification.spec
  requests(spec, specification)
end
            
name_for(dependency) click to toggle source
 
               # File rubygems/resolver.rb, line 269
def name_for(dependency)
  dependency.name
end
            
output() click to toggle source
 
               # File rubygems/resolver.rb, line 177
def output
  @output ||= debug? ? $stdout : File.open(IO::NULL, 'w')
end
            
requirement_satisfied_by?(requirement, activated, spec) click to toggle source
 
               # File rubygems/resolver.rb, line 265
def requirement_satisfied_by?(requirement, activated, spec)
  requirement.matches_spec? spec
end
            
resolve() click to toggle source

Proceed with resolution! Returns an array of ActivationRequest objects.

 
               # File rubygems/resolver.rb, line 190
def resolve
  locking_dg = Molinillo::DependencyGraph.new
  Molinillo::Resolver.new(self, self).resolve(@needed.map { |d| DependencyRequest.new d, nil }, locking_dg).tsort.map(&:payload).compact
rescue Molinillo::VersionConflict => e
  conflict = e.conflicts.values.first
  raise Gem::DependencyResolutionError, Conflict.new(conflict.requirement_trees.first.first, conflict.existing, conflict.requirement)
ensure
  @output.close if defined?(@output) and !debug?
end
            
search_for(dependency) click to toggle source
 
               # File rubygems/resolver.rb, line 229
def search_for(dependency)
  possibles, all = find_possible(dependency)
  if !@soft_missing && possibles.empty?
    @missing << dependency
    exc = Gem::UnsatisfiableDependencyError.new dependency, all
    exc.errors = @set.errors
    raise exc
  end

  groups = Hash.new { |hash, key| hash[key] = [] }

  # create groups & sources in the same loop
  sources = possibles.map do |spec|
    source = spec.source
    groups[source] << spec
    source
  end.uniq.reverse

  activation_requests = []

  sources.each do |source|
    groups[source].
      sort_by { |spec| [spec.version, Gem::Platform.local =~ spec.platform ? 1 : 0] }.
      map { |spec| ActivationRequest.new spec, dependency }.
      each { |activation_request| activation_requests << activation_request }
  end

  activation_requests
end
            
sort_dependencies(dependencies, activated, conflicts) click to toggle source
 
               # File rubygems/resolver.rb, line 278
def sort_dependencies(dependencies, activated, conflicts)
  dependencies.sort_by.with_index do |dependency, i|
    name = name_for(dependency)
    [
      activated.vertex_named(name).payload ? 0 : 1,
      amount_constrained(dependency),
      conflicts[name] ? 0 : 1,
      activated.vertex_named(name).payload ? 0 : search_for(dependency).count,
      i # for stable sort
    ]
  end
end