actionmailer 5.2.8.1 → 6.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cb2612d830b5e47ea48fd3e0c5e6bc85f533c2de368ca92ef941d9f767557fcc
4
- data.tar.gz: 2a7780bde926becc75a2d21a3f78f9abe7215adceba89f6919347e8a3249ef90
3
+ metadata.gz: af732a129a02cc2ac2022d963b5055006049a660083fb9eb28de69d31fc01fad
4
+ data.tar.gz: 994f198cf6a06cbac0a0f920753a30160965bc762470153a928671ef1262a2fa
5
5
  SHA512:
6
- metadata.gz: a35f07cee1ddd4c3679675a409d5fc552bd3c5f599f07f345f20552efd3427b65b15caef4fc94782ec622b1f1869d43e7aa2014b3dd5729bddf7c1c89c7361a1
7
- data.tar.gz: 814ea048acb38b2acdedf30901e5b4701305265d6ba1f2f4a81d1b119739465151a3dea0ac3d39293eabd288bda3e8c7ceb1c748b3fda3aad7108ec93aefac43
6
+ metadata.gz: 0ba45855596c9f3d4b88203a88788036f2b24129e9fd71ab22b323e461d6542f8d262dcf4b036c063c1dd781d3dcbc7355b9d71801cc31dd07a41839f17de2df
7
+ data.tar.gz: 3eb85af6dd23fb37d69cb3771ed118573a78fab9941bd94012bd2058a29eef507592ac29460f971dfc75b5e3b29117ce1f2179c5f4d54c1ff65ec2fe6768672e
data/CHANGELOG.md CHANGED
@@ -1,134 +1,71 @@
1
- ## Rails 5.2.8.1 (July 12, 2022) ##
1
+ ## Rails 6.0.0.beta1 (January 18, 2019) ##
2
2
 
3
- * No changes.
3
+ * Deprecate `ActionMailer::Base.receive` in favor of [Action Mailbox](https://github.com/rails/rails/tree/master/actionmailbox).
4
4
 
5
+ *George Claghorn*
5
6
 
6
- ## Rails 5.2.8 (May 09, 2022) ##
7
+ * Add `MailDeliveryJob` for delivering both regular and parameterized mail. Deprecate using `DeliveryJob` and `Parameterized::DeliveryJob`.
7
8
 
8
- * No changes.
9
+ *Gannon McGibbon*
9
10
 
11
+ * Fix ActionMailer assertions not working when a Mail defines
12
+ a custom delivery job class
10
13
 
11
- ## Rails 5.2.7.1 (April 26, 2022) ##
14
+ *Edouard Chin*
12
15
 
13
- * No changes.
16
+ * Mails with multipart `format` blocks with implicit render now also check for
17
+ a template name in options hash instead of only using the action name.
14
18
 
19
+ *Marcus Ilgner*
15
20
 
16
- ## Rails 5.2.7 (March 10, 2022) ##
21
+ * `ActionDispatch::IntegrationTest` includes `ActionMailer::TestHelper` module by default.
17
22
 
18
- * No changes.
23
+ *Ricardo Díaz*
19
24
 
25
+ * Add `perform_deliveries` to a payload of `deliver.action_mailer` notification.
20
26
 
21
- ## Rails 5.2.6.3 (March 08, 2022) ##
27
+ *Yoshiyuki Kinjo*
22
28
 
23
- * No changes.
29
+ * Change delivery logging message when `perform_deliveries` is false.
24
30
 
31
+ *Yoshiyuki Kinjo*
25
32
 
26
- ## Rails 5.2.6.2 (February 11, 2022) ##
33
+ * Allow call `assert_enqueued_email_with` with no block.
27
34
 
28
- * No changes.
35
+ Example:
36
+ ```
37
+ def test_email
38
+ ContactMailer.welcome.deliver_later
39
+ assert_enqueued_email_with ContactMailer, :welcome
40
+ end
29
41
 
42
+ def test_email_with_arguments
43
+ ContactMailer.welcome("Hello", "Goodbye").deliver_later
44
+ assert_enqueued_email_with ContactMailer, :welcome, args: ["Hello", "Goodbye"]
45
+ end
46
+ ```
30
47
 
31
- ## Rails 5.2.6.1 (February 11, 2022) ##
32
-
33
- * No changes.
34
-
35
-
36
- ## Rails 5.2.6 (May 05, 2021) ##
37
-
38
- * No changes.
39
-
40
-
41
- ## Rails 5.2.5 (March 26, 2021) ##
42
-
43
- * No changes.
44
-
45
-
46
- ## Rails 5.2.4.6 (May 05, 2021) ##
47
-
48
- * No changes.
49
-
50
-
51
- ## Rails 5.2.4.5 (February 10, 2021) ##
52
-
53
- * No changes.
54
-
55
-
56
- ## Rails 5.2.4.4 (September 09, 2020) ##
57
-
58
- * No changes.
59
-
60
-
61
- ## Rails 5.2.4.3 (May 18, 2020) ##
62
-
63
- * No changes.
64
-
65
-
66
- ## Rails 5.2.4.2 (March 19, 2020) ##
67
-
68
- * No changes.
69
-
70
-
71
- ## Rails 5.2.4.1 (December 18, 2019) ##
72
-
73
- * No changes.
74
-
75
-
76
- ## Rails 5.2.4 (November 27, 2019) ##
77
-
78
- * No changes.
79
-
80
-
81
- ## Rails 5.2.3 (March 27, 2019) ##
82
-
83
- * No changes.
84
-
85
-
86
- ## Rails 5.2.2.1 (March 11, 2019) ##
87
-
88
- * No changes.
89
-
90
-
91
- ## Rails 5.2.2 (December 04, 2018) ##
92
-
93
- * No changes.
94
-
95
-
96
- ## Rails 5.2.1.1 (November 27, 2018) ##
97
-
98
- * No changes.
99
-
100
-
101
- ## Rails 5.2.1 (August 07, 2018) ##
48
+ *bogdanvlviv*
102
49
 
103
50
  * Ensure mail gem is eager autoloaded when eager load is true to prevent thread deadlocks.
104
51
 
105
52
  *Samuel Cochran*
106
53
 
54
+ * Perform email jobs in `assert_emails`.
107
55
 
108
- ## Rails 5.2.0 (April 09, 2018) ##
109
-
110
- * Bring back proc with arity of 1 in `ActionMailer::Base.default` proc
111
- since it was supported in Rails 5.0 but not deprecated.
112
-
113
- *Jimmy Bourassa*
114
-
115
- * Add `assert_enqueued_email_with` test helper.
116
-
117
- assert_enqueued_email_with ContactMailer, :welcome do
118
- ContactMailer.welcome.deliver_later
119
- end
120
-
121
- *Mikkel Malmberg*
56
+ *Gannon McGibbon*
122
57
 
123
- * Allow Action Mailer classes to configure their delivery job.
58
+ * Add `Base.unregister_observer`, `Base.unregister_observers`,
59
+ `Base.unregister_interceptor`, `Base.unregister_interceptors`,
60
+ `Base.unregister_preview_interceptor` and `Base.unregister_preview_interceptors`.
61
+ This makes it possible to dynamically add and remove email observers and
62
+ interceptors at runtime in the same way they're registered.
124
63
 
125
- class MyMailer < ApplicationMailer
126
- self.delivery_job = MyCustomDeliveryJob
64
+ *Claudio Ortolina*, *Kota Miyake*
127
65
 
128
- ...
129
- end
66
+ * Rails 6 requires Ruby 2.5.0 or newer.
130
67
 
131
- *Matthew Mongeau*
68
+ *Jeremy Daer*, *Kasper Timm Hansen*
132
69
 
133
70
 
134
- Please check [5-1-stable](https://github.com/rails/rails/blob/5-1-stable/actionmailer/CHANGELOG.md) for previous changes.
71
+ Please check [5-2-stable](https://github.com/rails/rails/blob/5-2-stable/actionmailer/CHANGELOG.md) for previous changes.
data/MIT-LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2004-2018 David Heinemeier Hansson
1
+ Copyright (c) 2004-2019 David Heinemeier Hansson
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.rdoc CHANGED
@@ -93,42 +93,6 @@ Example:
93
93
  .....
94
94
  end
95
95
 
96
- == Receiving emails
97
-
98
- To receive emails, you need to implement a public instance method called
99
- +receive+ that takes an email object as its single parameter. The Action Mailer
100
- framework has a corresponding class method, which is also called +receive+, that
101
- accepts a raw, unprocessed email as a string, which it then turns into the email
102
- object and calls the receive instance method.
103
-
104
- Example:
105
-
106
- class Mailman < ActionMailer::Base
107
- def receive(email)
108
- page = Page.find_by(address: email.to.first)
109
- page.emails.create(
110
- subject: email.subject, body: email.body
111
- )
112
-
113
- if email.has_attachments?
114
- email.attachments.each do |attachment|
115
- page.attachments.create({
116
- file: attachment, description: email.subject
117
- })
118
- end
119
- end
120
- end
121
- end
122
-
123
- This Mailman can be the target for Postfix or other MTAs. In Rails, you would use
124
- the runner in the trivial case like this:
125
-
126
- rails runner 'Mailman.receive(STDIN.read)'
127
-
128
- However, invoking Rails in the runner for each mail to be received is very
129
- resource intensive. A single instance of Rails should be run within a daemon, if
130
- it is going to process more than just a limited amount of email.
131
-
132
96
  == Configuration
133
97
 
134
98
  The Base class has the full list of configuration options. Here's an example:
@@ -150,7 +114,7 @@ The latest version of Action Mailer can be installed with RubyGems:
150
114
 
151
115
  Source code can be downloaded as part of the Rails project on GitHub:
152
116
 
153
- * https://github.com/rails/rails/tree/5-2-stable/actionmailer
117
+ * https://github.com/rails/rails/tree/master/actionmailer
154
118
 
155
119
 
156
120
  == License
@@ -475,11 +475,21 @@ module ActionMailer
475
475
  observers.flatten.compact.each { |observer| register_observer(observer) }
476
476
  end
477
477
 
478
+ # Unregister one or more previously registered Observers.
479
+ def unregister_observers(*observers)
480
+ observers.flatten.compact.each { |observer| unregister_observer(observer) }
481
+ end
482
+
478
483
  # Register one or more Interceptors which will be called before mail is sent.
479
484
  def register_interceptors(*interceptors)
480
485
  interceptors.flatten.compact.each { |interceptor| register_interceptor(interceptor) }
481
486
  end
482
487
 
488
+ # Unregister one or more previously registered Interceptors.
489
+ def unregister_interceptors(*interceptors)
490
+ interceptors.flatten.compact.each { |interceptor| unregister_interceptor(interceptor) }
491
+ end
492
+
483
493
  # Register an Observer which will be notified when mail is delivered.
484
494
  # Either a class, string or symbol can be passed in as the Observer.
485
495
  # If a string or symbol is passed in it will be camelized and constantized.
@@ -487,6 +497,13 @@ module ActionMailer
487
497
  Mail.register_observer(observer_class_for(observer))
488
498
  end
489
499
 
500
+ # Unregister a previously registered Observer.
501
+ # Either a class, string or symbol can be passed in as the Observer.
502
+ # If a string or symbol is passed in it will be camelized and constantized.
503
+ def unregister_observer(observer)
504
+ Mail.unregister_observer(observer_class_for(observer))
505
+ end
506
+
490
507
  # Register an Interceptor which will be called before mail is sent.
491
508
  # Either a class, string or symbol can be passed in as the Interceptor.
492
509
  # If a string or symbol is passed in it will be camelized and constantized.
@@ -494,6 +511,13 @@ module ActionMailer
494
511
  Mail.register_interceptor(observer_class_for(interceptor))
495
512
  end
496
513
 
514
+ # Unregister a previously registered Interceptor.
515
+ # Either a class, string or symbol can be passed in as the Interceptor.
516
+ # If a string or symbol is passed in it will be camelized and constantized.
517
+ def unregister_interceptor(interceptor)
518
+ Mail.unregister_interceptor(observer_class_for(interceptor))
519
+ end
520
+
497
521
  def observer_class_for(value) # :nodoc:
498
522
  case value
499
523
  when String, Symbol
@@ -541,6 +565,11 @@ module ActionMailer
541
565
  # end
542
566
  # end
543
567
  def receive(raw_mail)
568
+ ActiveSupport::Deprecation.warn(<<~MESSAGE.squish)
569
+ ActionMailer::Base.receive is deprecated and will be removed in Rails 6.1.
570
+ Use Action Mailbox to process inbound email.
571
+ MESSAGE
572
+
544
573
  ActiveSupport::Notifications.instrument("receive.action_mailer") do |payload|
545
574
  mail = Mail.new(raw_mail)
546
575
  set_payload_for_mail(payload, mail)
@@ -564,15 +593,16 @@ module ActionMailer
564
593
  private
565
594
 
566
595
  def set_payload_for_mail(payload, mail)
567
- payload[:mailer] = name
568
- payload[:message_id] = mail.message_id
569
- payload[:subject] = mail.subject
570
- payload[:to] = mail.to
571
- payload[:from] = mail.from
572
- payload[:bcc] = mail.bcc if mail.bcc.present?
573
- payload[:cc] = mail.cc if mail.cc.present?
574
- payload[:date] = mail.date
575
- payload[:mail] = mail.encoded
596
+ payload[:mailer] = name
597
+ payload[:message_id] = mail.message_id
598
+ payload[:subject] = mail.subject
599
+ payload[:to] = mail.to
600
+ payload[:from] = mail.from
601
+ payload[:bcc] = mail.bcc if mail.bcc.present?
602
+ payload[:cc] = mail.cc if mail.cc.present?
603
+ payload[:date] = mail.date
604
+ payload[:mail] = mail.encoded
605
+ payload[:perform_deliveries] = mail.perform_deliveries
576
606
  end
577
607
 
578
608
  def method_missing(method_name, *args)
@@ -916,9 +946,7 @@ module ActionMailer
916
946
 
917
947
  def collect_responses(headers)
918
948
  if block_given?
919
- collector = ActionMailer::Collector.new(lookup_context) { render(action_name) }
920
- yield(collector)
921
- collector.responses
949
+ collect_responses_from_block(headers, &Proc.new)
922
950
  elsif headers[:body]
923
951
  collect_responses_from_text(headers)
924
952
  else
@@ -926,6 +954,13 @@ module ActionMailer
926
954
  end
927
955
  end
928
956
 
957
+ def collect_responses_from_block(headers)
958
+ templates_name = headers[:template_name] || action_name
959
+ collector = ActionMailer::Collector.new(lookup_context) { render(templates_name) }
960
+ yield(collector)
961
+ collector.responses
962
+ end
963
+
929
964
  def collect_responses_from_text(headers)
930
965
  [{
931
966
  body: headers.delete(:body),
@@ -983,7 +1018,7 @@ module ActionMailer
983
1018
  end
984
1019
 
985
1020
  def instrument_name
986
- "action_mailer".freeze
1021
+ "action_mailer"
987
1022
  end
988
1023
 
989
1024
  ActiveSupport.run_load_hooks(:action_mailer, self)
@@ -12,6 +12,14 @@ module ActionMailer
12
12
 
13
13
  rescue_from StandardError, with: :handle_exception_with_mailer_class
14
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
+
15
23
  def perform(mailer, mail_method, delivery_method, *args) #:nodoc:
16
24
  mailer.constantize.public_send(mail_method, *args).send(delivery_method)
17
25
  end
@@ -7,10 +7,10 @@ module ActionMailer
7
7
  end
8
8
 
9
9
  module VERSION
10
- MAJOR = 5
11
- MINOR = 2
12
- TINY = 8
13
- PRE = "1"
10
+ MAJOR = 6
11
+ MINOR = 0
12
+ TINY = 0
13
+ PRE = "beta1"
14
14
 
15
15
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
16
16
  end
@@ -40,9 +40,7 @@ module ActionMailer
40
40
  end
41
41
 
42
42
  private
43
- def message
44
- @message
45
- end
43
+ attr_reader :message
46
44
 
47
45
  def html_part
48
46
  @html_part ||= message.html_part
@@ -9,8 +9,13 @@ module ActionMailer
9
9
  # An email was delivered.
10
10
  def deliver(event)
11
11
  info do
12
+ perform_deliveries = event.payload[:perform_deliveries]
12
13
  recipients = Array(event.payload[:to]).join(", ")
13
- "Sent mail to #{recipients} (#{event.duration.round(1)}ms)"
14
+ if perform_deliveries
15
+ "Sent mail to #{recipients} (#{event.duration.round(1)}ms)"
16
+ else
17
+ "Skipped sending mail to #{recipients} as `perform_deliveries` is false"
18
+ end
14
19
  end
15
20
 
16
21
  debug { event.payload[:mail] }
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_job"
4
+
5
+ module ActionMailer
6
+ # The <tt>ActionMailer::NewDeliveryJob</tt> class is used when you
7
+ # want to send emails outside of the request-response cycle. It supports
8
+ # sending either parameterized or normal mail.
9
+ #
10
+ # Exceptions are rescued and handled by the mailer class.
11
+ class MailDeliveryJob < ActiveJob::Base # :nodoc:
12
+ queue_as { ActionMailer::Base.deliver_later_queue_name }
13
+
14
+ rescue_from StandardError, with: :handle_exception_with_mailer_class
15
+
16
+ def perform(mailer, mail_method, delivery_method, args:, params: nil) #:nodoc:
17
+ mailer_class = params ? mailer.constantize.with(params) : mailer.constantize
18
+ mailer_class.public_send(mail_method, *args).send(delivery_method)
19
+ end
20
+
21
+ private
22
+ # "Deserialize" the mailer class name by hand in case another argument
23
+ # (like a Global ID reference) raised DeserializationError.
24
+ def mailer_class
25
+ if mailer = Array(@serialized_arguments).first || Array(arguments).first
26
+ mailer.constantize
27
+ end
28
+ end
29
+
30
+ def handle_exception_with_mailer_class(exception)
31
+ if klass = mailer_class
32
+ klass.handle_exception exception
33
+ else
34
+ raise exception
35
+ end
36
+ end
37
+ end
38
+ end
@@ -29,7 +29,7 @@ module ActionMailer
29
29
  @mail_message ||= processed_mailer.message
30
30
  end
31
31
 
32
- # Unused except for delegator internals (dup, marshaling).
32
+ # Unused except for delegator internals (dup, marshalling).
33
33
  def __setobj__(mail_message) #:nodoc:
34
34
  @mail_message = mail_message
35
35
  end
@@ -135,10 +135,18 @@ module ActionMailer
135
135
  "#deliver_later, 2. only touch the message *within your mailer " \
136
136
  "method*, or 3. use a custom Active Job instead of #deliver_later."
137
137
  else
138
- args = @mailer_class.name, @action.to_s, delivery_method.to_s, *@args
139
138
  job = @mailer_class.delivery_job
139
+ args = arguments_for(job, delivery_method)
140
140
  job.set(options).perform_later(*args)
141
141
  end
142
142
  end
143
+
144
+ def arguments_for(delivery_job, delivery_method)
145
+ if delivery_job <= MailDeliveryJob
146
+ [@mailer_class.name, @action.to_s, delivery_method.to_s, args: @args]
147
+ else
148
+ [@mailer_class.name, @action.to_s, delivery_method.to_s, *@args]
149
+ end
150
+ end
143
151
  end
144
152
  end
@@ -121,6 +121,12 @@ module ActionMailer
121
121
  end
122
122
  end
123
123
 
124
+ class DeliveryJob < ActionMailer::DeliveryJob # :nodoc:
125
+ def perform(mailer, mail_method, delivery_method, params, *args)
126
+ mailer.constantize.with(params).public_send(mail_method, *args).send(delivery_method)
127
+ end
128
+ end
129
+
124
130
  class MessageDelivery < ActionMailer::MessageDelivery # :nodoc:
125
131
  def initialize(mailer_class, action, params, *args)
126
132
  super(mailer_class, action, *args)
@@ -139,16 +145,27 @@ module ActionMailer
139
145
  if processed?
140
146
  super
141
147
  else
142
- args = @mailer_class.name, @action.to_s, delivery_method.to_s, @params, *@args
143
- ActionMailer::Parameterized::DeliveryJob.set(options).perform_later(*args)
148
+ job = delivery_job_class
149
+ args = arguments_for(job, delivery_method)
150
+ job.set(options).perform_later(*args)
144
151
  end
145
152
  end
146
- end
147
153
 
148
- class DeliveryJob < ActionMailer::DeliveryJob # :nodoc:
149
- def perform(mailer, mail_method, delivery_method, params, *args)
150
- mailer.constantize.with(params).public_send(mail_method, *args).send(delivery_method)
151
- end
154
+ def delivery_job_class
155
+ if @mailer_class.delivery_job <= MailDeliveryJob
156
+ @mailer_class.delivery_job
157
+ else
158
+ Parameterized::DeliveryJob
159
+ end
160
+ end
161
+
162
+ def arguments_for(delivery_job, delivery_method)
163
+ if delivery_job <= MailDeliveryJob
164
+ [@mailer_class.name, @action.to_s, delivery_method.to_s, params: @params, args: @args]
165
+ else
166
+ [@mailer_class.name, @action.to_s, delivery_method.to_s, @params, *@args]
167
+ end
168
+ end
152
169
  end
153
170
  end
154
171
  end
@@ -31,22 +31,39 @@ module ActionMailer
31
31
  interceptors.flatten.compact.each { |interceptor| register_preview_interceptor(interceptor) }
32
32
  end
33
33
 
34
+ # Unregister one or more previously registered Interceptors.
35
+ def unregister_preview_interceptors(*interceptors)
36
+ interceptors.flatten.compact.each { |interceptor| unregister_preview_interceptor(interceptor) }
37
+ end
38
+
34
39
  # Register an Interceptor which will be called before mail is previewed.
35
40
  # Either a class or a string can be passed in as the Interceptor. If a
36
41
  # string is passed in it will be constantized.
37
42
  def register_preview_interceptor(interceptor)
38
- preview_interceptor = \
43
+ preview_interceptor = interceptor_class_for(interceptor)
44
+
45
+ unless preview_interceptors.include?(preview_interceptor)
46
+ preview_interceptors << preview_interceptor
47
+ end
48
+ end
49
+
50
+ # Unregister a previously registered Interceptor.
51
+ # Either a class or a string can be passed in as the Interceptor. If a
52
+ # string is passed in it will be constantized.
53
+ def unregister_preview_interceptor(interceptor)
54
+ preview_interceptors.delete(interceptor_class_for(interceptor))
55
+ end
56
+
57
+ private
58
+
59
+ def interceptor_class_for(interceptor)
39
60
  case interceptor
40
61
  when String, Symbol
41
62
  interceptor.to_s.camelize.constantize
42
63
  else
43
64
  interceptor
44
65
  end
45
-
46
- unless preview_interceptors.include?(preview_interceptor)
47
- preview_interceptors << preview_interceptor
48
66
  end
49
- end
50
67
  end
51
68
  end
52
69
 
@@ -46,10 +46,17 @@ module ActionMailer
46
46
  register_preview_interceptors(options.delete(:preview_interceptors))
47
47
  register_observers(options.delete(:observers))
48
48
 
49
+ if delivery_job = options.delete(:delivery_job)
50
+ self.delivery_job = delivery_job.constantize
51
+ end
52
+
49
53
  options.each { |k, v| send("#{k}=", v) }
50
54
  end
51
55
 
52
- ActiveSupport.on_load(:action_dispatch_integration_test) { include ActionMailer::TestCase::ClearTestDeliveries }
56
+ ActiveSupport.on_load(:action_dispatch_integration_test) do
57
+ include ActionMailer::TestHelper
58
+ include ActionMailer::TestCase::ClearTestDeliveries
59
+ end
53
60
  end
54
61
 
55
62
  initializer "action_mailer.compile_config_methods" do
@@ -28,13 +28,13 @@ module ActionMailer
28
28
  #
29
29
  # assert_emails 2 do
30
30
  # ContactMailer.welcome.deliver_now
31
- # ContactMailer.welcome.deliver_now
31
+ # ContactMailer.welcome.deliver_later
32
32
  # end
33
33
  # end
34
- def assert_emails(number)
34
+ def assert_emails(number, &block)
35
35
  if block_given?
36
36
  original_count = ActionMailer::Base.deliveries.size
37
- yield
37
+ perform_enqueued_jobs(only: ->(job) { delivery_job_filter(job) }, &block)
38
38
  new_count = ActionMailer::Base.deliveries.size
39
39
  assert_equal number, new_count - original_count, "#{number} emails expected, but #{new_count - original_count} were sent"
40
40
  else
@@ -90,10 +90,23 @@ module ActionMailer
90
90
  # end
91
91
  # end
92
92
  def assert_enqueued_emails(number, &block)
93
- assert_enqueued_jobs number, only: [ ActionMailer::DeliveryJob, ActionMailer::Parameterized::DeliveryJob ], &block
93
+ assert_enqueued_jobs(number, only: ->(job) { delivery_job_filter(job) }, &block)
94
94
  end
95
95
 
96
- # Asserts that block should cause the specified email
96
+ # Asserts that a specific email has been enqueued, optionally
97
+ # matching arguments.
98
+ #
99
+ # def test_email
100
+ # ContactMailer.welcome.deliver_later
101
+ # assert_enqueued_email_with ContactMailer, :welcome
102
+ # end
103
+ #
104
+ # def test_email_with_arguments
105
+ # ContactMailer.welcome("Hello", "Goodbye").deliver_later
106
+ # assert_enqueued_email_with ContactMailer, :welcome, args: ["Hello", "Goodbye"]
107
+ # end
108
+ #
109
+ # If a block is passed, that block should cause the specified email
97
110
  # to be enqueued.
98
111
  #
99
112
  # def test_email_in_block
@@ -106,20 +119,17 @@ module ActionMailer
106
119
  #
107
120
  # def test_parameterized_email
108
121
  # assert_enqueued_email_with ContactMailer, :welcome,
109
- # args: {email: 'user@example.com} do
122
+ # args: {email: 'user@example.com'} do
110
123
  # ContactMailer.with(email: 'user@example.com').welcome.deliver_later
111
124
  # end
112
125
  # end
113
126
  def assert_enqueued_email_with(mailer, method, args: nil, queue: "mailers", &block)
114
- if args.is_a? Hash
115
- job = ActionMailer::Parameterized::DeliveryJob
116
- args = [mailer.to_s, method.to_s, "deliver_now", args]
127
+ args = if args.is_a?(Hash)
128
+ [mailer.to_s, method.to_s, "deliver_now", params: args, args: []]
117
129
  else
118
- job = ActionMailer::DeliveryJob
119
- args = [mailer.to_s, method.to_s, "deliver_now", *args]
130
+ [mailer.to_s, method.to_s, "deliver_now", args: Array(args)]
120
131
  end
121
-
122
- assert_enqueued_with(job: job, args: args, queue: queue, &block)
132
+ assert_enqueued_with(job: mailer.delivery_job, args: args, queue: queue, &block)
123
133
  end
124
134
 
125
135
  # Asserts that no emails are enqueued for later delivery.
@@ -138,7 +148,15 @@ module ActionMailer
138
148
  # end
139
149
  # end
140
150
  def assert_no_enqueued_emails(&block)
141
- assert_no_enqueued_jobs only: [ ActionMailer::DeliveryJob, ActionMailer::Parameterized::DeliveryJob ], &block
151
+ assert_enqueued_emails 0, &block
142
152
  end
153
+
154
+ private
155
+
156
+ def delivery_job_filter(job)
157
+ job_class = job.is_a?(Hash) ? job.fetch(:job) : job.class
158
+
159
+ Base.descendants.map(&:delivery_job).include?(job_class)
160
+ end
143
161
  end
144
162
  end
data/lib/action_mailer.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  #--
4
- # Copyright (c) 2004-2018 David Heinemeier Hansson
4
+ # Copyright (c) 2004-2019 David Heinemeier Hansson
5
5
  #
6
6
  # Permission is hereby granted, free of charge, to any person obtaining
7
7
  # a copy of this software and associated documentation files (the
@@ -52,6 +52,7 @@ module ActionMailer
52
52
  autoload :TestHelper
53
53
  autoload :MessageDelivery
54
54
  autoload :DeliveryJob
55
+ autoload :MailDeliveryJob
55
56
 
56
57
  def self.eager_load!
57
58
  super
@@ -23,7 +23,7 @@ module Rails
23
23
 
24
24
  private
25
25
  def file_name # :doc:
26
- @_file_name ||= super.gsub(/_mailer/i, "")
26
+ @_file_name ||= super.sub(/_mailer\z/i, "")
27
27
  end
28
28
 
29
29
  def application_mailer_file_name
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: actionmailer
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.2.8.1
4
+ version: 6.0.0.beta1
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Heinemeier Hansson
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-07-12 00:00:00.000000000 Z
11
+ date: 2019-01-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: actionpack
@@ -16,42 +16,42 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 5.2.8.1
19
+ version: 6.0.0.beta1
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: 5.2.8.1
26
+ version: 6.0.0.beta1
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: actionview
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - '='
32
32
  - !ruby/object:Gem::Version
33
- version: 5.2.8.1
33
+ version: 6.0.0.beta1
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - '='
39
39
  - !ruby/object:Gem::Version
40
- version: 5.2.8.1
40
+ version: 6.0.0.beta1
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: activejob
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - '='
46
46
  - !ruby/object:Gem::Version
47
- version: 5.2.8.1
47
+ version: 6.0.0.beta1
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - '='
53
53
  - !ruby/object:Gem::Version
54
- version: 5.2.8.1
54
+ version: 6.0.0.beta1
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: mail
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -86,8 +86,8 @@ dependencies:
86
86
  - - "~>"
87
87
  - !ruby/object:Gem::Version
88
88
  version: '2.0'
89
- description: Email on Rails. Compose, deliver, receive, and test emails using the
90
- familiar controller/view pattern. First-class support for multipart email and attachments.
89
+ description: Email on Rails. Compose, deliver, and test emails using the familiar
90
+ controller/view pattern. First-class support for multipart email and attachments.
91
91
  email: david@loudthinking.com
92
92
  executables: []
93
93
  extensions: []
@@ -104,6 +104,7 @@ files:
104
104
  - lib/action_mailer/gem_version.rb
105
105
  - lib/action_mailer/inline_preview_interceptor.rb
106
106
  - lib/action_mailer/log_subscriber.rb
107
+ - lib/action_mailer/mail_delivery_job.rb
107
108
  - lib/action_mailer/mail_helper.rb
108
109
  - lib/action_mailer/message_delivery.rb
109
110
  - lib/action_mailer/parameterized.rb
@@ -121,9 +122,9 @@ homepage: http://rubyonrails.org
121
122
  licenses:
122
123
  - MIT
123
124
  metadata:
124
- source_code_uri: https://github.com/rails/rails/tree/v5.2.8.1/actionmailer
125
- changelog_uri: https://github.com/rails/rails/blob/v5.2.8.1/actionmailer/CHANGELOG.md
126
- post_install_message:
125
+ source_code_uri: https://github.com/rails/rails/tree/v6.0.0.beta1/actionmailer
126
+ changelog_uri: https://github.com/rails/rails/blob/v6.0.0.beta1/actionmailer/CHANGELOG.md
127
+ post_install_message:
127
128
  rdoc_options: []
128
129
  require_paths:
129
130
  - lib
@@ -131,16 +132,16 @@ required_ruby_version: !ruby/object:Gem::Requirement
131
132
  requirements:
132
133
  - - ">="
133
134
  - !ruby/object:Gem::Version
134
- version: 2.2.2
135
+ version: 2.5.0
135
136
  required_rubygems_version: !ruby/object:Gem::Requirement
136
137
  requirements:
137
- - - ">="
138
+ - - ">"
138
139
  - !ruby/object:Gem::Version
139
- version: '0'
140
+ version: 1.3.1
140
141
  requirements:
141
142
  - none
142
- rubygems_version: 3.3.3
143
- signing_key:
143
+ rubygems_version: 3.0.1
144
+ signing_key:
144
145
  specification_version: 4
145
- summary: Email composition, delivery, and receiving framework (part of Rails).
146
+ summary: Email composition and delivery framework (part of Rails).
146
147
  test_files: []