actionmailer 5.2.4.3 → 6.0.2.2

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: c803d3b51bd25394b18390e7ca2908b2ab10d5474cf7ea8c39be7a5c965b9768
4
- data.tar.gz: 8e2c16be2b4a88a1a3be033edcd0f9624938bc12b45272fad5e22c5544c5f1f4
3
+ metadata.gz: de242d8851f7d5940a59de2dd52dd79058abfc1829ae657718c8315d99ba7fd0
4
+ data.tar.gz: ac37fe72fdc553ea4f70504bb2eeeccb0f9b8a3b2aea6e246293923f955aa3cf
5
5
  SHA512:
6
- metadata.gz: d4402e8eafcac5ae14270b32633f938b9b220837fc4199ed09fa15ed6e679aabf59f011274019f1add40a8306704e22f13ce329bd8da95bbe4acf1aa4ad60e63
7
- data.tar.gz: a5f4822e360661e1634e70c892aea5d0b02ee1610c9b40513bb6361f9dbef5b33e8a4990ea4614867147efa6a406bf29bc8c4c1778fc3cd7dbc1e236df791a43
6
+ metadata.gz: b98de51cb6fbcdf058e6607d984cadf777201d10225279aba45b103aa98dabf2f8b7fdba37bdcee7cb557d136a1d9c88f468714e67f27c11bac625ebf1254114
7
+ data.tar.gz: 4810debde39deadb3ff9db7fec384ac1970acaa5a5990aed9214e22a0418b5171c0995625738297cd39b741b7970587a61665dc36b3c4a7781f68c22f47ce589
@@ -1,69 +1,113 @@
1
- ## Rails 5.2.4.3 (May 18, 2020) ##
1
+ ## Rails 6.0.2.1 (December 18, 2019) ##
2
2
 
3
3
  * No changes.
4
4
 
5
5
 
6
- ## Rails 5.2.4.1 (December 18, 2019) ##
6
+ ## Rails 6.0.2 (December 13, 2019) ##
7
+
8
+ * Fix ActionMailer assertions don't work for parameterized mail with legacy delivery job.
9
+
10
+ *bogdanvlviv*
11
+
12
+
13
+ ## Rails 6.0.1 (November 5, 2019) ##
7
14
 
8
15
  * No changes.
9
16
 
10
17
 
11
- ## Rails 5.2.4 (November 27, 2019) ##
18
+ ## Rails 6.0.0 (August 16, 2019) ##
12
19
 
13
20
  * No changes.
14
21
 
15
22
 
16
- ## Rails 5.2.3 (March 27, 2019) ##
23
+ ## Rails 6.0.0.rc2 (July 22, 2019) ##
17
24
 
18
25
  * No changes.
19
26
 
20
27
 
21
- ## Rails 5.2.2.1 (March 11, 2019) ##
28
+ ## Rails 6.0.0.rc1 (April 24, 2019) ##
22
29
 
23
30
  * No changes.
24
31
 
25
32
 
26
- ## Rails 5.2.2 (December 04, 2018) ##
33
+ ## Rails 6.0.0.beta3 (March 11, 2019) ##
27
34
 
28
35
  * No changes.
29
36
 
30
37
 
31
- ## Rails 5.2.1.1 (November 27, 2018) ##
38
+ ## Rails 6.0.0.beta2 (February 25, 2019) ##
32
39
 
33
40
  * No changes.
34
41
 
35
42
 
36
- ## Rails 5.2.1 (August 07, 2018) ##
43
+ ## Rails 6.0.0.beta1 (January 18, 2019) ##
37
44
 
38
- * Ensure mail gem is eager autoloaded when eager load is true to prevent thread deadlocks.
45
+ * Deprecate `ActionMailer::Base.receive` in favor of [Action Mailbox](https://github.com/rails/rails/tree/master/actionmailbox).
39
46
 
40
- *Samuel Cochran*
47
+ *George Claghorn*
48
+
49
+ * Add `MailDeliveryJob` for delivering both regular and parameterized mail. Deprecate using `DeliveryJob` and `Parameterized::DeliveryJob`.
50
+
51
+ *Gannon McGibbon*
52
+
53
+ * Fix ActionMailer assertions not working when a Mail defines
54
+ a custom delivery job class
55
+
56
+ *Edouard Chin*
57
+
58
+ * Mails with multipart `format` blocks with implicit render now also check for
59
+ a template name in options hash instead of only using the action name.
41
60
 
61
+ *Marcus Ilgner*
42
62
 
43
- ## Rails 5.2.0 (April 09, 2018) ##
63
+ * `ActionDispatch::IntegrationTest` includes `ActionMailer::TestHelper` module by default.
44
64
 
45
- * Bring back proc with arity of 1 in `ActionMailer::Base.default` proc
46
- since it was supported in Rails 5.0 but not deprecated.
65
+ *Ricardo Díaz*
47
66
 
48
- *Jimmy Bourassa*
67
+ * Add `perform_deliveries` to a payload of `deliver.action_mailer` notification.
49
68
 
50
- * Add `assert_enqueued_email_with` test helper.
69
+ *Yoshiyuki Kinjo*
70
+
71
+ * Change delivery logging message when `perform_deliveries` is false.
72
+
73
+ *Yoshiyuki Kinjo*
74
+
75
+ * Allow call `assert_enqueued_email_with` with no block.
76
+
77
+ Example:
78
+ ```
79
+ def test_email
80
+ ContactMailer.welcome.deliver_later
81
+ assert_enqueued_email_with ContactMailer, :welcome
82
+ end
83
+
84
+ def test_email_with_arguments
85
+ ContactMailer.welcome("Hello", "Goodbye").deliver_later
86
+ assert_enqueued_email_with ContactMailer, :welcome, args: ["Hello", "Goodbye"]
87
+ end
88
+ ```
89
+
90
+ *bogdanvlviv*
91
+
92
+ * Ensure mail gem is eager autoloaded when eager load is true to prevent thread deadlocks.
93
+
94
+ *Samuel Cochran*
51
95
 
52
- assert_enqueued_email_with ContactMailer, :welcome do
53
- ContactMailer.welcome.deliver_later
54
- end
96
+ * Perform email jobs in `assert_emails`.
55
97
 
56
- *Mikkel Malmberg*
98
+ *Gannon McGibbon*
57
99
 
58
- * Allow Action Mailer classes to configure their delivery job.
100
+ * Add `Base.unregister_observer`, `Base.unregister_observers`,
101
+ `Base.unregister_interceptor`, `Base.unregister_interceptors`,
102
+ `Base.unregister_preview_interceptor` and `Base.unregister_preview_interceptors`.
103
+ This makes it possible to dynamically add and remove email observers and
104
+ interceptors at runtime in the same way they're registered.
59
105
 
60
- class MyMailer < ApplicationMailer
61
- self.delivery_job = MyCustomDeliveryJob
106
+ *Claudio Ortolina*, *Kota Miyake*
62
107
 
63
- ...
64
- end
108
+ * Rails 6 requires Ruby 2.5.0 or newer.
65
109
 
66
- *Matthew Mongeau*
110
+ *Jeremy Daer*, *Kasper Timm Hansen*
67
111
 
68
112
 
69
- Please check [5-1-stable](https://github.com/rails/rails/blob/5-1-stable/actionmailer/CHANGELOG.md) for previous changes.
113
+ Please check [5-2-stable](https://github.com/rails/rails/blob/5-2-stable/actionmailer/CHANGELOG.md) for previous changes.
@@ -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
@@ -13,6 +13,8 @@ Additionally, an Action Mailer class can be used to process incoming email,
13
13
  such as allowing a blog to accept new posts from an email (which could even
14
14
  have been sent from a phone).
15
15
 
16
+ You can read more about Action Mailer in the {Action Mailer Basics}[https://edgeguides.rubyonrails.org/action_mailer_basics.html] guide.
17
+
16
18
  == Sending emails
17
19
 
18
20
  The framework works by initializing any instance variables you want to be
@@ -93,42 +95,6 @@ Example:
93
95
  .....
94
96
  end
95
97
 
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
98
  == Configuration
133
99
 
134
100
  The Base class has the full list of configuration options. Here's an example:
@@ -150,7 +116,7 @@ The latest version of Action Mailer can be installed with RubyGems:
150
116
 
151
117
  Source code can be downloaded as part of the Rails project on GitHub:
152
118
 
153
- * https://github.com/rails/rails/tree/5-2-stable/actionmailer
119
+ * https://github.com/rails/rails/tree/master/actionmailer
154
120
 
155
121
 
156
122
  == License
@@ -164,7 +130,7 @@ Action Mailer is released under the MIT license:
164
130
 
165
131
  API documentation is at
166
132
 
167
- * http://api.rubyonrails.org
133
+ * https://api.rubyonrails.org
168
134
 
169
135
  Bug reports for the Ruby on Rails project can be filed here:
170
136
 
@@ -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
@@ -408,7 +408,7 @@ module ActionMailer
408
408
  # really useful if you need to validate a self-signed and/or a wildcard certificate. You can use the name
409
409
  # of an OpenSSL verify constant (<tt>'none'</tt> or <tt>'peer'</tt>) or directly the constant
410
410
  # (<tt>OpenSSL::SSL::VERIFY_NONE</tt> or <tt>OpenSSL::SSL::VERIFY_PEER</tt>).
411
- # <tt>:ssl/:tls</tt> Enables the SMTP connection to use SMTP/TLS (SMTPS: SMTP over direct TLS connection)
411
+ # * <tt>:ssl/:tls</tt> Enables the SMTP connection to use SMTP/TLS (SMTPS: SMTP over direct TLS connection)
412
412
  #
413
413
  # * <tt>sendmail_settings</tt> - Allows you to override options for the <tt>:sendmail</tt> delivery method.
414
414
  # * <tt>:location</tt> - The location of the sendmail executable. Defaults to <tt>/usr/sbin/sendmail</tt>.
@@ -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[:mail] = mail.encoded
597
+ payload[:mailer] = name
598
+ payload[:message_id] = mail.message_id
599
+ payload[:subject] = mail.subject
600
+ payload[:to] = mail.to
601
+ payload[:from] = mail.from
602
+ payload[:bcc] = mail.bcc if mail.bcc.present?
603
+ payload[:cc] = mail.cc if mail.cc.present?
604
+ payload[:date] = mail.date
605
+ payload[:perform_deliveries] = mail.perform_deliveries
576
606
  end
577
607
 
578
608
  def method_missing(method_name, *args)
@@ -914,11 +944,9 @@ module ActionMailer
914
944
  assignable.each { |k, v| message[k] = v }
915
945
  end
916
946
 
917
- def collect_responses(headers)
947
+ def collect_responses(headers, &block)
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, &block)
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),
@@ -938,10 +973,10 @@ module ActionMailer
938
973
  templates_name = headers[:template_name] || action_name
939
974
 
940
975
  each_template(Array(templates_path), templates_name).map do |template|
941
- self.formats = template.formats
976
+ format = template.format || self.formats.first
942
977
  {
943
- body: render(template: template),
944
- content_type: template.type.to_s
978
+ body: render(template: template, formats: [format]),
979
+ content_type: Mime[format].to_s
945
980
  }
946
981
  end
947
982
  end
@@ -951,7 +986,7 @@ module ActionMailer
951
986
  if templates.empty?
952
987
  raise ActionView::MissingTemplate.new(paths, name, paths, false, "mailer")
953
988
  else
954
- templates.uniq(&:formats).each(&block)
989
+ templates.uniq(&:format).each(&block)
955
990
  end
956
991
  end
957
992
 
@@ -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 = 4
13
- PRE = "3"
10
+ MAJOR = 6
11
+ MINOR = 0
12
+ TINY = 2
13
+ PRE = "2"
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,12 @@ module ActionMailer
9
9
  # An email was delivered.
10
10
  def deliver(event)
11
11
  info do
12
- recipients = Array(event.payload[:to]).join(", ")
13
- "Sent mail to #{recipients} (#{event.duration.round(1)}ms)"
12
+ perform_deliveries = event.payload[:perform_deliveries]
13
+ if perform_deliveries
14
+ "Delivered mail #{event.payload[:message_id]} (#{event.duration.round(1)}ms)"
15
+ else
16
+ "Skipped delivery of mail #{event.payload[:message_id]} as `perform_deliveries` is false"
17
+ end
14
18
  end
15
19
 
16
20
  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::MailDeliveryJob</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,25 @@ 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
60
+ end
61
+
62
+ initializer "action_mailer.set_autoload_paths" do |app|
63
+ options = app.config.action_mailer
64
+
65
+ if options.show_previews && options.preview_path
66
+ ActiveSupport::Dependencies.autoload_paths << options.preview_path
67
+ end
53
68
  end
54
69
 
55
70
  initializer "action_mailer.compile_config_methods" do
@@ -69,12 +84,8 @@ module ActionMailer
69
84
 
70
85
  if options.show_previews
71
86
  app.routes.prepend do
72
- get "/rails/mailers" => "rails/mailers#index", internal: true
73
- get "/rails/mailers/*path" => "rails/mailers#preview", internal: true
74
- end
75
-
76
- if options.preview_path
77
- ActiveSupport::Dependencies.autoload_paths << options.preview_path
87
+ get "/rails/mailers" => "rails/mailers#index", internal: true
88
+ get "/rails/mailers/*path" => "rails/mailers#preview", internal: true
78
89
  end
79
90
  end
80
91
  end
@@ -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,16 @@ 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
+ ActionMailer::Parameterized::DeliveryJob == job_class
161
+ end
143
162
  end
144
163
  end
@@ -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.4.3
4
+ version: 6.0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Heinemeier Hansson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-18 00:00:00.000000000 Z
11
+ date: 2020-03-19 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.4.3
19
+ version: 6.0.2.2
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.4.3
26
+ version: 6.0.2.2
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.4.3
33
+ version: 6.0.2.2
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.4.3
40
+ version: 6.0.2.2
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.4.3
47
+ version: 6.0.2.2
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.4.3
54
+ version: 6.0.2.2
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
@@ -117,12 +118,15 @@ files:
117
118
  - lib/rails/generators/mailer/mailer_generator.rb
118
119
  - lib/rails/generators/mailer/templates/application_mailer.rb.tt
119
120
  - lib/rails/generators/mailer/templates/mailer.rb.tt
120
- homepage: http://rubyonrails.org
121
+ homepage: https://rubyonrails.org
121
122
  licenses:
122
123
  - MIT
123
124
  metadata:
124
- source_code_uri: https://github.com/rails/rails/tree/v5.2.4.3/actionmailer
125
- changelog_uri: https://github.com/rails/rails/blob/v5.2.4.3/actionmailer/CHANGELOG.md
125
+ bug_tracker_uri: https://github.com/rails/rails/issues
126
+ changelog_uri: https://github.com/rails/rails/blob/v6.0.2.2/actionmailer/CHANGELOG.md
127
+ documentation_uri: https://api.rubyonrails.org/v6.0.2.2/
128
+ mailing_list_uri: https://groups.google.com/forum/#!forum/rubyonrails-talk
129
+ source_code_uri: https://github.com/rails/rails/tree/v6.0.2.2/actionmailer
126
130
  post_install_message:
127
131
  rdoc_options: []
128
132
  require_paths:
@@ -131,7 +135,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
131
135
  requirements:
132
136
  - - ">="
133
137
  - !ruby/object:Gem::Version
134
- version: 2.2.2
138
+ version: 2.5.0
135
139
  required_rubygems_version: !ruby/object:Gem::Requirement
136
140
  requirements:
137
141
  - - ">="
@@ -139,8 +143,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
139
143
  version: '0'
140
144
  requirements:
141
145
  - none
142
- rubygems_version: 3.1.2
146
+ rubygems_version: 3.0.3
143
147
  signing_key:
144
148
  specification_version: 4
145
- summary: Email composition, delivery, and receiving framework (part of Rails).
149
+ summary: Email composition and delivery framework (part of Rails).
146
150
  test_files: []