class Gem::Resolver::Conflict

Used internally to indicate that a dependency conflicted with a spec that would be activated.

Attributes

activated [R]

The specification that was activated prior to the conflict

dependency [R]

The dependency that is in conflict with the activated gem.

Public Class Methods

new (dependency, activated, failed_dep=dependency)

Creates a new resolver conflict when dependency is in conflict with an already activated specification.

# File lib/rubygems/resolver/conflict.rb, line 24
def initialize(dependency, activated, failed_dep=dependency)
  @dependency = dependency
  @activated = activated
  @failed_dep = failed_dep
end

Public Instance Methods

conflicting_dependencies ()

Return the 2 dependency objects that conflicted

# File lib/rubygems/resolver/conflict.rb, line 47
def conflicting_dependencies
  [@failed_dep.dependency, @activated.request.dependency]
end
explain ()

A string explanation of the conflict.

# File lib/rubygems/resolver/conflict.rb, line 40
def explain
  "<Conflict wanted: #{@failed_dep}, had: #{activated.spec.full_name}>"
end
explanation ()

Explanation of the conflict used by exceptions to print useful messages

# File lib/rubygems/resolver/conflict.rb, line 54
  def explanation
    activated   = @activated.spec.full_name
    dependency  = @failed_dep.dependency
    requirement = dependency.requirement
    alternates  = dependency.matching_specs.map(&:full_name)

    unless alternates.empty?
      matching = <<-MATCHING.chomp

  Gems matching %s:
    %s
      MATCHING

      matching = format(matching, dependency, alternates.join(", "))
    end

    explanation = <<-EXPLANATION
  Activated %s
  which does not match conflicting dependency (%s)

  Conflicting dependency chains:
    %s

  versus:
    %s
%s
    EXPLANATION

    format(explanation, activated, requirement, request_path(@activated).reverse.join(", depends on\n    "), request_path(@failed_dep).reverse.join(", depends on\n    "), matching)
  end
for_spec? (spec)

Returns true if the conflicting dependency’s name matches spec.

# File lib/rubygems/resolver/conflict.rb, line 88
def for_spec?(spec)
  @dependency.name == spec.name
end
request_path (current)

Path of activations from the current list.

# File lib/rubygems/resolver/conflict.rb, line 116
def request_path(current)
  path = []

  while current do
    case current
    when Gem::Resolver::ActivationRequest then
      path <<
        "#{current.request.dependency}, #{current.spec.version} activated"

      current = current.parent
    when Gem::Resolver::DependencyRequest then
      path << current.dependency.to_s

      current = current.requester
    else
      raise Gem::Exception, "[BUG] unknown request class #{current.class}"
    end
  end

  path = ["user request (gem command or Gemfile)"] if path.empty?

  path
end
requester ()

Return the Specification that listed the dependency

# File lib/rubygems/resolver/conflict.rb, line 143
def requester
  @failed_dep.requester
end