capistrano-mailgun 0.1.1 → 1.0.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.
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