diff options
| author | Hiroshi SHIBATA <hsbt@ruby-lang.org> | 2026-05-01 11:50:19 +0900 |
|---|---|---|
| committer | git <svn-admin@ruby-lang.org> | 2026-05-07 09:24:50 +0000 |
| commit | 7a111bebbb0f5d5a45d89dd77bc9e01ff55fe5dc (patch) | |
| tree | 5dc45e5c0c4dce4f833ce8aff86ca2db23cda3c1 | |
| parent | 199af7f7cb1130b19d46ddf4208b18eee8cc9181 (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.rb | 14 | ||||
| -rw-r--r-- | 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")) |
