From 3ec8c35c64187501c01c85e8980d74caea62546e Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Tue, 16 Jun 2026 16:00:38 +0900 Subject: [PATCH] Skip option-like arguments in the :direct test loader The :direct loader required every ARGV entry, so a verbose run that appended -v tried to require "-v" and aborted with a LoadError. Skip arguments starting with "-", matching rake_test_loader.rb. https://github.com/ruby/rake/issues/724 Co-Authored-By: Claude Opus 4.8 (1M context) --- lib/rake/testtask.rb | 2 +- test/test_rake_test_task.rb | 26 +++++++++++++++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/lib/rake/testtask.rb b/lib/rake/testtask.rb index 6979b6b4c..fc2a74a00 100644 --- a/lib/rake/testtask.rb +++ b/lib/rake/testtask.rb @@ -180,7 +180,7 @@ def ruby_version # :nodoc: def run_code # :nodoc: case @loader when :direct - "-e \"ARGV.each{|f| require f}\"" + "-e \"ARGV.each{|f| require f unless f.start_with?('-')}\"" when :"test-unit" "-S test-unit" when :rake diff --git a/test/test_rake_test_task.rb b/test/test_rake_test_task.rb index 3514cfedd..16322aa98 100644 --- a/test/test_rake_test_task.rb +++ b/test/test_rake_test_task.rb @@ -141,10 +141,34 @@ def test_run_code_direct # t.pettern is "test/test*.rb" end - assert_equal '-e "ARGV.each{|f| require f}"', test_task.run_code + assert_equal %q{-e "ARGV.each{|f| require f unless f.start_with?('-')}"}, test_task.run_code assert_equal globbed, test_task.file_list.to_a end + def test_run_code_direct_skips_option_arguments + test_task = Rake::TestTask.new do |t| + t.loader = :direct + t.verbose = true + end + + code = test_task.run_code[/\A-e "(.*)"\z/, 1] + refute_nil code + + required = [] + receiver = Object.new + receiver.define_singleton_method(:require) { |file| required << file } + + saved_argv = ARGV.dup + begin + ARGV.replace(["test/foo_test.rb", "-v"]) + receiver.instance_eval(code) + ensure + ARGV.replace(saved_argv) + end + + assert_equal ["test/foo_test.rb"], required + end + test "run code test-unit" do test_task = Rake::TestTask.new do |t| t.loader = :"test-unit"