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 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