shelly 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
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
- shelly.console(code_name)
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
@@ -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
- console = app.console
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
@@ -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 console(code_name)
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
@@ -95,7 +95,7 @@ module Shelly
95
95
  unless Cloudfile.present? || cloud
96
96
  say_error "You have to specify cloud.", :with_exit => false
97
97
  say "Select cloud using `shelly #{action} --cloud CLOUD_NAME`"
98
- invoke :list
98
+ Shelly::CLI::Main.new.list
99
99
  exit 1
100
100
  end
101
101
 
@@ -1,3 +1,3 @@
1
1
  module Shelly
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
@@ -406,10 +406,28 @@ config
406
406
  end
407
407
  end
408
408
 
409
- describe "#console" do
409
+ describe "#node_and_console" do
410
410
  it "should fetch instance data from Api" do
411
- @client.should_receive(:console).with("foo-staging")
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(:console).and_return(expected)
1342
- @main.should_receive(:exec).with("ssh -o StrictHostKeyChecking=no -p 40010 -l foo-production 10.0.0.10")
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(:console).and_raise(exception)
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(:console).and_raise(Shelly::Client::APIException)
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("Unknown error, to see debug information run command with --debug")
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)
@@ -199,12 +199,12 @@ describe Shelly::Client do
199
199
  end
200
200
  end
201
201
 
202
- describe "#console" do
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.console("staging-foo")
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(Shelly::Client::APIException)
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
- hash: 25
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
- date: 2012-04-24 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
21
- version_requirements: &id001 !ruby/object:Gem::Requirement
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
- type: :development
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
- - !ruby/object:Gem::Dependency
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
- hash: 3
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
- - !ruby/object:Gem::Dependency
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
- hash: 3
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
- - !ruby/object:Gem::Dependency
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
- hash: 3
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
- - !ruby/object:Gem::Dependency
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
- hash: 3
99
- segments:
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
- name: fakefs
106
- - !ruby/object:Gem::Dependency
107
- version_requirements: &id007 !ruby/object:Gem::Requirement
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
- hash: 3
113
- segments:
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
- - !ruby/object:Gem::Dependency
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
- hash: 41
127
- segments:
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
- type: :runtime
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
- - !ruby/object:Gem::Dependency
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
- hash: 3
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
- - !ruby/object:Gem::Dependency
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
- hash: 3
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
- - !ruby/object:Gem::Dependency
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
- hash: 3
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
- - !ruby/object:Gem::Dependency
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
- hash: 3
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
- - !ruby/object:Gem::Dependency
193
- version_requirements: &id013 !ruby/object:Gem::Requirement
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
- name: shelly-dependencies
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
- hash: 3
282
- segments:
320
+ requirements:
321
+ - - ! '>='
322
+ - !ruby/object:Gem::Version
323
+ version: '0'
324
+ segments:
283
325
  - 0
284
- version: "0"
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
- hash: 3
291
- segments:
329
+ requirements:
330
+ - - ! '>='
331
+ - !ruby/object:Gem::Version
332
+ version: '0'
333
+ segments:
292
334
  - 0
293
- version: "0"
335
+ hash: 2099971699647784941
294
336
  requirements: []
295
-
296
337
  rubyforge_project: shelly
297
- rubygems_version: 1.8.10
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