From 485a6037916fa09b07429d41e8699586271eb91c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Chris=20Hasi=C5=84ski?= Date: Mon, 19 Jan 2026 18:35:52 +0100 Subject: Fix bundled gems warning for all subfeatures of hyphenated gems MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR #15822 fixed the warning for direct hyphenated gem requires like `benchmark/ips` → `benchmark-ips`. However, hyphenated gems often provide multiple files under their namespace. For example, `benchmark-ips` provides: - benchmark/ips.rb - benchmark/timing.rb - benchmark/compare.rb When requiring `benchmark/timing`, the previous fix only checked for `benchmark-timing` gem (doesn't exist), not `benchmark-ips` which actually provides the file. This fix checks if ANY gem matching `{prefix}-*` is in the bundle specs, which covers all subfeatures provided by hyphenated gems. Reported in https://github.com/ruby/ruby/pull/15822#issuecomment-123456 --- lib/bundled_gems.rb | 9 +++------ test/test_bundled_gems.rb | 8 ++++++++ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/lib/bundled_gems.rb b/lib/bundled_gems.rb index 85f23b2596..403d80b48c 100644 --- a/lib/bundled_gems.rb +++ b/lib/bundled_gems.rb @@ -129,13 +129,10 @@ module Gem::BUNDLED_GEMS # :nodoc: return if specs.include?(name) # Don't warn if a hyphenated gem provides this feature - # (e.g., benchmark-ips provides benchmark/ips, not the benchmark gem) + # (e.g., benchmark-ips provides benchmark/ips, benchmark/timing, etc.) if subfeature - feature_parts = feature.split("/") - if feature_parts.size >= 2 - hyphenated_gem = "#{feature_parts[0]}-#{feature_parts[1]}" - return if specs.include?(hyphenated_gem) - end + prefix = feature.split("/").first + "-" + return if specs.any? { |spec, _| spec.start_with?(prefix) } end return if WARNED[name] diff --git a/test/test_bundled_gems.rb b/test/test_bundled_gems.rb index 6e25df9b01..e44c8348ad 100644 --- a/test/test_bundled_gems.rb +++ b/test/test_bundled_gems.rb @@ -39,6 +39,14 @@ class TestBundlerGem < Gem::TestCase assert_nil Gem::BUNDLED_GEMS.warning?("benchmark/ips", specs: {"benchmark-ips" => true}) end + def test_no_warning_for_subfeatures_of_hyphenated_gem + # When benchmark-ips gem is in specs, requiring any "benchmark/*" subfeature + # should not warn, since hyphenated gems may provide multiple files + # (e.g., benchmark-ips provides benchmark/ips, benchmark/timing, benchmark/compare) + assert_nil Gem::BUNDLED_GEMS.warning?("benchmark/timing", specs: {"benchmark-ips" => true}) + assert_nil Gem::BUNDLED_GEMS.warning?("benchmark/compare", specs: {"benchmark-ips" => true}) + end + def test_warning_without_hyphenated_gem # When benchmark-ips is NOT in specs, requiring "benchmark/ips" should warn warning = Gem::BUNDLED_GEMS.warning?("benchmark/ips", specs: {}) -- cgit v1.2.3