Skip to content

Commit 7d73d9e

Browse files
hsbtclaude
andcommitted
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). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent e2fc491 commit 7d73d9e

2 files changed

Lines changed: 14 additions & 6 deletions

File tree

bundler/lib/bundler/override.rb

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
module Bundler
44
class Override
5-
LOWER_BOUND_OPERATORS = [">=", ">", "="].freeze
5+
UPPER_BOUND_OPERATORS = ["<", "<="].freeze
66

77
attr_reader :target, :field, :operation
88

@@ -30,17 +30,19 @@ def apply_to(requirement)
3030
def remove_upper_bounds(requirement)
3131
return Gem::Requirement.default if requirement.nil? || requirement.none?
3232

33-
lower_bounds = requirement.requirements.filter_map do |op, version|
34-
if LOWER_BOUND_OPERATORS.include?(op)
35-
[op, version]
33+
preserved = requirement.requirements.filter_map do |op, version|
34+
if UPPER_BOUND_OPERATORS.include?(op)
35+
nil
3636
elsif op == "~>"
3737
[">=", version]
38+
else
39+
[op, version]
3840
end
3941
end
4042

41-
return Gem::Requirement.default if lower_bounds.empty?
43+
return Gem::Requirement.default if preserved.empty?
4244

43-
Gem::Requirement.new(lower_bounds.map {|op, v| "#{op} #{v}" })
45+
Gem::Requirement.new(preserved.map {|op, v| "#{op} #{v}" })
4446
end
4547
end
4648
end

spec/bundler/override_spec.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@
3535
expect(result).to eq(Gem::Requirement.new(">= 1.5"))
3636
end
3737

38+
it "preserves != exclusion constraints" do
39+
override = described_class.new("rails", :version, :ignore_upper)
40+
result = override.apply_to(Gem::Requirement.new(">= 1.0", "!= 1.5.0", "< 2.0"))
41+
expect(result).to eq(Gem::Requirement.new(">= 1.0", "!= 1.5.0"))
42+
end
43+
3844
it "returns the default requirement when only upper bounds remain" do
3945
override = described_class.new("rails", :version, :ignore_upper)
4046
result = override.apply_to(Gem::Requirement.new("< 2.0"))

0 commit comments

Comments
 (0)