diff options
| author | Chris Hasiński <krzysztof.hasinski@gmail.com> | 2026-01-19 18:35:52 +0100 |
|---|---|---|
| committer | Takashi Kokubun <takashikkbn@gmail.com> | 2026-02-12 10:41:49 -0800 |
| commit | 485a6037916fa09b07429d41e8699586271eb91c (patch) | |
| tree | b08e4b3ac53739a7db628bcad90a4a675cb4dc4f | |
| parent | f3bfffe8565b08b3426003aebbe328a0ecedad26 (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.rb | 9 | ||||
| -rw-r--r-- | 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: {}) |
