heroku-rails-saas 0.1.7 → 1.0.2
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/.bundle/config +2 -0
- data/.gitignore +4 -0
- data/.rspec +1 -0
- data/.rvmrc +21 -0
- data/CHANGELOG +27 -0
- data/Gemfile +5 -3
- data/Gemfile.lock +94 -42
- data/README.md +49 -17
- data/data/cacert.pem +3988 -0
- data/heroku-rails-saas.gemspec +25 -0
- data/lib/generators/templates/heroku.rake +13 -12
- data/lib/heroku-rails-saas.rb +1 -4
- data/lib/heroku-rails-saas/config.rb +28 -25
- data/lib/heroku-rails-saas/displayer.rb +26 -0
- data/lib/heroku-rails-saas/helper.rb +67 -0
- data/lib/heroku-rails-saas/heroku_client.rb +54 -0
- data/lib/heroku-rails-saas/railtie.rb +8 -2
- data/lib/heroku-rails-saas/runner.rb +471 -204
- data/lib/heroku-rails-saas/version.rb +3 -0
- data/lib/heroku/rails/tasks.rb +112 -193
- data/spec/fixtures/awesomeapp.yml +7 -0
- data/spec/fixtures/example.netrc +3 -0
- data/spec/fixtures/heroku-config.yml +1 -0
- data/spec/heroku-rails-saas/config_spec.rb +214 -0
- data/spec/heroku-rails-saas/displayer_spec.rb +35 -0
- data/spec/heroku-rails-saas/helper_spec.rb +19 -0
- data/spec/heroku-rails-saas/heorku_client_spec.rb +58 -0
- data/spec/heroku-rails-saas/runner_spec.rb +64 -0
- data/spec/spec_helper.rb +4 -1
- metadata +125 -35
- data/heroku-rails.gemspec +0 -39
- data/lib/heroku-rails-saas/hash_recursive_merge.rb +0 -11
- data/spec/heroku/rails/saas/heroku_config_spec.rb +0 -189
- data/spec/heroku/rails/saas/heroku_runner_spec.rb +0 -23
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe HerokuRailsSaas::Displayer do
|
4
|
+
before(:each) do
|
5
|
+
@color = "green"
|
6
|
+
@remote_name = "Random"
|
7
|
+
@displayer = described_class.new(@remote_name, @color)
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "#labelize" do
|
11
|
+
before(:each) do
|
12
|
+
@orig_stdout = $stdout
|
13
|
+
@output_string_io = StringIO.new
|
14
|
+
$stdout = @output_string_io
|
15
|
+
end
|
16
|
+
|
17
|
+
after(:each) do
|
18
|
+
$stdout = @orig_stdout
|
19
|
+
end
|
20
|
+
|
21
|
+
context "with new_line enable" do
|
22
|
+
it "should prepend 'output message' with a label 'Random' with a font color of 'green'" do
|
23
|
+
@displayer.labelize("output message")
|
24
|
+
@output_string_io.string.should == "[ \e[32mRandom\e[0m ] output message\n"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context "with new_line disable" do
|
29
|
+
it "should prepend 'output message' with a label 'Random' with a font color of 'green'" do
|
30
|
+
@displayer.labelize("output message", false)
|
31
|
+
@output_string_io.string.should == "[ \e[32mRandom\e[0m ] output message"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe HerokuRailsSaas::Helper do
|
4
|
+
describe "color methods" do
|
5
|
+
it "should defined by HerokuRailsSaas::Helper::COLORS" do
|
6
|
+
described_class.const_get("COLORS").each do |color|
|
7
|
+
described_class.methods.should include(color.to_sym)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should output color font" do
|
12
|
+
described_class.red("message").should == "\e[31mmessage\e[0m"
|
13
|
+
described_class.green("message").should == "\e[32mmessage\e[0m"
|
14
|
+
described_class.yellow("message").should == "\e[33mmessage\e[0m"
|
15
|
+
described_class.magenta("message").should == "\e[35mmessage\e[0m"
|
16
|
+
described_class.cyan("message").should == "\e[36mmessage\e[0m"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe HerokuRailsSaas::HerokuClient do
|
4
|
+
it "should raise StandardError when there is no .netrc" do
|
5
|
+
File.stub!(:exists?).and_return(false)
|
6
|
+
lambda { described_class.new }.should raise_error(StandardError)
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should obtain a user and api_token when there is a .netrc" do
|
10
|
+
netrc_pathname = config_path("example.netrc").to_s
|
11
|
+
File.chmod(0600, netrc_pathname)
|
12
|
+
fixture_netrc = Netrc.read(netrc_pathname)
|
13
|
+
Netrc.should_receive(:read).and_return(fixture_netrc)
|
14
|
+
File.stub!(:exists?).and_return(true)
|
15
|
+
|
16
|
+
client = described_class.new
|
17
|
+
client.api_token.should == "THIS_IS_YOU_API_TOKEN"
|
18
|
+
client.user.should == "user@example.com"
|
19
|
+
end
|
20
|
+
|
21
|
+
context "Making Heroku calls" do
|
22
|
+
before(:each) do
|
23
|
+
WebMock.enable!
|
24
|
+
|
25
|
+
netrc_pathname = config_path("example.netrc").to_s
|
26
|
+
File.chmod(0600, netrc_pathname)
|
27
|
+
fixture_netrc = Netrc.read(netrc_pathname)
|
28
|
+
Netrc.should_receive(:read).and_return(fixture_netrc)
|
29
|
+
File.stub!(:exists?).and_return(true)
|
30
|
+
|
31
|
+
@client = described_class.new
|
32
|
+
end
|
33
|
+
|
34
|
+
after(:each) do
|
35
|
+
WebMock.reset!
|
36
|
+
WebMock.disable!
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should return the output when making a valid API call" do
|
40
|
+
response = [{"id" => 1000010, "name" => "awesomeapp-staging", "dynos" => 1, "workers" => 0,
|
41
|
+
"repo_size" => 41218048, "slug_size" => 34458496, "stack" => "cedar"},
|
42
|
+
{"id" => 1000010, "name" => "awesomeapp", "dynos" => 1, "workers" => 0,
|
43
|
+
"repo_size" => 41218048, "slug_size" => 34458496, "stack" => "cedar"}]
|
44
|
+
stub_request(:any, /.*heroku.*/).to_return(:body => response.to_json, :status => 200)
|
45
|
+
@client.get_apps.should == response
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should raise RuntimeError when making a invalid API call" do
|
49
|
+
response = {"id" => "forbidden", "error" => "You do not have permission to provision paid resources for awesomeapp-staging.\\nOnly the app owner, admin@awesomeapp.com, can do that."}
|
50
|
+
stub_request(:any, /.*heroku.*/).to_return(:status => 403, :body => response.to_json)
|
51
|
+
lambda { @client.post_addon("awesomeapp-staging", "memcache:250mb") }.should raise_error(RuntimeError)
|
52
|
+
end
|
53
|
+
|
54
|
+
it "should raise NoMethodError when making a non-exisiting API call" do
|
55
|
+
lambda { @client.non_existing_api_call }.should raise_error(NoMethodError)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe HerokuRailsSaas::Runner do
|
4
|
+
describe "#each_heroku_app" do
|
5
|
+
it "should return all apps in all environments" do
|
6
|
+
config_files = {:default => config_path("heroku-config.yml"), :apps => [config_path("awesomeapp.yml"), config_path("mediocreapp.yml")]}
|
7
|
+
config = HerokuRailsSaas::Config.new(config_files)
|
8
|
+
runner = described_class.new(config)
|
9
|
+
runner.all_environments
|
10
|
+
runner.each_heroku_app {}.should == ["awesomeapp:production", "awesomeapp:staging", "mediocreapp:development"]
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should not return a production app if @environment is not specified and there's only one app" do
|
14
|
+
config_files = {:default => config_path("heroku-config.yml"), :apps => [config_path("mediocreapp.yml")]}
|
15
|
+
config = HerokuRailsSaas::Config.new(config_files)
|
16
|
+
runner = described_class.new(config)
|
17
|
+
runner.instance_variable_set("@environments", [])
|
18
|
+
lambda { runner.each_heroku_app }.should raise_error(SystemExit)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
context "Methods" do
|
23
|
+
let(:client) { HerokuRailsSaas::HerokuClient.new }
|
24
|
+
|
25
|
+
before(:each) do
|
26
|
+
WebMock.enable!
|
27
|
+
|
28
|
+
config_files = {:default => config_path("heroku-config.yml"), :apps => [config_path("awesomeapp.yml")]}
|
29
|
+
config = HerokuRailsSaas::Config.new(config_files)
|
30
|
+
@runner = described_class.new(config)
|
31
|
+
@runner.stub!(:heroku).and_return(client)
|
32
|
+
end
|
33
|
+
|
34
|
+
after(:each) do
|
35
|
+
WebMock.reset!
|
36
|
+
WebMock.disable!
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "#setup_app" do
|
40
|
+
it "should create a new app for 'awesomeapp:production'"do
|
41
|
+
stub_request(:get, "https://api.heroku.com/apps").to_return(:body => [].to_json, :status => 200)
|
42
|
+
stub_request(:post, /.*api\.heroku\.com\/apps.*/).to_return(:body => {}.to_json, :status => 202)
|
43
|
+
|
44
|
+
@runner.add_app("awesomeapp:production")
|
45
|
+
@runner.setup_app
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "#setup_stack" do
|
50
|
+
end
|
51
|
+
|
52
|
+
describe "#setup_collaborators" do
|
53
|
+
end
|
54
|
+
|
55
|
+
describe "#setup_addons" do
|
56
|
+
end
|
57
|
+
|
58
|
+
describe "#setup_config" do
|
59
|
+
end
|
60
|
+
|
61
|
+
describe "#setup_domains" do
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: heroku-rails-saas
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,22 +13,91 @@ authors:
|
|
13
13
|
autorequire:
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
|
-
date:
|
16
|
+
date: 2013-05-02 00:00:00.000000000 Z
|
17
17
|
dependencies:
|
18
18
|
- !ruby/object:Gem::Dependency
|
19
|
-
name:
|
20
|
-
requirement:
|
19
|
+
name: rails
|
20
|
+
requirement: !ruby/object:Gem::Requirement
|
21
21
|
none: false
|
22
22
|
requirements:
|
23
23
|
- - ! '>='
|
24
24
|
- !ruby/object:Gem::Version
|
25
|
-
version:
|
25
|
+
version: '0'
|
26
|
+
type: :runtime
|
27
|
+
prerelease: false
|
28
|
+
version_requirements: !ruby/object:Gem::Requirement
|
29
|
+
none: false
|
30
|
+
requirements:
|
31
|
+
- - ! '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: heroku-api
|
36
|
+
requirement: !ruby/object:Gem::Requirement
|
37
|
+
none: false
|
38
|
+
requirements:
|
39
|
+
- - ~>
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: 0.3.8
|
42
|
+
type: :runtime
|
43
|
+
prerelease: false
|
44
|
+
version_requirements: !ruby/object:Gem::Requirement
|
45
|
+
none: false
|
46
|
+
requirements:
|
47
|
+
- - ~>
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: 0.3.8
|
50
|
+
- !ruby/object:Gem::Dependency
|
51
|
+
name: netrc
|
52
|
+
requirement: !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
54
|
+
requirements:
|
55
|
+
- - ~>
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: 0.7.7
|
58
|
+
type: :runtime
|
59
|
+
prerelease: false
|
60
|
+
version_requirements: !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ~>
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: 0.7.7
|
66
|
+
- !ruby/object:Gem::Dependency
|
67
|
+
name: parallel
|
68
|
+
requirement: !ruby/object:Gem::Requirement
|
69
|
+
none: false
|
70
|
+
requirements:
|
71
|
+
- - ~>
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: 0.6.2
|
74
|
+
type: :runtime
|
75
|
+
prerelease: false
|
76
|
+
version_requirements: !ruby/object:Gem::Requirement
|
77
|
+
none: false
|
78
|
+
requirements:
|
79
|
+
- - ~>
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: 0.6.2
|
82
|
+
- !ruby/object:Gem::Dependency
|
83
|
+
name: rendezvous
|
84
|
+
requirement: !ruby/object:Gem::Requirement
|
85
|
+
none: false
|
86
|
+
requirements:
|
87
|
+
- - ~>
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.0.2
|
26
90
|
type: :runtime
|
27
91
|
prerelease: false
|
28
|
-
version_requirements:
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
none: false
|
94
|
+
requirements:
|
95
|
+
- - ~>
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: 0.0.2
|
29
98
|
- !ruby/object:Gem::Dependency
|
30
99
|
name: rspec
|
31
|
-
requirement:
|
100
|
+
requirement: !ruby/object:Gem::Requirement
|
32
101
|
none: false
|
33
102
|
requirements:
|
34
103
|
- - ~>
|
@@ -36,18 +105,28 @@ dependencies:
|
|
36
105
|
version: '2.0'
|
37
106
|
type: :development
|
38
107
|
prerelease: false
|
39
|
-
version_requirements:
|
108
|
+
version_requirements: !ruby/object:Gem::Requirement
|
109
|
+
none: false
|
110
|
+
requirements:
|
111
|
+
- - ~>
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
version: '2.0'
|
40
114
|
- !ruby/object:Gem::Dependency
|
41
|
-
name:
|
42
|
-
requirement:
|
115
|
+
name: webmock
|
116
|
+
requirement: !ruby/object:Gem::Requirement
|
43
117
|
none: false
|
44
118
|
requirements:
|
45
|
-
- -
|
119
|
+
- - ~>
|
46
120
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
121
|
+
version: 1.11.0
|
48
122
|
type: :development
|
49
123
|
prerelease: false
|
50
|
-
version_requirements:
|
124
|
+
version_requirements: !ruby/object:Gem::Requirement
|
125
|
+
none: false
|
126
|
+
requirements:
|
127
|
+
- - ~>
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
version: 1.11.0
|
51
130
|
description: Manage multiple Heroku instances/apps for a single Rails app using Rake.
|
52
131
|
email: lance.sanchez@gmail.com
|
53
132
|
executables: []
|
@@ -58,29 +137,41 @@ extra_rdoc_files:
|
|
58
137
|
- TODO
|
59
138
|
- CHANGELOG
|
60
139
|
files:
|
140
|
+
- .bundle/config
|
141
|
+
- .gitignore
|
142
|
+
- .rspec
|
143
|
+
- .rvmrc
|
144
|
+
- CHANGELOG
|
145
|
+
- Gemfile
|
146
|
+
- Gemfile.lock
|
147
|
+
- LICENSE
|
148
|
+
- README.md
|
149
|
+
- Rakefile
|
150
|
+
- TODO
|
151
|
+
- data/cacert.pem
|
152
|
+
- heroku-rails-saas.gemspec
|
61
153
|
- lib/generators/heroku/config_generator.rb
|
62
154
|
- lib/generators/templates/heroku.rake
|
63
155
|
- lib/generators/templates/heroku.yml
|
64
|
-
- lib/heroku
|
156
|
+
- lib/heroku-rails-saas.rb
|
65
157
|
- lib/heroku-rails-saas/config.rb
|
66
|
-
- lib/heroku-rails-saas/
|
158
|
+
- lib/heroku-rails-saas/displayer.rb
|
159
|
+
- lib/heroku-rails-saas/helper.rb
|
160
|
+
- lib/heroku-rails-saas/heroku_client.rb
|
67
161
|
- lib/heroku-rails-saas/railtie.rb
|
68
162
|
- lib/heroku-rails-saas/runner.rb
|
69
|
-
- lib/heroku-rails-saas.rb
|
163
|
+
- lib/heroku-rails-saas/version.rb
|
164
|
+
- lib/heroku/rails/tasks.rb
|
70
165
|
- spec/fixtures/awesomeapp.yml
|
166
|
+
- spec/fixtures/example.netrc
|
71
167
|
- spec/fixtures/heroku-config.yml
|
72
168
|
- spec/fixtures/mediocreapp.yml
|
73
|
-
- spec/heroku
|
74
|
-
- spec/heroku
|
169
|
+
- spec/heroku-rails-saas/config_spec.rb
|
170
|
+
- spec/heroku-rails-saas/displayer_spec.rb
|
171
|
+
- spec/heroku-rails-saas/helper_spec.rb
|
172
|
+
- spec/heroku-rails-saas/heorku_client_spec.rb
|
173
|
+
- spec/heroku-rails-saas/runner_spec.rb
|
75
174
|
- spec/spec_helper.rb
|
76
|
-
- heroku-rails.gemspec
|
77
|
-
- Gemfile
|
78
|
-
- Gemfile.lock
|
79
|
-
- CHANGELOG
|
80
|
-
- LICENSE
|
81
|
-
- Rakefile
|
82
|
-
- README.md
|
83
|
-
- TODO
|
84
175
|
homepage: http://github.com/darkbushido/heroku-rails-saas
|
85
176
|
licenses: []
|
86
177
|
post_install_message:
|
@@ -94,28 +185,27 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
94
185
|
- - ! '>='
|
95
186
|
- !ruby/object:Gem::Version
|
96
187
|
version: '0'
|
97
|
-
segments:
|
98
|
-
- 0
|
99
|
-
hash: 2780192577745053897
|
100
188
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
101
189
|
none: false
|
102
190
|
requirements:
|
103
191
|
- - ! '>='
|
104
192
|
- !ruby/object:Gem::Version
|
105
193
|
version: '0'
|
106
|
-
segments:
|
107
|
-
- 0
|
108
|
-
hash: 2780192577745053897
|
109
194
|
requirements: []
|
110
195
|
rubyforge_project: none
|
111
|
-
rubygems_version: 1.8.
|
196
|
+
rubygems_version: 1.8.24
|
112
197
|
signing_key:
|
113
198
|
specification_version: 3
|
114
199
|
summary: Deployment and configuration tools for Heroku/Rails
|
115
200
|
test_files:
|
116
201
|
- spec/fixtures/awesomeapp.yml
|
202
|
+
- spec/fixtures/example.netrc
|
117
203
|
- spec/fixtures/heroku-config.yml
|
118
204
|
- spec/fixtures/mediocreapp.yml
|
119
|
-
- spec/heroku
|
120
|
-
- spec/heroku
|
205
|
+
- spec/heroku-rails-saas/config_spec.rb
|
206
|
+
- spec/heroku-rails-saas/displayer_spec.rb
|
207
|
+
- spec/heroku-rails-saas/helper_spec.rb
|
208
|
+
- spec/heroku-rails-saas/heorku_client_spec.rb
|
209
|
+
- spec/heroku-rails-saas/runner_spec.rb
|
121
210
|
- spec/spec_helper.rb
|
211
|
+
has_rdoc:
|
data/heroku-rails.gemspec
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
Gem::Specification.new do |s|
|
2
|
-
s.name = "heroku-rails-saas"
|
3
|
-
s.version = "0.1.7"
|
4
|
-
|
5
|
-
s.authors = [ "Elijah Miller", "Glenn Roberts", "Jacques Crocker", "Lance Sanchez", "Chris Trinh"]
|
6
|
-
|
7
|
-
s.summary = "Deployment and configuration tools for Heroku/Rails"
|
8
|
-
s.description = "Manage multiple Heroku instances/apps for a single Rails app using Rake."
|
9
|
-
|
10
|
-
s.email = "lance.sanchez@gmail.com"
|
11
|
-
s.homepage = "http://github.com/darkbushido/heroku-rails-saas"
|
12
|
-
s.rubyforge_project = "none"
|
13
|
-
|
14
|
-
s.require_paths = ["lib"]
|
15
|
-
s.files = Dir['lib/**/*',
|
16
|
-
'spec/**/*',
|
17
|
-
'heroku-rails.gemspec',
|
18
|
-
'Gemfile',
|
19
|
-
'Gemfile.lock',
|
20
|
-
'CHANGELOG',
|
21
|
-
'LICENSE',
|
22
|
-
'Rakefile',
|
23
|
-
'README.md',
|
24
|
-
'TODO']
|
25
|
-
|
26
|
-
s.test_files = Dir['spec/**/*']
|
27
|
-
s.rdoc_options = ["--charset=UTF-8"]
|
28
|
-
s.extra_rdoc_files = [
|
29
|
-
"LICENSE",
|
30
|
-
"README.md",
|
31
|
-
"TODO",
|
32
|
-
"CHANGELOG"
|
33
|
-
]
|
34
|
-
|
35
|
-
s.add_runtime_dependency "heroku", ">= 2.24.1"
|
36
|
-
s.add_development_dependency "rspec", "~> 2.0"
|
37
|
-
s.add_development_dependency "activesupport"
|
38
|
-
end
|
39
|
-
|