aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJimmy Bourassa <jimmy.bourassa@hooktstudios.com>2017-08-24 01:13:54 -0400
committerJimmy Bourassa <jimmy.bourassa@hooktstudios.com>2017-08-29 09:42:28 -0400
commitfbb2fc8aa7d17fd86ad9c3fbbe60ef84a4cde950 (patch)
treecc7db1c38e4dc64c437b1be50d49192af826cfed
parent9a66a22102db76896f400939165ec92280e092e7 (diff)
downloadrails-fbb2fc8aa7d17fd86ad9c3fbbe60ef84a4cde950.tar.gz
rails-fbb2fc8aa7d17fd86ad9c3fbbe60ef84a4cde950.tar.bz2
rails-fbb2fc8aa7d17fd86ad9c3fbbe60ef84a4cde950.zip
Fix AM::Base.default proc arity breaking change
PR #29270 changed the number of arguments that gets passed to Procs defined in ActionMail::Base.default. With this changeset, Procs can now have 1 or 0 arguments Also adds test coverage for AM::Base.default Proc arity.
-rw-r--r--actionmailer/CHANGELOG.md5
-rw-r--r--actionmailer/lib/action_mailer/base.rb12
-rw-r--r--actionmailer/test/base_test.rb9
-rw-r--r--actionmailer/test/mailers/proc_mailer.rb9
4 files changed, 33 insertions, 2 deletions
diff --git a/actionmailer/CHANGELOG.md b/actionmailer/CHANGELOG.md
index 9993a11c9d..6859128b24 100644
--- a/actionmailer/CHANGELOG.md
+++ b/actionmailer/CHANGELOG.md
@@ -1,3 +1,8 @@
+* Bring back proc with arity of 1 in ActionMailer::Base.default proc
+ since it was supported in Rails 5.0 but not deprecated.
+
+ *Jimmy Bourassa*
+
* Allow Action Mailer classes to configure their delivery job.
class MyMailer < ApplicationMailer
diff --git a/actionmailer/lib/action_mailer/base.rb b/actionmailer/lib/action_mailer/base.rb
index a54eb52dcb..8477539c49 100644
--- a/actionmailer/lib/action_mailer/base.rb
+++ b/actionmailer/lib/action_mailer/base.rb
@@ -889,7 +889,7 @@ module ActionMailer
default_values = self.class.default.map do |key, value|
[
key,
- value.is_a?(Proc) ? instance_exec(&value) : value
+ compute_default(value)
]
end.to_h
@@ -898,6 +898,16 @@ module ActionMailer
headers_with_defaults
end
+ def compute_default(value)
+ return value unless value.is_a?(Proc)
+
+ if value.arity == 1
+ instance_exec(self, &value)
+ else
+ instance_exec(&value)
+ end
+ end
+
def assign_headers_to_message(message, headers)
assignable = headers.except(:parts_order, :content_type, :body, :template_name,
:template_path, :delivery_method, :delivery_method_options)
diff --git a/actionmailer/test/base_test.rb b/actionmailer/test/base_test.rb
index 0da969c349..6f3b638994 100644
--- a/actionmailer/test/base_test.rb
+++ b/actionmailer/test/base_test.rb
@@ -726,6 +726,15 @@ class BaseTest < ActiveSupport::TestCase
assert(ProcMailer.welcome["x-has-to-proc"].to_s == "symbol")
end
+ test "proc default values can have arity of 1 where arg is a mailer instance" do
+ assert_equal(ProcMailer.welcome['X-Lambda-Arity-1-arg'].to_s, "complex_value")
+ assert_equal(ProcMailer.welcome['X-Lambda-Arity-1-self'].to_s, "complex_value")
+ end
+
+ test "proc default values with fixed arity of 0 can be called" do
+ assert_equal("0", ProcMailer.welcome["X-Lambda-Arity-0"].to_s)
+ end
+
test "we can call other defined methods on the class as needed" do
mail = ProcMailer.welcome
assert_equal("Thanks for signing up this afternoon", mail.subject)
diff --git a/actionmailer/test/mailers/proc_mailer.rb b/actionmailer/test/mailers/proc_mailer.rb
index b7cf53eb4a..76e730bb79 100644
--- a/actionmailer/test/mailers/proc_mailer.rb
+++ b/actionmailer/test/mailers/proc_mailer.rb
@@ -4,12 +4,19 @@ class ProcMailer < ActionMailer::Base
default to: "system@test.lindsaar.net",
"X-Proc-Method" => Proc.new { Time.now.to_i.to_s },
subject: Proc.new { give_a_greeting },
- "x-has-to-proc" => :symbol
+ "x-has-to-proc" => :symbol,
+ "X-Lambda-Arity-0" => ->() { "0" },
+ "X-Lambda-Arity-1-arg" => ->(arg) { arg.computed_value },
+ "X-Lambda-Arity-1-self" => ->(_) { self.computed_value }
def welcome
mail
end
+ def computed_value
+ "complex_value"
+ end
+
private
def give_a_greeting