diff options
| author | Hiroshi SHIBATA <hsbt@ruby-lang.org> | 2026-05-07 18:37:04 +0900 |
|---|---|---|
| committer | git <svn-admin@ruby-lang.org> | 2026-05-08 06:43:37 +0000 |
| commit | 29229d82bec6256e6b4f93486d772014cead9d8c (patch) | |
| tree | 2dc9bd6f6bd2f162b75ed0197bfeaa820b3a0d41 | |
| parent | ee9e92082784761849b4f9d5244af22c3bf407ba (diff) | |
[ruby/rubygems] Consolidate Override lookup with Override.find_for
Definition#apply_override_to, Definition#converge_dependencies, and
Resolver#apply_overrides each duplicated the same find expression.
Centralizing it on Override prepares for upcoming fields (and the :all
target) without repeating the predicate in every call site.
https://github.com/ruby/rubygems/commit/0c4424d5f3
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
| -rw-r--r-- | lib/bundler/definition.rb | 2 | ||||
| -rw-r--r-- | lib/bundler/override.rb | 4 | ||||
| -rw-r--r-- | lib/bundler/resolver.rb | 2 | ||||
| -rw-r--r-- | spec/bundler/bundler/override_spec.rb | 22 |
4 files changed, 28 insertions, 2 deletions
diff --git a/lib/bundler/definition.rb b/lib/bundler/definition.rb index a64b67cb44..3cfe401d2a 100644 --- a/lib/bundler/definition.rb +++ b/lib/bundler/definition.rb @@ -644,7 +644,7 @@ module Bundler end def apply_override_to(dep) - override = @overrides.find {|o| o.target == dep.name && o.field == :version } + override = Override.find_for(@overrides, dep.name, :version) return dep unless override new_dep = dep.dup new_dep.instance_variable_set(:@requirement, override.apply_to(dep.requirement)) diff --git a/lib/bundler/override.rb b/lib/bundler/override.rb index 1ca6d2fde5..9d0db30d6a 100644 --- a/lib/bundler/override.rb +++ b/lib/bundler/override.rb @@ -4,6 +4,10 @@ module Bundler class Override UPPER_BOUND_OPERATORS = ["<", "<="].freeze + def self.find_for(overrides, name, field) + overrides.find {|o| o.target == name && o.field == field } + end + attr_reader :target, :field, :operation def initialize(target, field, operation) diff --git a/lib/bundler/resolver.rb b/lib/bundler/resolver.rb index 5e934e2a12..e8dc349e50 100644 --- a/lib/bundler/resolver.rb +++ b/lib/bundler/resolver.rb @@ -530,7 +530,7 @@ module Bundler return dependencies if @base.overrides.empty? dependencies.map do |dep| - override = @base.overrides.find {|o| o.target == dep.name && o.field == :version } + override = Override.find_for(@base.overrides, dep.name, :version) next dep unless override Gem::Dependency.new(dep.name, override.apply_to(dep.requirement)) end diff --git a/spec/bundler/bundler/override_spec.rb b/spec/bundler/bundler/override_spec.rb index da3b5aad87..e0ef4ed54d 100644 --- a/spec/bundler/bundler/override_spec.rb +++ b/spec/bundler/bundler/override_spec.rb @@ -1,6 +1,28 @@ # frozen_string_literal: true RSpec.describe Bundler::Override do + describe ".find_for" do + it "returns the matching override by target and field" do + a = described_class.new("rails", :version, ">= 8.0") + b = described_class.new("nokogiri", :version, :ignore_upper) + expect(described_class.find_for([a, b], "rails", :version)).to be(a) + end + + it "returns nil when no override matches the target" do + a = described_class.new("rails", :version, ">= 8.0") + expect(described_class.find_for([a], "sinatra", :version)).to be_nil + end + + it "returns nil when no override matches the field" do + a = described_class.new("rails", :version, ">= 8.0") + expect(described_class.find_for([a], "rails", :required_ruby_version)).to be_nil + end + + it "returns nil for an empty overrides list" do + expect(described_class.find_for([], "rails", :version)).to be_nil + end + end + describe "#apply_to" do context "when operation is a version spec string" do it "replaces the existing requirement entirely" do |
