[rubygems/rubygems] use full path for instance_eval

so that __dir__ and __FILE__ will work properly from within that gemfile
fragment, if eval_gemfile is given a relative path

d521bf9790
This commit is contained in:
Cody Cutrer 2024-02-12 10:13:36 -07:00 committed by git
parent 8f17b3bd27
commit fa334ecd40
2 changed files with 12 additions and 1 deletions

View file

@ -46,7 +46,7 @@ module Bundler
@gemfile = expanded_gemfile_path
@gemfiles << expanded_gemfile_path
contents ||= Bundler.read_file(@gemfile.to_s)
instance_eval(contents, gemfile.to_s, 1)
instance_eval(contents, @gemfile.to_s, 1)
rescue Exception => e # rubocop:disable Lint/RescueException
message = "There was an error " \
"#{e.is_a?(GemfileEvalError) ? "evaluating" : "parsing"} " \

View file

@ -134,6 +134,17 @@ RSpec.describe Bundler::Dsl do
expect { subject.eval_gemfile("Gemfile") }.
to raise_error(Bundler::GemfileError, /There was an error evaluating `Gemfile`: ruby_version must match the :engine_version for MRI/)
end
it "populates __dir__ and __FILE__ correctly" do
abs_path = source_root.join("../fragment.rb").to_s
expect(Bundler).to receive(:read_file).with(abs_path).and_return(<<~RUBY)
@fragment_dir = __dir__
@fragment_file = __FILE__
RUBY
subject.eval_gemfile("../fragment.rb")
expect(subject.instance_variable_get(:@fragment_dir)).to eq(source_root.dirname.to_s)
expect(subject.instance_variable_get(:@fragment_file)).to eq(abs_path)
end
end
describe "#gem" do