From 199af7f7cb1130b19d46ddf4208b18eee8cc9181 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Fri, 1 May 2026 11:30:50 +0900 Subject: [ruby/rubygems] 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. https://github.com/ruby/rubygems/commit/e2fc49141c Co-Authored-By: Claude Opus 4.7 (1M context) --- lib/bundler/dsl.rb | 13 +++++++++++-- spec/bundler/bundler/dsl_spec.rb | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/lib/bundler/dsl.rb b/lib/bundler/dsl.rb index 6f06c4e918..a5df3235b1 100644 --- a/lib/bundler/dsl.rb +++ b/lib/bundler/dsl.rb @@ -22,7 +22,7 @@ module Bundler GITHUB_PULL_REQUEST_URL = %r{\Ahttps://github\.com/([A-Za-z0-9_\-\.]+/[A-Za-z0-9_\-\.]+)/pull/(\d+)\z} GITLAB_MERGE_REQUEST_URL = %r{\Ahttps://gitlab\.com/([A-Za-z0-9_\-\./]+)/-/merge_requests/(\d+)\z} - attr_reader :gemspecs, :gemfile + attr_reader :gemspecs, :gemfile, :overrides attr_accessor :dependencies def initialize @@ -40,6 +40,7 @@ module Bundler @gemfile = nil @gemfiles = [] @lockfile = nil + @overrides = [] add_git_sources end @@ -184,10 +185,18 @@ module Bundler with_source(git_source) { yield } end + def override(target, **operations) + operations.each do |field, operation| + @overrides << Override.new(target, field, operation) + end + end + def to_definition(lockfile, unlock) check_primary_source_safety lockfile = @lockfile unless @lockfile.nil? - Definition.new(lockfile, @dependencies, @sources, unlock, @ruby_version, @optional_groups, @gemfiles) + definition = Definition.new(lockfile, @dependencies, @sources, unlock, @ruby_version, @optional_groups, @gemfiles) + definition.overrides = @overrides + definition end def group(*args, &blk) diff --git a/spec/bundler/bundler/dsl_spec.rb b/spec/bundler/bundler/dsl_spec.rb index 6ba2e728b5..b0aa0fa05d 100644 --- a/spec/bundler/bundler/dsl_spec.rb +++ b/spec/bundler/bundler/dsl_spec.rb @@ -366,4 +366,36 @@ RSpec.describe Bundler::Dsl do end end end + + describe "#override" do + it "stores an Override for a gem with a version: operation" do + subject.override("rails", version: ">= 8.0") + + expect(subject.overrides.size).to eq(1) + override = subject.overrides.first + expect(override.target).to eq("rails") + expect(override.field).to eq(:version) + expect(override.operation).to eq(">= 8.0") + end + + it "accepts :ignore_upper as the operation" do + subject.override("nokogiri", version: :ignore_upper) + expect(subject.overrides.first.operation).to eq(:ignore_upper) + end + + it "accepts nil as the operation" do + subject.override("legacy", version: nil) + expect(subject.overrides.first.operation).to be_nil + end + + it "appends to overrides across multiple statements" do + subject.override("rails", version: ">= 8.0") + subject.override("nokogiri", version: :ignore_upper) + expect(subject.overrides.map(&:target)).to eq(["rails", "nokogiri"]) + end + + it "is empty by default" do + expect(subject.overrides).to eq([]) + end + end end -- cgit v1.2.3