actionmailer 5.0.0.rc1 → 5.0.0.rc2

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
  SHA1:
3
- metadata.gz: cd0a6570d581cc9eb29bbd91afa234749b7bf58b
4
- data.tar.gz: b534939a5472dff982dc1572c6dd015ef320fa65
3
+ metadata.gz: 4c66edc530e47491b457fe5bbe6bd663b368c860
4
+ data.tar.gz: 0410986754bdd911c65d0ea400c597560b2fa7dd
5
5
  SHA512:
6
- metadata.gz: 66af363c4f40905f436e8bbaa6ed8211ffe4314664f552f519f0c54bca405a1fc061b11d294da6d31b0482fedf33ca8aed1a56dac949e3032fc79adedb289169
7
- data.tar.gz: 99e8516d59ed27dceb6da172db9a1494fa80824b2caab45b08f5816716e987ef6b215b87a207d122cdf9bc55c991032254ada4f153af6ce71885aa6616461af1
6
+ metadata.gz: 7b14aa9dc2a1d810efd1bac5f8f0773b8d9e13faa07489d1c7cb15180d5bc479a48a2fb6d5e8098577ce61066cd0fa00f94db381e18a6320d2eaf79516f81937
7
+ data.tar.gz: d6cd2bde888ec9757f1c113f67feac6aa7605589416ec2ced1bf56af3b6d95c8d8e410ed58ab0b3d601495241006b153b5b685a77a11d00f153893d73ef197f2
data/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ ## Rails 5.0.0.rc2 (June 22, 2016) ##
2
+
3
+ * Exception handling: use `rescue_from` to handle exceptions raised by
4
+ mailer actions, by message delivery, and by deferred delivery jobs.
5
+
6
+ *Jeremy Daer*
7
+
8
+
1
9
  ## Rails 5.0.0.rc1 (May 06, 2016) ##
2
10
 
3
11
  * No changes.
@@ -5,6 +5,7 @@ require 'active_support/core_ext/hash/except'
5
5
  require 'active_support/core_ext/module/anonymous'
6
6
 
7
7
  require 'action_mailer/log_subscriber'
8
+ require 'action_mailer/rescuable'
8
9
 
9
10
  module ActionMailer
10
11
  # Action Mailer allows you to send email from your application using a mailer model and views.
@@ -419,6 +420,7 @@ module ActionMailer
419
420
  # * <tt>deliver_later_queue_name</tt> - The name of the queue used with <tt>deliver_later</tt>.
420
421
  class Base < AbstractController::Base
421
422
  include DeliveryMethods
423
+ include Rescuable
422
424
  include Previews
423
425
 
424
426
  abstract!
@@ -3,11 +3,32 @@ require 'active_job'
3
3
  module ActionMailer
4
4
  # The <tt>ActionMailer::DeliveryJob</tt> class is used when you
5
5
  # want to send emails outside of the request-response cycle.
6
+ #
7
+ # Exceptions are rescued and handled by the mailer class.
6
8
  class DeliveryJob < ActiveJob::Base # :nodoc:
7
9
  queue_as { ActionMailer::Base.deliver_later_queue_name }
8
10
 
11
+ rescue_from StandardError, with: :handle_exception_with_mailer_class
12
+
9
13
  def perform(mailer, mail_method, delivery_method, *args) #:nodoc:
10
14
  mailer.constantize.public_send(mail_method, *args).send(delivery_method)
11
15
  end
16
+
17
+ private
18
+ # "Deserialize" the mailer class name by hand in case another argument
19
+ # (like a Global ID reference) raised DeserializationError.
20
+ def mailer_class
21
+ if mailer = Array(@serialized_arguments).first || Array(arguments).first
22
+ mailer.constantize
23
+ end
24
+ end
25
+
26
+ def handle_exception_with_mailer_class(exception)
27
+ if klass = mailer_class
28
+ klass.handle_exception exception
29
+ else
30
+ raise exception
31
+ end
32
+ end
12
33
  end
13
34
  end
@@ -8,7 +8,7 @@ module ActionMailer
8
8
  MAJOR = 5
9
9
  MINOR = 0
10
10
  TINY = 0
11
- PRE = "rc1"
11
+ PRE = "rc2"
12
12
 
13
13
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
14
14
  end
@@ -1,7 +1,6 @@
1
1
  require 'delegate'
2
2
 
3
3
  module ActionMailer
4
-
5
4
  # The <tt>ActionMailer::MessageDelivery</tt> class is used by
6
5
  # <tt>ActionMailer::Base</tt> when creating a new mailer.
7
6
  # <tt>MessageDelivery</tt> is a wrapper (+Delegator+ subclass) around a lazy
@@ -14,30 +13,35 @@ module ActionMailer
14
13
  # Notifier.welcome(User.first).deliver_later # enqueue email delivery as a job through Active Job
15
14
  # Notifier.welcome(User.first).message # a Mail::Message object
16
15
  class MessageDelivery < Delegator
17
- def initialize(mailer, mail_method, *args) #:nodoc:
18
- @mailer = mailer
19
- @mail_method = mail_method
20
- @args = args
21
- @obj = nil
16
+ def initialize(mailer_class, action, *args) #:nodoc:
17
+ @mailer_class, @action, @args = mailer_class, action, args
18
+
19
+ # The mail is only processed if we try to call any methods on it.
20
+ # Typical usage will leave it unloaded and call deliver_later.
21
+ @processed_mailer = nil
22
+ @mail_message = nil
22
23
  end
23
24
 
25
+ # Method calls are delegated to the Mail::Message that's ready to deliver.
24
26
  def __getobj__ #:nodoc:
25
- @obj ||= begin
26
- mailer = @mailer.new
27
- mailer.process @mail_method, *@args
28
- mailer.message
29
- end
27
+ @mail_message ||= processed_mailer.message
30
28
  end
31
29
 
32
- def __setobj__(obj) #:nodoc:
33
- @obj = obj
30
+ # Unused except for delegator internals (dup, marshaling).
31
+ def __setobj__(mail_message) #:nodoc:
32
+ @mail_message = mail_message
34
33
  end
35
34
 
36
- # Returns the Mail::Message object
35
+ # Returns the resulting Mail::Message
37
36
  def message
38
37
  __getobj__
39
38
  end
40
39
 
40
+ # Was the delegate loaded, causing the mailer action to be processed?
41
+ def processed?
42
+ @processed_mailer || @mail_message
43
+ end
44
+
41
45
  # Enqueues the email to be delivered through Active Job. When the
42
46
  # job runs it will send the email using +deliver_now!+. That means
43
47
  # that the message will be sent bypassing checking +perform_deliveries+
@@ -78,7 +82,9 @@ module ActionMailer
78
82
  # Notifier.welcome(User.first).deliver_now!
79
83
  #
80
84
  def deliver_now!
81
- message.deliver!
85
+ processed_mailer.handle_exceptions do
86
+ message.deliver!
87
+ end
82
88
  end
83
89
 
84
90
  # Delivers an email:
@@ -86,24 +92,33 @@ module ActionMailer
86
92
  # Notifier.welcome(User.first).deliver_now
87
93
  #
88
94
  def deliver_now
89
- message.deliver
95
+ processed_mailer.handle_exceptions do
96
+ message.deliver
97
+ end
90
98
  end
91
99
 
92
100
  private
101
+ # Returns the processed Mailer instance. We keep this instance
102
+ # on hand so we can delegate exception handling to it.
103
+ def processed_mailer
104
+ @processed_mailer ||= @mailer_class.new.tap do |mailer|
105
+ mailer.process @action, *@args
106
+ end
107
+ end
93
108
 
94
109
  def enqueue_delivery(delivery_method, options={})
95
- if @obj
96
- raise "You've accessed the message before asking to deliver it " \
97
- "later, so you may have made local changes that would be " \
98
- "silently lost if we enqueued a job to deliver it. Why? Only " \
110
+ if processed?
111
+ ::Kernel.raise "You've accessed the message before asking to " \
112
+ "deliver it later, so you may have made local changes that would " \
113
+ "be silently lost if we enqueued a job to deliver it. Why? Only " \
99
114
  "the mailer method *arguments* are passed with the delivery job! " \
100
115
  "Do not access the message in any way if you mean to deliver it " \
101
116
  "later. Workarounds: 1. don't touch the message before calling " \
102
117
  "#deliver_later, 2. only touch the message *within your mailer " \
103
118
  "method*, or 3. use a custom Active Job instead of #deliver_later."
104
119
  else
105
- args = @mailer.name, @mail_method.to_s, delivery_method.to_s, *@args
106
- ActionMailer::DeliveryJob.set(options).perform_later(*args)
120
+ args = @mailer_class.name, @action.to_s, delivery_method.to_s, *@args
121
+ ::ActionMailer::DeliveryJob.set(options).perform_later(*args)
107
122
  end
108
123
  end
109
124
  end
@@ -0,0 +1,27 @@
1
+ module ActionMailer #:nodoc:
2
+ # Provides `rescue_from` for mailers. Wraps mailer action processing,
3
+ # mail job processing, and mail delivery.
4
+ module Rescuable
5
+ extend ActiveSupport::Concern
6
+ include ActiveSupport::Rescuable
7
+
8
+ class_methods do
9
+ def handle_exception(exception) #:nodoc:
10
+ rescue_with_handler(exception) || raise(exception)
11
+ end
12
+ end
13
+
14
+ def handle_exceptions #:nodoc:
15
+ yield
16
+ rescue => exception
17
+ rescue_with_handler(exception) || raise
18
+ end
19
+
20
+ private
21
+ def process(*)
22
+ handle_exceptions do
23
+ super
24
+ end
25
+ end
26
+ end
27
+ end
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.0.0.rc1
4
+ version: 5.0.0.rc2
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: 2016-05-06 00:00:00.000000000 Z
11
+ date: 2016-06-22 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.0.0.rc1
19
+ version: 5.0.0.rc2
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.0.0.rc1
26
+ version: 5.0.0.rc2
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.0.0.rc1
33
+ version: 5.0.0.rc2
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.0.0.rc1
40
+ version: 5.0.0.rc2
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.0.0.rc1
47
+ version: 5.0.0.rc2
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.0.0.rc1
54
+ version: 5.0.0.rc2
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: mail
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -114,6 +114,7 @@ files:
114
114
  - lib/action_mailer/message_delivery.rb
115
115
  - lib/action_mailer/preview.rb
116
116
  - lib/action_mailer/railtie.rb
117
+ - lib/action_mailer/rescuable.rb
117
118
  - lib/action_mailer/test_case.rb
118
119
  - lib/action_mailer/test_helper.rb
119
120
  - lib/action_mailer/version.rb
@@ -142,7 +143,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
142
143
  requirements:
143
144
  - none
144
145
  rubyforge_project:
145
- rubygems_version: 2.5.1
146
+ rubygems_version: 2.6.4
146
147
  signing_key:
147
148
  specification_version: 4
148
149
  summary: Email composition, delivery, and receiving framework (part of Rails).