1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

[rubygems/rubygems] Improve sources representation

We have two representations of a source. Once used for sorting, which
should not depend on the source's state, but solely on its static
information, like remotes. Another one used for error and informational
messages, which should properly inform about the exact state of the
source when the message is printed.

This commit makes the latter be the default implementation of `to_s`, so
that error and informational messages are more accurate by default.

https://github.com/rubygems/rubygems/commit/b5f2b88957
This commit is contained in:
David Rodríguez 2021-11-11 23:58:40 +01:00 committed by git
parent 7d974cc56f
commit 248fae0ec4
9 changed files with 26 additions and 21 deletions

View file

@ -66,7 +66,7 @@ module Bundler
if locked_gems = Bundler.definition.locked_gems if locked_gems = Bundler.definition.locked_gems
previous_locked_info = locked_gems.specs.reduce({}) do |h, s| previous_locked_info = locked_gems.specs.reduce({}) do |h, s|
h[s.name] = { :spec => s, :version => s.version, :source => s.source.to_s } h[s.name] = { :spec => s, :version => s.version, :source => s.source.identifier }
h h
end end
end end
@ -95,7 +95,7 @@ module Bundler
end end
locked_source = locked_info[:source] locked_source = locked_info[:source]
new_source = new_spec.source.to_s new_source = new_spec.source.identifier
next if locked_source != new_source next if locked_source != new_source
new_version = new_spec.version new_version = new_spec.version

View file

@ -283,6 +283,7 @@ module Bundler
def to_s def to_s
"plugin source for #{@type} with uri #{@uri}" "plugin source for #{@type} with uri #{@uri}"
end end
alias_method :identifier, :to_s
# Note: Do not override if you don't know what you are doing. # Note: Do not override if you don't know what you are doing.
def include?(other) def include?(other)

View file

@ -270,7 +270,7 @@ module Bundler
rescue GemfileNotFound rescue GemfileNotFound
nil nil
end end
message = String.new("Could not find gem '#{SharedHelpers.pretty_dependency(requirement)}' in #{source.to_err}#{cache_message}.\n") message = String.new("Could not find gem '#{SharedHelpers.pretty_dependency(requirement)}' in #{source}#{cache_message}.\n")
message << "The source contains the following versions of '#{name}': #{formatted_versions_with_platforms(versions_with_platforms)}" if versions_with_platforms.any? message << "The source contains the following versions of '#{name}': #{formatted_versions_with_platforms(versions_with_platforms)}" if versions_with_platforms.any?
end end
raise GemNotFound, message raise GemNotFound, message
@ -369,7 +369,7 @@ module Bundler
o << if metadata_requirement o << if metadata_requirement
"is not available in #{relevant_source}" "is not available in #{relevant_source}"
else else
"in #{relevant_source.to_err}.\n" "in #{relevant_source}.\n"
end end
end end
end, end,

View file

@ -67,7 +67,7 @@ module Bundler
"#<#{self.class}:0x#{object_id} #{self}>" "#<#{self.class}:0x#{object_id} #{self}>"
end end
def to_err def identifier
to_s to_s
end end

View file

@ -98,26 +98,30 @@ module Bundler
out << " specs:\n" out << " specs:\n"
end end
def to_err def to_s
if remotes.empty? if remotes.empty?
"locally installed gems" "locally installed gems"
elsif @allow_remote elsif @allow_remote && @allow_cached && @allow_local
"rubygems repository #{remote_names}, cached gems or installed locally"
elsif @allow_remote && @allow_local
"rubygems repository #{remote_names} or installed locally" "rubygems repository #{remote_names} or installed locally"
elsif @allow_cached elsif @allow_remote
"cached gems from rubygems repository #{remote_names} or installed locally" "rubygems repository #{remote_names}"
elsif @allow_cached && @allow_local
"cached gems or installed locally"
else else
"locally installed gems" "locally installed gems"
end end
end end
def to_s def identifier
if remotes.empty? if remotes.empty?
"locally installed gems" "locally installed gems"
else else
"rubygems repository #{remote_names} or installed locally" "rubygems repository #{remote_names}"
end end
end end
alias_method :name, :to_s alias_method :name, :identifier
def specs def specs
@specs ||= begin @specs ||= begin

View file

@ -16,7 +16,7 @@ module Bundler
@index @index
end end
def to_err def identifier
to_s to_s
end end

View file

@ -106,14 +106,14 @@ module Bundler
end end
def lock_other_sources def lock_other_sources
(path_sources + git_sources + plugin_sources).sort_by(&:to_s) (path_sources + git_sources + plugin_sources).sort_by(&:identifier)
end end
def lock_rubygems_sources def lock_rubygems_sources
if merged_gem_lockfile_sections? if merged_gem_lockfile_sections?
[combine_rubygems_sources] [combine_rubygems_sources]
else else
rubygems_sources.sort_by(&:to_s) rubygems_sources.sort_by(&:identifier)
end end
end end
@ -211,7 +211,7 @@ module Bundler
end end
def equivalent_sources?(lock_sources, replacement_sources) def equivalent_sources?(lock_sources, replacement_sources)
lock_sources.sort_by(&:to_s) == replacement_sources.sort_by(&:to_s) lock_sources.sort_by(&:identifier) == replacement_sources.sort_by(&:identifier)
end end
def equivalent_source?(source, other_source) def equivalent_source?(source, other_source)

View file

@ -1336,8 +1336,8 @@ RSpec.describe "bundle install with gems on multiple sources" do
G G
expect(err).to eq strip_whitespace(<<-EOS).strip expect(err).to eq strip_whitespace(<<-EOS).strip
Warning: The gem 'rack' was found in multiple relevant sources. Warning: The gem 'rack' was found in multiple relevant sources.
* rubygems repository https://gem.repo1/ or installed locally * rubygems repository https://gem.repo1/
* rubygems repository https://gem.repo4/ or installed locally * rubygems repository https://gem.repo4/
You should add this gem to the source block for the source you wish it to be installed from. You should add this gem to the source block for the source you wish it to be installed from.
EOS EOS
expect(last_command).to be_success expect(last_command).to be_success
@ -1366,8 +1366,8 @@ RSpec.describe "bundle install with gems on multiple sources" do
expect(last_command).to be_failure expect(last_command).to be_failure
expect(err).to eq strip_whitespace(<<-EOS).strip expect(err).to eq strip_whitespace(<<-EOS).strip
The gem 'rack' was found in multiple relevant sources. The gem 'rack' was found in multiple relevant sources.
* rubygems repository https://gem.repo1/ or installed locally * rubygems repository https://gem.repo1/
* rubygems repository https://gem.repo4/ or installed locally * rubygems repository https://gem.repo4/
You must add this gem to the source block for the source you wish it to be installed from. You must add this gem to the source block for the source you wish it to be installed from.
EOS EOS
expect(the_bundle).not_to be_locked expect(the_bundle).not_to be_locked

View file

@ -17,7 +17,7 @@ module Spec
def resolve(args = []) def resolve(args = [])
@platforms ||= ["ruby"] @platforms ||= ["ruby"]
deps = [] deps = []
default_source = instance_double("Bundler::Source::Rubygems", :specs => @index, :to_err => "locally install gems") default_source = instance_double("Bundler::Source::Rubygems", :specs => @index, :to_s => "locally install gems")
source_requirements = { :default => default_source } source_requirements = { :default => default_source }
@deps.each do |d| @deps.each do |d|
source_requirements[d.name] = d.source = default_source source_requirements[d.name] = d.source = default_source