diff --git a/lib/bundled_gems.rb b/lib/bundled_gems.rb index f819134c96..087f94a9ac 100644 --- a/lib/bundled_gems.rb +++ b/lib/bundled_gems.rb @@ -52,6 +52,10 @@ module Gem::BUNDLED_GEMS "syslog" => true, }.freeze + OPTIONAL = { + "fiddle" => true, + }.freeze + WARNED = {} # unfrozen conf = ::RbConfig::CONFIG @@ -69,9 +73,15 @@ module Gem::BUNDLED_GEMS [::Kernel.singleton_class, ::Kernel].each do |kernel_class| kernel_class.send(:alias_method, :no_warning_require, :require) kernel_class.send(:define_method, :require) do |name| - result = kernel_class.send(:no_warning_require, name) - if result && message = ::Gem::BUNDLED_GEMS.warning?(name, specs: spec_names) + message = ::Gem::BUNDLED_GEMS.warning?(name, specs: spec_names) + begin + result = kernel_class.send(:no_warning_require, name) + rescue LoadError => e + result = e + end + + if (result || !OPTIONAL[name]) && message if ::Gem::BUNDLED_GEMS.uplevel > 0 Kernel.warn message, uplevel: ::Gem::BUNDLED_GEMS.uplevel else @@ -79,8 +89,13 @@ module Gem::BUNDLED_GEMS end end - result + if result.is_a?(LoadError) + raise result + else + result + end end + if kernel_class == ::Kernel kernel_class.send(:private, :require) else