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

[rubygems/rubygems] Improve "gem not found in source" errors

When printing sources inside these error messages, it's useful to only
consider the current state of the source. For example, when requiring
`bundler/setup`, the source shouldn't be configured to be able to hit
the network, so the error message should only mention "locally installed
gems" to make that more clear.

30eb14f853
This commit is contained in:
David Rodríguez 2021-07-31 14:10:59 +02:00 committed by Hiroshi SHIBATA
parent 2e850e0038
commit 0b4dbe2e6a
Notes: git 2021-08-31 19:07:20 +09:00
7 changed files with 30 additions and 7 deletions

View file

@ -272,7 +272,7 @@ module Bundler
rescue GemfileNotFound rescue GemfileNotFound
nil nil
end end
message = String.new("Could not find gem '#{SharedHelpers.pretty_dependency(requirement)}' in #{source}#{cache_message}.\n") message = String.new("Could not find gem '#{SharedHelpers.pretty_dependency(requirement)}' in #{source.to_err}#{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
@ -371,7 +371,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}.\n" "in #{relevant_source.to_err}.\n"
end end
end end
end, end,

View file

@ -67,6 +67,10 @@ module Bundler
"#<#{self.class}:0x#{object_id} #{self}>" "#<#{self.class}:0x#{object_id} #{self}>"
end end
def to_err
to_s
end
def path? def path?
instance_of?(Bundler::Source::Path) instance_of?(Bundler::Source::Path)
end end

View file

@ -96,11 +96,22 @@ module Bundler
out << " specs:\n" out << " specs:\n"
end end
def to_err
if remotes.empty?
"locally installed gems"
elsif @allow_remote
"rubygems repository #{remote_names} or installed locally"
elsif @allow_cached
"cached gems from rubygems repository #{remote_names} or installed locally"
else
"locally installed gems"
end
end
def to_s def to_s
if remotes.empty? if remotes.empty?
"locally installed gems" "locally installed gems"
else else
remote_names = remotes.map(&:to_s).join(", ")
"rubygems repository #{remote_names} or installed locally" "rubygems repository #{remote_names} or installed locally"
end end
end end
@ -319,6 +330,10 @@ module Bundler
protected protected
def remote_names
remotes.map(&:to_s).join(", ")
end
def credless_remotes def credless_remotes
remotes.map(&method(:suppress_configured_credentials)) remotes.map(&method(:suppress_configured_credentials))
end end

View file

@ -16,6 +16,10 @@ module Bundler
@index @index
end end
def to_err
to_s
end
def to_s def to_s
"any of the sources" "any of the sources"
end end

View file

@ -836,7 +836,7 @@ RSpec.describe "bundle exec" do
let(:exit_code) { Bundler::GemNotFound.new.status_code } let(:exit_code) { Bundler::GemNotFound.new.status_code }
let(:expected) { "" } let(:expected) { "" }
let(:expected_err) { <<-EOS.strip } let(:expected_err) { <<-EOS.strip }
Could not find gem 'rack (= 2)' in rubygems repository #{file_uri_for(gem_repo1)}/ or installed locally. Could not find gem 'rack (= 2)' in locally installed gems.
The source contains the following versions of 'rack': 0.9.1, 1.0.0 The source contains the following versions of 'rack': 0.9.1, 1.0.0
Run `bundle install` to install missing gems. Run `bundle install` to install missing gems.
EOS EOS
@ -863,7 +863,7 @@ Run `bundle install` to install missing gems.
let(:exit_code) { Bundler::GemNotFound.new.status_code } let(:exit_code) { Bundler::GemNotFound.new.status_code }
let(:expected) { "" } let(:expected) { "" }
let(:expected_err) { <<-EOS.strip } let(:expected_err) { <<-EOS.strip }
Could not find gem 'rack (= 2)' in rubygems repository #{file_uri_for(gem_repo1)}/ or installed locally. Could not find gem 'rack (= 2)' in locally installed gems.
The source contains the following versions of 'rack': 1.0.0 The source contains the following versions of 'rack': 1.0.0
Run `bundle install` to install missing gems. Run `bundle install` to install missing gems.
EOS EOS

View file

@ -86,7 +86,7 @@ RSpec.describe "bundle lock" do
it "does not fetch remote specs when using the --local option" do it "does not fetch remote specs when using the --local option" do
bundle "lock --update --local", :raise_on_error => false bundle "lock --update --local", :raise_on_error => false
expect(err).to match(/installed locally/) expect(err).to match(/locally installed gems/)
end end
it "works with --gemfile flag" do it "works with --gemfile flag" do

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) default_source = instance_double("Bundler::Source::Rubygems", :specs => @index, :to_err => "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