capistrano-mailgun 1.0.2 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +30 -0
- data/README.md +131 -31
- data/lib/capistrano-mailgun.rb +81 -20
- data/lib/capistrano-mailgun/version.rb +1 -1
- data/lib/templates/default.html.erb +149 -0
- data/lib/templates/default.txt.erb +26 -0
- data/spec/capistrano-mailgun_spec.rb +108 -10
- data/spec/integration_spec.rb +165 -0
- data/spec/spec_helper.rb +0 -4
- metadata +9 -4
data/CHANGELOG.md
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
## 2012-10-?? - v1.1.0
|
2
|
+
* default subject now includes stage
|
3
|
+
* built-in templates
|
4
|
+
* support for custom messages
|
5
|
+
|
6
|
+
## 2012-10-15 - v1.0.2
|
7
|
+
* Minor release
|
8
|
+
* documentation changes
|
9
|
+
|
10
|
+
## 2012-10-15 - v1.0.1
|
11
|
+
* Minor release
|
12
|
+
* documentation changes
|
13
|
+
|
14
|
+
## 2012-10-15 - v1.0.0
|
15
|
+
* Version 1.0.0!
|
16
|
+
* Proper definitions of dependencies
|
17
|
+
* Proper documentation
|
18
|
+
* Full support for Mailgun API options in `mailgun.send_email`
|
19
|
+
* Deduplication of email addresses in `mailgun.build_recipients`
|
20
|
+
* Support for custom domain in `mailgun.build_recipients`
|
21
|
+
* Support for HTML and text templates in emails using `mailgun.notify_of_deploy`
|
22
|
+
* Full rspec test suite
|
23
|
+
|
24
|
+
## 2012-10-11 - v0.1.1
|
25
|
+
|
26
|
+
* Fixed a bug where it would blow up if you `require` the gem inside a non-Capistrano environment
|
27
|
+
|
28
|
+
## 2012-10-11 - v0.1.0
|
29
|
+
|
30
|
+
Initial Release
|
data/README.md
CHANGED
@@ -1,11 +1,12 @@
|
|
1
|
-
# Capistrano
|
1
|
+
# Capistrano::Mailgun [![Build Status](https://travis-ci.org/spikegrobstein/capistrano-mailgun.png)](https://travis-ci.org/spikegrobstein/capistrano-mailgun)
|
2
2
|
|
3
3
|
*Bust a cap in your deployment notifications*
|
4
4
|
|
5
|
-
|
5
|
+
Mailgun.org is an excellent, API-driven email provider. So, bust out your nine, pop in the clip and send emails
|
6
|
+
easily from inside your Capistrano recipes.
|
6
7
|
|
7
|
-
|
8
|
-
|
8
|
+
`Capistrano::Mailgun` provides a simple interface for notifying of deploys, exposing your Capistrano
|
9
|
+
variables to your ERB template built on top of a more robust public interface to the Mailgun API.
|
9
10
|
|
10
11
|
## Installation
|
11
12
|
|
@@ -34,18 +35,14 @@ To send a notification after deploy, add the following to your `deploy.rb` file:
|
|
34
35
|
set :mailgun_from, 'deployment@example.com' # who the email will appear to come from
|
35
36
|
set :mailgun_recipients, [ 'you@example.com', 'otherguy@example.com' ] # who will receive the email
|
36
37
|
|
37
|
-
# The erb template will have visibility into all your capistrano variables.
|
38
|
-
# this template will be the text body of the notification email
|
39
|
-
set :mailgun_text_template, File.join(File.dirname(__FILE__), 'mail.erb')
|
40
|
-
|
41
38
|
# create an after deploy hook
|
42
|
-
after
|
43
|
-
|
44
|
-
You should then create a `mail.erb` file in the same directory as `deploy.rb`:
|
39
|
+
after :deploy, 'mailgun_notify'
|
45
40
|
|
46
|
-
|
41
|
+
That's it. When you do a deploy, it should automatically send an email using the built-in text and HTML
|
42
|
+
templates.
|
47
43
|
|
48
|
-
|
44
|
+
`Capistrano::Mailgun` defines a `mailgun_notify` task which calls the `mailgun.notify_of_deploy` function,
|
45
|
+
using your Capistrano configuration to send the notification.
|
49
46
|
|
50
47
|
## Example using mailgun.send_email
|
51
48
|
|
@@ -57,6 +54,8 @@ in your `deploy.rb` file:
|
|
57
54
|
set :mailgun_api_key, 'key-12345678901234567890123456789012' # your mailgun API key
|
58
55
|
set :mailgun_domain, 'example.com' # your mailgun email domain
|
59
56
|
|
57
|
+
set :mailgun_recipient_domain, 'example.com' # append this to any unqualified email addresses
|
58
|
+
|
60
59
|
set(:email_body) { abort "Please set email_body using `-s email_body='this is the body of the email'" }
|
61
60
|
|
62
61
|
# some variables that we'll use when calling mailgun.send_email
|
@@ -67,7 +66,7 @@ in your `deploy.rb` file:
|
|
67
66
|
namespace :email do
|
68
67
|
task :ops do
|
69
68
|
mailgun.send_email(
|
70
|
-
:to =>
|
69
|
+
:to => ops_emails, # build_recipients gets called automatically by Capistrano::Mailgun
|
71
70
|
:from => 'some_dude@example.com',
|
72
71
|
:subject => 'you have just been mailgunned',
|
73
72
|
:text => email_body
|
@@ -78,7 +77,7 @@ in your `deploy.rb` file:
|
|
78
77
|
mailgun.send_email(
|
79
78
|
:to => 'no-reply@example.com',
|
80
79
|
:from => 'no-reply@example.com',
|
81
|
-
:bcc => mailgun.build_recipients(dev_emails, 'example.com'),
|
80
|
+
:bcc => mailgun.build_recipients(dev_emails, 'audit.example.com'), # note the different domain
|
82
81
|
:subject => 'You guys are just developers',
|
83
82
|
:text => email_body
|
84
83
|
)
|
@@ -98,7 +97,7 @@ Also, notice the use of `mailgun.build_recipients`. See documentation below for
|
|
98
97
|
|
99
98
|
## Capistrano Variables
|
100
99
|
|
101
|
-
`
|
100
|
+
`Capistrano::Mailgun` leverages variables defined in Capistrano to reduce the amount of configuration
|
102
101
|
you need to do. The following are all variables it supports:
|
103
102
|
|
104
103
|
### mailgun_api_key (required)
|
@@ -115,55 +114,124 @@ The email address that your notifications will appear to come from (by default).
|
|
115
114
|
|
116
115
|
### mailgun_recipients (required for notify_of_deploy)
|
117
116
|
|
118
|
-
|
117
|
+
The email address as a string or an array of email addresses who should recieve an email from `notify_of_deploy`.
|
119
118
|
|
120
|
-
You can optionally only specify just the part of the email address before the @ and `
|
119
|
+
You can optionally only specify just the part of the email address before the @ and `Capistrano::Mailgun` will
|
121
120
|
automatically append the `mailgun_recipient_domain` to it. See `mailgun_recipient_domain`.
|
122
121
|
|
122
|
+
If you omit the domain and don't specify `mailgun_recipient_domain`, a error will be raised.
|
123
|
+
|
124
|
+
### mailgun_cc
|
125
|
+
|
126
|
+
An array of email addresses who should be CC'd when `mailgun.notify_of_deploy` is called. This will
|
127
|
+
follow the same rules as the `mailgun_recipients` variable with respect to the handling of unqualified
|
128
|
+
email addresses.
|
129
|
+
|
130
|
+
### mailgun_bcc
|
131
|
+
|
132
|
+
An array of email addresses who should be BCC'd when `mailgun.notify_of_deploy` is called. This will
|
133
|
+
follow the same rules as the `mailgun_recipients` variable with respect to the handling of unqualified
|
134
|
+
eail addresses.
|
135
|
+
|
123
136
|
### mailgun_text_template (required for notify_of_deploy)
|
124
137
|
|
125
|
-
This is the path to the ERB template that `
|
138
|
+
This is the path to the ERB template that `mailgun.notify_of_deploy` will use to create the text body of
|
126
139
|
your email. This is only required if you do not use the `mailgun_html_template` variable. You can
|
127
140
|
specify both text and html templates and the emails will contain the proper bodies where the client
|
128
141
|
supports it.
|
129
142
|
|
143
|
+
The default setting for this is `:deploy_text` which is a built-in template. See "Built-in Templates"
|
144
|
+
below for more information.
|
145
|
+
|
130
146
|
### mailgun_html_template (required for notify_of_deploy)
|
131
147
|
|
132
148
|
This is the path to the ERB template that will be used to generate the HTML body of the email. It is only
|
133
149
|
required if you do not specify the `mailgun_text_template` variable. You can specify both text and html
|
134
150
|
templates and emails will contain the proper bodies where the client supports it.
|
135
151
|
|
152
|
+
The default setting for this is `:deploy_html` which is a built-in template. See "Built-in Templates"
|
153
|
+
below for more information.
|
154
|
+
|
136
155
|
### mailgun_recipient_domain
|
137
156
|
|
138
157
|
The domain that will be automatically appended to incomplete email addresses in the `mailgun_recipients`.
|
139
158
|
|
159
|
+
Example:
|
160
|
+
|
161
|
+
set :mailgun_recipient_domain, 'example.com'
|
162
|
+
set :mailgun_recipients, [ 'alice', 'bob', 'carl@contractors.net' ]
|
163
|
+
|
164
|
+
When an email is sent from `Capistrano::Mailgun`, the recipients will be processed and the email will be sent to:
|
165
|
+
|
166
|
+
* alice@example.com
|
167
|
+
* bob@example.com
|
168
|
+
* carl@contractors.net
|
169
|
+
|
170
|
+
If `mailgun_recipient_domain` is not set, `Capistrano::Mailgun` will raise an error.
|
171
|
+
|
140
172
|
### mailgun_subject
|
141
173
|
|
142
174
|
The subject to be used in deployment emails. This defaults to:
|
143
175
|
|
144
|
-
[Deployment] #{ application.capitalize }
|
176
|
+
[Deployment] #{ application.capitalize } deploy completed
|
177
|
+
|
178
|
+
In the event that you're using multistage, it will include that:
|
179
|
+
|
180
|
+
[Deployment] #{ stage.capitalize } #{ application.capitalize } deploy completed
|
181
|
+
|
182
|
+
Setting this variable yourself will override the default.
|
183
|
+
|
184
|
+
### mailgun_message
|
185
|
+
|
186
|
+
An optional message can be specified to be included in the email. This is used inside the default templates,
|
187
|
+
so if you use your own templates, you'll have to include support for this variable yourself.
|
145
188
|
|
146
|
-
|
189
|
+
The purpose of this variable is to be set when calling capistrano so you can have a custom, per-deploy message.
|
190
|
+
You would call it in the following manner:
|
191
|
+
|
192
|
+
cap deploy -s mailgun_message="Fixes that really nasty bug where our site does not work"
|
193
|
+
|
194
|
+
### github_url
|
195
|
+
|
196
|
+
If your project is hosted on Github and you'd like to have links to the Github repository in the deployment
|
197
|
+
notifications, set this. It should be in the following format:
|
198
|
+
|
199
|
+
https://github.com/USERNAME/PROJECT
|
200
|
+
|
201
|
+
This is used for linking to commits from the log and linking to the Github page for the exact revision that
|
202
|
+
was deployed.
|
203
|
+
|
204
|
+
## Capistrano Tasks
|
205
|
+
|
206
|
+
### mailgun_notify
|
207
|
+
|
208
|
+
This task is defined strictly for convenience in defining Capistrano hooks and for sending a notification
|
209
|
+
from the commandline. All it does is run `mailgun.notify_of_deploy` on your local machine.
|
210
|
+
|
211
|
+
Normally, you'd want to have an after-hook on `deploy` defined as follows:
|
212
|
+
|
213
|
+
after :deploy, 'mailgun_notify'
|
147
214
|
|
148
215
|
## Function API
|
149
216
|
|
150
|
-
`
|
217
|
+
`Capistrano::Mailgun` has a couple of functions to simplify some common tasks. The following are the functions:
|
151
218
|
|
152
219
|
### mailgun.build_recipients( recipients, default_domain=nil )
|
153
220
|
|
154
221
|
Given an array of email addresses, this will join them with a comma so any recipients field with more than 1 recipient
|
155
|
-
will be formatted properly, have the recipients list deduplicated and returned as a string. Typically, you will
|
156
|
-
this function
|
222
|
+
will be formatted properly, have the recipients list deduplicated and returned as a string. Typically, you will not call
|
223
|
+
this function directly as `Capistrano::Mailgun` calls it implicitely on your `to`, `cc` and `bcc` fields before hitting
|
224
|
+
the Mailgun API.
|
157
225
|
|
158
226
|
You can also pass an alternate `default_domain`. This is useful if you're not using the global `mailgun_recipient_domain`
|
159
|
-
Capistrano variable of if you want to override the behavior in
|
160
|
-
choose the specified `default_domain` over `mailgun_recipient_domain`.
|
227
|
+
Capistrano variable of if you want to override the behavior in a specific case. `mailgun.build_recipients` will always
|
228
|
+
choose the specified `default_domain` passed to the function over the Capistrano variable `mailgun_recipient_domain`.
|
161
229
|
|
162
230
|
### mailgun.notify_of_deploy
|
163
231
|
|
164
|
-
This is a convenience function to send an email via the Mailgun api using your Capistrano variables for
|
165
|
-
|
166
|
-
|
232
|
+
This is a convenience function to send an email via the Mailgun api using your Capistrano variables for declarative
|
233
|
+
configuration. It will use `mailgun_html_template` and `mailgun_text_template` to generate the email body when set,
|
234
|
+
`mailgun_recipients` for who to address the email to, `mailgun_from` for the reply-to field
|
167
235
|
of the email and `mailgun_subject` for the subject of the email.
|
168
236
|
|
169
237
|
See Quickstart, above, for an example.
|
@@ -182,9 +250,13 @@ This function also takes the following additional options:
|
|
182
250
|
* `:text_template` -- a path to an ERB template for the text body of the email.
|
183
251
|
* `:html_template` -- a path to an ERB template for the HTML body of the email.
|
184
252
|
|
185
|
-
The templates will have access to all of your Capistrano variables
|
253
|
+
The templates will have access to all of your Capistrano variables and anything else that Capistrano can see
|
254
|
+
such as methods and Capistrano plugins (including `Capistrano::Mailgun`).
|
186
255
|
|
187
|
-
Of course, you can also pass `:text` and `:html` options for the exact text/html bodies of the sent emails
|
256
|
+
Of course, you can also pass `:text` and `:html` options for the exact text/html bodies of the sent emails as they
|
257
|
+
will be passed directly to the Mailgun API.
|
258
|
+
|
259
|
+
No validation is done from this function, so errors from Mailgun will percolate up to you.
|
188
260
|
|
189
261
|
### deployer_username
|
190
262
|
|
@@ -192,10 +264,28 @@ This is a default capistrano variable that is defined in the gem. It will use th
|
|
192
264
|
configured as `:git` or use `whoami` if not. This is handy if you want to notify people of which user
|
193
265
|
actually did the deployment.
|
194
266
|
|
267
|
+
## Built-in Templates
|
268
|
+
|
269
|
+
`Capistrano::Mailgun` comes with built-in templates for use with `mailgun.notify_of_deploy`. There are both HTML and Text
|
270
|
+
templates which include information such as the sha1 and ref that has been deployed as well as logs of the last
|
271
|
+
commits. Use of the Capistrano variable `github_url` will enable links back to the repository and direct links
|
272
|
+
to the commits in the log.
|
273
|
+
|
274
|
+
These files live inside the gem in the `lib/templates` directory, so feel free to pull them out, copy into
|
275
|
+
your project and customize.
|
276
|
+
|
277
|
+
By default, `mailgun.notify_of_deploy` sets `mailgun_text_template` to `:default_text` and `mailgun_html_template`
|
278
|
+
to `:default_html`, which signals it to use these built-in templates. Overriding those variables with absolute
|
279
|
+
paths to your own templates will signal mailgun to use those. Setting either variable to `nil` will prevent
|
280
|
+
`mailgun.notify_of_deploy` from using anything for either the text or HTML portion of the email.
|
281
|
+
|
195
282
|
## Limitations
|
196
283
|
|
197
284
|
* Only supports ERB for templates. This should be changed in a future release.
|
198
285
|
* Currently requires that ERB templates are on the filesystem. Future releases may allow for inline templates.
|
286
|
+
* Support for VCSs other than `:git` is lacking. `Capistrano::Mailgun` has been built with git and Github in mind.
|
287
|
+
If anyone has interest in adding support for other another version control system, that would be great.
|
288
|
+
Using this with a VCS other than Git may yeild unpredictable results.
|
199
289
|
|
200
290
|
## Contributing
|
201
291
|
|
@@ -204,3 +294,13 @@ actually did the deployment.
|
|
204
294
|
3. Commit your changes (`git commit -am 'Added some feature'`)
|
205
295
|
4. Push to the branch (`git push origin my-new-feature`)
|
206
296
|
5. Create new Pull Request
|
297
|
+
|
298
|
+
## Acknowledgements
|
299
|
+
|
300
|
+
`Capistrano::Mailgun` is written by Spike Grobstein and is used in production at [Ticket Evolution](http://www.ticketevolution.com)
|
301
|
+
|
302
|
+
`Capistrano::Mailgun` leverages the awesome email sending API of [Mailgun.org](http://mailgun.org). You should definitely check it out.
|
303
|
+
|
304
|
+
## License
|
305
|
+
|
306
|
+
`Capistrano::Mailgun` is ©2012 Spike Grobstein and licensed under the MIT License. See `LICENSE` file.
|
data/lib/capistrano-mailgun.rb
CHANGED
@@ -14,7 +14,9 @@ module Capistrano
|
|
14
14
|
|
15
15
|
Capistrano.plugin :mailgun, Capistrano::Mailgun
|
16
16
|
|
17
|
-
set(:mailgun_subject)
|
17
|
+
set(:mailgun_subject) do
|
18
|
+
[ "[Deployment]", fetch(:stage, '').to_s.capitalize, fetch(:application, '').capitalize, 'deploy completed'].join(' ').gsub(/\s+/, ' ')
|
19
|
+
end
|
18
20
|
|
19
21
|
set(:mailgun_api_key) { abort "Please set mailgun_api_key accordingly" }
|
20
22
|
set(:mailgun_domain) { abort "Please set mailgun_domain accordingly" }
|
@@ -22,22 +24,39 @@ module Capistrano
|
|
22
24
|
set(:mailgun_recipients) { abort "Please specify mailgun_recipients" }
|
23
25
|
set(:mailgun_recipient_domain) { abort "Please set mailgun_recipient_domain accordingly" }
|
24
26
|
|
27
|
+
# set these to nil to not use, or set to path to your custom template
|
28
|
+
set :mailgun_text_template, :deploy_text
|
29
|
+
set :mailgun_html_template, :deploy_html
|
30
|
+
|
25
31
|
set(:deployer_username) do
|
26
|
-
if fetch(:scm,
|
32
|
+
if fetch(:scm, '').to_sym == :git
|
27
33
|
`git config user.name`.chomp
|
28
34
|
else
|
29
35
|
`whoami`.chomp
|
30
36
|
end
|
31
37
|
end
|
32
38
|
|
39
|
+
# default mailgun email tasks
|
40
|
+
desc <<-DESC
|
41
|
+
Send a mailgun deployment notification.
|
42
|
+
|
43
|
+
This is here for convenience so you can force a notification to
|
44
|
+
be sent from the commandline and also to simplify configuring
|
45
|
+
after-deploy hooks and even after-mailgun-notify hooks.
|
46
|
+
DESC
|
47
|
+
task :mailgun_notify do
|
48
|
+
mailgun.notify_of_deploy
|
49
|
+
end
|
50
|
+
|
51
|
+
|
33
52
|
|
34
53
|
end # config.load
|
35
54
|
end
|
36
55
|
|
37
56
|
# Simple wrapper for sending an email with a given template
|
38
57
|
# Supports all options that the Mailgun API supports. In addition, it also accepts:
|
39
|
-
#
|
40
|
-
#
|
58
|
+
# * +:text_template+ -- the path to the template for the text body. It will be processed and interpolated and set the +text+ field when doing the API call.
|
59
|
+
# * +:html_template+ -- the path to the template for the html body. It will be processed and interpolated and set the +html+ field when doing the API call.
|
41
60
|
def send_email(options)
|
42
61
|
options = process_send_email_options(options)
|
43
62
|
|
@@ -46,38 +65,35 @@ module Capistrano
|
|
46
65
|
|
47
66
|
# Sends the email via the Mailgun API using variables configured in Capistrano.
|
48
67
|
# It depends on the following Capistrano vars in addition to the default:
|
49
|
-
#
|
50
|
-
#
|
51
|
-
#
|
68
|
+
# * +mailgun_recipients+
|
69
|
+
# * +mailgun_from+
|
70
|
+
# * +mailgun_subject+
|
52
71
|
# Requires one or both of the following:
|
53
|
-
#
|
54
|
-
#
|
72
|
+
# * +mailgun_text_template+
|
73
|
+
# * +mailgun_html_template+
|
55
74
|
#
|
56
75
|
# See README for explanations of the above variables.
|
57
76
|
def notify_of_deploy
|
58
77
|
options = {
|
59
|
-
:to =>
|
78
|
+
:to => fetch(:mailgun_recipients),
|
60
79
|
:from => fetch(:mailgun_from),
|
61
80
|
:subject => fetch(:mailgun_subject)
|
62
81
|
}
|
63
82
|
|
83
|
+
options[:cc] = fetch(:mailgun_cc) if fetch(:mailgun_cc, nil)
|
84
|
+
options[:bcc] = fetch(:mailgun_bcc) if fetch(:mailgun_bcc, nil)
|
85
|
+
|
64
86
|
if fetch(:mailgun_text_template, nil).nil? && fetch(:mailgun_html_template, nil).nil?
|
65
87
|
abort "You must specify one (or both) of mailgun_text_template and mailgun_html_template to use notify_of_deploy"
|
66
88
|
end
|
67
89
|
|
68
|
-
options[:text_template] = fetch(:mailgun_text_template
|
69
|
-
options[:html_template] = fetch(:mailgun_html_template
|
90
|
+
options[:text_template] = fetch(:mailgun_text_template, nil)
|
91
|
+
options[:html_template] = fetch(:mailgun_html_template, nil)
|
70
92
|
|
71
93
|
send_email options
|
72
94
|
end
|
73
95
|
|
74
|
-
#
|
75
|
-
def find_template(t)
|
76
|
-
return t
|
77
|
-
File.join( File.dirname(__FILE__), t )
|
78
|
-
end
|
79
|
-
|
80
|
-
# Given an array of +recipients+, it returns a comma-delimited, deduplicated string, suitable for populating the +to+ field of a Mailgun API call.
|
96
|
+
# Given an array of +recipients+, it returns a comma-delimited, deduplicated string, suitable for populating the +to+, +cc+, and +bcc+ fields of a Mailgun API call.
|
81
97
|
# Optionally, it will take a +default_domain+ which will automatically be appended to any unqualified recipients (eg: 'spike' => 'spike@example.com')
|
82
98
|
def build_recipients(recipients, default_domain=nil)
|
83
99
|
[*recipients].map do |r|
|
@@ -86,19 +102,64 @@ module Capistrano
|
|
86
102
|
else
|
87
103
|
"#{ r }@#{ default_domain || fetch(:mailgun_recipient_domain) }"
|
88
104
|
end
|
89
|
-
end.uniq
|
105
|
+
end.uniq.sort.join(',')
|
106
|
+
end
|
107
|
+
|
108
|
+
# git log between +first_ref+ to +last_ref+
|
109
|
+
def log_output(first_ref, last_ref)
|
110
|
+
return @log_output unless @log_output.nil?
|
111
|
+
|
112
|
+
log_output = run_locally("git log --oneline #{ first_ref }..#{ last_ref }")
|
113
|
+
|
114
|
+
@log_output = log_output = log_output.split("\n").map do |line|
|
115
|
+
fields = line.split("\s", 2)
|
116
|
+
[ fields[0], fields[1] ]
|
117
|
+
end
|
90
118
|
end
|
91
119
|
|
92
120
|
private
|
93
121
|
|
122
|
+
def default_deploy_text_template_path
|
123
|
+
default_template_path 'default.txt.erb'
|
124
|
+
end
|
125
|
+
|
126
|
+
def default_deploy_html_template_path
|
127
|
+
default_template_path 'default.html.erb'
|
128
|
+
end
|
129
|
+
|
130
|
+
def default_template_path(name)
|
131
|
+
File.join( File.dirname(__FILE__), 'templates', name)
|
132
|
+
end
|
133
|
+
|
134
|
+
def find_template(t)
|
135
|
+
case t
|
136
|
+
when :deploy_text then default_deploy_text_template_path
|
137
|
+
when :deploy_html then default_deploy_html_template_path
|
138
|
+
else
|
139
|
+
abort "Unknown template symbol: #{ t }" if t.is_a?(Symbol)
|
140
|
+
abort "Template not found: #{ t }" unless File.exists?(t)
|
141
|
+
t
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
94
145
|
# apply templates and all that jazz
|
95
146
|
def process_send_email_options(options)
|
96
147
|
text_template = options.delete(:text_template)
|
97
148
|
html_template = options.delete(:html_template)
|
98
149
|
|
150
|
+
options[:to] = build_recipients(options[:to]) unless options[:to].nil?
|
151
|
+
options[:cc] = build_recipients(options[:cc]) unless options[:cc].nil?
|
152
|
+
options[:bcc] = build_recipients(options[:bcc]) unless options[:bcc].nil?
|
153
|
+
|
99
154
|
options[:text] = ERB.new( File.open( find_template(text_template) ).read ).result(self.binding) if text_template
|
100
155
|
options[:html] = ERB.new( File.open( find_template(html_template) ).read ).result(self.binding) if html_template
|
101
156
|
|
157
|
+
# clean up the text template a little
|
158
|
+
if options[:text]
|
159
|
+
options[:text].gsub! /^ +/, ''
|
160
|
+
options[:text].gsub! /\n{3,}/, "\n\n"
|
161
|
+
end
|
162
|
+
|
102
163
|
options
|
103
164
|
end
|
104
165
|
|
@@ -0,0 +1,149 @@
|
|
1
|
+
<html>
|
2
|
+
<head>
|
3
|
+
<style>
|
4
|
+
body {
|
5
|
+
font: 12px "Helvetica", "Lucida Grande", "Trebuchet MS", Verdana, sans-serif;
|
6
|
+
}
|
7
|
+
.section h2 {
|
8
|
+
color: #999;
|
9
|
+
margin: 0;
|
10
|
+
}
|
11
|
+
|
12
|
+
.section {
|
13
|
+
margin-bottom: 10px;
|
14
|
+
border-radius: 10px;
|
15
|
+
background-color: #eee;
|
16
|
+
|
17
|
+
padding: 5px 20px;
|
18
|
+
}
|
19
|
+
|
20
|
+
dt {
|
21
|
+
width: 15%;
|
22
|
+
margin-right: 10px;
|
23
|
+
display: inline-block;
|
24
|
+
white-space: nowrap;
|
25
|
+
|
26
|
+
clear: both;
|
27
|
+
}
|
28
|
+
|
29
|
+
dd {
|
30
|
+
width: 65%;
|
31
|
+
display: inline-block;
|
32
|
+
}
|
33
|
+
|
34
|
+
dl dt {
|
35
|
+
font-weight: bold;
|
36
|
+
}
|
37
|
+
|
38
|
+
.log ul {
|
39
|
+
font-family: monospace;
|
40
|
+
|
41
|
+
list-style: none;
|
42
|
+
}
|
43
|
+
|
44
|
+
.log ul li {
|
45
|
+
margin: 5px;
|
46
|
+
}
|
47
|
+
|
48
|
+
.log ul li a {
|
49
|
+
font-weight: bold;
|
50
|
+
padding: 2px 5px;
|
51
|
+
background-color: #eee;
|
52
|
+
color: #666;
|
53
|
+
text-decoration: none;
|
54
|
+
}
|
55
|
+
|
56
|
+
.log ul li a:hover {
|
57
|
+
text-decoration: underline;
|
58
|
+
color: black;
|
59
|
+
}
|
60
|
+
|
61
|
+
</style>
|
62
|
+
</head>
|
63
|
+
<body>
|
64
|
+
|
65
|
+
<h1>
|
66
|
+
<%= fetch(:stage, '').to_s.capitalize %> <%= application.capitalize %> deployment completed!
|
67
|
+
</h1>
|
68
|
+
|
69
|
+
<div class="section">
|
70
|
+
<h2>Deployment Overview</h2>
|
71
|
+
|
72
|
+
<dl>
|
73
|
+
<dt>Deployed by:</dt>
|
74
|
+
<dd><%= deployer_username %></dd>
|
75
|
+
|
76
|
+
<dt>Deployed at:</dt>
|
77
|
+
<dd><%= Time.now %></dd>
|
78
|
+
</dl>
|
79
|
+
|
80
|
+
<dl>
|
81
|
+
<dt>Application:</dt>
|
82
|
+
<dd><%= fetch(:application, 'N/A') %></dd>
|
83
|
+
|
84
|
+
<dt>Repository:</dt>
|
85
|
+
<dd><%= fetch(:repository, 'N/A') %></dd>
|
86
|
+
|
87
|
+
<% if fetch(:stage, nil) %>
|
88
|
+
<dt>Environment:</dt>
|
89
|
+
<dd><%= stage %></dd>
|
90
|
+
<% end %>
|
91
|
+
</div>
|
92
|
+
|
93
|
+
<div class="section">
|
94
|
+
<h2>Deployment Details</h2>
|
95
|
+
|
96
|
+
<dl>
|
97
|
+
<% if fetch(:branch, nil) %>
|
98
|
+
<dt>Ref:</dt>
|
99
|
+
<dd><%= branch %></dd>
|
100
|
+
<% end %>
|
101
|
+
|
102
|
+
<dt>Sha1:</dt>
|
103
|
+
<dd><%= fetch(:latest_revision, 'N/A') %></dd>
|
104
|
+
|
105
|
+
<dt>Release:</dt>
|
106
|
+
<dd><%= fetch(:release_name, 'N/A') %></dd>
|
107
|
+
|
108
|
+
</dl>
|
109
|
+
|
110
|
+
<% if fetch(:github_url, nil) %>
|
111
|
+
<dl>
|
112
|
+
<dt>WWW:</dt>
|
113
|
+
<dd><%= github_url %>/tree/<%= latest_revision %></dd>
|
114
|
+
</dl>
|
115
|
+
<% end %>
|
116
|
+
</div>
|
117
|
+
|
118
|
+
<% if fetch(:mailgun_message, nil) %>
|
119
|
+
<div id="mailgun_message" class="section">
|
120
|
+
<h2>Custom Message:</h2>
|
121
|
+
<p>
|
122
|
+
<%= fetch(:mailgun_message) %>
|
123
|
+
</p>
|
124
|
+
</div>
|
125
|
+
<% end %>
|
126
|
+
|
127
|
+
<% log_output = mailgun.log_output(latest_revision, real_revision) %>
|
128
|
+
<% unless log_output.count == 0 %>
|
129
|
+
<div class="log">
|
130
|
+
<h2>Log:</h2>
|
131
|
+
|
132
|
+
<ul>
|
133
|
+
<% mailgun.log_output(latest_revision, real_revision).each do |line| %>
|
134
|
+
<li>
|
135
|
+
<% if fetch(:github_url, nil) %>
|
136
|
+
<a href="<%= github_url %>/commit/<%= line[0] %>"><%= line[0] %></a>
|
137
|
+
<% else %>
|
138
|
+
<%= line[0] %>
|
139
|
+
<% end %>
|
140
|
+
|
141
|
+
<%= line[1] %>
|
142
|
+
</li>
|
143
|
+
<% end %>
|
144
|
+
</ul>
|
145
|
+
</div>
|
146
|
+
<% end %>
|
147
|
+
|
148
|
+
</body>
|
149
|
+
</html>
|
@@ -0,0 +1,26 @@
|
|
1
|
+
<%= fetch(:stage, '').to_s.capitalize %> <%= application.capitalize %> deployment completed!
|
2
|
+
|
3
|
+
Deployed by: <%= deployer_username %>
|
4
|
+
Deployed at: <%= Time.now %>
|
5
|
+
|
6
|
+
Application: <%= fetch(:application, 'N/A') %>
|
7
|
+
Repository: <%= fetch(:repository, 'N/A') %>
|
8
|
+
<% if fetch(:stage, nil) %>Environment: <%= stage %><% end %>
|
9
|
+
|
10
|
+
<% if fetch(:branch, nil) %>Ref: <%= branch %><% end %>
|
11
|
+
Sha1: <%= fetch(:latest_revision, 'N/A') %>
|
12
|
+
Release: <%= fetch(:release_name, 'N/A') %>
|
13
|
+
<% if fetch(:mailgun_message, nil) %>
|
14
|
+
Custom Message:
|
15
|
+
<%= fetch(:mailgun_message) %>
|
16
|
+
<% end %>
|
17
|
+
|
18
|
+
<% if fetch(:url, nil) %>WWW: <%= fetch(:url) %><% end %>
|
19
|
+
<% log_output = mailgun.log_output(latest_revision, real_revision) %>
|
20
|
+
<% unless log_output.count == 0 %>
|
21
|
+
Log:
|
22
|
+
---------------------------------------------------------------------------------
|
23
|
+
<% log_output.each do |line| %>
|
24
|
+
<%= line.join(' ') %>
|
25
|
+
<% end %>
|
26
|
+
<% end %>
|
@@ -8,9 +8,11 @@ describe Capistrano::Mailgun do
|
|
8
8
|
|
9
9
|
before do
|
10
10
|
Capistrano::Mailgun.load_into(config)
|
11
|
+
|
12
|
+
RestClient.stub(:post)
|
11
13
|
end
|
12
14
|
|
13
|
-
let
|
15
|
+
let(:mailgun) { config.mailgun }
|
14
16
|
|
15
17
|
context '#buid_recipients' do
|
16
18
|
let(:email_1) { 'spike@example.com' }
|
@@ -21,15 +23,15 @@ describe Capistrano::Mailgun do
|
|
21
23
|
end
|
22
24
|
|
23
25
|
it "should accept a single recipient (not an array)" do
|
24
|
-
build_recipients(email_1).should ==
|
26
|
+
build_recipients(email_1).should == email_1
|
25
27
|
end
|
26
28
|
|
27
29
|
it "should accept an array of recipeints" do
|
28
|
-
build_recipients( [email_1, email_2] ).should == [email_1, email_2]
|
30
|
+
build_recipients( [email_1, email_2] ).should == [email_1, email_2].sort.join(',')
|
29
31
|
end
|
30
32
|
|
31
33
|
it "should deduplicate emails in the recipients" do
|
32
|
-
build_recipients( [email_1, email_2, email_1] ).should == [email_1, email_2]
|
34
|
+
build_recipients( [email_1, email_2, email_1] ).should == [email_1, email_2].sort.join(',')
|
33
35
|
end
|
34
36
|
|
35
37
|
context "when working with unqualified email addresses" do
|
@@ -40,11 +42,11 @@ describe Capistrano::Mailgun do
|
|
40
42
|
end
|
41
43
|
|
42
44
|
it "should add the mailgun_recipient_domain to any unqualified email addresses" do
|
43
|
-
build_recipients( %w( spike ) ).should ==
|
45
|
+
build_recipients( %w( spike ) ).should == 'spike@another.com'
|
44
46
|
end
|
45
47
|
|
46
48
|
it "should accept a mix of qualified and unqualified email addresses" do
|
47
|
-
build_recipients( [email_1, 'spike']).should == [email_1, 'spike@another.com']
|
49
|
+
build_recipients( [email_1, 'spike']).should == [email_1, 'spike@another.com'].sort.join(',')
|
48
50
|
end
|
49
51
|
|
50
52
|
end
|
@@ -57,7 +59,7 @@ describe Capistrano::Mailgun do
|
|
57
59
|
|
58
60
|
it "should use the passed default_domain over the mailgun_recipient_domain if it's passed" do
|
59
61
|
config.load { set :mailgun_recipient_domain, 'example.com' }
|
60
|
-
build_recipients( ['spike'], 'awesome.com' ).should ==
|
62
|
+
build_recipients( ['spike'], 'awesome.com' ).should == 'spike@awesome.com'
|
61
63
|
end
|
62
64
|
end
|
63
65
|
|
@@ -66,9 +68,46 @@ describe Capistrano::Mailgun do
|
|
66
68
|
|
67
69
|
context "#find_template" do
|
68
70
|
|
69
|
-
|
70
|
-
|
71
|
-
|
71
|
+
def find_template(t)
|
72
|
+
mailgun.send(:find_template, t)
|
73
|
+
end
|
74
|
+
|
75
|
+
context "when dealing with a path" do
|
76
|
+
|
77
|
+
it "should return the path if the file exists" do
|
78
|
+
File.stub!(:exists? => true)
|
79
|
+
|
80
|
+
find_template('asdf').should == 'asdf'
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should not raise an error if the file exists" do
|
84
|
+
File.stub!(:exists? => true)
|
85
|
+
|
86
|
+
lambda { find_template('adsf') }.should_not raise_error
|
87
|
+
end
|
88
|
+
|
89
|
+
it "should raise an error if the path doesn't exist" do
|
90
|
+
File.stub!(:exists? => false)
|
91
|
+
|
92
|
+
lambda { find_template('asdf') }.should raise_error
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
|
97
|
+
context "when dealing with a symbol" do
|
98
|
+
|
99
|
+
it "should return the default_deploy_text_template_path for :deploy_text" do
|
100
|
+
mailgun.should_receive(:default_deploy_text_template_path)
|
101
|
+
|
102
|
+
find_template(:deploy_text)
|
103
|
+
end
|
104
|
+
|
105
|
+
it "should return the default_deploy_html_template_path for :deploy_html" do
|
106
|
+
mailgun.should_receive(:default_deploy_html_template_path)
|
107
|
+
|
108
|
+
find_template(:deploy_html)
|
109
|
+
end
|
110
|
+
|
72
111
|
end
|
73
112
|
|
74
113
|
end
|
@@ -132,6 +171,65 @@ describe Capistrano::Mailgun do
|
|
132
171
|
lambda { mailgun.notify_of_deploy }.should_not raise_error
|
133
172
|
end
|
134
173
|
|
174
|
+
context "when using cc and bcc" do
|
175
|
+
let(:cc_email) { 'cc_email@example.com' }
|
176
|
+
let(:bcc_email) { 'bcc_email@example.com' }
|
177
|
+
|
178
|
+
context "when cc and bcc are included" do
|
179
|
+
before do
|
180
|
+
|
181
|
+
ERB.stub!(:new => mock(:result => 'completed template'))
|
182
|
+
|
183
|
+
config.load do
|
184
|
+
set :application, 'some application'
|
185
|
+
|
186
|
+
set :mailgun_api_key, 'asdfasdf'
|
187
|
+
set :mailgun_domain, 'example.com'
|
188
|
+
|
189
|
+
set :mailgun_cc, 'cc_email@example.com'
|
190
|
+
set :mailgun_bcc, 'bcc_email@example.com'
|
191
|
+
|
192
|
+
set :mailgun_recipient_domain, 'example.com'
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
after do
|
197
|
+
mailgun.notify_of_deploy
|
198
|
+
end
|
199
|
+
|
200
|
+
it "should recieve process_send_email_options with cc and bcc values" do
|
201
|
+
mailgun.should_receive(:process_send_email_options) do |options|
|
202
|
+
options[:cc].should_not be_nil
|
203
|
+
options[:bcc].should_not be_nil
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
207
|
+
it "should run build_recipients on cc and bcc" do
|
208
|
+
mailgun.should_receive(:build_recipients).with('people@example.com')
|
209
|
+
mailgun.should_receive(:build_recipients).with(cc_email)
|
210
|
+
mailgun.should_receive(:build_recipients).with(bcc_email)
|
211
|
+
end
|
212
|
+
|
213
|
+
it "should set the options in send_email to include cc if it's there" do
|
214
|
+
config.load do
|
215
|
+
set :mailgun_cc, nil
|
216
|
+
end
|
217
|
+
|
218
|
+
mailgun.should_not_receive(:build_recipients).with(cc_email)
|
219
|
+
end
|
220
|
+
|
221
|
+
it "should set the options in send_email to include bcc if it's there" do
|
222
|
+
config.load do
|
223
|
+
set :mailgun_cc, nil
|
224
|
+
end
|
225
|
+
|
226
|
+
mailgun.should_not_receive(:build_recipients).with(cc_email)
|
227
|
+
end
|
228
|
+
|
229
|
+
end
|
230
|
+
|
231
|
+
end
|
232
|
+
|
135
233
|
end
|
136
234
|
|
137
235
|
context "#process_send_email_options" do
|
@@ -0,0 +1,165 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "Integration testing for Capistrano::Mailgun" do
|
4
|
+
|
5
|
+
let(:config) do
|
6
|
+
Capistrano::Configuration.new
|
7
|
+
end
|
8
|
+
|
9
|
+
before do
|
10
|
+
Capistrano::Mailgun.load_into(config)
|
11
|
+
|
12
|
+
RestClient.stub(:post)
|
13
|
+
end
|
14
|
+
|
15
|
+
let(:mailgun) { config.mailgun }
|
16
|
+
|
17
|
+
context "when overriding defaults" do
|
18
|
+
|
19
|
+
before do
|
20
|
+
config.stub!(:run_locally => 'local output')
|
21
|
+
|
22
|
+
config.load do
|
23
|
+
set :application, 'testing'
|
24
|
+
set :scm, :git
|
25
|
+
|
26
|
+
# deploy stuff stubbing
|
27
|
+
set :latest_revision, 'asdfasdf'
|
28
|
+
set :real_revision, 'asdfasdf'
|
29
|
+
|
30
|
+
# base Capistrano::Mailgun config
|
31
|
+
set :mailgun_api_key, 'api-dummy-key'
|
32
|
+
set :mailgun_domain, 'example.com'
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
context "when using mailgun.notify_of_deploy" do
|
37
|
+
before do
|
38
|
+
config.load do
|
39
|
+
set :mailgun_from, 'noreply@example.com'
|
40
|
+
set :mailgun_recipients, 'everyone@example.com'
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
after do
|
45
|
+
mailgun.notify_of_deploy
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
it "should allow user to unset text template" do
|
50
|
+
config.load do
|
51
|
+
set :mailgun_text_template, nil
|
52
|
+
end
|
53
|
+
|
54
|
+
RestClient.should_receive(:post) do |url, opts|
|
55
|
+
opts.has_key?(:text).should be_false
|
56
|
+
opts.has_key?(:html).should be_true
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should allow user to unset html template" do
|
61
|
+
config.load do
|
62
|
+
set :mailgun_html_template, nil
|
63
|
+
end
|
64
|
+
|
65
|
+
RestClient.should_receive(:post) do |url, opts|
|
66
|
+
opts.has_key?(:text).should be_true
|
67
|
+
opts.has_key?(:html).should be_false
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
context "email subject" do
|
72
|
+
|
73
|
+
it "should include the stage if that's defined" do
|
74
|
+
config.load do
|
75
|
+
set :stage, 'production'
|
76
|
+
end
|
77
|
+
|
78
|
+
RestClient.should_receive(:post) do |url, opts|
|
79
|
+
opts[:subject].should match(/\bproduction\b/i)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should allow overriding of subject" do
|
84
|
+
config.load do
|
85
|
+
set :mailgun_subject, 'Test subject'
|
86
|
+
end
|
87
|
+
|
88
|
+
RestClient.should_receive(:post) do |url, opts|
|
89
|
+
opts[:subject].should == 'Test subject'
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
it "should use mailgun_from for :from field" do
|
95
|
+
RestClient.should_receive(:post) do |url, opts|
|
96
|
+
opts[:from].should == 'noreply@example.com'
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should use mailgun_recipients for :to field" do
|
101
|
+
RestClient.should_receive(:post) do |url, opts|
|
102
|
+
opts[:to].should == 'everyone@example.com'
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
context "when using mailgun_cc" do
|
107
|
+
it "should use CC field if it's set" do
|
108
|
+
config.load do
|
109
|
+
set :mailgun_cc, 'cc@example.com'
|
110
|
+
end
|
111
|
+
|
112
|
+
RestClient.should_receive(:post) do |url, opts|
|
113
|
+
opts[:cc].should == 'cc@example.com'
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
it "should not use CC field if it's not set" do
|
118
|
+
RestClient.should_receive(:post) do |url, opts|
|
119
|
+
opts.has_key?(:cc).should be_false
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
context "when using mailgun_bcc" do
|
125
|
+
it "should use bcc field if it's set" do
|
126
|
+
config.load do
|
127
|
+
set :mailgun_bcc, 'bcc@example.com'
|
128
|
+
end
|
129
|
+
|
130
|
+
RestClient.should_receive(:post) do |url, opts|
|
131
|
+
opts[:bcc].should == 'bcc@example.com'
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
it "should not use bcc field if it's not set" do
|
136
|
+
RestClient.should_receive(:post) do |url, opts|
|
137
|
+
opts.has_key?(:bcc).should be_false
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
context "when using mailgun_message" do
|
143
|
+
it "should include a mailgun_message if set" do
|
144
|
+
config.load do
|
145
|
+
set :mailgun_message, '_custom_message_'
|
146
|
+
end
|
147
|
+
|
148
|
+
RestClient.should_receive(:post) do |url, opts|
|
149
|
+
opts[:text].should include('_custom_message_')
|
150
|
+
opts[:html].should include('_custom_message_')
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
it "should not have the custom_message div if no custom_message is set" do
|
155
|
+
RestClient.should_receive(:post) do |url, opts|
|
156
|
+
opts[:html].should_not include('id="mailgun_message"')
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
end
|
162
|
+
|
163
|
+
end
|
164
|
+
|
165
|
+
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: capistrano-mailgun
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-10-
|
12
|
+
date: 2012-10-22 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: capistrano
|
@@ -54,6 +54,7 @@ files:
|
|
54
54
|
- .gitignore
|
55
55
|
- .rspec
|
56
56
|
- .travis.yml
|
57
|
+
- CHANGELOG.md
|
57
58
|
- Gemfile
|
58
59
|
- LICENSE
|
59
60
|
- README.md
|
@@ -61,9 +62,12 @@ files:
|
|
61
62
|
- capistrano-mailgun.gemspec
|
62
63
|
- lib/capistrano-mailgun.rb
|
63
64
|
- lib/capistrano-mailgun/version.rb
|
65
|
+
- lib/templates/default.html.erb
|
66
|
+
- lib/templates/default.txt.erb
|
64
67
|
- spec/capistrano-mailgun_spec.rb
|
65
68
|
- spec/fixtures/html_body.erb
|
66
69
|
- spec/fixtures/text_body.erb
|
70
|
+
- spec/integration_spec.rb
|
67
71
|
- spec/spec_helper.rb
|
68
72
|
homepage: ''
|
69
73
|
licenses: []
|
@@ -79,7 +83,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
79
83
|
version: '0'
|
80
84
|
segments:
|
81
85
|
- 0
|
82
|
-
hash:
|
86
|
+
hash: 4576376367349129326
|
83
87
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
84
88
|
none: false
|
85
89
|
requirements:
|
@@ -88,7 +92,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
88
92
|
version: '0'
|
89
93
|
segments:
|
90
94
|
- 0
|
91
|
-
hash:
|
95
|
+
hash: 4576376367349129326
|
92
96
|
requirements: []
|
93
97
|
rubyforge_project:
|
94
98
|
rubygems_version: 1.8.24
|
@@ -99,4 +103,5 @@ test_files:
|
|
99
103
|
- spec/capistrano-mailgun_spec.rb
|
100
104
|
- spec/fixtures/html_body.erb
|
101
105
|
- spec/fixtures/text_body.erb
|
106
|
+
- spec/integration_spec.rb
|
102
107
|
- spec/spec_helper.rb
|