123456789_123456789_123456789_123456789_123456789_

Class: Gem::Resolver::Conflict

Relationships & Source Files
Inherits: Object
Defined in: lib/rubygems/resolver/conflict.rb

Overview

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

Class Method Summary

Instance Attribute Summary

  • #activated readonly

    The specification that was activated prior to the conflict.

  • #dependency readonly

    The dependency that is in conflict with the activated gem.

  • #failed_dep readonly Internal use only

Instance Method Summary

Constructor Details

.new(dependency, activated, failed_dep = dependency) ⇒ Conflict

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

[ GitHub ]

  
# File 'lib/rubygems/resolver/conflict.rb', line 23

def initialize(dependency, activated, failed_dep=dependency)
  @dependency = dependency
  @activated = activated
  @failed_dep = failed_dep
end

Instance Attribute Details

#activated (readonly)

The specification that was activated prior to the conflict

[ GitHub ]

  
# File 'lib/rubygems/resolver/conflict.rb', line 10

attr_reader :activated

#dependency (readonly)

The dependency that is in conflict with the activated gem.

[ GitHub ]

  
# File 'lib/rubygems/resolver/conflict.rb', line 15

attr_reader :dependency

#failed_dep (readonly)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rubygems/resolver/conflict.rb', line 17

attr_reader :failed_dep # :nodoc:

Instance Method Details

#==(other)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rubygems/resolver/conflict.rb', line 29

def ==(other) # :nodoc:
  self.class === other &&
    @dependency == other.dependency &&
    @activated  == other.activated  &&
    @failed_dep == other.failed_dep
end

#conflicting_dependencies

Return the 2 dependency objects that conflicted

[ GitHub ]

  
# File 'lib/rubygems/resolver/conflict.rb', line 46

def conflicting_dependencies
  [@failed_dep.dependency, @activated.request.dependency]
end

#explain

A string explanation of the conflict.

[ GitHub ]

  
# File 'lib/rubygems/resolver/conflict.rb', line 39

def explain
  "<Conflict wanted: #{@failed_dep}, had: #{activated.spec.full_name}>"
end

#explanation

Explanation of the conflict used by exceptions to print useful messages

[ GitHub ]

  
# File 'lib/rubygems/resolver/conflict.rb', line 53

def explanation
  activated   = @activated.spec.full_name
  dependency  = @failed_dep.dependency
  requirement = dependency.requirement
  alternates  = dependency.matching_specs.map {|spec| spec.full_name }

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

Gems matching %s:
  %s
    MATCHING

    matching = matching % [
      dependency,
      alternates.join(", "),
    ]
  end

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

Conflicting dependency chains:
  %s

versus:
  %s
%s
  EXPLANATION

  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) ⇒ Boolean

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

[ GitHub ]

  
# File 'lib/rubygems/resolver/conflict.rb', line 95

def for_spec?(spec)
  @dependency.name == spec.name
end

#pretty_print(q)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rubygems/resolver/conflict.rb', line 99

def pretty_print(q) # :nodoc:
  q.group 2, "[Dependency conflict: ", "]" do
    q.breakable

    q.text "activated "
    q.pp @activated

    q.breakable
    q.text " dependency "
    q.pp @dependency

    q.breakable
    if @dependency == @failed_dep
      q.text " failed"
    else
      q.text " failed dependency "
      q.pp @failed_dep
    end
  end
end

#request_path(current)

Path of activations from the current list.

[ GitHub ]

  
# File 'lib/rubygems/resolver/conflict.rb', line 123

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}"

      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

[ GitHub ]

  
# File 'lib/rubygems/resolver/conflict.rb', line 150

def requester
  @failed_dep.requester
end