summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHiroshi SHIBATA <hsbt@ruby-lang.org>2026-05-07 18:37:04 +0900
committergit <svn-admin@ruby-lang.org>2026-05-08 06:43:37 +0000
commit29229d82bec6256e6b4f93486d772014cead9d8c (patch)
tree2dc9bd6f6bd2f162b75ed0197bfeaa820b3a0d41
parentee9e92082784761849b4f9d5244af22c3bf407ba (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.rb2
-rw-r--r--lib/bundler/override.rb4
-rw-r--r--lib/bundler/resolver.rb2
-rw-r--r--spec/bundler/bundler/override_spec.rb22
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