Class
Used internally to indicate that a dependency conflicted with a spec that would be activated.
Attributes
Read
The specification that was activated prior to the conflict
Read
The dependency that is in conflict with the activated gem.
Class Methods
lib/rubygems/resolver/conflict.rb
View on GitHub
# File tmp/rubies/ruby-3.0.5/lib/rubygems/resolver/conflict.rb, line 23
def initialize(dependency, activated, failed_dep=dependency)
@dependency = dependency
@activated = activated
@failed_dep = failed_dep
end
Creates a new resolver conflict when dependency
is in conflict with an already activated
specification.
Instance Methods
lib/rubygems/resolver/conflict.rb
View on GitHub
# File tmp/rubies/ruby-3.0.5/lib/rubygems/resolver/conflict.rb, line 46
def conflicting_dependencies
[@failed_dep.dependency, @activated.request.dependency]
end
Return the 2 dependency objects that conflicted
#
lib/rubygems/resolver/conflict.rb
View on GitHub
# File tmp/rubies/ruby-3.0.5/lib/rubygems/resolver/conflict.rb, line 39
def explain
"<Conflict wanted: #{@failed_dep}, had: #{activated.spec.full_name}>"
end
A string explanation of the conflict.
lib/rubygems/resolver/conflict.rb
View on GitHub
# File tmp/rubies/ruby-3.0.5/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
Explanation of the conflict used by exceptions to print useful messages
lib/rubygems/resolver/conflict.rb
View on GitHub
# File tmp/rubies/ruby-3.0.5/lib/rubygems/resolver/conflict.rb, line 95
def for_spec?(spec)
@dependency.name == spec.name
end
Returns true if the conflicting dependency’s name matches spec
.
lib/rubygems/resolver/conflict.rb
View on GitHub
# File tmp/rubies/ruby-3.0.5/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
Path of activations from the current
list.
lib/rubygems/resolver/conflict.rb
View on GitHub
# File tmp/rubies/ruby-3.0.5/lib/rubygems/resolver/conflict.rb, line 150
def requester
@failed_dep.requester
end
Return the Specification that listed the dependency