actionmailer 4.2.11 → 5.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of actionmailer might be problematic. Click here for more details.

@@ -1,4 +1,4 @@
1
- require 'active_support/descendants_tracker'
1
+ require "active_support/descendants_tracker"
2
2
 
3
3
  module ActionMailer
4
4
  module Previews #:nodoc:
@@ -21,7 +21,7 @@ module ActionMailer
21
21
 
22
22
  # :nodoc:
23
23
  mattr_accessor :preview_interceptors, instance_writer: false
24
- self.preview_interceptors = []
24
+ self.preview_interceptors = [ActionMailer::InlinePreviewInterceptor]
25
25
  end
26
26
 
27
27
  module ClassMethods
@@ -34,7 +34,8 @@ module ActionMailer
34
34
  # Either a class or a string can be passed in as the Interceptor. If a
35
35
  # string is passed in it will be <tt>constantize</tt>d.
36
36
  def register_preview_interceptor(interceptor)
37
- preview_interceptor = case interceptor
37
+ preview_interceptor = \
38
+ case interceptor
38
39
  when String, Symbol
39
40
  interceptor.to_s.camelize.constantize
40
41
  else
@@ -52,7 +53,7 @@ module ActionMailer
52
53
  extend ActiveSupport::DescendantsTracker
53
54
 
54
55
  class << self
55
- # Returns all mailer preview classes
56
+ # Returns all mailer preview classes.
56
57
  def all
57
58
  load_previews if descendants.empty?
58
59
  descendants
@@ -62,53 +63,53 @@ module ActionMailer
62
63
  # interceptors will be informed so that they can transform the message
63
64
  # as they would if the mail was actually being delivered.
64
65
  def call(email)
65
- preview = self.new
66
+ preview = new
66
67
  message = preview.public_send(email)
67
68
  inform_preview_interceptors(message)
68
69
  message
69
70
  end
70
71
 
71
- # Returns all of the available email previews
72
+ # Returns all of the available email previews.
72
73
  def emails
73
74
  public_instance_methods(false).map(&:to_s).sort
74
75
  end
75
76
 
76
- # Returns true if the email exists
77
+ # Returns true if the email exists.
77
78
  def email_exists?(email)
78
79
  emails.include?(email)
79
80
  end
80
81
 
81
- # Returns true if the preview exists
82
+ # Returns true if the preview exists.
82
83
  def exists?(preview)
83
- all.any?{ |p| p.preview_name == preview }
84
+ all.any? { |p| p.preview_name == preview }
84
85
  end
85
86
 
86
- # Find a mailer preview by its underscored class name
87
+ # Find a mailer preview by its underscored class name.
87
88
  def find(preview)
88
- all.find{ |p| p.preview_name == preview }
89
+ all.find { |p| p.preview_name == preview }
89
90
  end
90
91
 
91
- # Returns the underscored name of the mailer preview without the suffix
92
+ # Returns the underscored name of the mailer preview without the suffix.
92
93
  def preview_name
93
- name.sub(/Preview$/, '').underscore
94
+ name.sub(/Preview$/, "").underscore
94
95
  end
95
96
 
96
- protected
97
- def load_previews #:nodoc:
97
+ private
98
+ def load_previews
98
99
  if preview_path
99
- Dir["#{preview_path}/**/*_preview.rb"].each{ |file| require_dependency file }
100
+ Dir["#{preview_path}/**/*_preview.rb"].each { |file| require_dependency file }
100
101
  end
101
102
  end
102
103
 
103
- def preview_path #:nodoc:
104
+ def preview_path
104
105
  Base.preview_path
105
106
  end
106
107
 
107
- def show_previews #:nodoc:
108
+ def show_previews
108
109
  Base.show_previews
109
110
  end
110
111
 
111
- def inform_preview_interceptors(message) #:nodoc:
112
+ def inform_preview_interceptors(message)
112
113
  Base.preview_interceptors.each do |interceptor|
113
114
  interceptor.previewing_email(message)
114
115
  end
@@ -1,4 +1,4 @@
1
- require 'active_job/railtie'
1
+ require "active_job/railtie"
2
2
  require "action_mailer"
3
3
  require "rails"
4
4
  require "abstract_controller/railties/routes_helpers"
@@ -16,13 +16,19 @@ module ActionMailer
16
16
  paths = app.config.paths
17
17
  options = app.config.action_mailer
18
18
 
19
+ if app.config.force_ssl
20
+ options.default_url_options ||= {}
21
+ options.default_url_options[:protocol] ||= "https"
22
+ end
23
+
19
24
  options.assets_dir ||= paths["public"].first
20
25
  options.javascripts_dir ||= paths["public/javascripts"].first
21
26
  options.stylesheets_dir ||= paths["public/stylesheets"].first
22
27
  options.show_previews = Rails.env.development? if options.show_previews.nil?
28
+ options.cache_store ||= Rails.cache
23
29
 
24
30
  if options.show_previews
25
- options.preview_path ||= defined?(Rails.root) ? "#{Rails.root}/test/mailers/previews" : nil
31
+ options.preview_path ||= defined?(Rails.root) ? "#{Rails.root}/test/mailers/previews" : nil
26
32
  end
27
33
 
28
34
  # make sure readers methods get compiled
@@ -38,15 +44,10 @@ module ActionMailer
38
44
  register_preview_interceptors(options.delete(:preview_interceptors))
39
45
  register_observers(options.delete(:observers))
40
46
 
41
- options.each { |k,v| send("#{k}=", v) }
42
-
43
- if options.show_previews
44
- app.routes.append do
45
- get '/rails/mailers' => "rails/mailers#index"
46
- get '/rails/mailers/*path' => "rails/mailers#preview"
47
- end
48
- end
47
+ options.each { |k, v| send("#{k}=", v) }
49
48
  end
49
+
50
+ ActiveSupport.on_load(:action_dispatch_integration_test) { include ActionMailer::TestCase::ClearTestDeliveries }
50
51
  end
51
52
 
52
53
  initializer "action_mailer.compile_config_methods" do
@@ -55,9 +56,18 @@ module ActionMailer
55
56
  end
56
57
  end
57
58
 
58
- config.after_initialize do
59
- if ActionMailer::Base.preview_path
60
- ActiveSupport::Dependencies.autoload_paths << ActionMailer::Base.preview_path
59
+ config.after_initialize do |app|
60
+ options = app.config.action_mailer
61
+
62
+ if options.show_previews
63
+ app.routes.prepend do
64
+ get "/rails/mailers" => "rails/mailers#index", internal: true
65
+ get "/rails/mailers/*path" => "rails/mailers#preview", internal: true
66
+ end
67
+
68
+ if options.preview_path
69
+ ActiveSupport::Dependencies.autoload_paths << options.preview_path
70
+ end
61
71
  end
62
72
  end
63
73
  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
@@ -1,16 +1,33 @@
1
- require 'active_support/test_case'
2
- require 'rails-dom-testing'
1
+ require "active_support/test_case"
2
+ require "rails-dom-testing"
3
3
 
4
4
  module ActionMailer
5
5
  class NonInferrableMailerError < ::StandardError
6
6
  def initialize(name)
7
- super "Unable to determine the mailer to test from #{name}. " +
8
- "You'll need to specify it using tests YourMailer in your " +
7
+ super "Unable to determine the mailer to test from #{name}. " \
8
+ "You'll need to specify it using tests YourMailer in your " \
9
9
  "test case definition"
10
10
  end
11
11
  end
12
12
 
13
13
  class TestCase < ActiveSupport::TestCase
14
+ module ClearTestDeliveries
15
+ extend ActiveSupport::Concern
16
+
17
+ included do
18
+ setup :clear_test_deliveries
19
+ teardown :clear_test_deliveries
20
+ end
21
+
22
+ private
23
+
24
+ def clear_test_deliveries
25
+ if ActionMailer::Base.delivery_method == :test
26
+ ActionMailer::Base.deliveries.clear
27
+ end
28
+ end
29
+ end
30
+
14
31
  module Behavior
15
32
  extend ActiveSupport::Concern
16
33
 
@@ -24,6 +41,7 @@ module ActionMailer
24
41
  setup :initialize_test_deliveries
25
42
  setup :set_expected_mail
26
43
  teardown :restore_test_deliveries
44
+ ActiveSupport.run_load_hooks(:action_mailer_test_case, self)
27
45
  end
28
46
 
29
47
  module ClassMethods
@@ -39,7 +57,7 @@ module ActionMailer
39
57
  end
40
58
 
41
59
  def mailer_class
42
- if mailer = self._mailer_class
60
+ if mailer = _mailer_class
43
61
  mailer
44
62
  else
45
63
  tests determine_default_mailer(name)
@@ -55,7 +73,7 @@ module ActionMailer
55
73
  end
56
74
  end
57
75
 
58
- protected
76
+ private
59
77
 
60
78
  def initialize_test_deliveries
61
79
  set_delivery_method :test
@@ -82,11 +100,9 @@ module ActionMailer
82
100
  def set_expected_mail
83
101
  @expected = Mail.new
84
102
  @expected.content_type ["text", "plain", { "charset" => charset }]
85
- @expected.mime_version = '1.0'
103
+ @expected.mime_version = "1.0"
86
104
  end
87
105
 
88
- private
89
-
90
106
  def charset
91
107
  "UTF-8"
92
108
  end
@@ -96,7 +112,7 @@ module ActionMailer
96
112
  end
97
113
 
98
114
  def read_fixture(action)
99
- IO.readlines(File.join(Rails.root, 'test', 'fixtures', self.class.mailer_class.name.underscore, action))
115
+ IO.readlines(File.join(Rails.root, "test", "fixtures", self.class.mailer_class.name.underscore, action))
100
116
  end
101
117
  end
102
118
 
@@ -1,7 +1,11 @@
1
+ require "active_job"
2
+
1
3
  module ActionMailer
2
4
  # Provides helper methods for testing Action Mailer, including #assert_emails
3
- # and #assert_no_emails
5
+ # and #assert_no_emails.
4
6
  module TestHelper
7
+ include ActiveJob::TestHelper
8
+
5
9
  # Asserts that the number of emails sent matches the given number.
6
10
  #
7
11
  # def test_emails
@@ -36,7 +40,7 @@ module ActionMailer
36
40
  end
37
41
  end
38
42
 
39
- # Assert that no emails have been sent.
43
+ # Asserts that no emails have been sent.
40
44
  #
41
45
  # def test_emails
42
46
  # assert_no_emails
@@ -58,5 +62,52 @@ module ActionMailer
58
62
  def assert_no_emails(&block)
59
63
  assert_emails 0, &block
60
64
  end
65
+
66
+ # Asserts that the number of emails enqueued for later delivery matches
67
+ # the given number.
68
+ #
69
+ # def test_emails
70
+ # assert_enqueued_emails 0
71
+ # ContactMailer.welcome.deliver_later
72
+ # assert_enqueued_emails 1
73
+ # ContactMailer.welcome.deliver_later
74
+ # assert_enqueued_emails 2
75
+ # end
76
+ #
77
+ # If a block is passed, that block should cause the specified number of
78
+ # emails to be enqueued.
79
+ #
80
+ # def test_emails_again
81
+ # assert_enqueued_emails 1 do
82
+ # ContactMailer.welcome.deliver_later
83
+ # end
84
+ #
85
+ # assert_enqueued_emails 2 do
86
+ # ContactMailer.welcome.deliver_later
87
+ # ContactMailer.welcome.deliver_later
88
+ # end
89
+ # end
90
+ def assert_enqueued_emails(number, &block)
91
+ assert_enqueued_jobs number, only: [ ActionMailer::DeliveryJob, ActionMailer::Parameterized::DeliveryJob ], &block
92
+ end
93
+
94
+ # Asserts that no emails are enqueued for later delivery.
95
+ #
96
+ # def test_no_emails
97
+ # assert_no_enqueued_emails
98
+ # ContactMailer.welcome.deliver_later
99
+ # assert_enqueued_emails 1
100
+ # end
101
+ #
102
+ # If a block is provided, it should not cause any emails to be enqueued.
103
+ #
104
+ # def test_no_emails
105
+ # assert_no_enqueued_emails do
106
+ # # No emails should be enqueued from this block
107
+ # end
108
+ # end
109
+ def assert_no_enqueued_emails(&block)
110
+ assert_no_enqueued_jobs only: [ ActionMailer::DeliveryJob, ActionMailer::Parameterized::DeliveryJob ], &block
111
+ end
61
112
  end
62
113
  end
@@ -1,4 +1,4 @@
1
- require_relative 'gem_version'
1
+ require_relative "gem_version"
2
2
 
3
3
  module ActionMailer
4
4
  # Returns the version of the currently loaded Action Mailer as a
@@ -11,7 +11,7 @@ Example:
11
11
  rails generate mailer Notifications signup forgot_password invoice
12
12
 
13
13
  creates a Notifications mailer class, views, and test:
14
- Mailer: app/mailers/notifications.rb
15
- Views: app/views/notifications/signup.text.erb [...]
16
- Test: test/mailers/notifications_test.rb
14
+ Mailer: app/mailers/notifications_mailer.rb
15
+ Views: app/views/notifications_mailer/signup.text.erb [...]
16
+ Test: test/mailers/notifications_mailer_test.rb
17
17
 
@@ -4,16 +4,33 @@ module Rails
4
4
  source_root File.expand_path("../templates", __FILE__)
5
5
 
6
6
  argument :actions, type: :array, default: [], banner: "method method"
7
- check_class_collision
7
+
8
+ check_class_collision suffix: "Mailer"
8
9
 
9
10
  def create_mailer_file
10
- template "mailer.rb", File.join('app/mailers', class_path, "#{file_name}.rb")
11
- if self.behavior == :invoke
12
- template "application_mailer.rb", 'app/mailers/application_mailer.rb'
11
+ template "mailer.rb", File.join("app/mailers", class_path, "#{file_name}_mailer.rb")
12
+
13
+ in_root do
14
+ if behavior == :invoke && !File.exist?(application_mailer_file_name)
15
+ template "application_mailer.rb", application_mailer_file_name
16
+ end
13
17
  end
14
18
  end
15
19
 
16
20
  hook_for :template_engine, :test_framework
21
+
22
+ private
23
+ def file_name # :doc:
24
+ @_file_name ||= super.gsub(/_mailer/i, "")
25
+ end
26
+
27
+ def application_mailer_file_name
28
+ @_application_mailer_file_name ||= if mountable_engine?
29
+ "app/mailers/#{namespaced_path}/application_mailer.rb"
30
+ else
31
+ "app/mailers/application_mailer.rb"
32
+ end
33
+ end
17
34
  end
18
35
  end
19
36
  end
@@ -1,4 +1,6 @@
1
+ <% module_namespacing do -%>
1
2
  class ApplicationMailer < ActionMailer::Base
2
- default from: "from@example.com"
3
+ default from: 'from@example.com'
3
4
  layout 'mailer'
4
5
  end
6
+ <% end %>
@@ -1,11 +1,11 @@
1
1
  <% module_namespacing do -%>
2
- class <%= class_name %> < ApplicationMailer
2
+ class <%= class_name %>Mailer < ApplicationMailer
3
3
  <% actions.each do |action| -%>
4
4
 
5
5
  # Subject can be set in your I18n file at config/locales/en.yml
6
6
  # with the following lookup:
7
7
  #
8
- # en.<%= file_path.tr("/",".") %>.<%= action %>.subject
8
+ # en.<%= file_path.tr("/",".") %>_mailer.<%= action %>.subject
9
9
  #
10
10
  def <%= action %>
11
11
  @greeting = "Hi"
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: 4.2.11
4
+ version: 5.1.0
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: 2018-11-27 00:00:00.000000000 Z
11
+ date: 2017-04-27 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: 4.2.11
19
+ version: 5.1.0
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: 4.2.11
26
+ version: 5.1.0
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: 4.2.11
33
+ version: 5.1.0
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: 4.2.11
40
+ version: 5.1.0
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: 4.2.11
47
+ version: 5.1.0
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: 4.2.11
54
+ version: 5.1.0
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: mail
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -78,20 +78,14 @@ dependencies:
78
78
  requirements:
79
79
  - - "~>"
80
80
  - !ruby/object:Gem::Version
81
- version: '1.0'
82
- - - ">="
83
- - !ruby/object:Gem::Version
84
- version: 1.0.5
81
+ version: '2.0'
85
82
  type: :runtime
86
83
  prerelease: false
87
84
  version_requirements: !ruby/object:Gem::Requirement
88
85
  requirements:
89
86
  - - "~>"
90
87
  - !ruby/object:Gem::Version
91
- version: '1.0'
92
- - - ">="
93
- - !ruby/object:Gem::Version
94
- version: 1.0.5
88
+ version: '2.0'
95
89
  description: Email on Rails. Compose, deliver, receive, and test emails using the
96
90
  familiar controller/view pattern. First-class support for multipart email and attachments.
97
91
  email: david@loudthinking.com
@@ -112,8 +106,10 @@ files:
112
106
  - lib/action_mailer/log_subscriber.rb
113
107
  - lib/action_mailer/mail_helper.rb
114
108
  - lib/action_mailer/message_delivery.rb
109
+ - lib/action_mailer/parameterized.rb
115
110
  - lib/action_mailer/preview.rb
116
111
  - lib/action_mailer/railtie.rb
112
+ - lib/action_mailer/rescuable.rb
117
113
  - lib/action_mailer/test_case.rb
118
114
  - lib/action_mailer/test_helper.rb
119
115
  - lib/action_mailer/version.rb
@@ -121,7 +117,7 @@ files:
121
117
  - lib/rails/generators/mailer/mailer_generator.rb
122
118
  - lib/rails/generators/mailer/templates/application_mailer.rb
123
119
  - lib/rails/generators/mailer/templates/mailer.rb
124
- homepage: http://www.rubyonrails.org
120
+ homepage: http://rubyonrails.org
125
121
  licenses:
126
122
  - MIT
127
123
  metadata: {}
@@ -133,7 +129,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
133
129
  requirements:
134
130
  - - ">="
135
131
  - !ruby/object:Gem::Version
136
- version: 1.9.3
132
+ version: 2.2.2
137
133
  required_rubygems_version: !ruby/object:Gem::Requirement
138
134
  requirements:
139
135
  - - ">="
@@ -142,7 +138,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
142
138
  requirements:
143
139
  - none
144
140
  rubyforge_project:
145
- rubygems_version: 2.7.6
141
+ rubygems_version: 2.6.11
146
142
  signing_key:
147
143
  specification_version: 4
148
144
  summary: Email composition, delivery, and receiving framework (part of Rails).