mandrill_mailer 0.4.13 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- YTdmZmQ0MTg2NGUwNmE3NGRiNjQxMTc5MDcyOTBiMDJjMTg5MTY0Yg==
4
+ Y2VmMGFhYjViZGU1MGI5YTk4NzY3OWNkMzk5N2ZhYzE1ZGY1NWU4OQ==
5
5
  data.tar.gz: !binary |-
6
- MmNkYjMyZmQxODAzZDhmYmI0Y2YzYWExMGFjYjRhZDYwNzQwNzc4Ng==
6
+ ZWUwMGI0MjU1ZmExNWY2YmI0NzcyZDM0Yjc1OTY4YmUwYjM4MGZkYw==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- ZTQ2OGYzMGUxN2Q2N2U2MjJkYWI4ZWYyNjVkNjJiZmU5M2QyNTFjNDUzZjVk
10
- YzUwYTgyMmZkMjIxNDkwMTVkM2RjOTllNzRkOGY4ZGI1YzlmYWI5MTgzZTRm
11
- NzYwOThlMzI1OGE2OGY5MzJiYTYxNmFlNjQxNjc3ZTVmYTcyMDM=
9
+ NDhjMzc2Yzk1MGJhZGYzZmE2MTIwNGVlMjBjNDJkYmIzODViN2IzYTZjZjRh
10
+ MGJjMWVmMWMwMjI3Mzc5YjQwNDBjODExNTVhZTkwMDdiZGIwOTE4Zjc0YTc0
11
+ ZDc4ODAwMmVjNzFjZWI3MmI3NDhiMDc5YWYyNzg0ZDJiMTlhMTQ=
12
12
  data.tar.gz: !binary |-
13
- YmQ5OWI4OWE4MWRmMTlkYWZlZWJhZjU2Y2U2YWRmYzYyYTY1OGVjZGUxOGM1
14
- NzA5M2M3YTMzZmYzYzc4NGNjZWMzNTlhYmQ1YWI3MzNlMDc5YzFkMGI4Njc4
15
- ZGRlOTA0OGZiZjk1YTk4ZTc2MGE3ZTZhMzk2YmNhZGQwMTljMGM=
13
+ YTI4MTJlNWM1MzdmMTk1NjMwMjM2NzQ1YmRlNmVmMjUxODllYWU2YzIxMTU0
14
+ NGI0MWE4NGM2NGU0OWY1YmFlNjk5YjVmNjI0MTljNjM4OTc4ZTE0ZDZjZjRl
15
+ ZDgzY2JhODBkOTI3YjcxZWNjYWE3MjdhYTEzNTU4NTBlMzk5YWY=
@@ -1,3 +1,6 @@
1
+ # 0.5.0
2
+ - [IMPROVEMENT] Made the file attachment and image apis compatible with mandrill api doc syntax
3
+
1
4
  # 0.4.9
2
5
  - [FEATURE] Added offline support for the MandrillMailer::Messenger class. Thanks @arthurtalkgoal
3
6
 
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
- # Mandrill Mailer
2
- [![Gem Version](http://img.shields.io/gem/v/mandrill_mailer.svg)](rubygems.org/gems/mandrill_mailer)
3
- [![Code Climate](http://img.shields.io/codeclimate/github/renz45/mandrill_mailer.svg)](https://codeclimate.com/github/renz45/mandrill_mailer)
1
+ # Mandrill Mailer
2
+ [![Gem Version](http://img.shields.io/gem/v/mandrill_mailer.svg)](rubygems.org/gems/mandrill_mailer)
3
+ [![Code Climate](http://img.shields.io/codeclimate/github/renz45/mandrill_mailer.svg)](https://codeclimate.com/github/renz45/mandrill_mailer)
4
4
  [![Dependencies](http://img.shields.io/gemnasium/renz45/mandrill_mailer.svg)](https://gemnasium.com/renz45/mandrill_mailer)
5
5
 
6
6
  Inherit the MandrillMailer class in your existing Rails mailers to send transactional emails through Mandrill using their template-based emails.
@@ -32,7 +32,7 @@ ActionMailer::Base.smtp_settings = {
32
32
  :address => "smtp.mandrillapp.com",
33
33
  :port => 587,
34
34
  :user_name => ENV['MANDRILL_USERNAME'],
35
- :password => ENV['MANDRILL_PASSWORD'],
35
+ :password => ENV['MANDRILL_API_KEY'],
36
36
  :domain => 'heroku.com'
37
37
  }
38
38
  ActionMailer::Base.delivery_method = :smtp
@@ -47,7 +47,7 @@ You don't need to add the ActionMailer stuff unless you're still using ActionMai
47
47
  This uses the Mandrill SMTP servers. If you're using template-based emails
48
48
  through the Mandrill API you only need the `MandrillMailer.configure` portion.
49
49
 
50
- Do not forget to setup the environment (`ENV`) variables on your server instead
50
+ Do not forget to setup the environment (`ENV`) variables on your server instead
51
51
  of hardcoding your Mandrill username and password in the `mail.rb` initializer.
52
52
 
53
53
  You will also need to set `default_url_options` for the mailer, similar to ActionMailer
@@ -68,25 +68,30 @@ class InvitationMailer < MandrillMailer::TemplateMailer
68
68
  # in this example `invitation.invitees` is an Array
69
69
  invitees = invitation.invitees.map { |invitee| { email: invitee.email, name: invitee.name } }
70
70
 
71
- mandrill_mail template: 'group-invite',
72
- subject: I18n.t('invitation_mailer.invite.subject'),
73
- to: invitees,
74
- # to: invitation.email,
75
- # to: { email: invitation.email, name: 'Honored Guest' },
76
- vars: {
77
- 'OWNER_NAME' => invitation.owner_name,
78
- 'PROJECT_NAME' => invitation.project_name
79
- },
80
- important: true,
81
- inline_css: true,
82
- recipient_vars: invitation.invitees.map do |invitee| # invitation.invitees is an Array
83
- { invitee.email =>
84
- {
85
- 'INVITEE_NAME' => invitee.name,
86
- 'INVITATION_URL' => new_invitation_url(invitee.email, secret: invitee.secret_code)
87
- }
88
- }
89
- end
71
+ mandrill_mail(
72
+ template: 'group-invite',
73
+ subject: I18n.t('invitation_mailer.invite.subject'),
74
+ to: invitees,
75
+ # to: invitation.email,
76
+ # to: { email: invitation.email, name: 'Honored Guest' },
77
+ vars: {
78
+ 'OWNER_NAME' => invitation.owner_name,
79
+ 'PROJECT_NAME' => invitation.project_name
80
+ },
81
+ important: true,
82
+ inline_css: true,
83
+ recipient_vars: invitation.invitees.map do |invitee|
84
+ { invitee.email =>
85
+ {
86
+ 'INVITEE_NAME' => invitee.name,
87
+ 'INVITATION_URL' => new_invitation_url(
88
+ invitee.email,
89
+ secret: invitee.secret_code
90
+ )
91
+ }
92
+ }
93
+ end
94
+ )
90
95
  end
91
96
  end
92
97
  ```
@@ -141,14 +146,14 @@ end
141
146
  * `:inline_css` - whether or not to automatically inline all CSS styles provided in the message HTML - only for HTML documents less than 256KB in size.
142
147
 
143
148
  * `:attachments` - An array of file objects with the following keys:
144
- * `file:` This is the actual file, it will be converted to byte data in the mailer
145
- * `filename:` The name of the file
146
- * `mimetype:` This is the mimetype of the file. Ex. png = image/png, pdf = application/pdf, txt = text/plain etc
149
+ * `content`: The file contents, must be a base64 encoded string
150
+ * `name`: The name of the file
151
+ * `type`: This is the mimetype of the file. Ex. png = image/png, pdf = application/pdf, txt = text/plain etc etc
147
152
 
148
153
  * `:images` - An array of embedded images to add to the message:
149
- * `file:` This is the actual file, it will be converted to byte data in the mailer
150
- * `filename:` The Content ID of the image - use `<img src="cid:THIS_VALUE">` to reference the image in your HTML content
151
- * `mimetype:` The MIME type of the image - must start with "image/"
154
+ * `content`: The file contents, must be a base64 encoded string
155
+ * `name`: The name of the file
156
+ * `type`: This is the mimetype of the file. Ex. png = image/png, pdf = application/pdf, txt = text/plain etc etc etc
152
157
 
153
158
  * `:async` - Whether or not this message should be sent asynchronously
154
159
 
@@ -183,6 +188,13 @@ class InvitationMailer < MandrillMailer::MessageMailer
183
188
  },
184
189
  important: true,
185
190
  inline_css: true,
191
+ attachments: [
192
+ {
193
+ content: Base64.encode64(File.read(File.expand_path('assets/offer.pdf'))),
194
+ name: 'offer.pdf',
195
+ type: 'application/pdf'
196
+ }
197
+ ],
186
198
  recipient_vars: invitation.invitees.map do |invitee| # invitation.invitees is an Array
187
199
  { invitee.email =>
188
200
  {
@@ -48,7 +48,7 @@
48
48
  # 'example@domain.com`
49
49
  # 2)
50
50
  # { email: 'someone@email.com', name: 'Bob Bertly' }
51
- # 3)
51
+ # 3)
52
52
  # [{ email: 'someone@email.com', name: 'Bob Bertly' },
53
53
  # { email: 'other@email.com', name: 'Claire Nayo' }]
54
54
  #
@@ -107,7 +107,7 @@ module MandrillMailer
107
107
  class InvalidEmail < StandardError; end
108
108
  class InvalidMailerMethod < StandardError; end
109
109
  class InvalidInterceptorParams < StandardError; end
110
-
110
+
111
111
  # Public: Other information on the message to send
112
112
  attr_accessor :message
113
113
 
@@ -151,7 +151,7 @@ module MandrillMailer
151
151
  # Public: setup a way to test mailer methods
152
152
  #
153
153
  # mailer_method - Name of the mailer method the test setup is for
154
- #
154
+ #
155
155
  # block - Block of code to execute to perform the test. The mailer
156
156
  # and options are passed to the block. The options have to
157
157
  # contain at least the :email to send the test to.
@@ -176,7 +176,7 @@ module MandrillMailer
176
176
  # Public: Executes a test email
177
177
  #
178
178
  # mailer_method - Method to execute
179
- #
179
+ #
180
180
  # options - The Hash options used to refine the selection (default: {}):
181
181
  # :email - The email to send the test to.
182
182
  #
@@ -197,17 +197,17 @@ module MandrillMailer
197
197
  end
198
198
 
199
199
  end
200
-
200
+
201
201
  # Public: Triggers the stored Mandrill params to be sent to the Mandrill api
202
202
  def deliver
203
203
  mesg = "#{self.class.name}#deliver() is not implemented."
204
204
  raise NotImplementedError.new(mesg)
205
205
  end
206
-
206
+
207
207
  # Public: Build the hash needed to send to the mandrill api
208
208
  #
209
209
  # args - The Hash options used to refine the selection:
210
-
210
+
211
211
  # Examples
212
212
  #
213
213
  # mandrill_mail template: 'Group Invite',
@@ -229,7 +229,7 @@ module MandrillMailer
229
229
  mesg = "#{self.class.name}#data() is not implemented."
230
230
  raise NotImplementedError.new(mesg)
231
231
  end
232
-
232
+
233
233
  def check_required_options
234
234
  mesg = "#{self.class.name}#check_required_options() is not implemented."
235
235
  raise NotImplementedError.new(mesg)
@@ -257,22 +257,16 @@ module MandrillMailer
257
257
  return unless args
258
258
  args.map do |attachment|
259
259
  attachment.symbolize_keys!
260
- type = attachment[:mimetype]
261
- name = attachment[:filename]
262
- file = attachment[:file]
260
+ type = attachment[:mimetype] || attachment[:type]
261
+ name = attachment[:filename] || attachment[:name]
262
+ file = attachment[:file] || attachment[:content]
263
263
  {"type" => type, "name" => name, "content" => Base64.encode64(file)}
264
264
  end
265
265
  end
266
266
 
267
267
  def mandrill_images_args(args)
268
268
  return unless args
269
- args.map do |attachment|
270
- attachment.symbolize_keys!
271
- type = attachment[:mimetype]
272
- name = attachment[:filename]
273
- file = attachment[:file]
274
- {"type" => type, "name" => name, "content" => Base64.encode64(file)}
275
- end
269
+ mandrill_attachment_args(args)
276
270
  end
277
271
 
278
272
  # Makes this class act as a singleton without it actually being a singleton
@@ -360,7 +354,5 @@ module MandrillMailer
360
354
  def api_key
361
355
  MandrillMailer.config.api_key
362
356
  end
363
-
364
-
365
357
  end
366
358
  end
@@ -26,7 +26,7 @@
26
26
  # }
27
27
  # }
28
28
  # end,
29
- # attachments: [{file: File.read(File.expand_path('assets/some_image.png')), filename: 'My Image.png', mimetype: 'image/png'}],
29
+ # attachments: [{content: Base64.encode64(File.read(File.expand_path('assets/some_image.png'))), name: 'MyImage.png', type: 'image/png'}],
30
30
  # important: true,
31
31
  # inline_css: true
32
32
  # end
@@ -48,7 +48,7 @@
48
48
  # 'example@domain.com`
49
49
  # 2)
50
50
  # { email: 'someone@email.com', name: 'Bob Bertly' }
51
- # 3)
51
+ # 3)
52
52
  # [{ email: 'someone@email.com', name: 'Bob Bertly' },
53
53
  # { email: 'other@email.com', name: 'Claire Nayo' }]
54
54
  #
@@ -62,14 +62,14 @@
62
62
  # ex. [{'someone@email.com' => {'INVITEE_NAME' => 'Roger'}}, {'another@email.com' => {'INVITEE_NAME' => 'Tommy'}}]
63
63
 
64
64
  # :attachments - An array of file objects with the following keys:
65
- # file: This is the actual file, it will be converted to byte data in the mailer
66
- # filename: The name of the file
67
- # mimetype: This is the mimetype of the file. Ex. png = image/png, pdf = application/pdf, txt = text/plain etc
65
+ # content: The file contents, must be a base64 encoded string
66
+ # name: The name of the file
67
+ # type: This is the mimetype of the file. Ex. png = image/png, pdf = application/pdf, txt = text/plain etc
68
68
 
69
69
  # :images - An array of embedded images to add to the message:
70
- # file: This is the actual file, it will be converted to byte data in the mailer
71
- # filename: The Content ID of the image - use <img src="cid:THIS_VALUE"> to reference the image in your HTML content
72
- # mimetype: The MIME type of the image - must start with "image/"
70
+ # content: The file contents, must be a base64 encoded string
71
+ # name: The name of the file
72
+ # type: This is the mimetype of the file. Ex. png = image/png, pdf = application/pdf, txt = text/plain etc
73
73
 
74
74
  # :headers - Extra headers to add to the message (currently only Reply-To and X-* headers are allowed) {"...": "..."}
75
75
 
@@ -109,7 +109,7 @@ module MandrillMailer
109
109
  mandrill = Mandrill::API.new(api_key)
110
110
  mandrill.messages.send(message, async, ip_pool, send_at)
111
111
  end
112
-
112
+
113
113
  # Public: Build the hash needed to send to the mandrill api
114
114
  #
115
115
  # args - The Hash options used to refine the selection:
@@ -151,8 +151,8 @@ module MandrillMailer
151
151
 
152
152
  # Construct message hash
153
153
  self.message = {
154
- "text" => args[:text],
155
- "html" => args[:html],
154
+ "text" => args[:text],
155
+ "html" => args[:html],
156
156
  "view_content_link" => args[:view_content_link],
157
157
  "subject" => args[:subject],
158
158
  "from_email" => args[:from] || self.class.defaults[:from],
@@ -177,7 +177,7 @@ module MandrillMailer
177
177
  "attachments" => mandrill_attachment_args(args[:attachments]),
178
178
  "images" => mandrill_images_args(args[:images])
179
179
  }
180
-
180
+
181
181
  unless MandrillMailer.config.interceptor_params.nil?
182
182
  unless MandrillMailer.config.interceptor_params.is_a?(Hash)
183
183
  raise InvalidInterceptorParams.new "The interceptor_params config must be a Hash"
@@ -27,7 +27,7 @@
27
27
  # }
28
28
  # end,
29
29
  # template_content: {},
30
- # attachments: [{file: File.read(File.expand_path('assets/some_image.png')), filename: 'My Image.png', mimetype: 'image/png'}],
30
+ # attachments: [{contents:Base64.encode64(File.read(File.expand_path('assets/some_image.png'))), name: 'MyImage.png', type: 'image/png'}],
31
31
  # important: true,
32
32
  # inline_css: true
33
33
  # end
@@ -48,7 +48,7 @@
48
48
  # 'example@domain.com`
49
49
  # 2)
50
50
  # { email: 'someone@email.com', name: 'Bob Bertly' }
51
- # 3)
51
+ # 3)
52
52
  # [{ email: 'someone@email.com', name: 'Bob Bertly' },
53
53
  # { email: 'other@email.com', name: 'Claire Nayo' }]
54
54
  #
@@ -67,14 +67,14 @@
67
67
  # these fields by passing a Hash {'header' => 'my email content'}
68
68
 
69
69
  # :attachments - An array of file objects with the following keys:
70
- # file: This is the actual file, it will be converted to byte data in the mailer
71
- # filename: The name of the file
72
- # mimetype: This is the mimetype of the file. Ex. png = image/png, pdf = application/pdf, txt = text/plain etc
70
+ # content: The file contents, must be a base64 encoded string
71
+ # name: The name of the file
72
+ # type: This is the mimetype of the file. Ex. png = image/png, pdf = application/pdf, txt = text/plain etc
73
73
 
74
74
  # :images - An array of embedded images to add to the message:
75
- # file: This is the actual file, it will be converted to byte data in the mailer
76
- # filename: The Content ID of the image - use <img src="cid:THIS_VALUE"> to reference the image in your HTML content
77
- # mimetype: The MIME type of the image - must start with "image/"
75
+ # content: The file contents, must be a base64 encoded string
76
+ # name: The name of the file
77
+ # type: This is the mimetype of the file. Ex. png = image/png, pdf = application/pdf, txt = text/plain etc
78
78
 
79
79
  # :headers - Extra headers to add to the message (currently only Reply-To and X-* headers are allowed) {"...": "..."}
80
80
 
@@ -1,3 +1,3 @@
1
1
  module MandrillMailer
2
- VERSION = "0.4.13"
2
+ VERSION = "0.5.0"
3
3
  end
@@ -0,0 +1,67 @@
1
+ require "spec_helper"
2
+ require 'base64'
3
+
4
+ describe MandrillMailer::CoreMailer do
5
+ subject(:core_mailer) { described_class }
6
+
7
+ let(:file_args) do
8
+ {
9
+ mimetype: "some/type",
10
+ filename: 'test',
11
+ file: "testing some test test file"
12
+ }
13
+ end
14
+
15
+ let(:api_args) do
16
+ {
17
+ type: "some/type",
18
+ name: 'test',
19
+ content: "testing some test test file"
20
+ }
21
+ end
22
+
23
+
24
+ describe 'protected#mandrill_attachment_args' do
25
+ context "with file syntax" do
26
+ it "formats the correct attachment data" do
27
+ expect(core_mailer.new.send(:mandrill_attachment_args, [file_args])).to eq([{
28
+ 'type' => "some/type",
29
+ 'name' => 'test',
30
+ 'content' => Base64.encode64("testing some test test file")
31
+ }])
32
+ end
33
+ end
34
+
35
+ context "with api syntax" do
36
+ it "formats the correct attachment data" do
37
+ expect(core_mailer.new.send(:mandrill_attachment_args, [api_args])).to eq([{
38
+ 'type' => "some/type",
39
+ 'name' => 'test',
40
+ 'content' => Base64.encode64("testing some test test file")
41
+ }])
42
+ end
43
+ end
44
+ end
45
+
46
+ describe '#mandrill_images_args' do
47
+ context "with file syntax" do
48
+ it "formats the correct attachment data" do
49
+ expect(core_mailer.new.send(:mandrill_attachment_args, [file_args])).to eq([{
50
+ 'type' => "some/type",
51
+ 'name' => 'test',
52
+ 'content' => Base64.encode64("testing some test test file")
53
+ }])
54
+ end
55
+ end
56
+
57
+ context "with api syntax" do
58
+ it "formats the correct attachment data" do
59
+ expect(core_mailer.new.send(:mandrill_attachment_args, [api_args])).to eq([{
60
+ 'type' => "some/type",
61
+ 'name' => 'test',
62
+ 'content' => Base64.encode64("testing some test test file")
63
+ }])
64
+ end
65
+ end
66
+ end
67
+ end
@@ -58,8 +58,8 @@ describe MandrillMailer::TemplateMailer do
58
58
  url_strip_qs: false
59
59
  }
60
60
  end
61
-
62
-
61
+
62
+
63
63
  let(:message_args) do
64
64
  {
65
65
  text: "Example text content",
@@ -97,7 +97,7 @@ describe MandrillMailer::TemplateMailer do
97
97
  MandrillMailer.config.default_url_options = { host: default_host }
98
98
  #MandrillMailer.config.stub(:image_path).and_return(image_path)
99
99
  allow(MandrillMailer.config).to receive(:image_path).and_return(image_path)
100
-
100
+
101
101
  MandrillMailer::TemplateMailer.default from: from_email, from_name: from_name
102
102
  end
103
103
 
@@ -215,7 +215,7 @@ describe MandrillMailer::TemplateMailer do
215
215
  expect(subject.template_name).to eq 'Email Template'
216
216
  end
217
217
 
218
-
218
+
219
219
  it 'should set the template content' do
220
220
  expect(subject.template_content).to eq [{'name' => template_content_name, 'content' => template_content_content}]
221
221
  end
@@ -252,6 +252,7 @@ describe MandrillMailer::TemplateMailer do
252
252
  "url_strip_qs" => args[:url_strip_qs],
253
253
  "preserve_recipients" => false,
254
254
  "bcc_address" => args[:bcc],
255
+ "merge_language" => args[:merge_language],
255
256
  "global_merge_vars" => [{"name" => var_name, "content" => var_content}],
256
257
  "merge_vars" => [{"rcpt" => to_email, "vars" => [{"name" => var_rcpt_name, "content" => var_rcpt_content}]}],
257
258
  "tags" => args[:tags],
@@ -299,6 +300,7 @@ describe MandrillMailer::TemplateMailer do
299
300
  "url_strip_qs" => args[:url_strip_qs],
300
301
  "preserve_recipients" => false,
301
302
  "bcc_address" => @intercepted_params[:bcc_address],
303
+ "merge_language" => args[:merge_language],
302
304
  "global_merge_vars" => [{"name" => var_name, "content" => var_content}],
303
305
  "merge_vars" => [{"rcpt" => to_email, "vars" => [{"name" => var_rcpt_name, "content" => var_rcpt_content}]}],
304
306
  "tags" => @intercepted_params[:tags],
@@ -313,7 +315,7 @@ describe MandrillMailer::TemplateMailer do
313
315
  end
314
316
  end
315
317
 
316
-
318
+
317
319
  describe 'url helpers in mailer' do
318
320
  subject { mailer.send(:course_url) }
319
321
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mandrill_mailer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.13
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Rensel
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-12 00:00:00.000000000 Z
11
+ date: 2014-12-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -101,6 +101,7 @@ files:
101
101
  - lib/mandrill_mailer/template_mailer.rb
102
102
  - lib/mandrill_mailer/version.rb
103
103
  - mandrill_mailer.gemspec
104
+ - spec/core_mailer_spec.rb
104
105
  - spec/fake_rails/fake_rails.rb
105
106
  - spec/message_mailer_spec.rb
106
107
  - spec/spec_helper.rb
@@ -131,6 +132,7 @@ signing_key:
131
132
  specification_version: 4
132
133
  summary: Transactional Mailer for Mandrill
133
134
  test_files:
135
+ - spec/core_mailer_spec.rb
134
136
  - spec/fake_rails/fake_rails.rb
135
137
  - spec/message_mailer_spec.rb
136
138
  - spec/spec_helper.rb