heroku_san 2.1.4 → 2.2.2

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Change log (curated)
2
2
 
3
+ ## v2.2.1
4
+
5
+ * New feature: addons from [Matt Burke](https://github.com/spraints)
6
+
3
7
  ## v2.1.4
4
8
 
5
9
  * Use heroku-api for client calls instead heroku gem
data/README.rdoc CHANGED
@@ -69,6 +69,8 @@ Need to add remotes for each app?
69
69
 
70
70
  A full list of tasks provided:
71
71
 
72
+ rake heroku:addons # Install addons for the application.
73
+ rake heroku:addons:local # List configured addons, without installing them
72
74
  rake heroku:apps # Lists configured apps
73
75
  rake heroku:apps:local # Lists configured apps without hitting heroku
74
76
  rake heroku:config # Add config:vars to each application.
@@ -133,6 +135,7 @@ Issue Tracker:: http://github.com/fastestforward/heroku_san/issues
133
135
  * Mat Schaffer (mat@schaffer.me)
134
136
  * Jonathan Hironaga (jonathan.hironaga@halogennetwork.com)
135
137
  * Ken Mayer (ken@bitwrangler.com)
138
+ * Matt Burke (https://github.com/spraints)
136
139
 
137
140
  == License
138
141
 
data/cucumber.yml CHANGED
@@ -1,2 +1,2 @@
1
- default: --tags ~@slow_process
2
- remote: --tags @slow_process
1
+ default: --tags ~@slow_process --no-source
2
+ remote: --tags @slow_process --no-source
@@ -27,4 +27,5 @@ Feature: heroku_san can control a project on Heroku
27
27
  And I turn maintenance off
28
28
  And I restart my project
29
29
  And I list all apps on Heroku
30
+ And I install an addon
30
31
  Then heroku_san is green
@@ -131,6 +131,24 @@ When /^I list all apps on Heroku$/ do
131
131
  assert_partial_output "@ #{sha} master", output
132
132
  end
133
133
 
134
+ When /^I install an addon$/ do
135
+ # Install the campfire addon.
136
+ overwrite_file 'config/heroku.yml', <<END_CONFIG
137
+ test_app:
138
+ app: #{@app}
139
+ addons:
140
+ - deployhooks:campfire
141
+ END_CONFIG
142
+ run_simple 'rake test_app heroku:addons'
143
+ output = stdout_from 'rake test_app heroku:addons'
144
+ # The output should show the default addons...
145
+ assert_partial_output "shared-database:5mb", output
146
+ # ... and the new one ...
147
+ assert_partial_output "deployhooks:campfire", output
148
+ # ... with a note about needing to configure it.
149
+ assert_partial_output "https://api.heroku.com/myapps/#{@app}/addons/deployhooks:campfire", output
150
+ end
151
+
134
152
  Then /^heroku_san is green$/ do
135
153
  run_simple "heroku apps:destroy #{@app} --confirm #{@app}"
136
154
  end
@@ -37,6 +37,10 @@ module HerokuSan
37
37
  def config
38
38
  @options['config'] ||= {}
39
39
  end
40
+
41
+ def addons
42
+ (@options['addons'] ||= []).flatten
43
+ end
40
44
 
41
45
  def run(command, args = nil)
42
46
  if stack =~ /cedar/
@@ -99,6 +103,18 @@ module HerokuSan
99
103
  heroku.put_config_vars(app, params).body
100
104
  end
101
105
 
106
+ def installed_addons
107
+ heroku.get_addons(app).body
108
+ end
109
+
110
+ def install_addons
111
+ addons_to_install = addons - installed_addons.map{|a|a['name']}
112
+ addons_to_install.each do |addon|
113
+ heroku.post_addon(app, addon)
114
+ end
115
+ installed_addons
116
+ end
117
+
102
118
  def restart
103
119
  "restarted" if heroku.post_ps_restart(app).body == 'ok'
104
120
  end
@@ -1,3 +1,3 @@
1
1
  module HerokuSan
2
- VERSION = "2.1.4"
2
+ VERSION = "2.2.2"
3
3
  end
data/lib/tasks.rb CHANGED
@@ -86,6 +86,26 @@ namespace :heroku do
86
86
  end
87
87
  end
88
88
 
89
+ desc 'Install addons for the application.'
90
+ task :addons do
91
+ each_heroku_app do |stage|
92
+ addons = stage.install_addons
93
+ puts y("#{stage.name} addons" => addons.map { |addon| addon['configured'] ? addon['name'] : { addon['name'] => "Configure at https://api.heroku.com/myapps/#{stage.app}/addons/#{addon['name']}" } })
94
+ end
95
+ end
96
+
97
+ namespace :addons do
98
+ desc 'List configured addons, without installing them'
99
+ task :local do
100
+ each_heroku_app do |stage|
101
+ puts "Configured addons for #{stage.name}:"
102
+ stage.addons.each do |addon|
103
+ puts " - #{addon}"
104
+ end
105
+ end
106
+ end
107
+ end
108
+
89
109
  desc 'Creates an example configuration file'
90
110
  task :create_config do
91
111
  filename = %Q{#{@heroku_san.config_file.to_s}}
@@ -14,7 +14,8 @@ describe HerokuSan::Stage do
14
14
  {"stack" => "cedar",
15
15
  "app" => "awesomeapp-demo",
16
16
  "tag" => "demo/*",
17
- "config"=> {"BUNDLE_WITHOUT"=>"development:test"}
17
+ "config"=> {"BUNDLE_WITHOUT"=>"development:test"},
18
+ "addons"=> ['one:addon', 'two:addons'],
18
19
  })}
19
20
 
20
21
  its(:name) { should == 'production' }
@@ -23,6 +24,7 @@ describe HerokuSan::Stage do
23
24
  its(:tag) { should == "demo/*" }
24
25
  its(:config) { should == {"BUNDLE_WITHOUT"=>"development:test"} }
25
26
  its(:repo) { should == 'git@heroku.com:awesomeapp-demo.git' }
27
+ its(:addons) { should == ['one:addon', 'two:addons'] }
26
28
  end
27
29
 
28
30
  describe "#app" do
@@ -38,7 +40,7 @@ describe HerokuSan::Stage do
38
40
  describe "#stack" do
39
41
  it "returns the name of the stack from Heroku" do
40
42
  subject = HerokuSan::Stage.new('production', {"app" => "awesomeapp"})
41
- with_app(subject, 'name' => 'awesomeapp') do |app_data|
43
+ with_app(subject, 'name' => subject.app) do |app_data|
42
44
  subject.stack.should == 'bamboo-mri-1.9.2'
43
45
  end
44
46
  end
@@ -49,6 +51,26 @@ describe HerokuSan::Stage do
49
51
  end
50
52
  end
51
53
 
54
+ describe '#addons' do
55
+ subject { HerokuSan::Stage.new('production', {'addons' => addons}) }
56
+ context 'default' do
57
+ let(:addons) { nil }
58
+ its(:addons) { should == [] }
59
+ end
60
+ context 'nested' do
61
+ # This is for when you do:
62
+ # default_addons: &default_addons
63
+ # - a
64
+ # - b
65
+ # env:
66
+ # addons:
67
+ # - *default_addons
68
+ # - other
69
+ let(:addons) { [ ['a', 'b'], 'other' ] }
70
+ its(:addons) { should == [ 'a', 'b', 'other' ] }
71
+ end
72
+ end
73
+
52
74
  describe "#run" do
53
75
  it "runs commands using the pre-cedar format" do
54
76
  subject.should_receive(:sh).with("heroku run:rake foo bar bleh --app awesomeapp")
@@ -223,4 +245,29 @@ describe HerokuSan::Stage do
223
245
  subject.revision.should == ''
224
246
  end
225
247
  end
226
- end
248
+
249
+ describe "#installed_addons" do
250
+ it "returns the list of installed addons" do
251
+ with_app(subject, 'name' => subject.app) do |app_data|
252
+ subject.installed_addons.map{|a|a['name']}.should =~ %w[logging:basic shared-database:5mb]
253
+ end
254
+ end
255
+ end
256
+
257
+ describe '#install_addons' do
258
+ subject { HerokuSan::Stage.new('production', {"app" => "awesomeapp", "stack" => "bamboo-ree-1.8.7", "addons" => ["custom_domains:basic", "ssl:piggyback"]})}
259
+
260
+ it "installs the addons" do
261
+ with_app(subject, 'name' => subject.app) do |app_data|
262
+ subject.install_addons.map{|a| a['name']}.should =~ %w[logging:basic shared-database:5mb custom_domains:basic ssl:piggyback]
263
+ subject.installed_addons.map{|a|a['name']}.should =~ subject.install_addons.map{|a| a['name']}
264
+ end
265
+ end
266
+ it "only installs missing addons" do
267
+ subject = HerokuSan::Stage.new('production', {"app" => "awesomeapp", "stack" => "bamboo-ree-1.8.7", "addons" => ["logging:basic","custom_domains:basic", "ssl:piggyback"]})
268
+ with_app(subject, 'name' => subject.app) do |app_data|
269
+ subject.install_addons.map{|a| a['name']}.should =~ %w[logging:basic shared-database:5mb custom_domains:basic ssl:piggyback]
270
+ end
271
+ end
272
+ end
273
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: heroku_san
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.4
4
+ version: 2.2.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -12,7 +12,7 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2012-04-11 00:00:00.000000000 Z
15
+ date: 2012-04-24 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: rails