capistrano-mailgun 0.1.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,6 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 1.8.7
5
+ - ree
6
+ script: bundle exec rspec spec
data/Gemfile CHANGED
@@ -2,3 +2,7 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in capistrano-mailgun.gemspec
4
4
  gemspec
5
+
6
+ gem 'rake'
7
+ gem 'rspec'
8
+ gem 'awesome_print'
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Capistrano-Mailgun
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
 
@@ -29,17 +29,17 @@ In your `Capfile`, add:
29
29
 
30
30
  To send a notification after deploy, add the following to your `deploy.rb` file:
31
31
 
32
- require 'capistrano-mailgun'
33
-
34
32
  set :mailgun_api_key, 'key-12345678901234567890123456789012' # your mailgun API key
35
33
  set :mailgun_domain, 'example.com' # your mailgun email domain
36
34
  set :mailgun_from, 'deployment@example.com' # who the email will appear to come from
37
35
  set :mailgun_recipients, [ 'you@example.com', 'otherguy@example.com' ] # who will receive the email
38
36
 
39
- # create an after:deploy hook
40
- # pass it the path to an erb template.
41
37
  # The erb template will have visibility into all your capistrano variables.
42
- after(:deploy) { mailgun.notify_of_deploy File.join(File.dirname(__FILE__), 'mail.erb') }
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
+ # create an after deploy hook
42
+ after(:deploy) { mailgun.notify_of_deploy }
43
43
 
44
44
  You should then create a `mail.erb` file in the same directory as `deploy.rb`:
45
45
 
@@ -47,6 +47,55 @@ You should then create a `mail.erb` file in the same directory as `deploy.rb`:
47
47
 
48
48
  That's it. When you do a deploy, it should automatically send an email.
49
49
 
50
+ ## Example using mailgun.send_email
51
+
52
+ If you need a little more control over the message being sent or you want to bcc or be a little
53
+ more conditional over what you're sending, see the following example, which should be placed
54
+ in your `deploy.rb` file:
55
+
56
+ # when using send_email, the following 2 settings are REQUIRED
57
+ set :mailgun_api_key, 'key-12345678901234567890123456789012' # your mailgun API key
58
+ set :mailgun_domain, 'example.com' # your mailgun email domain
59
+
60
+ set(:email_body) { abort "Please set email_body using `-s email_body='this is the body of the email'" }
61
+
62
+ # some variables that we'll use when calling mailgun.send_email
63
+ set :ops_emails, [ 'alice', 'bob' ]
64
+ set :dev_emails, [ 'carl@contractors.com', 'dave' ]
65
+
66
+ # some basic tasks
67
+ namespace :email do
68
+ task :ops do
69
+ mailgun.send_email(
70
+ :to => mailgun.build_recipients(ops_emails, 'example.com'),
71
+ :from => 'some_dude@example.com',
72
+ :subject => 'you have just been mailgunned',
73
+ :text => email_body
74
+ )
75
+ end
76
+
77
+ task :devs do
78
+ mailgun.send_email(
79
+ :to => 'no-reply@example.com',
80
+ :from => 'no-reply@example.com',
81
+ :bcc => mailgun.build_recipients(dev_emails, 'example.com'),
82
+ :subject => 'You guys are just developers',
83
+ :text => email_body
84
+ )
85
+ end
86
+ end
87
+
88
+ This defines 2 tasks that can be used to send emails to ops or devs. The `email:ops` task is using
89
+ an Capistrano variable `email_body` which should be set on the commandline. With this example, you could
90
+ send an email to ops guys like the following:
91
+
92
+ cap email:ops -s email_body="You guys are awesome. Keep up the good work"
93
+
94
+ You could also take advantage of `:text_template` and/or `:html_template` for more complex messages. The
95
+ above is just an example.
96
+
97
+ Also, notice the use of `mailgun.build_recipients`. See documentation below for more information.
98
+
50
99
  ## Capistrano Variables
51
100
 
52
101
  `capistrano-mailgun` leverages variables defined in Capistrano to reduce the amount of configuration
@@ -71,6 +120,19 @@ An array of email addresses who should recieve a notification when a deployment
71
120
  You can optionally only specify just the part of the email address before the @ and `capistrano-mailgun` will
72
121
  automatically append the `mailgun_recipient_domain` to it. See `mailgun_recipient_domain`.
73
122
 
123
+ ### mailgun_text_template (required for notify_of_deploy)
124
+
125
+ This is the path to the ERB template that `Capistrano::Mailgun` will use to create the text body of
126
+ your email. This is only required if you do not use the `mailgun_html_template` variable. You can
127
+ specify both text and html templates and the emails will contain the proper bodies where the client
128
+ supports it.
129
+
130
+ ### mailgun_html_template (required for notify_of_deploy)
131
+
132
+ This is the path to the ERB template that will be used to generate the HTML body of the email. It is only
133
+ required if you do not specify the `mailgun_text_template` variable. You can specify both text and html
134
+ templates and emails will contain the proper bodies where the client supports it.
135
+
74
136
  ### mailgun_recipient_domain
75
137
 
76
138
  The domain that will be automatically appended to incomplete email addresses in the `mailgun_recipients`.
@@ -87,23 +149,41 @@ Setting this will override the default.
87
149
 
88
150
  `capistrano-mailgun` has a couple of methods to enable you to send emails easily. The following are the functions:
89
151
 
90
- ### mailgun.notify_of_deploy(erb_path)
152
+ ### mailgun.build_recipients( recipients, default_domain=nil )
153
+
154
+ 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. Typically, you will only use this function in the event that you're using `mailgun.send_email`.
156
+
157
+ You can also pass an alternate `default_domain`. This is useful if you're not using the global `mailgun_recipient_domain`
158
+ Capistrano variable of if you want to override the behavior in this one use-case. `mailgun.build_recipients` will always
159
+ choose the specified `default_domain` over `mailgun_recipient_domain`.
91
160
 
92
- Given a path to an erb template file, it will send an email to recipients specified using the above
93
- Capistrano variables.
161
+ ### mailgun.notify_of_deploy
162
+
163
+ This is a convenience function to send an email via the Mailgun api using your Capistrano variables for
164
+ basic configuration. It will use either/or `mailgun_html_template` and `mailgun_text_template` to generate the
165
+ email body, `mailgun_recipients` for who to address the email to, `mailgun_from` for the reply-to field
166
+ of the email and `mailgun_subject` for the subject of the email.
94
167
 
95
168
  See Quickstart, above, for an example.
96
169
 
97
- ### mailgun.send_email( template, subject, recipients, from_address )
170
+ ### mailgun.send_email( options )
171
+
172
+ This is the base function for operating the Mailgun API. It uses the `mailgun_api_key` and `mailgun_domain`
173
+ Capistrano variables for interacting with the service. If you need additional control over headers and options
174
+ when sending the emails, call this function directly. For a full list of options, see the Mailgun REST API
175
+ documentation:
176
+
177
+ http://documentation.mailgun.net/api-sending.html
178
+
179
+ This function also takes the following additional options:
98
180
 
99
- Given a path to a template, subject, recipients and a from\_address, send an email via the Mailgun API.
181
+ * `:text_template` -- a path to an ERB template for the text body of the email.
182
+ * `:html_template` -- a path to an ERB template for the HTML body of the email.
100
183
 
101
- This function exists for convenience if you want to change the default behavior or notify during other events
102
- triggered by Capistrano. `mailgun.send_email` adheres to the same behavior for recipients (automatically adding
103
- the domain to the email addresses) as the regular `mailgun.notify_of_deploy` function.
184
+ The templates will have access to all of your Capistrano variables.
104
185
 
105
- The template will also be executed in the context of the recipe and will have access to everything that
106
- capistrano has access to.
186
+ Of course, you can also pass `:text` and `:html` options for the exact text/html bodies of the sent emails.
107
187
 
108
188
  ### deployer_username
109
189
 
@@ -113,10 +193,8 @@ actually did the deployment.
113
193
 
114
194
  ## Limitations
115
195
 
116
- * Only supports plain-text emails. This should be fixed in the next release.
117
196
  * Only supports ERB for templates. This should be changed in a future release.
118
- * Simpler support for specifying templates? Should not need to pass absolute path, hopefully.
119
- * Extremely limited access to Mailgun parameters. Eventually I'd like to add support for better customization of this.
197
+ * Currently requires that ERB templates are on the filesystem. Future releases may allow for inline templates.
120
198
 
121
199
  ## Contributing
122
200
 
@@ -14,4 +14,7 @@ Gem::Specification.new do |gem|
14
14
  gem.name = "capistrano-mailgun"
15
15
  gem.require_paths = ["lib"]
16
16
  gem.version = Capistrano::Mailgun::VERSION
17
+
18
+ gem.add_dependency "capistrano"
19
+ gem.add_dependency "rest-client"
17
20
  end
@@ -1,5 +1,5 @@
1
1
  module Capistrano
2
2
  module Mailgun
3
- VERSION = "0.1.1"
3
+ VERSION = "1.0.0"
4
4
  end
5
5
  end
@@ -6,18 +6,54 @@ require 'erb'
6
6
  module Capistrano
7
7
  module Mailgun
8
8
 
9
+ def self.load_into(config)
10
+ config.load do
11
+
12
+ Capistrano.plugin :mailgun, Capistrano::Mailgun
13
+
14
+ set(:mailgun_subject) { "[Deployment] #{ application.capitalize } completed" }
15
+
16
+ set(:mailgun_api_key) { abort "Please set mailgun_api_key accordingly" }
17
+ set(:mailgun_domain) { abort "Please set mailgun_domain accordingly" }
18
+ set(:mailgun_from) { abort "Please set mailgun_from to your desired From field" }
19
+ set(:mailgun_recipients) { abort "Please specify mailgun_recipients" }
20
+ set(:mailgun_recipient_domain) { abort "Please set mailgun_recipient_domain accordingly" }
21
+
22
+ set(:deployer_username) do
23
+ if fetch(:scm, nil).to_sym == :git
24
+ `git config user.name`.chomp
25
+ else
26
+ `whoami`.chomp
27
+ end
28
+ end
29
+
30
+
31
+ end # config.load
32
+ end
33
+
9
34
  # simple wrapper for sending an email with a given template
10
- def send_email(template, subject, recipients, from_address)
11
- RestClient.post "https://api:#{ mailgun_api_key }@api.mailgun.net/v2/#{ mailgun_domain }/messages",
12
- :from => from_address,
13
- :to => build_recipients( recipients ).join(','),
14
- :subject => subject,
15
- :text => ERB.new( File.open( find_template(template), 'r' ).read ).result(self.binding)
35
+ def send_email(options)
36
+ options = process_send_email_options(options)
37
+
38
+ RestClient.post build_mailgun_uri( mailgun_api_key, mailgun_domain ), options
16
39
  end
17
40
 
18
41
  # does a deploy notification leveraging variables defined in capistrano.
19
- def notify_of_deploy(template_name)
20
- send_email( template_name, mailgun_subject, build_recipients( mailgun_recipients ), mailgun_from )
42
+ def notify_of_deploy
43
+ options = {
44
+ :to => build_recipients( fetch(:mailgun_recipients) ),
45
+ :from => fetch(:mailgun_from),
46
+ :subject => fetch(:mailgun_subject)
47
+ }
48
+
49
+ if fetch(:mailgun_text_template, nil).nil? && fetch(:mailgun_html_template, nil).nil?
50
+ abort "You must specify one (or both) of mailgun_text_template and mailgun_html_template to use notify_of_deploy"
51
+ end
52
+
53
+ options[:text_template] = fetch(:mailgun_text_template) if fetch(:mailgun_text_template, nil)
54
+ options[:html_template] = fetch(:mailgun_html_template) if fetch(:mailgun_html_template, nil)
55
+
56
+ send_email options
21
57
  end
22
58
 
23
59
  # kinda unused function for locating a provided template
@@ -26,42 +62,37 @@ module Capistrano
26
62
  File.join( File.dirname(__FILE__), t )
27
63
  end
28
64
 
29
- private
30
-
31
- # regenerates the recipients list using hte mailgun_domain for any reciients without domains
32
- def build_recipients(recipients)
33
- recipients.map do |r|
34
- if r.match /.+?@.+?$/
65
+ # regenerates the recipients list using the mailgun_domain for any reciients without domains
66
+ def build_recipients(recipients, default_domain=nil)
67
+ [*recipients].map do |r|
68
+ if r.match /.+?@.+?$/ # the email contains an @ so it's fully-qualified.
35
69
  r
36
70
  else
37
- "#{ r }@#{ mailgun_recipient_domain }"
71
+ "#{ r }@#{ default_domain || fetch(:mailgun_recipient_domain) }"
38
72
  end
39
- end
73
+ end.uniq
40
74
  end
41
75
 
42
- end
43
- end
76
+ private
44
77
 
45
- if Capistrano::Configuration.instance
46
- Capistrano::Configuration.instance.load do
47
- Capistrano.plugin :mailgun, Capistrano::Mailgun
48
-
49
- set(:mailgun_subject) { "[Deployment] #{ application.capitalize } completed" }
50
-
51
- set(:mailgun_api_key) { abort "Please set mailgun_api_key accordingly" }
52
- set(:mailgun_domain) { abort "Please set mailgun_domain accordingly" }
53
- set(:mailgun_from) { abort "Please set mailgun_from to your desired From field" }
54
- set(:mailgun_recipients) { abort "Please specify mailgun_recipients" }
55
- set(:mailgun_recipient_domain) { abort "Please set mailgun_recipient_domain accordingly" }
56
-
57
- set(:deployer_username) do
58
- if fetch(:scm, nil).to_sym == :git
59
- `git config user.name`.chomp
60
- else
61
- `whoami`.chomp
62
- end
78
+ # apply templates and all that jazz
79
+ def process_send_email_options(options)
80
+ text_template = options.delete(:text_template)
81
+ html_template = options.delete(:html_template)
82
+
83
+ options[:text] = ERB.new( File.open( find_template(text_template) ).read ).result(self.binding) if text_template
84
+ options[:html] = ERB.new( File.open( find_template(html_template) ).read ).result(self.binding) if html_template
85
+
86
+ options
87
+ end
88
+
89
+ def build_mailgun_uri(mailgun_api_key, mailgun_domain)
90
+ "https://api:#{ mailgun_api_key }@api.mailgun.net/v2/#{ mailgun_domain }/messages"
63
91
  end
64
92
 
65
93
  end
94
+ end
66
95
 
96
+ if Capistrano::Configuration.instance
97
+ Capistrano::Mailgun.load_into(Capistrano::Configuration.instance)
67
98
  end
@@ -0,0 +1,174 @@
1
+ require 'spec_helper'
2
+
3
+ describe 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
+ end
12
+
13
+ let!(:mailgun) { config.mailgun }
14
+
15
+ context '#buid_recipients' do
16
+ let(:email_1) { 'spike@example.com' }
17
+ let(:email_2) { 'bob@example.com' }
18
+
19
+ def build_recipients(recipients, default_domain=nil)
20
+ mailgun.send(:build_recipients, recipients, default_domain)
21
+ end
22
+
23
+ it "should accept a single recipient (not an array)" do
24
+ build_recipients(email_1).should == [email_1]
25
+ end
26
+
27
+ it "should accept an array of recipeints" do
28
+ build_recipients( [email_1, email_2] ).should == [email_1, email_2]
29
+ end
30
+
31
+ it "should deduplicate emails in the recipients" do
32
+ build_recipients( [email_1, email_2, email_1] ).should == [email_1, email_2]
33
+ end
34
+
35
+ context "when working with unqualified email addresses" do
36
+ before do
37
+ config.load do
38
+ set :mailgun_recipient_domain, 'another.com'
39
+ end
40
+ end
41
+
42
+ it "should add the mailgun_recipient_domain to any unqualified email addresses" do
43
+ build_recipients( %w( spike ) ).should == ['spike@another.com']
44
+ end
45
+
46
+ it "should accept a mix of qualified and unqualified email addresses" do
47
+ build_recipients( [email_1, 'spike']).should == [email_1, 'spike@another.com']
48
+ end
49
+
50
+ end
51
+
52
+ context "when working with custom default domains" do
53
+
54
+ it "should not raise an error if mailgun_recipient_domain is not defined, but default_domain is" do
55
+ lambda { build_recipients( ['spike'], 'example.com' ) }.should_not raise_error
56
+ end
57
+
58
+ it "should use the passed default_domain over the mailgun_recipient_domain if it's passed" do
59
+ config.load { set :mailgun_recipient_domain, 'example.com' }
60
+ build_recipients( ['spike'], 'awesome.com' ).should == ['spike@awesome.com']
61
+ end
62
+ end
63
+
64
+
65
+ end
66
+
67
+ context "#find_template" do
68
+
69
+ # future behavior might be different
70
+ it "should return the path passed to it" do
71
+ mailgun.find_template('asdf').should == 'asdf'
72
+ end
73
+
74
+ end
75
+
76
+
77
+ context "when ensuring cap variables are defined" do
78
+
79
+ def should_require(var)
80
+ lambda do
81
+ config.load { fetch var }
82
+ end.should raise_error
83
+ end
84
+
85
+ it "should require mailgun_api_key" do
86
+ should_require :mailgun_api_key
87
+ end
88
+
89
+ it "should require mailgun_domain" do
90
+ should_require :mailgun_domain
91
+ end
92
+
93
+ end
94
+
95
+ context "#send_email" do
96
+
97
+ before do
98
+ config.load do
99
+ set :mailgun_api_key, 'asdfasdf'
100
+ set :mailgun_domain, 'example.com'
101
+ end
102
+ end
103
+
104
+ end
105
+
106
+ context "#notify_of_deploy" do
107
+
108
+ before do
109
+ config.load do
110
+ set :mailgun_recipients, 'people@example.com'
111
+ set :mailgun_from, 'me@example.com'
112
+
113
+ set :mailgun_subject, 'new subject'
114
+ end
115
+ end
116
+
117
+ it "should raise an error if neither mailgun_text_template nor mailgun_html_template are defined" do
118
+ lambda { mailgun.send(:notify_of_deploy) }.should raise_error
119
+ end
120
+
121
+ it "should not raise an error if mailgun_text_template is defined" do
122
+ config.load { set :mailgun_text_template, 'template' }
123
+ mailgun.should_receive(:send_email)
124
+
125
+ lambda { mailgun.notify_of_deploy }.should_not raise_error
126
+ end
127
+
128
+ it "should not raise an error if mailgun_html_template is defined" do
129
+ config.load { set :mailgun_html_template, 'template' }
130
+ mailgun.should_receive(:send_email)
131
+
132
+ lambda { mailgun.notify_of_deploy }.should_not raise_error
133
+ end
134
+
135
+ end
136
+
137
+ context "#process_send_email_options" do
138
+ let(:test_mailgun_domain) { 'example.com' }
139
+
140
+ before do
141
+ config.load { set :mailgun_domain, 'example.com' }
142
+ end
143
+
144
+ it "should set text to the rendered text template if text_template is passed" do
145
+ result = mailgun.send(:process_send_email_options, :text_template => fixture_path('text_body.erb'))
146
+
147
+ result[:text].should include(test_mailgun_domain)
148
+ result[:text].should_not include('<%=')
149
+ end
150
+
151
+ it "should not change text if no text_template is passed" do
152
+ ERB.should_not_receive(:new)
153
+ File.should_not_receive(:open)
154
+
155
+ mailgun.send(:process_send_email_options, :text => 'normal text')[:text].should == 'normal text'
156
+ end
157
+
158
+ it "should set html to the rendered html template if html_template is passed" do
159
+ result = mailgun.send(:process_send_email_options, :html_template => fixture_path('html_body.erb'))
160
+
161
+ result[:html].should include(test_mailgun_domain)
162
+ result[:html].should_not include('<%=')
163
+ end
164
+
165
+ it "should not change html if no html_template is passed" do
166
+ ERB.should_not_receive(:new)
167
+ File.should_not_receive(:open)
168
+
169
+ mailgun.send(:process_send_email_options, :html => 'normal html')[:html].should == 'normal html'
170
+ end
171
+
172
+ end
173
+
174
+ end
@@ -0,0 +1 @@
1
+ This is an html template. <%= mailgun_domain %>
@@ -0,0 +1 @@
1
+ This is a text template. <%= mailgun_domain %>
@@ -0,0 +1,18 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+
4
+ require 'awesome_print'
5
+
6
+ $: << File.dirname(__FILE__) + '/../lib'
7
+
8
+ require 'capistrano'
9
+ require 'capistrano-mailgun'
10
+
11
+ Rspec.configure do |config|
12
+ # config
13
+ end
14
+
15
+ def fixture_path(filename)
16
+ File.join( File.dirname(__FILE__), 'fixtures', filename )
17
+ end
18
+
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: 0.1.1
4
+ version: 1.0.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,8 +9,40 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-11 00:00:00.000000000 Z
13
- dependencies: []
12
+ date: 2012-10-15 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: capistrano
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rest-client
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
14
46
  description: Notify of deploys and other actions using mailgun
15
47
  email:
16
48
  - spike@ticketevolution.com
@@ -19,6 +51,8 @@ extensions: []
19
51
  extra_rdoc_files: []
20
52
  files:
21
53
  - .gitignore
54
+ - .rspec
55
+ - .travis.yml
22
56
  - Gemfile
23
57
  - LICENSE
24
58
  - README.md
@@ -26,6 +60,10 @@ files:
26
60
  - capistrano-mailgun.gemspec
27
61
  - lib/capistrano-mailgun.rb
28
62
  - lib/capistrano-mailgun/version.rb
63
+ - spec/capistrano-mailgun_spec.rb
64
+ - spec/fixtures/html_body.erb
65
+ - spec/fixtures/text_body.erb
66
+ - spec/spec_helper.rb
29
67
  homepage: ''
30
68
  licenses: []
31
69
  post_install_message:
@@ -38,17 +76,26 @@ required_ruby_version: !ruby/object:Gem::Requirement
38
76
  - - ! '>='
39
77
  - !ruby/object:Gem::Version
40
78
  version: '0'
79
+ segments:
80
+ - 0
81
+ hash: 224140973397268413
41
82
  required_rubygems_version: !ruby/object:Gem::Requirement
42
83
  none: false
43
84
  requirements:
44
85
  - - ! '>='
45
86
  - !ruby/object:Gem::Version
46
87
  version: '0'
88
+ segments:
89
+ - 0
90
+ hash: 224140973397268413
47
91
  requirements: []
48
92
  rubyforge_project:
49
93
  rubygems_version: 1.8.24
50
94
  signing_key:
51
95
  specification_version: 3
52
96
  summary: Notify of deploys and other actions using mailgun
53
- test_files: []
54
- has_rdoc:
97
+ test_files:
98
+ - spec/capistrano-mailgun_spec.rb
99
+ - spec/fixtures/html_body.erb
100
+ - spec/fixtures/text_body.erb
101
+ - spec/spec_helper.rb