Skip to content

Commit 336a07b

Browse files
committed
Revert "Remove deprecated ActionMailer::DeliveryJob and ActionMailer::Parameterized::DeliveryJob"
This reverts commit 0f9249c. Reverted because this wasn't warning in custom jobs and therefore applications may have not seen the deprecation. We'll need to fix the deprecation to warn for custom jobs so that applications can migrate.
1 parent 243d891 commit 336a07b

12 files changed

+217
-18
lines changed

Diff for: actionmailer/CHANGELOG.md

-5
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,3 @@
1-
* Remove deprecated `ActionMailer::DeliveryJob` and `ActionMailer::Parameterized::DeliveryJob`
2-
in favor of `ActionMailer::MailDeliveryJob`.
3-
4-
*Rafael Mendonça França*
5-
61
* Remove deprecated `ActionMailer::Base.receive` in favor of [Action Mailbox](https://github.com/rails/rails/tree/master/actionmailbox).
72

83
*Rafael Mendonça França*

Diff for: actionmailer/lib/action_mailer.rb

+1
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ module ActionMailer
5151
autoload :TestCase
5252
autoload :TestHelper
5353
autoload :MessageDelivery
54+
autoload :DeliveryJob
5455
autoload :MailDeliveryJob
5556

5657
def self.eager_load!

Diff for: actionmailer/lib/action_mailer/base.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -457,7 +457,7 @@ class Base < AbstractController::Base
457457

458458
helper ActionMailer::MailHelper
459459

460-
class_attribute :delivery_job, default: ::ActionMailer::MailDeliveryJob
460+
class_attribute :delivery_job, default: ::ActionMailer::DeliveryJob
461461
class_attribute :default_params, default: {
462462
mime_version: "1.0",
463463
charset: "UTF-8",

Diff for: actionmailer/lib/action_mailer/delivery_job.rb

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# frozen_string_literal: true
2+
3+
require "active_job"
4+
5+
module ActionMailer
6+
# The <tt>ActionMailer::DeliveryJob</tt> class is used when you
7+
# want to send emails outside of the request-response cycle.
8+
#
9+
# Exceptions are rescued and handled by the mailer class.
10+
class DeliveryJob < ActiveJob::Base # :nodoc:
11+
queue_as { ActionMailer::Base.deliver_later_queue_name }
12+
13+
rescue_from StandardError, with: :handle_exception_with_mailer_class
14+
15+
before_perform do
16+
ActiveSupport::Deprecation.warn <<~MSG.squish
17+
Sending mail with DeliveryJob and Parameterized::DeliveryJob
18+
is deprecated and will be removed in Rails 6.1.
19+
Please use MailDeliveryJob instead.
20+
MSG
21+
end
22+
23+
def perform(mailer, mail_method, delivery_method, *args) #:nodoc:
24+
mailer.constantize.public_send(mail_method, *args).send(delivery_method)
25+
end
26+
ruby2_keywords(:perform) if respond_to?(:ruby2_keywords, true)
27+
28+
private
29+
# "Deserialize" the mailer class name by hand in case another argument
30+
# (like a Global ID reference) raised DeserializationError.
31+
def mailer_class
32+
if mailer = Array(@serialized_arguments).first || Array(arguments).first
33+
mailer.constantize
34+
end
35+
end
36+
37+
def handle_exception_with_mailer_class(exception)
38+
if klass = mailer_class
39+
klass.handle_exception exception
40+
else
41+
raise exception
42+
end
43+
end
44+
end
45+
end

Diff for: actionmailer/lib/action_mailer/message_delivery.rb

+11-4
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ def processed?
6060
# * <tt>:wait_until</tt> - Enqueue the email to be delivered at (after) a specific date / time
6161
# * <tt>:queue</tt> - Enqueue the email on the specified queue
6262
#
63-
# By default, the email will be enqueued using <tt>ActionMailer::MailDeliveryJob</tt>. Each
63+
# By default, the email will be enqueued using <tt>ActionMailer::DeliveryJob</tt>. Each
6464
# <tt>ActionMailer::Base</tt> class can specify the job to use by setting the class variable
6565
# +delivery_job+.
6666
#
@@ -84,7 +84,7 @@ def deliver_later!(options = {})
8484
# * <tt>:wait_until</tt> - Enqueue the email to be delivered at (after) a specific date / time.
8585
# * <tt>:queue</tt> - Enqueue the email on the specified queue.
8686
#
87-
# By default, the email will be enqueued using <tt>ActionMailer::MailDeliveryJob</tt>. Each
87+
# By default, the email will be enqueued using <tt>ActionMailer::DeliveryJob</tt>. Each
8888
# <tt>ActionMailer::Base</tt> class can specify the job to use by setting the class variable
8989
# +delivery_job+.
9090
#
@@ -136,8 +136,15 @@ def enqueue_delivery(delivery_method, options = {})
136136
"#deliver_later, 2. only touch the message *within your mailer " \
137137
"method*, or 3. use a custom Active Job instead of #deliver_later."
138138
else
139-
@mailer_class.delivery_job.set(options).perform_later(
140-
@mailer_class.name, @action.to_s, delivery_method.to_s, args: @args)
139+
job = @mailer_class.delivery_job
140+
141+
if job <= MailDeliveryJob
142+
job.set(options).perform_later(
143+
@mailer_class.name, @action.to_s, delivery_method.to_s, args: @args)
144+
else
145+
job.set(options).perform_later(
146+
@mailer_class.name, @action.to_s, delivery_method.to_s, *@args)
147+
end
141148
end
142149
end
143150
end

Diff for: actionmailer/lib/action_mailer/parameterized.rb

+24-2
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,13 @@ def respond_to_missing?(method, include_all = false)
122122
end
123123
end
124124

125+
class DeliveryJob < ActionMailer::DeliveryJob # :nodoc:
126+
def perform(mailer, mail_method, delivery_method, params, *args)
127+
mailer.constantize.with(params).public_send(mail_method, *args).send(delivery_method)
128+
end
129+
ruby2_keywords(:perform) if respond_to?(:ruby2_keywords, true)
130+
end
131+
125132
class MessageDelivery < ActionMailer::MessageDelivery # :nodoc:
126133
def initialize(mailer_class, action, params, *args)
127134
super(mailer_class, action, *args)
@@ -141,8 +148,23 @@ def enqueue_delivery(delivery_method, options = {})
141148
if processed?
142149
super
143150
else
144-
@mailer_class.delivery_job.set(options).perform_later(
145-
@mailer_class.name, @action.to_s, delivery_method.to_s, params: @params, args: @args)
151+
job = delivery_job_class
152+
153+
if job <= MailDeliveryJob
154+
job.set(options).perform_later(
155+
@mailer_class.name, @action.to_s, delivery_method.to_s, params: @params, args: @args)
156+
else
157+
job.set(options).perform_later(
158+
@mailer_class.name, @action.to_s, delivery_method.to_s, @params, *@args)
159+
end
160+
end
161+
end
162+
163+
def delivery_job_class
164+
if @mailer_class.delivery_job <= MailDeliveryJob
165+
@mailer_class.delivery_job
166+
else
167+
Parameterized::DeliveryJob
146168
end
147169
end
148170
end

Diff for: actionmailer/lib/action_mailer/test_helper.rb

+2-1
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,8 @@ def assert_no_enqueued_emails(&block)
155155
def delivery_job_filter(job)
156156
job_class = job.is_a?(Hash) ? job.fetch(:job) : job.class
157157

158-
Base.descendants.map(&:delivery_job).include?(job_class)
158+
Base.descendants.map(&:delivery_job).include?(job_class) ||
159+
ActionMailer::Parameterized::DeliveryJob == job_class
159160
end
160161
end
161162
end

Diff for: actionmailer/test/legacy_delivery_job_test.rb

+82
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
# frozen_string_literal: true
2+
3+
require "abstract_unit"
4+
require "active_job"
5+
require "mailers/params_mailer"
6+
require "mailers/delayed_mailer"
7+
8+
class LegacyDeliveryJobTest < ActiveSupport::TestCase
9+
include ActiveJob::TestHelper
10+
11+
class LegacyDeliveryJob < ActionMailer::DeliveryJob
12+
end
13+
14+
setup do
15+
@previous_logger = ActiveJob::Base.logger
16+
ActiveJob::Base.logger = Logger.new(nil)
17+
18+
@previous_delivery_method = ActionMailer::Base.delivery_method
19+
ActionMailer::Base.delivery_method = :test
20+
21+
@previous_deliver_later_queue_name = ActionMailer::Base.deliver_later_queue_name
22+
ActionMailer::Base.deliver_later_queue_name = :test_queue
23+
end
24+
25+
teardown do
26+
ActiveJob::Base.logger = @previous_logger
27+
ParamsMailer.deliveries.clear
28+
29+
ActionMailer::Base.delivery_method = @previous_delivery_method
30+
ActionMailer::Base.deliver_later_queue_name = @previous_deliver_later_queue_name
31+
end
32+
33+
test "should send parameterized mail correctly" do
34+
mail = ParamsMailer.with(inviter: "[email protected]", invitee: "[email protected]").invitation
35+
args = [
36+
"ParamsMailer",
37+
"invitation",
38+
"deliver_now",
39+
{ inviter: "[email protected]", invitee: "[email protected]" },
40+
]
41+
42+
with_delivery_job(LegacyDeliveryJob) do
43+
assert_deprecated do
44+
assert_performed_with(job: ActionMailer::Parameterized::DeliveryJob, args: args) do
45+
mail.deliver_later
46+
end
47+
end
48+
end
49+
end
50+
51+
test "should send mail correctly" do
52+
mail = DelayedMailer.test_message(1, 2, 3)
53+
args = [
54+
"DelayedMailer",
55+
"test_message",
56+
"deliver_now",
57+
1,
58+
2,
59+
3,
60+
]
61+
62+
with_delivery_job(LegacyDeliveryJob) do
63+
assert_deprecated do
64+
assert_performed_with(job: LegacyDeliveryJob, args: args) do
65+
mail.deliver_later
66+
end
67+
end
68+
end
69+
end
70+
71+
private
72+
def with_delivery_job(job)
73+
old_params_delivery_job = ParamsMailer.delivery_job
74+
old_regular_delivery_job = DelayedMailer.delivery_job
75+
ParamsMailer.delivery_job = job
76+
DelayedMailer.delivery_job = job
77+
yield
78+
ensure
79+
ParamsMailer.delivery_job = old_params_delivery_job
80+
DelayedMailer.delivery_job = old_regular_delivery_job
81+
end
82+
end

Diff for: actionmailer/test/test_helper_test.rb

+28
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,20 @@ def test_assert_enqueued_emails
206206
end
207207
end
208208

209+
def test_assert_enqueued_emails_with_legacy_delivery_job
210+
previous_delivery_job = TestHelperMailer.delivery_job
211+
TestHelperMailer.delivery_job = ActionMailer::DeliveryJob
212+
assert_nothing_raised do
213+
assert_enqueued_emails 1 do
214+
silence_stream($stdout) do
215+
TestHelperMailer.test.deliver_later
216+
end
217+
end
218+
end
219+
ensure
220+
TestHelperMailer.delivery_job = previous_delivery_job
221+
end
222+
209223
def test_assert_enqueued_parameterized_emails
210224
assert_nothing_raised do
211225
assert_enqueued_emails 1 do
@@ -216,6 +230,20 @@ def test_assert_enqueued_parameterized_emails
216230
end
217231
end
218232

233+
def test_assert_enqueued_parameterized_emails_with_legacy_delivery_job
234+
previous_delivery_job = TestHelperMailer.delivery_job
235+
TestHelperMailer.delivery_job = ActionMailer::DeliveryJob
236+
assert_nothing_raised do
237+
assert_enqueued_emails 1 do
238+
silence_stream($stdout) do
239+
TestHelperMailer.with(a: 1).test.deliver_later
240+
end
241+
end
242+
end
243+
ensure
244+
TestHelperMailer.delivery_job = previous_delivery_job
245+
end
246+
219247
def test_assert_enqueued_emails_too_few_sent
220248
error = assert_raise ActiveSupport::TestCase::Assertion do
221249
assert_enqueued_emails 2 do

Diff for: guides/source/6_1_release_notes.md

-3
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,6 @@ Please refer to the [Changelog][action-mailer] for detailed changes.
7979

8080
### Removals
8181

82-
* Remove deprecated `ActionMailer::DeliveryJob` and `ActionMailer::Parameterized::DeliveryJob`
83-
in favor of `ActionMailer::MailDeliveryJob`.
84-
8582
* Remove deprecated `ActionMailer::Base.receive` in favor of [Action Mailbox](https://github.com/rails/rails/tree/master/actionmailbox).
8683

8784
### Deprecations

Diff for: guides/source/configuring.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -770,7 +770,7 @@ There are a number of settings available on `config.action_mailer`:
770770

771771
* `config.action_mailer.perform_caching` specifies whether the mailer templates should perform fragment caching or not. If it's not specified, the default will be `true`.
772772
773-
* `config.action_mailer.delivery_job` specifies delivery job for mail. Defaults to `ActionMailer::MailDeliveryJob`.
773+
* `config.action_mailer.delivery_job` specifies delivery job for mail. Defaults to `ActionMailer::DeliveryJob`.
774774
775775
776776
### Configuring Active Support

Diff for: railties/test/application/configuration_test.rb

+22-1
Original file line numberDiff line numberDiff line change
@@ -1123,7 +1123,7 @@ def index
11231123
assert_equal [::MyMailObserver, ::MyOtherMailObserver], ::Mail.class_variable_get(:@@delivery_notification_observers)
11241124
end
11251125

1126-
test "allows setting the queue name for the ActionMailer::MailDeliveryJob" do
1126+
test "allows setting the queue name for the ActionMailer::DeliveryJob" do
11271127
add_to_config <<-RUBY
11281128
config.action_mailer.deliver_later_queue_name = 'test_default'
11291129
RUBY
@@ -2503,6 +2503,27 @@ class MyLogger < ::Logger
25032503
assert_equal ActionMailer::MailDeliveryJob, ActionMailer::Base.delivery_job
25042504
end
25052505

2506+
test "ActionMailer::Base.delivery_job is ActionMailer::DeliveryJob in the 5.x defaults" do
2507+
remove_from_config '.*config\.load_defaults.*\n'
2508+
add_to_config 'config.load_defaults "5.2"'
2509+
2510+
app "development"
2511+
2512+
assert_equal ActionMailer::DeliveryJob, ActionMailer::Base.delivery_job
2513+
end
2514+
2515+
test "ActionMailer::Base.delivery_job can be configured in the new framework defaults" do
2516+
remove_from_config '.*config\.load_defaults.*\n'
2517+
2518+
app_file "config/initializers/new_framework_defaults_6_0.rb", <<-RUBY
2519+
Rails.application.config.action_mailer.delivery_job = "ActionMailer::MailDeliveryJob"
2520+
RUBY
2521+
2522+
app "development"
2523+
2524+
assert_equal ActionMailer::MailDeliveryJob, ActionMailer::Base.delivery_job
2525+
end
2526+
25062527
test "ActiveRecord::Base.filter_attributes should equal to filter_parameters" do
25072528
app_file "config/initializers/filter_parameters_logging.rb", <<-RUBY
25082529
Rails.application.config.filter_parameters += [ :password, :credit_card_number ]

0 commit comments

Comments
 (0)