Skip to content

Commit e2fc491

Browse files
hsbtclaude
andcommitted
Add override DSL method to Bundler::Dsl
Introduce Gemfile-level `override target, field: operation, ...` that collects Bundler::Override instances and forwards them to Definition via to_definition. Validation and resolver hookup come in later commits; this commit only wires the entry point. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 6fb2bf9 commit e2fc491

2 files changed

Lines changed: 43 additions & 2 deletions

File tree

bundler/lib/bundler/dsl.rb

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ def self.evaluate(gemfile, lockfile, unlock)
2222
GITHUB_PULL_REQUEST_URL = %r{\Ahttps://github\.com/([A-Za-z0-9_\-\.]+/[A-Za-z0-9_\-\.]+)/pull/(\d+)\z}
2323
GITLAB_MERGE_REQUEST_URL = %r{\Ahttps://gitlab\.com/([A-Za-z0-9_\-\./]+)/-/merge_requests/(\d+)\z}
2424

25-
attr_reader :gemspecs, :gemfile
25+
attr_reader :gemspecs, :gemfile, :overrides
2626
attr_accessor :dependencies
2727

2828
def initialize
@@ -40,6 +40,7 @@ def initialize
4040
@gemfile = nil
4141
@gemfiles = []
4242
@lockfile = nil
43+
@overrides = []
4344
add_git_sources
4445
end
4546

@@ -184,10 +185,18 @@ def github(repo, options = {})
184185
with_source(git_source) { yield }
185186
end
186187

188+
def override(target, **operations)
189+
operations.each do |field, operation|
190+
@overrides << Override.new(target, field, operation)
191+
end
192+
end
193+
187194
def to_definition(lockfile, unlock)
188195
check_primary_source_safety
189196
lockfile = @lockfile unless @lockfile.nil?
190-
Definition.new(lockfile, @dependencies, @sources, unlock, @ruby_version, @optional_groups, @gemfiles)
197+
definition = Definition.new(lockfile, @dependencies, @sources, unlock, @ruby_version, @optional_groups, @gemfiles)
198+
definition.overrides = @overrides
199+
definition
191200
end
192201

193202
def group(*args, &blk)

spec/bundler/dsl_spec.rb

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,4 +366,36 @@
366366
end
367367
end
368368
end
369+
370+
describe "#override" do
371+
it "stores an Override for a gem with a version: operation" do
372+
subject.override("rails", version: ">= 8.0")
373+
374+
expect(subject.overrides.size).to eq(1)
375+
override = subject.overrides.first
376+
expect(override.target).to eq("rails")
377+
expect(override.field).to eq(:version)
378+
expect(override.operation).to eq(">= 8.0")
379+
end
380+
381+
it "accepts :ignore_upper as the operation" do
382+
subject.override("nokogiri", version: :ignore_upper)
383+
expect(subject.overrides.first.operation).to eq(:ignore_upper)
384+
end
385+
386+
it "accepts nil as the operation" do
387+
subject.override("legacy", version: nil)
388+
expect(subject.overrides.first.operation).to be_nil
389+
end
390+
391+
it "appends to overrides across multiple statements" do
392+
subject.override("rails", version: ">= 8.0")
393+
subject.override("nokogiri", version: :ignore_upper)
394+
expect(subject.overrides.map(&:target)).to eq(["rails", "nokogiri"])
395+
end
396+
397+
it "is empty by default" do
398+
expect(subject.overrides).to eq([])
399+
end
400+
end
369401
end

0 commit comments

Comments
 (0)