diff --git a/lib/spring/application_manager.rb b/lib/spring/application_manager.rb index ce8c63bc..1a3325c8 100644 --- a/lib/spring/application_manager.rb +++ b/lib/spring/application_manager.rb @@ -102,7 +102,7 @@ def start_child(preload = false) "RACK_ENV" => app_env, "SPRING_ORIGINAL_ENV" => JSON.dump(Spring::ORIGINAL_ENV), "SPRING_PRELOAD" => preload ? "1" : "0", - "SPRING_SPAWN_ENV" => JSON.dump(spawn_env), + "SPRING_SPAWN_ENV" => JSON.dump(spawn_env.compact), **spawn_env, }, "ruby", diff --git a/lib/spring/client/run.rb b/lib/spring/client/run.rb index 52ec20cf..fcb72b19 100644 --- a/lib/spring/client/run.rb +++ b/lib/spring/client/run.rb @@ -254,7 +254,9 @@ def default_rails_env end def spawn_env - ENV.slice(*Spring.spawn_on_env) + Spring.spawn_on_env.to_h do |key| + [key, ENV[key]] + end end end end diff --git a/test/support/acceptance_test.rb b/test/support/acceptance_test.rb index 6043e4f4..c481c531 100644 --- a/test/support/acceptance_test.rb +++ b/test/support/acceptance_test.rb @@ -663,6 +663,18 @@ def exec_name assert_success %(bin/rails runner 'p ENV.key?("FOO")'), stdout: "false" end + test "spawn_on_env variables are cleared when unset" do + File.write(app.spring_client_config, "Spring.spawn_on_env << 'VAR_FROM_BOOT'") + File.write(app.application_config, "#{app.application_config.read}\nRails.configuration.x.var_from_boot = ENV['VAR_FROM_BOOT']") + + app.env["VAR_FROM_BOOT"] = "before" + assert_success %(bin/rails runner 'p Rails.configuration.x.var_from_boot.inspect'), stdout: "before" + + app.env.delete "VAR_FROM_BOOT" + + assert_success %(bin/rails runner 'p Rails.configuration.x.var_from_boot.inspect'), stdout: "nil" + end + test "Kernel.raise remains private" do expr = "p Kernel.private_instance_methods.include?(:raise)" assert_success %(bin/rails runner '#{expr}'), stdout: "true"