diff --git a/lib/bundled_gems.rb b/lib/bundled_gems.rb index 932949576b..a42b12ac23 100644 --- a/lib/bundled_gems.rb +++ b/lib/bundled_gems.rb @@ -34,6 +34,8 @@ module Gem::BUNDLED_GEMS "logger" => "3.5.0", }.freeze + SINCE_FAST_PATH = SINCE.transform_keys { |g| g.sub(/\A.*\-/, "") }.freeze + EXACT = { "kconv" => "nkf", }.freeze @@ -92,6 +94,13 @@ module Gem::BUNDLED_GEMS def self.warning?(name, specs: nil) # name can be a feature name or a file path with String or Pathname feature = File.path(name) + + if feature.include?("/") + return unless SINCE_FAST_PATH[File.basename(feature, ".*")] + else + return unless SINCE_FAST_PATH[feature] + end + # bootsnap expands `require "csv"` to `require "#{LIBDIR}/csv.rb"`, # and `require "syslog"` to `require "#{ARCHDIR}/syslog.so"`. name = feature.delete_prefix(ARCHDIR) diff --git a/test/test_bundled_gems.rb b/test/test_bundled_gems.rb new file mode 100644 index 0000000000..36f7324336 --- /dev/null +++ b/test/test_bundled_gems.rb @@ -0,0 +1,35 @@ +require_relative "rubygems/helper" +require "rubygems" +require "bundled_gems" + +class TestBundlerGem < Gem::TestCase + def setup + Gem::BUNDLED_GEMS::WARNED.clear + end + + def teardown + Gem::BUNDLED_GEMS::WARNED.clear + end + + def test_warning + assert Gem::BUNDLED_GEMS.warning?("rss", specs: {}) + assert_nil Gem::BUNDLED_GEMS.warning?("rss", specs: {}) + end + + def test_no_warning_warning + assert_nil Gem::BUNDLED_GEMS.warning?("some_gem", specs: {}) + assert_nil Gem::BUNDLED_GEMS.warning?("/path/to/some_gem.rb", specs: {}) + end + + def test_warning_libdir + path = File.join(::RbConfig::CONFIG.fetch("rubylibdir"), "rss.rb") + assert Gem::BUNDLED_GEMS.warning?(path, specs: {}) + assert_nil Gem::BUNDLED_GEMS.warning?(path, specs: {}) + end + + def test_warning_archdir + path = File.join(::RbConfig::CONFIG.fetch("rubyarchdir"), "syslog.so") + assert Gem::BUNDLED_GEMS.warning?(path, specs: {}) + assert_nil Gem::BUNDLED_GEMS.warning?(path, specs: {}) + end +end