From 7a111bebbb0f5d5a45d89dd77bc9e01ff55fe5dc Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Fri, 1 May 2026 11:50:19 +0900 Subject: [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) --- lib/bundler/override.rb | 14 ++++++++------ spec/bundler/bundler/override_spec.rb | 6 ++++++ 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")) -- cgit v1.2.3