summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Hasiński <krzysztof.hasinski@gmail.com>2026-01-19 18:35:52 +0100
committerTakashi Kokubun <takashikkbn@gmail.com>2026-02-12 10:41:49 -0800
commit485a6037916fa09b07429d41e8699586271eb91c (patch)
treeb08e4b3ac53739a7db628bcad90a4a675cb4dc4f
parentf3bfffe8565b08b3426003aebbe328a0ecedad26 (diff)
Fix bundled gems warning for all subfeatures of hyphenated gems
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
-rw-r--r--lib/bundled_gems.rb9
-rw-r--r--test/test_bundled_gems.rb8
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: {})