shelly 0.1.1 → 0.1.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/lib/shelly/app.rb +11 -1
- data/lib/shelly/cli/main.rb +14 -3
- data/lib/shelly/cli/runner.rb +8 -0
- data/lib/shelly/client.rb +5 -4
- data/lib/shelly/helpers.rb +1 -1
- data/lib/shelly/version.rb +1 -1
- data/spec/shelly/app_spec.rb +20 -2
- data/spec/shelly/cli/main_spec.rb +48 -6
- data/spec/shelly/cli/runner_spec.rb +16 -2
- data/spec/shelly/client_spec.rb +12 -3
- metadata +242 -185
data/lib/shelly/app.rb
CHANGED
@@ -231,8 +231,18 @@ module Shelly
|
|
231
231
|
Launchy.open("http://#{attributes["domain"]}")
|
232
232
|
end
|
233
233
|
|
234
|
+
def node_and_port
|
235
|
+
shelly.node_and_port(code_name)
|
236
|
+
end
|
237
|
+
|
234
238
|
def console
|
235
|
-
|
239
|
+
params = node_and_port
|
240
|
+
exec "ssh -o StrictHostKeyChecking=no -p #{params['port']} -l #{params['user']} #{params['node_ip']}"
|
241
|
+
end
|
242
|
+
|
243
|
+
def upload(path)
|
244
|
+
params = node_and_port
|
245
|
+
exec "rsync -avz -e 'ssh -p #{params['port']}' --progress #{path} #{params['user']}@#{params['node_ip']}:/srv/glusterfs/disk"
|
236
246
|
end
|
237
247
|
end
|
238
248
|
end
|
data/lib/shelly/cli/main.rb
CHANGED
@@ -16,7 +16,7 @@ module Shelly
|
|
16
16
|
check_unknown_options!(:except => :rake)
|
17
17
|
|
18
18
|
# FIXME: it should be possible to pass single symbol, instead of one element array
|
19
|
-
before_hook :logged_in?, :only => [:add, :status, :list, :start, :stop, :logs, :delete, :info, :ip, :logout, :execute, :rake, :setup, :console]
|
19
|
+
before_hook :logged_in?, :only => [:add, :status, :list, :start, :stop, :logs, :delete, :info, :ip, :logout, :execute, :rake, :setup, :console, :upload]
|
20
20
|
before_hook :inside_git_repository?, :only => [:add, :setup]
|
21
21
|
|
22
22
|
map %w(-v --version) => :version
|
@@ -347,8 +347,7 @@ We have been notified about it. We will be adding new resources shortly}
|
|
347
347
|
method_option :cloud, :type => :string, :aliases => "-c", :desc => "Specify cloud"
|
348
348
|
def console
|
349
349
|
app = multiple_clouds(options[:cloud], "console")
|
350
|
-
|
351
|
-
exec "ssh -o StrictHostKeyChecking=no -p #{console['port']} -l #{console['user']} #{console['node_ip']}"
|
350
|
+
app.console
|
352
351
|
rescue Client::NotFoundException => e
|
353
352
|
raise unless e.resource == :cloud
|
354
353
|
say_error "You have no access to '#{app}' cloud defined in Cloudfile"
|
@@ -356,6 +355,18 @@ We have been notified about it. We will be adding new resources shortly}
|
|
356
355
|
say_error "Cloud #{app} is not running. Cannot run console."
|
357
356
|
end
|
358
357
|
|
358
|
+
desc "upload PATH", "Upload files to persisted data storage"
|
359
|
+
method_option :cloud, :type => :string, :aliases => "-c", :desc => "Specify cloud"
|
360
|
+
def upload(path)
|
361
|
+
app = multiple_clouds(options[:cloud], "upload #{path}")
|
362
|
+
app.upload(path)
|
363
|
+
rescue Client::NotFoundException => e
|
364
|
+
raise unless e.resource == :cloud
|
365
|
+
say_error "You have no access to '#{app}' cloud defined in Cloudfile"
|
366
|
+
rescue Client::APIException => e
|
367
|
+
say_error "Cloud #{app} is not running. Cannot upload files."
|
368
|
+
end
|
369
|
+
|
359
370
|
# FIXME: move to helpers
|
360
371
|
no_tasks do
|
361
372
|
# Returns valid arguments for rake, removes shelly gem arguments
|
data/lib/shelly/cli/runner.rb
CHANGED
@@ -31,6 +31,14 @@ module Shelly
|
|
31
31
|
raise if debug?
|
32
32
|
say_new_line
|
33
33
|
say_error "[canceled]"
|
34
|
+
rescue Client::APIException => e
|
35
|
+
raise if debug?
|
36
|
+
say_error "You have found a bug in the shelly gem. We're sorry.",
|
37
|
+
:with_exit => e.request_id.blank?
|
38
|
+
say_error <<-eos
|
39
|
+
You can report it to support@shellycloud.com by describing what you wanted
|
40
|
+
to do and mentioning error id #{e.request_id}.
|
41
|
+
eos
|
34
42
|
rescue Exception
|
35
43
|
raise if debug?
|
36
44
|
say_error "Unknown error, to see debug information run command with --debug"
|
data/lib/shelly/client.rb
CHANGED
@@ -5,11 +5,12 @@ require "cgi"
|
|
5
5
|
module Shelly
|
6
6
|
class Client
|
7
7
|
class APIException < Exception
|
8
|
-
attr_reader :status_code, :body
|
8
|
+
attr_reader :status_code, :body, :request_id
|
9
9
|
|
10
|
-
def initialize(body = {}, status_code = nil)
|
10
|
+
def initialize(body = {}, status_code = nil, request_id = nil)
|
11
11
|
@status_code = status_code
|
12
12
|
@body = body
|
13
|
+
@request_id = request_id
|
13
14
|
end
|
14
15
|
|
15
16
|
def [](key)
|
@@ -124,7 +125,7 @@ module Shelly
|
|
124
125
|
post("/apps/#{cloud}/command", {:body => body, :type => type})
|
125
126
|
end
|
126
127
|
|
127
|
-
def
|
128
|
+
def node_and_port(code_name)
|
128
129
|
get("/apps/#{code_name}/console")
|
129
130
|
end
|
130
131
|
|
@@ -234,7 +235,7 @@ module Shelly
|
|
234
235
|
when 422; ValidationException
|
235
236
|
else; APIException
|
236
237
|
end
|
237
|
-
raise exception_class.new(body, code)
|
238
|
+
raise exception_class.new(body, code, response.headers[:x_request_id])
|
238
239
|
end
|
239
240
|
response.return!
|
240
241
|
body
|
data/lib/shelly/helpers.rb
CHANGED
data/lib/shelly/version.rb
CHANGED
data/spec/shelly/app_spec.rb
CHANGED
@@ -406,10 +406,28 @@ config
|
|
406
406
|
end
|
407
407
|
end
|
408
408
|
|
409
|
-
describe "#
|
409
|
+
describe "#node_and_console" do
|
410
410
|
it "should fetch instance data from Api" do
|
411
|
-
@client.should_receive(:
|
411
|
+
@client.should_receive(:node_and_port).with("foo-staging")
|
412
|
+
@app.node_and_port
|
413
|
+
end
|
414
|
+
end
|
415
|
+
|
416
|
+
describe "#console" do
|
417
|
+
it "should run ssh with all parameters" do
|
418
|
+
@client.stub(:node_and_port).and_return(
|
419
|
+
{"node_ip" => "10.0.0.1", "port" => "40010", "user" => "foo"})
|
420
|
+
@app.should_receive(:exec).with("ssh -o StrictHostKeyChecking=no -p 40010 -l foo 10.0.0.1")
|
412
421
|
@app.console
|
413
422
|
end
|
414
423
|
end
|
424
|
+
|
425
|
+
describe "#upload" do
|
426
|
+
it "should run rsync with all parameters" do
|
427
|
+
@client.stub(:node_and_port).and_return(
|
428
|
+
{"node_ip" => "10.0.0.1", "port" => "40010", "user" => "foo"})
|
429
|
+
@app.should_receive(:exec).with("rsync -avz -e 'ssh -p 40010' --progress /path foo@10.0.0.1:/srv/glusterfs/disk")
|
430
|
+
@app.upload("/path")
|
431
|
+
end
|
432
|
+
end
|
415
433
|
end
|
@@ -44,6 +44,7 @@ Tasks:
|
|
44
44
|
shelly setup # Set up clouds
|
45
45
|
shelly start # Start the cloud
|
46
46
|
shelly stop # Shutdown the cloud
|
47
|
+
shelly upload PATH # Upload files to persisted data storage
|
47
48
|
shelly user <command> # Manage collaborators
|
48
49
|
shelly version # Display shelly version
|
49
50
|
|
@@ -1326,33 +1327,35 @@ We have been notified about it. We will be adding new resources shortly")
|
|
1326
1327
|
|
1327
1328
|
describe "#console" do
|
1328
1329
|
before do
|
1329
|
-
@user = Shelly::User.new
|
1330
1330
|
@client.stub(:token).and_return("abc")
|
1331
1331
|
@app = Shelly::App.new("foo-production")
|
1332
|
-
@app.stub(:open)
|
1333
1332
|
Shelly::App.stub(:new).and_return(@app)
|
1334
1333
|
FileUtils.mkdir_p("/projects/foo")
|
1335
1334
|
Dir.chdir("/projects/foo")
|
1336
1335
|
File.open("Cloudfile", 'w') { |f| f.write("foo-production:\n") }
|
1337
1336
|
end
|
1338
1337
|
|
1338
|
+
it "should ensure user has logged in" do
|
1339
|
+
hooks(@main, :console).should include(:logged_in?)
|
1340
|
+
end
|
1341
|
+
|
1339
1342
|
it "execute ssh command" do
|
1340
1343
|
expected = {"port" => "40010", "node_ip" => "10.0.0.10", "user"=>"foo-production"}
|
1341
|
-
@client.stub(:
|
1342
|
-
@
|
1344
|
+
@client.stub(:node_and_port).and_return(expected)
|
1345
|
+
@app.should_receive(:console)
|
1343
1346
|
invoke(@main, :console)
|
1344
1347
|
end
|
1345
1348
|
|
1346
1349
|
it "should exit if user doesn't have access to clouds in Cloudfile" do
|
1347
1350
|
exception = Shelly::Client::NotFoundException.new("resource" => "cloud")
|
1348
|
-
@client.stub(:
|
1351
|
+
@client.stub(:node_and_port).and_raise(exception)
|
1349
1352
|
$stdout.should_receive(:puts).with(red "You have no access to 'foo-production' cloud defined in Cloudfile")
|
1350
1353
|
lambda { invoke(@main, :console) }.should raise_error(SystemExit)
|
1351
1354
|
end
|
1352
1355
|
|
1353
1356
|
context "Instances are not running" do
|
1354
1357
|
it "should display error" do
|
1355
|
-
@client.stub(:
|
1358
|
+
@client.stub(:node_and_port).and_raise(Shelly::Client::APIException)
|
1356
1359
|
$stdout.should_receive(:puts).with(red "Cloud foo-production is not running. Cannot run console.")
|
1357
1360
|
lambda {
|
1358
1361
|
invoke(@main, :console)
|
@@ -1360,4 +1363,43 @@ We have been notified about it. We will be adding new resources shortly")
|
|
1360
1363
|
end
|
1361
1364
|
end
|
1362
1365
|
end
|
1366
|
+
|
1367
|
+
describe "#upload" do
|
1368
|
+
before do
|
1369
|
+
@client.stub(:token).and_return("abc")
|
1370
|
+
@app = Shelly::App.new("foo-production")
|
1371
|
+
Shelly::App.stub(:new).and_return(@app)
|
1372
|
+
FileUtils.mkdir_p("/projects/foo")
|
1373
|
+
Dir.chdir("/projects/foo")
|
1374
|
+
File.open("Cloudfile", 'w') { |f| f.write("foo-production:\n") }
|
1375
|
+
end
|
1376
|
+
|
1377
|
+
it "should ensure user has logged in" do
|
1378
|
+
hooks(@main, :upload).should include(:logged_in?)
|
1379
|
+
end
|
1380
|
+
|
1381
|
+
it "should upload files" do
|
1382
|
+
expected = {"port" => "40010", "node_ip" => "10.0.0.10", "user"=>"foo-production"}
|
1383
|
+
@client.stub(:node_and_port).and_return(expected)
|
1384
|
+
@app.should_receive(:upload).with("some/path")
|
1385
|
+
invoke(@main, :upload, "some/path")
|
1386
|
+
end
|
1387
|
+
|
1388
|
+
it "should exit if user doesn't have access to clouds in Cloudfile" do
|
1389
|
+
exception = Shelly::Client::NotFoundException.new("resource" => "cloud")
|
1390
|
+
@client.stub(:node_and_port).and_raise(exception)
|
1391
|
+
$stdout.should_receive(:puts).with(red "You have no access to 'foo-production' cloud defined in Cloudfile")
|
1392
|
+
lambda { invoke(@main, :upload, "some/path") }.should raise_error(SystemExit)
|
1393
|
+
end
|
1394
|
+
|
1395
|
+
context "Instances are not running" do
|
1396
|
+
it "should display error" do
|
1397
|
+
@client.stub(:node_and_port).and_raise(Shelly::Client::APIException)
|
1398
|
+
$stdout.should_receive(:puts).with(red "Cloud foo-production is not running. Cannot upload files.")
|
1399
|
+
lambda {
|
1400
|
+
invoke(@main, :upload, "some/path")
|
1401
|
+
}.should raise_error(SystemExit)
|
1402
|
+
end
|
1403
|
+
end
|
1404
|
+
end
|
1363
1405
|
end
|
@@ -118,9 +118,23 @@ describe Shelly::CLI::Runner do
|
|
118
118
|
end
|
119
119
|
|
120
120
|
it "should catch exception thrown by API Client" do
|
121
|
-
Shelly::CLI::Main.stub(:start).and_raise(Shelly::Client::APIException.new)
|
121
|
+
Shelly::CLI::Main.stub(:start).and_raise(Shelly::Client::APIException.new({}, 500, "test123"))
|
122
122
|
runner = Shelly::CLI::Runner.new(%w(version))
|
123
|
-
$stdout.should_receive(:puts).with("
|
123
|
+
$stdout.should_receive(:puts).with("You have found a bug in the shelly gem. We're sorry.")
|
124
|
+
$stdout.should_receive(:puts).with(<<-eos
|
125
|
+
You can report it to support@shellycloud.com by describing what you wanted
|
126
|
+
to do and mentioning error id test123.
|
127
|
+
eos
|
128
|
+
)
|
129
|
+
lambda {
|
130
|
+
runner.start
|
131
|
+
}.should raise_error(SystemExit)
|
132
|
+
end
|
133
|
+
|
134
|
+
it "should not print reporting info if no request id returned" do
|
135
|
+
Shelly::CLI::Main.stub(:start).and_raise(Shelly::Client::APIException.new({}, 500, nil))
|
136
|
+
runner = Shelly::CLI::Runner.new(%w(version))
|
137
|
+
$stdout.should_receive(:puts).with("You have found a bug in the shelly gem. We're sorry.")
|
124
138
|
lambda {
|
125
139
|
runner.start
|
126
140
|
}.should raise_error(SystemExit)
|
data/spec/shelly/client_spec.rb
CHANGED
@@ -199,12 +199,12 @@ describe Shelly::Client do
|
|
199
199
|
end
|
200
200
|
end
|
201
201
|
|
202
|
-
describe "#
|
202
|
+
describe "#node_and_port" do
|
203
203
|
it "should fetch instance data from API" do
|
204
204
|
body = {:port => "40010", :node_ip => "10.0.0.10", :user => "foo-production"}
|
205
205
|
FakeWeb.register_uri(:get, api_url("apps/staging-foo/console"),
|
206
206
|
:body => body.to_json)
|
207
|
-
response = @client.
|
207
|
+
response = @client.node_and_port("staging-foo")
|
208
208
|
response.should == {"port" => "40010", "node_ip" => "10.0.0.10", "user"=>"foo-production"}
|
209
209
|
end
|
210
210
|
end
|
@@ -363,6 +363,7 @@ describe Shelly::Client do
|
|
363
363
|
it "should raise UnauthorizedException" do
|
364
364
|
@response.stub(:code).and_return(401)
|
365
365
|
@response.stub(:body).and_return("")
|
366
|
+
@response.stub(:headers).and_return({})
|
366
367
|
lambda {
|
367
368
|
@client.post("/")
|
368
369
|
}.should raise_error(Shelly::Client::UnauthorizedException)
|
@@ -373,6 +374,7 @@ describe Shelly::Client do
|
|
373
374
|
it "should raise NotFoundException" do
|
374
375
|
@response.stub(:code).and_return(404)
|
375
376
|
@response.stub(:body).and_return("")
|
377
|
+
@response.stub(:headers).and_return({})
|
376
378
|
lambda {
|
377
379
|
@client.post("/")
|
378
380
|
}.should raise_error(Shelly::Client::NotFoundException)
|
@@ -383,6 +385,7 @@ describe Shelly::Client do
|
|
383
385
|
it "should raise ConflictException" do
|
384
386
|
@response.stub(:code).and_return(409)
|
385
387
|
@response.stub(:body).and_return("")
|
388
|
+
@response.stub(:headers).and_return({})
|
386
389
|
lambda {
|
387
390
|
@client.post("/")
|
388
391
|
}.should raise_error(Shelly::Client::ConflictException)
|
@@ -393,6 +396,7 @@ describe Shelly::Client do
|
|
393
396
|
it "should raise ValidationException" do
|
394
397
|
@response.stub(:code).and_return(422)
|
395
398
|
@response.stub(:body).and_return("")
|
399
|
+
@response.stub(:headers).and_return({})
|
396
400
|
lambda {
|
397
401
|
@client.post("/")
|
398
402
|
}.should raise_error(Shelly::Client::ValidationException)
|
@@ -403,9 +407,13 @@ describe Shelly::Client do
|
|
403
407
|
it "should raise generic APIException" do
|
404
408
|
@response.stub(:code).and_return(500)
|
405
409
|
@response.stub(:body).and_return("")
|
410
|
+
@response.stub(:headers).and_return({:x_request_id => "id123"})
|
406
411
|
lambda {
|
407
412
|
@client.post("/")
|
408
|
-
}.should raise_error
|
413
|
+
}.should raise_error { |error|
|
414
|
+
error.should be_a(Shelly::Client::APIException)
|
415
|
+
error.request_id.should == "id123"
|
416
|
+
}
|
409
417
|
end
|
410
418
|
end
|
411
419
|
|
@@ -413,6 +421,7 @@ describe Shelly::Client do
|
|
413
421
|
JSON.should_receive(:parse).with("").and_raise(JSON::ParserError)
|
414
422
|
@response.stub(:code).and_return("204")
|
415
423
|
@response.stub(:body).and_return("")
|
424
|
+
@response.stub(:headers).and_return({})
|
416
425
|
@client.post("/api/apps/flower").should == {}
|
417
426
|
end
|
418
427
|
end
|
metadata
CHANGED
@@ -1,220 +1,264 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: shelly
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.2
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 1
|
9
|
-
- 1
|
10
|
-
version: 0.1.1
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Shelly Cloud team
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
12
|
+
date: 2012-05-07 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rspec
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
22
17
|
none: false
|
23
|
-
requirements:
|
18
|
+
requirements:
|
24
19
|
- - ~>
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
hash: 47
|
27
|
-
segments:
|
28
|
-
- 2
|
29
|
-
- 8
|
30
|
-
- 0
|
20
|
+
- !ruby/object:Gem::Version
|
31
21
|
version: 2.8.0
|
32
|
-
requirement: *id001
|
33
|
-
prerelease: false
|
34
22
|
type: :development
|
35
|
-
name: rspec
|
36
|
-
- !ruby/object:Gem::Dependency
|
37
|
-
version_requirements: &id002 !ruby/object:Gem::Requirement
|
38
|
-
none: false
|
39
|
-
requirements:
|
40
|
-
- - ">="
|
41
|
-
- !ruby/object:Gem::Version
|
42
|
-
hash: 3
|
43
|
-
segments:
|
44
|
-
- 0
|
45
|
-
version: "0"
|
46
|
-
requirement: *id002
|
47
23
|
prerelease: false
|
48
|
-
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 2.8.0
|
30
|
+
- !ruby/object:Gem::Dependency
|
49
31
|
name: rake
|
50
|
-
|
51
|
-
version_requirements: &id003 !ruby/object:Gem::Requirement
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
52
33
|
none: false
|
53
|
-
requirements:
|
54
|
-
- -
|
55
|
-
- !ruby/object:Gem::Version
|
56
|
-
|
57
|
-
segments:
|
58
|
-
- 0
|
59
|
-
version: "0"
|
60
|
-
requirement: *id003
|
61
|
-
prerelease: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
62
38
|
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
63
47
|
name: guard
|
64
|
-
|
65
|
-
version_requirements: &id004 !ruby/object:Gem::Requirement
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
66
49
|
none: false
|
67
|
-
requirements:
|
68
|
-
- -
|
69
|
-
- !ruby/object:Gem::Version
|
70
|
-
|
71
|
-
segments:
|
72
|
-
- 0
|
73
|
-
version: "0"
|
74
|
-
requirement: *id004
|
75
|
-
prerelease: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
76
54
|
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
77
63
|
name: guard-rspec
|
78
|
-
|
79
|
-
version_requirements: &id005 !ruby/object:Gem::Requirement
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
80
65
|
none: false
|
81
|
-
requirements:
|
82
|
-
- -
|
83
|
-
- !ruby/object:Gem::Version
|
84
|
-
|
85
|
-
segments:
|
86
|
-
- 0
|
87
|
-
version: "0"
|
88
|
-
requirement: *id005
|
89
|
-
prerelease: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
90
70
|
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
91
79
|
name: simplecov
|
92
|
-
|
93
|
-
version_requirements: &id006 !ruby/object:Gem::Requirement
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
94
81
|
none: false
|
95
|
-
requirements:
|
96
|
-
- -
|
97
|
-
- !ruby/object:Gem::Version
|
98
|
-
|
99
|
-
|
100
|
-
- 0
|
101
|
-
version: "0"
|
102
|
-
requirement: *id006
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :development
|
103
87
|
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: ruby_gntp
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
104
102
|
type: :development
|
105
|
-
|
106
|
-
|
107
|
-
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: rb-fsevent
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
108
113
|
none: false
|
109
|
-
requirements:
|
110
|
-
- -
|
111
|
-
- !ruby/object:Gem::Version
|
112
|
-
|
113
|
-
|
114
|
-
- 0
|
115
|
-
version: "0"
|
116
|
-
requirement: *id007
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
117
119
|
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ! '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: fakefs
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
130
|
+
requirements:
|
131
|
+
- - ! '>='
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: '0'
|
118
134
|
type: :development
|
135
|
+
prerelease: false
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ! '>='
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: '0'
|
142
|
+
- !ruby/object:Gem::Dependency
|
119
143
|
name: fakeweb
|
120
|
-
|
121
|
-
version_requirements: &id008 !ruby/object:Gem::Requirement
|
144
|
+
requirement: !ruby/object:Gem::Requirement
|
122
145
|
none: false
|
123
|
-
requirements:
|
124
|
-
- -
|
125
|
-
- !ruby/object:Gem::Version
|
126
|
-
|
127
|
-
|
128
|
-
- 0
|
129
|
-
- 14
|
130
|
-
- 7
|
131
|
-
version: 0.14.7
|
132
|
-
requirement: *id008
|
146
|
+
requirements:
|
147
|
+
- - ! '>='
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: '0'
|
150
|
+
type: :development
|
133
151
|
prerelease: false
|
134
|
-
|
152
|
+
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
154
|
+
requirements:
|
155
|
+
- - ! '>='
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: '0'
|
158
|
+
- !ruby/object:Gem::Dependency
|
135
159
|
name: wijet-thor
|
136
|
-
|
137
|
-
version_requirements: &id009 !ruby/object:Gem::Requirement
|
160
|
+
requirement: !ruby/object:Gem::Requirement
|
138
161
|
none: false
|
139
|
-
requirements:
|
140
|
-
- -
|
141
|
-
- !ruby/object:Gem::Version
|
142
|
-
|
143
|
-
segments:
|
144
|
-
- 0
|
145
|
-
version: "0"
|
146
|
-
requirement: *id009
|
147
|
-
prerelease: false
|
162
|
+
requirements:
|
163
|
+
- - ~>
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
version: 0.14.7
|
148
166
|
type: :runtime
|
167
|
+
prerelease: false
|
168
|
+
version_requirements: !ruby/object:Gem::Requirement
|
169
|
+
none: false
|
170
|
+
requirements:
|
171
|
+
- - ~>
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: 0.14.7
|
174
|
+
- !ruby/object:Gem::Dependency
|
149
175
|
name: rest-client
|
150
|
-
|
151
|
-
version_requirements: &id010 !ruby/object:Gem::Requirement
|
176
|
+
requirement: !ruby/object:Gem::Requirement
|
152
177
|
none: false
|
153
|
-
requirements:
|
154
|
-
- -
|
155
|
-
- !ruby/object:Gem::Version
|
156
|
-
|
157
|
-
segments:
|
158
|
-
- 0
|
159
|
-
version: "0"
|
160
|
-
requirement: *id010
|
161
|
-
prerelease: false
|
178
|
+
requirements:
|
179
|
+
- - ! '>='
|
180
|
+
- !ruby/object:Gem::Version
|
181
|
+
version: '0'
|
162
182
|
type: :runtime
|
183
|
+
prerelease: false
|
184
|
+
version_requirements: !ruby/object:Gem::Requirement
|
185
|
+
none: false
|
186
|
+
requirements:
|
187
|
+
- - ! '>='
|
188
|
+
- !ruby/object:Gem::Version
|
189
|
+
version: '0'
|
190
|
+
- !ruby/object:Gem::Dependency
|
163
191
|
name: json
|
164
|
-
|
165
|
-
version_requirements: &id011 !ruby/object:Gem::Requirement
|
192
|
+
requirement: !ruby/object:Gem::Requirement
|
166
193
|
none: false
|
167
|
-
requirements:
|
168
|
-
- -
|
169
|
-
- !ruby/object:Gem::Version
|
170
|
-
|
171
|
-
segments:
|
172
|
-
- 0
|
173
|
-
version: "0"
|
174
|
-
requirement: *id011
|
175
|
-
prerelease: false
|
194
|
+
requirements:
|
195
|
+
- - ! '>='
|
196
|
+
- !ruby/object:Gem::Version
|
197
|
+
version: '0'
|
176
198
|
type: :runtime
|
199
|
+
prerelease: false
|
200
|
+
version_requirements: !ruby/object:Gem::Requirement
|
201
|
+
none: false
|
202
|
+
requirements:
|
203
|
+
- - ! '>='
|
204
|
+
- !ruby/object:Gem::Version
|
205
|
+
version: '0'
|
206
|
+
- !ruby/object:Gem::Dependency
|
177
207
|
name: progressbar
|
178
|
-
|
179
|
-
version_requirements: &id012 !ruby/object:Gem::Requirement
|
208
|
+
requirement: !ruby/object:Gem::Requirement
|
180
209
|
none: false
|
181
|
-
requirements:
|
182
|
-
- -
|
183
|
-
- !ruby/object:Gem::Version
|
184
|
-
|
185
|
-
segments:
|
186
|
-
- 0
|
187
|
-
version: "0"
|
188
|
-
requirement: *id012
|
189
|
-
prerelease: false
|
210
|
+
requirements:
|
211
|
+
- - ! '>='
|
212
|
+
- !ruby/object:Gem::Version
|
213
|
+
version: '0'
|
190
214
|
type: :runtime
|
215
|
+
prerelease: false
|
216
|
+
version_requirements: !ruby/object:Gem::Requirement
|
217
|
+
none: false
|
218
|
+
requirements:
|
219
|
+
- - ! '>='
|
220
|
+
- !ruby/object:Gem::Version
|
221
|
+
version: '0'
|
222
|
+
- !ruby/object:Gem::Dependency
|
191
223
|
name: launchy
|
192
|
-
|
193
|
-
|
224
|
+
requirement: !ruby/object:Gem::Requirement
|
225
|
+
none: false
|
226
|
+
requirements:
|
227
|
+
- - ! '>='
|
228
|
+
- !ruby/object:Gem::Version
|
229
|
+
version: '0'
|
230
|
+
type: :runtime
|
231
|
+
prerelease: false
|
232
|
+
version_requirements: !ruby/object:Gem::Requirement
|
233
|
+
none: false
|
234
|
+
requirements:
|
235
|
+
- - ! '>='
|
236
|
+
- !ruby/object:Gem::Version
|
237
|
+
version: '0'
|
238
|
+
- !ruby/object:Gem::Dependency
|
239
|
+
name: shelly-dependencies
|
240
|
+
requirement: !ruby/object:Gem::Requirement
|
194
241
|
none: false
|
195
|
-
requirements:
|
242
|
+
requirements:
|
196
243
|
- - ~>
|
197
|
-
- !ruby/object:Gem::Version
|
198
|
-
hash: 25
|
199
|
-
segments:
|
200
|
-
- 0
|
201
|
-
- 1
|
202
|
-
- 1
|
244
|
+
- !ruby/object:Gem::Version
|
203
245
|
version: 0.1.1
|
204
|
-
requirement: *id013
|
205
|
-
prerelease: false
|
206
246
|
type: :runtime
|
207
|
-
|
247
|
+
prerelease: false
|
248
|
+
version_requirements: !ruby/object:Gem::Requirement
|
249
|
+
none: false
|
250
|
+
requirements:
|
251
|
+
- - ~>
|
252
|
+
- !ruby/object:Gem::Version
|
253
|
+
version: 0.1.1
|
208
254
|
description: Tool for managing applications and clouds at shellycloud.com
|
209
|
-
email:
|
255
|
+
email:
|
210
256
|
- support@shellycloud.com
|
211
|
-
executables:
|
257
|
+
executables:
|
212
258
|
- shelly
|
213
259
|
extensions: []
|
214
|
-
|
215
260
|
extra_rdoc_files: []
|
216
|
-
|
217
|
-
files:
|
261
|
+
files:
|
218
262
|
- .gitignore
|
219
263
|
- .travis.yml
|
220
264
|
- Gemfile
|
@@ -267,36 +311,49 @@ files:
|
|
267
311
|
- spec/thor/options_spec.rb
|
268
312
|
homepage: http://shellycloud.com
|
269
313
|
licenses: []
|
270
|
-
|
271
314
|
post_install_message:
|
272
315
|
rdoc_options: []
|
273
|
-
|
274
|
-
require_paths:
|
316
|
+
require_paths:
|
275
317
|
- lib
|
276
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
318
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
277
319
|
none: false
|
278
|
-
requirements:
|
279
|
-
- -
|
280
|
-
- !ruby/object:Gem::Version
|
281
|
-
|
282
|
-
segments:
|
320
|
+
requirements:
|
321
|
+
- - ! '>='
|
322
|
+
- !ruby/object:Gem::Version
|
323
|
+
version: '0'
|
324
|
+
segments:
|
283
325
|
- 0
|
284
|
-
|
285
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
326
|
+
hash: 2099971699647784941
|
327
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
286
328
|
none: false
|
287
|
-
requirements:
|
288
|
-
- -
|
289
|
-
- !ruby/object:Gem::Version
|
290
|
-
|
291
|
-
segments:
|
329
|
+
requirements:
|
330
|
+
- - ! '>='
|
331
|
+
- !ruby/object:Gem::Version
|
332
|
+
version: '0'
|
333
|
+
segments:
|
292
334
|
- 0
|
293
|
-
|
335
|
+
hash: 2099971699647784941
|
294
336
|
requirements: []
|
295
|
-
|
296
337
|
rubyforge_project: shelly
|
297
|
-
rubygems_version: 1.8.
|
338
|
+
rubygems_version: 1.8.24
|
298
339
|
signing_key:
|
299
340
|
specification_version: 3
|
300
341
|
summary: Shelly Cloud command line tool
|
301
|
-
test_files:
|
302
|
-
|
342
|
+
test_files:
|
343
|
+
- spec/helpers.rb
|
344
|
+
- spec/input_faker.rb
|
345
|
+
- spec/shelly/app_spec.rb
|
346
|
+
- spec/shelly/backup_spec.rb
|
347
|
+
- spec/shelly/cli/backup_spec.rb
|
348
|
+
- spec/shelly/cli/config_spec.rb
|
349
|
+
- spec/shelly/cli/deploys_spec.rb
|
350
|
+
- spec/shelly/cli/main_spec.rb
|
351
|
+
- spec/shelly/cli/runner_spec.rb
|
352
|
+
- spec/shelly/cli/user_spec.rb
|
353
|
+
- spec/shelly/client_spec.rb
|
354
|
+
- spec/shelly/cloudfile_spec.rb
|
355
|
+
- spec/shelly/download_progress_bar_spec.rb
|
356
|
+
- spec/shelly/model_spec.rb
|
357
|
+
- spec/shelly/user_spec.rb
|
358
|
+
- spec/spec_helper.rb
|
359
|
+
- spec/thor/options_spec.rb
|