summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHiroshi SHIBATA <hsbt@ruby-lang.org>2026-05-01 11:50:19 +0900
committergit <svn-admin@ruby-lang.org>2026-05-07 09:24:50 +0000
commit7a111bebbb0f5d5a45d89dd77bc9e01ff55fe5dc (patch)
tree5dc45e5c0c4dce4f833ce8aff86ca2db23cda3c1
parent199af7f7cb1130b19d46ddf4208b18eee8cc9181 (diff)
[ruby/rubygems] Preserve != exclusions in Override :ignore_upper
Switch remove_upper_bounds from a lower-bound allow-list to an upper-bound reject-list so that operators other than <, <=, and ~> are kept verbatim. The previous logic, inherited from Shopify/bundler-ignore-dependency, dropped != exclusions and could silently re-allow versions the user had explicitly pinned out (e.g. >= 1.0, != 1.5.0, < 2.0 collapsed to >= 1.0). https://github.com/ruby/rubygems/commit/7d73d9e035 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
-rw-r--r--lib/bundler/override.rb14
-rw-r--r--spec/bundler/bundler/override_spec.rb6
2 files changed, 14 insertions, 6 deletions
diff --git a/lib/bundler/override.rb b/lib/bundler/override.rb
index d07dad00ea..1ca6d2fde5 100644
--- a/lib/bundler/override.rb
+++ b/lib/bundler/override.rb
@@ -2,7 +2,7 @@
module Bundler
class Override
- LOWER_BOUND_OPERATORS = [">=", ">", "="].freeze
+ UPPER_BOUND_OPERATORS = ["<", "<="].freeze
attr_reader :target, :field, :operation
@@ -30,17 +30,19 @@ module Bundler
def remove_upper_bounds(requirement)
return Gem::Requirement.default if requirement.nil? || requirement.none?
- lower_bounds = requirement.requirements.filter_map do |op, version|
- if LOWER_BOUND_OPERATORS.include?(op)
- [op, version]
+ preserved = requirement.requirements.filter_map do |op, version|
+ if UPPER_BOUND_OPERATORS.include?(op)
+ nil
elsif op == "~>"
[">=", version]
+ else
+ [op, version]
end
end
- return Gem::Requirement.default if lower_bounds.empty?
+ return Gem::Requirement.default if preserved.empty?
- Gem::Requirement.new(lower_bounds.map {|op, v| "#{op} #{v}" })
+ Gem::Requirement.new(preserved.map {|op, v| "#{op} #{v}" })
end
end
end
diff --git a/spec/bundler/bundler/override_spec.rb b/spec/bundler/bundler/override_spec.rb
index bc813e52fc..da3b5aad87 100644
--- a/spec/bundler/bundler/override_spec.rb
+++ b/spec/bundler/bundler/override_spec.rb
@@ -35,6 +35,12 @@ RSpec.describe Bundler::Override do
expect(result).to eq(Gem::Requirement.new(">= 1.5"))
end
+ it "preserves != exclusion constraints" do
+ override = described_class.new("rails", :version, :ignore_upper)
+ result = override.apply_to(Gem::Requirement.new(">= 1.0", "!= 1.5.0", "< 2.0"))
+ expect(result).to eq(Gem::Requirement.new(">= 1.0", "!= 1.5.0"))
+ end
+
it "returns the default requirement when only upper bounds remain" do
override = described_class.new("rails", :version, :ignore_upper)
result = override.apply_to(Gem::Requirement.new("< 2.0"))