shelly 0.4.0 → 0.4.1
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.
- checksums.yaml +8 -8
- data/CHANGELOG.md +6 -0
- data/lib/shelly/app.rb +8 -0
- data/lib/shelly/cli/config.rb +46 -8
- data/lib/shelly/cli/deploy.rb +6 -6
- data/lib/shelly/version.rb +1 -1
- data/spec/shelly/app_spec.rb +21 -0
- data/spec/shelly/cli/config_spec.rb +73 -12
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ZGJlZjY2MmJjZjJmNWNhYjgyODg3NjA2ODNhYzk2NzRmMjY0NzdjOQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
MTNmY2VkZWUyMjhmYzU5MTFhZDRkYTNjMmM2ZTRiNGJkNzY4NWJhNA==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
YmU2NzhkNWJkYzNlMjMwNGFjMGIxN2ZhNWI0YTdlZjk3ZjVlOTk3M2I3MWNm
|
10
|
+
OTMxZDNlMWFjN2FlODQ2MTgxMWU4MDFkYmNkZDIyYjdhODhhMGFiNDkxODcy
|
11
|
+
YzMwYjVlZmQyZjk0MzNmYWQxYTRkNWIzNTZhYmQ1YzgwNzQ1NTA=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ODdmZjg1NzcyNzI0YWE5ODI1MDc1MWE0MmVhYmRhNTI3YjJjMDA5OTgxMWNk
|
14
|
+
Njc5YjRkYWRmNmI3NDU5Y2Y5OWViOTMzOGZiNzBiYTFmNTQ3ZjFkNjFjZTI0
|
15
|
+
YjIyMjY4ZjgwZWI2NjJmNDk5Njg0YzExOTQyNWE1NzlkMjk0N2E=
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
## 0.4.1 / 2013-08-26
|
2
|
+
|
3
|
+
* [feature] Upload existing config file with `shelly config upload PATH`
|
4
|
+
* [improvement] Reorganised displaying deploy logs
|
5
|
+
* [improvement] Show next action depending on cloud state when adding configuration file
|
6
|
+
|
1
7
|
## 0.4.0 / 2013-08-13
|
2
8
|
|
3
9
|
* [feature] Added `shelly organization add` to create new organizations
|
data/lib/shelly/app.rb
CHANGED
@@ -191,6 +191,10 @@ module Shelly
|
|
191
191
|
shelly.app_delete_config(code_name, path)
|
192
192
|
end
|
193
193
|
|
194
|
+
def config_exists?(path)
|
195
|
+
configs.any? { |config| config["path"] == path }
|
196
|
+
end
|
197
|
+
|
194
198
|
def rake(task)
|
195
199
|
ssh(:command => "rake_runner \"#{task}\"")
|
196
200
|
end
|
@@ -243,6 +247,10 @@ module Shelly
|
|
243
247
|
system("git status > /dev/null 2>&1")
|
244
248
|
end
|
245
249
|
|
250
|
+
def turned_off?
|
251
|
+
state == 'turned_off'
|
252
|
+
end
|
253
|
+
|
246
254
|
def to_s
|
247
255
|
code_name
|
248
256
|
end
|
data/lib/shelly/cli/config.rb
CHANGED
@@ -6,8 +6,10 @@ module Shelly
|
|
6
6
|
namespace :config
|
7
7
|
include Helpers
|
8
8
|
|
9
|
-
before_hook :logged_in?, :only => [:list, :show, :create, :new, :edit,
|
10
|
-
|
9
|
+
before_hook :logged_in?, :only => [:list, :show, :create, :new, :edit,
|
10
|
+
:update, :upload, :delete]
|
11
|
+
class_option :cloud, :type => :string, :aliases => "-c",
|
12
|
+
:desc => "Specify cloud"
|
11
13
|
|
12
14
|
desc "list", "List configuration files"
|
13
15
|
def list
|
@@ -51,8 +53,7 @@ module Shelly
|
|
51
53
|
app = multiple_clouds(options[:cloud], "create #{path}")
|
52
54
|
app.create_config(path, output)
|
53
55
|
say "File '#{path}' created.", :green
|
54
|
-
|
55
|
-
say "`shelly redeploy --cloud #{app}`"
|
56
|
+
next_action_info(app)
|
56
57
|
rescue Client::ValidationException => e
|
57
58
|
e.each_error { |error| say_error error, :with_exit => false }
|
58
59
|
exit 1
|
@@ -67,8 +68,7 @@ module Shelly
|
|
67
68
|
content = open_editor(config["path"], config["content"])
|
68
69
|
app.update_config(path, content)
|
69
70
|
say "File '#{config["path"]}' updated.", :green
|
70
|
-
|
71
|
-
say "`shelly redeploy --cloud #{app}`"
|
71
|
+
next_action_info(app)
|
72
72
|
rescue Client::NotFoundException => e
|
73
73
|
raise unless e.resource == :config
|
74
74
|
say_error "Config '#{path}' not found", :with_exit => false
|
@@ -84,8 +84,7 @@ module Shelly
|
|
84
84
|
if yes?("Are you sure you want to delete '#{path}' (yes/no):")
|
85
85
|
app.delete_config(path)
|
86
86
|
say "File '#{path}' deleted.", :green
|
87
|
-
|
88
|
-
say "`shelly redeploy --cloud #{app}`"
|
87
|
+
next_action_info(app)
|
89
88
|
else
|
90
89
|
say "File not deleted"
|
91
90
|
end
|
@@ -95,7 +94,46 @@ module Shelly
|
|
95
94
|
say_error "You can list available config files with `shelly config list --cloud #{app}`"
|
96
95
|
end
|
97
96
|
|
97
|
+
desc "upload PATH [DESTINATION_PATH]", "Upload configuration file"
|
98
|
+
long_desc %{
|
99
|
+
Upload configuration file from local machine
|
100
|
+
PATH - Path to configuration file that will be uploaded
|
101
|
+
DESTINATION_PATH - Optional file path that file will be uploaded to. By default it's the same as PATH.
|
102
|
+
}
|
103
|
+
def upload(path, destination_path = nil)
|
104
|
+
app = multiple_clouds(options[:cloud], "config upload #{path}")
|
105
|
+
destination_path ||= path
|
106
|
+
if ::File.exists?(path)
|
107
|
+
content = ::File.read(path)
|
108
|
+
else
|
109
|
+
say_error "File '#{path}' doesn't exist."
|
110
|
+
end
|
111
|
+
if app.config_exists?(destination_path)
|
112
|
+
if yes?("Config file '#{destination_path}' exists, do you want to overwrite it (yes/no):")
|
113
|
+
app.update_config(destination_path, content)
|
114
|
+
say "File '#{path}' uploaded.", :green
|
115
|
+
next_action_info(app)
|
116
|
+
else
|
117
|
+
say "File not overwritten."
|
118
|
+
end
|
119
|
+
else
|
120
|
+
app.create_config(destination_path, content)
|
121
|
+
say "File '#{path}' uploaded.", :green
|
122
|
+
next_action_info(app)
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
98
126
|
no_tasks do
|
127
|
+
def next_action_info(app)
|
128
|
+
if app.turned_off?
|
129
|
+
say "Changes will take affect when cloud is started"
|
130
|
+
say "`shelly start --cloud #{app}`"
|
131
|
+
else
|
132
|
+
say "To make changes to running cloud redeploy it using:"
|
133
|
+
say "`shelly redeploy --cloud #{app}`"
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
99
137
|
def print_configs(configs)
|
100
138
|
print_table(configs.map { |config|
|
101
139
|
[" * ", config["path"]] })
|
data/lib/shelly/cli/deploy.rb
CHANGED
@@ -43,12 +43,6 @@ module Shelly
|
|
43
43
|
if content["bundle_install"]
|
44
44
|
say("Starting bundle install", :green); say(content["bundle_install"])
|
45
45
|
end
|
46
|
-
if content["whenever"]
|
47
|
-
say("Starting whenever", :green); say(content["whenever"])
|
48
|
-
end
|
49
|
-
if content["callbacks"]
|
50
|
-
say("Starting callbacks", :green); say(content["callbacks"])
|
51
|
-
end
|
52
46
|
if content["delayed_job"]
|
53
47
|
say("Starting delayed job", :green); say(content["delayed_job"])
|
54
48
|
end
|
@@ -61,6 +55,12 @@ module Shelly
|
|
61
55
|
if content["puma_restart"]
|
62
56
|
say("Starting puma", :green); say(content["puma_restart"])
|
63
57
|
end
|
58
|
+
if content["callbacks"]
|
59
|
+
say("Starting callbacks", :green); say(content["callbacks"])
|
60
|
+
end
|
61
|
+
if content["whenever"]
|
62
|
+
say("Starting whenever", :green); say(content["whenever"])
|
63
|
+
end
|
64
64
|
else
|
65
65
|
say_error("There was an error and log is not available", :with_exit => false)
|
66
66
|
say_error("Please contact our support https://shellycloud.com/support")
|
data/lib/shelly/version.rb
CHANGED
data/spec/shelly/app_spec.rb
CHANGED
@@ -97,6 +97,20 @@ describe Shelly::App do
|
|
97
97
|
@client.should_receive(:app_delete_config).with("foo-staging", "path")
|
98
98
|
@app.delete_config("path")
|
99
99
|
end
|
100
|
+
|
101
|
+
describe "#config_exists?" do
|
102
|
+
before do
|
103
|
+
@client.stub(:app_configs => config_response)
|
104
|
+
end
|
105
|
+
|
106
|
+
it "should return true when config exists" do
|
107
|
+
@app.config_exists?("user_created").should be_true
|
108
|
+
end
|
109
|
+
|
110
|
+
it "should return false when config doesn't exist" do
|
111
|
+
@app.config_exists?("some/config").should be_false
|
112
|
+
end
|
113
|
+
end
|
100
114
|
end
|
101
115
|
|
102
116
|
describe "#attributes" do
|
@@ -185,6 +199,13 @@ describe Shelly::App do
|
|
185
199
|
end
|
186
200
|
end
|
187
201
|
|
202
|
+
describe "#turned_off?" do
|
203
|
+
it "should return true if cloud state is turned_off" do
|
204
|
+
@client.should_receive(:app).and_return({'state' => 'turned_off'})
|
205
|
+
@app.turned_off?.should be_true
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
188
209
|
describe "#deploy_logs" do
|
189
210
|
it "should list deploy_logs" do
|
190
211
|
@client.should_receive(:deploy_logs).with("foo-staging")
|
@@ -14,6 +14,7 @@ describe Shelly::CLI::Config do
|
|
14
14
|
FileUtils.mkdir_p("/projects/foo")
|
15
15
|
Dir.chdir("/projects/foo")
|
16
16
|
@client.stub(:authorize!)
|
17
|
+
@client.stub(:app).and_return('state' => 'running')
|
17
18
|
File.open("Cloudfile", 'w') {|f| f.write("foo-production:\n") }
|
18
19
|
FileUtils.mkdir_p("/tmp")
|
19
20
|
Dir.stub(:tmpdir).and_return("/tmp")
|
@@ -96,7 +97,6 @@ describe Shelly::CLI::Config do
|
|
96
97
|
# multiple_clouds is tested in main_spec.rb in describe "#start" block
|
97
98
|
it "should ensure multiple_clouds check" do
|
98
99
|
@config.should_receive(:system).with(/vim \/tmp\/shelly-edit/).and_return(true)
|
99
|
-
@app = Shelly::App.new("foo-production")
|
100
100
|
Shelly::App.stub(:new).and_return(@app)
|
101
101
|
@client.should_receive(:app_create_config).with("foo-production", "path", "\n").and_return({})
|
102
102
|
@config.should_receive(:multiple_clouds).and_return(@app)
|
@@ -109,13 +109,27 @@ describe Shelly::CLI::Config do
|
|
109
109
|
lambda { invoke(@config, :create, "path") }.should raise_error(SystemExit)
|
110
110
|
end
|
111
111
|
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
112
|
+
context "cloud running" do
|
113
|
+
it "should create file" do
|
114
|
+
@config.should_receive(:system).with(/vim \/tmp\/shelly-edit/).and_return(true)
|
115
|
+
@client.should_receive(:app_create_config).with("foo-production", "path", "\n").and_return({})
|
116
|
+
$stdout.should_receive(:puts).with(green "File 'path' created.")
|
117
|
+
$stdout.should_receive(:puts).with("To make changes to running cloud redeploy it using:")
|
118
|
+
$stdout.should_receive(:puts).with("`shelly redeploy --cloud foo-production`")
|
119
|
+
invoke(@config, :create, "path")
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
context "cloud turned off" do
|
124
|
+
it "should print " do
|
125
|
+
@client.stub(:app).and_return('state' => 'turned_off')
|
126
|
+
@config.should_receive(:system).with(/vim \/tmp\/shelly-edit/).and_return(true)
|
127
|
+
@client.should_receive(:app_create_config).with("foo-production", "path", "\n").and_return({})
|
128
|
+
$stdout.should_receive(:puts).with(green "File 'path' created.")
|
129
|
+
$stdout.should_receive(:puts).with("Changes will take affect when cloud is started")
|
130
|
+
$stdout.should_receive(:puts).with("`shelly start --cloud foo-production`")
|
131
|
+
invoke(@config, :create, "path")
|
132
|
+
end
|
119
133
|
end
|
120
134
|
|
121
135
|
context "on validation errors" do
|
@@ -162,8 +176,7 @@ describe Shelly::CLI::Config do
|
|
162
176
|
@config.should_receive(:system).with(/vim \/tmp\/shelly-edit/).and_return(true)
|
163
177
|
@client.should_receive(:app_update_config).with("foo-production", "path", "example content\n").and_return({"path" => "test.rb", "content" => "example content"})
|
164
178
|
$stdout.should_receive(:puts).with(green "File 'test.rb' updated.")
|
165
|
-
|
166
|
-
$stdout.should_receive(:puts).with("`shelly redeploy --cloud foo-production`")
|
179
|
+
@config.should_receive(:next_action_info)
|
167
180
|
invoke(@config, :edit, "path")
|
168
181
|
end
|
169
182
|
|
@@ -211,8 +224,7 @@ describe Shelly::CLI::Config do
|
|
211
224
|
@client.should_receive(:app_delete_config).with("foo-production", "some-path").and_return({})
|
212
225
|
$stdout.should_receive(:print).with("Are you sure you want to delete 'some-path' (yes/no): ")
|
213
226
|
$stdout.should_receive(:puts).with(green "File 'some-path' deleted.")
|
214
|
-
|
215
|
-
$stdout.should_receive(:puts).with("`shelly redeploy --cloud foo-production`")
|
227
|
+
@config.should_receive(:next_action_info)
|
216
228
|
fake_stdin(["y"]) do
|
217
229
|
invoke(@config, :delete, "some-path")
|
218
230
|
end
|
@@ -242,4 +254,53 @@ describe Shelly::CLI::Config do
|
|
242
254
|
end
|
243
255
|
end
|
244
256
|
end
|
257
|
+
|
258
|
+
describe "#upload" do
|
259
|
+
before do
|
260
|
+
@config.stub(:multiple_clouds => @app)
|
261
|
+
end
|
262
|
+
|
263
|
+
it "should ensure user has logged in" do
|
264
|
+
hooks(@config, :upload).should include(:logged_in?)
|
265
|
+
end
|
266
|
+
|
267
|
+
it "should upload given configuration file" do
|
268
|
+
File.open("upload_me", "w") { |f| f << "upload_me_content" }
|
269
|
+
@app.stub(:config_exists? => false)
|
270
|
+
@app.should_receive(:create_config).with("upload_me", "upload_me_content").and_return({})
|
271
|
+
$stdout.should_receive(:puts).with(green "File 'upload_me' uploaded.")
|
272
|
+
invoke(@config, :upload, "upload_me")
|
273
|
+
end
|
274
|
+
|
275
|
+
context "when destination path given" do
|
276
|
+
it "should upload to given path" do
|
277
|
+
File.open("upload_me", "w") { |f| f << "upload_me_content" }
|
278
|
+
@app.stub(:config_exists? => false)
|
279
|
+
@app.should_receive(:create_config).with("put/it/here", "upload_me_content").and_return({})
|
280
|
+
$stdout.should_receive(:puts).with(green "File 'upload_me' uploaded.")
|
281
|
+
invoke(@config, :upload, "upload_me", "put/it/here")
|
282
|
+
end
|
283
|
+
end
|
284
|
+
|
285
|
+
context "when source path doesn't exist" do
|
286
|
+
it "should show error" do
|
287
|
+
@app.stub(:config_exists? => false)
|
288
|
+
@app.should_not_receive(:create_config)
|
289
|
+
$stdout.should_receive(:puts).with(red "File 'upload_me' doesn't exist.")
|
290
|
+
lambda { invoke(@config, :upload, "upload_me") }.should raise_error(SystemExit)
|
291
|
+
end
|
292
|
+
end
|
293
|
+
|
294
|
+
context "when destination path exists" do
|
295
|
+
it "should ask if overwrite" do
|
296
|
+
File.open("upload_me", "w") { |f| f << "upload_me_content" }
|
297
|
+
@app.stub(:config_exists? => true)
|
298
|
+
@app.should_receive(:update_config).with("upload_me", "upload_me_content").and_return({})
|
299
|
+
$stdout.should_receive(:puts).with(green "File 'upload_me' uploaded.")
|
300
|
+
fake_stdin(["y"]) do
|
301
|
+
invoke(@config, :upload, "upload_me")
|
302
|
+
end
|
303
|
+
end
|
304
|
+
end
|
305
|
+
end
|
245
306
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shelly
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shelly Cloud team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-08-
|
11
|
+
date: 2013-08-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|