shelly 0.4.6 → 0.4.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,15 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 9806b19fb3c19741be321f7b85b0b5907d6b397c
4
- data.tar.gz: 60dc5f079fc9aa5d658232e1b5af5eb8a2cba919
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ YzFmYmZhM2Q2ZjBhZWVkNDY3ZmJkNzNlZTllYjVkNTVhNzU4ZWQ2Yg==
5
+ data.tar.gz: !binary |-
6
+ ZjNlZjI3YTI2OTEyNGNhNzVhYWFjM2ZmNzc5YjY4MTVmMjI0MTg3NA==
5
7
  SHA512:
6
- metadata.gz: 44b83e991d63f0b091d12c392c605170c80bb370f166e827c9d2605a35ba004ddc8dc94ff85862d021410608e51d6cbe5719ed5c66679835c4f7f5b7518db1c8
7
- data.tar.gz: c7192c598ec6e85faafb4a7981c4d4c685f742f24738793ab7b528ed63730522af4fe150295ba16f5da13f1fdc1b6408b5c4fd942965a1368631c82b574f2bd1
8
+ metadata.gz: !binary |-
9
+ ZTJlNThiMDRhNDg2YzQ0Y2QxNDY2NjdjNmFlZTQ5MGI3Yjg2MGZjYzE5NTUz
10
+ NTBmYjQyZTc2Yzg0YzIxMDMzZjU5NjY4ODE3MGRiNjE3NWU2ODhjZWVlNTg4
11
+ YmZiODRjZWExOWYwYmMwNDlkNzMwOWVmMDQyZTI2OThiY2IzMjQ=
12
+ data.tar.gz: !binary |-
13
+ YjNkYmI1ODQwNTVmN2I3ZjlmNDVhZTYzNWQyNTBiZWFmYWUxZjI1NTg4YWJk
14
+ ZDQ5MjUxOTA2MTdkM2Q4MmI3ZGIwNGFmZmI4NTlmZjlmOTI4NTA4Mjc2NzJl
15
+ YTU4MDlkNjUyN2JkMTUyOWE0MjcwZTNjZjZmMTQ2MmUzNWJhNmQ=
@@ -1,3 +1,7 @@
1
+ ## 0.4.7 / 2013-10-18
2
+
3
+ * [feature] Mange SSL certificate with `shelly cert`
4
+
1
5
  ## 0.4.6 / 2013-10-01
2
6
 
3
7
  * [bugfix] `shelly delete` removes proper git remote.
@@ -200,6 +200,18 @@ module Shelly
200
200
  configs.any? { |config| config["path"] == path }
201
201
  end
202
202
 
203
+ def cert
204
+ shelly.cert(code_name)
205
+ end
206
+
207
+ def create_cert(content, key)
208
+ shelly.create_cert(code_name, content, key)
209
+ end
210
+
211
+ def update_cert(content, key)
212
+ shelly.update_cert(code_name, content, key)
213
+ end
214
+
203
215
  def rake(task)
204
216
  ssh(:command => "rake_runner \"#{task}\"")
205
217
  end
@@ -0,0 +1,99 @@
1
+ require "shelly/cli/command"
2
+
3
+ module Shelly
4
+ module CLI
5
+ class Cert < Command
6
+ namespace :cert
7
+ include Helpers
8
+
9
+ before_hook :logged_in?, :only => [:show, :create, :update]
10
+
11
+ class_option :cloud, :type => :string, :aliases => "-c", :desc => "Specify cloud"
12
+
13
+ desc "show", "Show current certificate information"
14
+ def show
15
+ app = multiple_clouds(options[:cloud], "backup list")
16
+
17
+ cert = app.cert
18
+ say "Issuer: #{cert['info']['issuer']}"
19
+ say "Subject: #{cert['info']['subject']}"
20
+ say "Not valid before: #{Time.parse(cert['info']['since']).
21
+ getlocal.strftime("%Y-%m-%d %H:%M:%S")}"
22
+ say "Expires: #{Time.parse(cert['info']['to']).
23
+ getlocal.strftime("%Y-%m-%d %H:%M:%S")}"
24
+ rescue Client::NotFoundException => e
25
+ raise unless e.resource == :certificate
26
+ say_error "Certificate not found"
27
+ end
28
+
29
+ desc "create CERT_PATH [BUNDLE_PATH] KEY_PATH", "Add certificate to your cloud"
30
+ long_desc %{
31
+ Add certificate to your cloud.\n
32
+ CERT_PATH - path to certificate.\n
33
+ BUNDLE_PATH - optional path to certificate bundle path.\n
34
+ KEY_PATH - path to private key.
35
+ }
36
+ def create(cert_path, bundle_path = nil, key_path)
37
+ app = multiple_clouds(options[:cloud], "cert create CERT_PATH [BUNDLE_PATH] KEY_PATH")
38
+
39
+ content = ::File.read(cert_path).strip
40
+ bundle = bundle_path ? ::File.read(bundle_path).strip : ""
41
+ key = ::File.read(key_path).strip
42
+
43
+ content = content + "\n" + bundle
44
+ cert = app.create_cert(content, key)
45
+
46
+ say "Certificate was added to your cloud", :green
47
+ if cert['ip_address']
48
+ say "Deploying certificate on front end."
49
+ say "Point your domain to private IP address: #{cert['ip_address']}"
50
+ else
51
+ say "SSL requires certificate and private IP address."
52
+ say "Private IP address was requested for your cloud."
53
+ say "Support has been notified and will contact you shortly."
54
+ end
55
+ rescue Client::ValidationException => e
56
+ e.each_error { |error| say_error error, :with_exit => false }
57
+ exit 1
58
+ rescue Client::ConflictException => e
59
+ say_error e[:message]
60
+ end
61
+
62
+ desc "update CERT_PATH [BUNDLE_PATH] key", "Update current certificate"
63
+ long_desc %{
64
+ Update current certificate.\n
65
+ CERT_PATH - path to certificate.\n
66
+ BUNDLE_PATH - optional path to certificate bundle path.\n
67
+ KEY_PATH - path to private key.
68
+ }
69
+ def update(cert_path, bundle_path = nil, key_path)
70
+ app = multiple_clouds(options[:cloud], "cert update CERT_PATH [BUNDLE_PATH] KEY_PATH")
71
+
72
+ content = ::File.read(cert_path).strip
73
+ bundle = bundle_path ? ::File.read(bundle_path).strip : ""
74
+ key = ::File.read(key_path).strip
75
+
76
+ content = content + "\n" + bundle
77
+ cert = app.update_cert(content, key)
78
+
79
+ say "Certificate was updated", :green
80
+ if cert['ip_address']
81
+ say "Deploying certificate on front end."
82
+ say "Point your domain to private IP address: #{cert['ip_address']}"
83
+ else
84
+ say "SSL requires certificate and private IP address."
85
+ say "Private IP address was requested for your cloud."
86
+ say "Support has been notified and will contact you shortly."
87
+ end
88
+ rescue Client::ValidationException => e
89
+ e.each_error { |error| say_error error, :with_exit => false }
90
+ exit 1
91
+ rescue Client::NotFoundException => e
92
+ raise unless e.resource == :certificate
93
+ say_error "Certificate not found"
94
+ rescue Client::ConflictException => e
95
+ say_error e[:message]
96
+ end
97
+ end
98
+ end
99
+ end
@@ -7,6 +7,7 @@ require "shelly/cli/config"
7
7
  require "shelly/cli/file"
8
8
  require "shelly/cli/organization"
9
9
  require "shelly/cli/logs"
10
+ require "shelly/cli/cert"
10
11
 
11
12
  require "shelly/cli/main/add"
12
13
  require "shelly/cli/main/check"
@@ -21,7 +22,8 @@ module Shelly
21
22
  register_subcommand(Config, "config", "config <command>", "Manage application configuration files")
22
23
  register_subcommand(File, "file", "file <command>", "Upload and download files to and from persistent storage")
23
24
  register_subcommand(Organization, "organization", "organization <command>", "View organizations")
24
- register_subcommand(Logs, "logs", "logs <command>", "View application logs")
25
+ register_subcommand(Logs, "log", "logs <command>", "View application logs")
26
+ register_subcommand(Cert, "cert", "cert <command>", "Mange application certificates")
25
27
 
26
28
  check_unknown_options!(:except => :rake)
27
29
 
@@ -18,6 +18,7 @@ module Shelly
18
18
  require 'shelly/client/ssh_keys'
19
19
  require 'shelly/client/organizations'
20
20
  require 'shelly/client/auth'
21
+ require 'shelly/client/cert'
21
22
 
22
23
  def api_url
23
24
  ENV["SHELLY_URL"] || "https://api.shellycloud.com/apiv2"
@@ -0,0 +1,13 @@
1
+ class Shelly::Client
2
+ def cert(cloud)
3
+ get("/apps/#{cloud}/cert")
4
+ end
5
+
6
+ def create_cert(cloud, content, key)
7
+ post("/apps/#{cloud}/cert", :cert => {:content => content, :key => key})
8
+ end
9
+
10
+ def update_cert(cloud, content, key)
11
+ put("/apps/#{cloud}/cert", :cert => {:content => content, :key => key})
12
+ end
13
+ end
@@ -1,3 +1,3 @@
1
1
  module Shelly
2
- VERSION = "0.4.6"
2
+ VERSION = "0.4.7"
3
3
  end
@@ -472,6 +472,23 @@ describe Shelly::App do
472
472
  end
473
473
  end
474
474
 
475
+ context "certificate" do
476
+ it "#show_cert should query api" do
477
+ @client.should_receive(:cert).with(@app.code_name)
478
+ @app.cert
479
+ end
480
+
481
+ it "#create_cert should query api" do
482
+ @client.should_receive(:create_cert).with(@app.code_name, 'crt', 'key')
483
+ @app.create_cert("crt", "key")
484
+ end
485
+
486
+ it "#update_cert should query api" do
487
+ @client.should_receive(:update_cert).with(@app.code_name, 'crt', 'key')
488
+ @app.update_cert("crt", "key")
489
+ end
490
+ end
491
+
475
492
  describe "#create_cloudfile" do
476
493
  before do
477
494
  @app.environment = "production"
@@ -0,0 +1,161 @@
1
+ require "spec_helper"
2
+ require "shelly/cli/cert"
3
+
4
+ describe Shelly::CLI::Cert do
5
+ before do
6
+ FileUtils.stub(:chmod)
7
+ @cli = Shelly::CLI::Cert.new
8
+ Shelly::CLI::Cert.stub(:new).and_return(@cli)
9
+ @client = mock
10
+ Shelly::Client.stub(:new).and_return(@client)
11
+ @client.stub(:authorize!)
12
+ FileUtils.mkdir_p("/projects/foo")
13
+ Dir.chdir("/projects/foo")
14
+ @app = Shelly::App.new("foo-production")
15
+ Shelly::App.stub(:new).and_return(@app)
16
+ File.open("Cloudfile", 'w') { |f| f.write("foo-production:\n") }
17
+ end
18
+
19
+ describe "#show" do
20
+ it "should description" do
21
+ @app.should_receive(:cert).and_return(cert_response)
22
+ $stdout.should_receive(:puts).with("Issuer: Some issuer")
23
+ $stdout.should_receive(:puts).with("Subject: Some subject")
24
+ $stdout.should_receive(:puts).with("Not valid before:"\
25
+ " #{Time.parse(cert_response['info']['since']).getlocal.strftime("%Y-%m-%d %H:%M:%S")}")
26
+ $stdout.should_receive(:puts).with("Expires:"\
27
+ " #{Time.parse(cert_response['info']['to']).getlocal.strftime("%Y-%m-%d %H:%M:%S")}")
28
+ invoke(@cli, :show)
29
+ end
30
+
31
+ context "certificate not found" do
32
+ it "should exit" do
33
+ exception = Shelly::Client::NotFoundException.new("resource" => "certificate")
34
+ @app.should_receive(:cert).and_raise(exception)
35
+ $stdout.should_receive(:puts).with(red "Certificate not found")
36
+ lambda {
37
+ invoke(@cli, :show)
38
+ }.should raise_error(SystemExit)
39
+ end
40
+ end
41
+ end
42
+
43
+ describe "#create" do
44
+ before do
45
+ File.stub(:read).with('crt_path').and_return('crt')
46
+ File.stub(:read).with('key_path').and_return('key')
47
+ File.stub(:read).with('bundle_path').and_return('bundle')
48
+ end
49
+
50
+ it "should create certificate" do
51
+ @app.should_receive(:create_cert).with("crt\nbundle", "key").
52
+ and_return(cert_response)
53
+ $stdout.should_receive(:puts).with(green "Certificate was added to your cloud")
54
+ $stdout.should_receive(:puts).with("Deploying certificate on front end.")
55
+ $stdout.should_receive(:puts).with("Point your domain to private IP address: 10.0.0.1")
56
+
57
+ invoke(@cli, :create, "crt_path", "bundle_path", "key_path")
58
+ end
59
+
60
+ it "should create certificate without bundle" do
61
+ @app.should_receive(:create_cert).with("crt\n", "key").
62
+ and_return(cert_response('ip_address' => nil))
63
+
64
+ $stdout.should_receive(:puts).with(green "Certificate was added to your cloud")
65
+ $stdout.should_receive(:puts).with("SSL requires certificate and private IP address.")
66
+ $stdout.should_receive(:puts).with("Private IP address was requested for your cloud.")
67
+ $stdout.should_receive(:puts).with("Support has been notified and will contact you shortly.")
68
+
69
+ invoke(@cli, :create, "crt_path", "key_path")
70
+ end
71
+
72
+ context "validation errors" do
73
+ it "should show errors and exit" do
74
+ exception = Shelly::Client::ValidationException.new({"errors" => [["key", "is invalid"]]})
75
+ @app.should_receive(:create_cert).and_raise(exception)
76
+ $stdout.should_receive(:puts).with(red "Key is invalid")
77
+
78
+ lambda {
79
+ invoke(@cli, :create, "crt_path", "bundle_path", "key_path")
80
+ }.should raise_error(SystemExit)
81
+ end
82
+ end
83
+
84
+ context "deployment conflict" do
85
+ it "should show errors and exit" do
86
+ exception = Shelly::Client::ConflictException.new({"message" => "Deployment is in progress"})
87
+ @app.should_receive(:create_cert).and_raise(exception)
88
+ $stdout.should_receive(:puts).with(red "Deployment is in progress")
89
+
90
+ lambda {
91
+ invoke(@cli, :create, "crt_path", "bundle_path", "key_path")
92
+ }.should raise_error(SystemExit)
93
+ end
94
+ end
95
+ end
96
+
97
+ describe "#update" do
98
+ before do
99
+ File.stub(:read).with('crt_path').and_return('crt')
100
+ File.stub(:read).with('key_path').and_return('key')
101
+ File.stub(:read).with('bundle_path').and_return('bundle')
102
+ end
103
+
104
+ it "should create certificate" do
105
+ @app.should_receive(:update_cert).with("crt\nbundle", "key").
106
+ and_return(cert_response)
107
+ $stdout.should_receive(:puts).with(green "Certificate was updated")
108
+ $stdout.should_receive(:puts).with("Deploying certificate on front end.")
109
+ $stdout.should_receive(:puts).with("Point your domain to private IP address: 10.0.0.1")
110
+
111
+ invoke(@cli, :update, "crt_path", "bundle_path", "key_path")
112
+ end
113
+
114
+ it "should create certificate without bundle" do
115
+ @app.should_receive(:update_cert).with("crt\n", "key").
116
+ and_return(cert_response('ip_address' => nil))
117
+
118
+ $stdout.should_receive(:puts).with(green "Certificate was updated")
119
+ $stdout.should_receive(:puts).with("SSL requires certificate and private IP address.")
120
+ $stdout.should_receive(:puts).with("Private IP address was requested for your cloud.")
121
+ $stdout.should_receive(:puts).with("Support has been notified and will contact you shortly.")
122
+
123
+ invoke(@cli, :update, "crt_path", "key_path")
124
+ end
125
+
126
+ context "validation errors" do
127
+ it "should show errors and exit" do
128
+ exception = Shelly::Client::ValidationException.new({"errors" => [["key", "is invalid"]]})
129
+ @app.should_receive(:update_cert).and_raise(exception)
130
+ $stdout.should_receive(:puts).with(red "Key is invalid")
131
+
132
+ lambda {
133
+ invoke(@cli, :update, "crt_path", "bundle_path", "key_path")
134
+ }.should raise_error(SystemExit)
135
+ end
136
+ end
137
+
138
+ context "deployment conflict" do
139
+ it "should show errors and exit" do
140
+ exception = Shelly::Client::ConflictException.new({"message" => "Deployment is in progress"})
141
+ @app.should_receive(:update_cert).and_raise(exception)
142
+ $stdout.should_receive(:puts).with(red "Deployment is in progress")
143
+
144
+ lambda {
145
+ invoke(@cli, :update, "crt_path", "bundle_path", "key_path")
146
+ }.should raise_error(SystemExit)
147
+ end
148
+ end
149
+ end
150
+
151
+ def cert_response(options = {})
152
+ {
153
+ 'info' => {
154
+ 'issuer' => 'Some issuer',
155
+ 'subject' => 'Some subject',
156
+ 'since' => '2012-06-11 23:00:00 UTC',
157
+ 'to' => '2013-06-11 11:00:00 UTC'},
158
+ 'ip_address' => '10.0.0.1'
159
+ }.merge(options)
160
+ end
161
+ end
@@ -393,6 +393,25 @@ describe Shelly::Client do
393
393
  end
394
394
  end
395
395
 
396
+ context "certificate" do
397
+ it "#cert should perform a get request" do
398
+ @client.should_receive(:get).with("/apps/staging-foo/cert")
399
+ @client.cert("staging-foo")
400
+ end
401
+
402
+ it "#create_cert should perform a post request" do
403
+ @client.should_receive(:post).with("/apps/staging-foo/cert",
404
+ :cert => {:content => 'crt', :key => 'key'})
405
+ @client.create_cert("staging-foo", "crt", "key")
406
+ end
407
+
408
+ it "#update_cert should perform a put request" do
409
+ @client.should_receive(:put).with("/apps/staging-foo/cert",
410
+ :cert => {:content => 'crt', :key => 'key'})
411
+ @client.update_cert("staging-foo", "crt", "key")
412
+ end
413
+ end
414
+
396
415
  describe "#request_parameters" do
397
416
  it "should return hash of resquest parameters" do
398
417
  expected = {
metadata CHANGED
@@ -1,195 +1,223 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shelly
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.6
4
+ version: 0.4.7
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-10-01 00:00:00.000000000 Z
11
+ date: 2013-10-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
+ type: :development
15
+ prerelease: false
14
16
  name: rspec
15
- requirement: !ruby/object:Gem::Requirement
17
+ version_requirements: !ruby/object:Gem::Requirement
16
18
  requirements:
17
19
  - - ~>
18
20
  - !ruby/object:Gem::Version
19
21
  version: 2.11.0
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
22
+ requirement: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ~>
25
25
  - !ruby/object:Gem::Version
26
26
  version: 2.11.0
27
27
  - !ruby/object:Gem::Dependency
28
+ type: :development
29
+ prerelease: false
28
30
  name: rake
31
+ version_requirements: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - ! '>='
34
+ - !ruby/object:Gem::Version
35
+ version: '0'
29
36
  requirement: !ruby/object:Gem::Requirement
30
37
  requirements:
31
- - - '>='
38
+ - - ! '>='
32
39
  - !ruby/object:Gem::Version
33
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
34
42
  type: :development
35
43
  prerelease: false
44
+ name: guard
36
45
  version_requirements: !ruby/object:Gem::Requirement
37
46
  requirements:
38
- - - '>='
47
+ - - ! '>='
39
48
  - !ruby/object:Gem::Version
40
49
  version: '0'
41
- - !ruby/object:Gem::Dependency
42
- name: guard
43
50
  requirement: !ruby/object:Gem::Requirement
44
51
  requirements:
45
- - - '>='
52
+ - - ! '>='
46
53
  - !ruby/object:Gem::Version
47
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
48
56
  type: :development
49
57
  prerelease: false
58
+ name: guard-rspec
50
59
  version_requirements: !ruby/object:Gem::Requirement
51
60
  requirements:
52
- - - '>='
61
+ - - ! '>='
53
62
  - !ruby/object:Gem::Version
54
63
  version: '0'
55
- - !ruby/object:Gem::Dependency
56
- name: guard-rspec
57
64
  requirement: !ruby/object:Gem::Requirement
58
65
  requirements:
59
- - - '>='
66
+ - - ! '>='
60
67
  - !ruby/object:Gem::Version
61
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
62
70
  type: :development
63
71
  prerelease: false
72
+ name: simplecov
64
73
  version_requirements: !ruby/object:Gem::Requirement
65
74
  requirements:
66
- - - '>='
75
+ - - ! '>='
67
76
  - !ruby/object:Gem::Version
68
77
  version: '0'
69
- - !ruby/object:Gem::Dependency
70
- name: simplecov
71
78
  requirement: !ruby/object:Gem::Requirement
72
79
  requirements:
73
- - - '>='
80
+ - - ! '>='
74
81
  - !ruby/object:Gem::Version
75
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
76
84
  type: :development
77
85
  prerelease: false
86
+ name: ruby_gntp
78
87
  version_requirements: !ruby/object:Gem::Requirement
79
88
  requirements:
80
- - - '>='
89
+ - - ! '>='
81
90
  - !ruby/object:Gem::Version
82
91
  version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: fakefs
85
92
  requirement: !ruby/object:Gem::Requirement
86
93
  requirements:
87
- - - '>='
94
+ - - ! '>='
88
95
  - !ruby/object:Gem::Version
89
96
  version: '0'
97
+ - !ruby/object:Gem::Dependency
90
98
  type: :development
91
99
  prerelease: false
100
+ name: rb-fsevent
92
101
  version_requirements: !ruby/object:Gem::Requirement
93
102
  requirements:
94
- - - '>='
103
+ - - ! '>='
95
104
  - !ruby/object:Gem::Version
96
105
  version: '0'
97
- - !ruby/object:Gem::Dependency
98
- name: fakeweb
99
106
  requirement: !ruby/object:Gem::Requirement
100
107
  requirements:
101
- - - '>='
108
+ - - ! '>='
102
109
  - !ruby/object:Gem::Version
103
110
  version: '0'
111
+ - !ruby/object:Gem::Dependency
104
112
  type: :development
105
113
  prerelease: false
114
+ name: fakefs
106
115
  version_requirements: !ruby/object:Gem::Requirement
107
116
  requirements:
108
- - - '>='
117
+ - - ! '>='
118
+ - !ruby/object:Gem::Version
119
+ version: '0'
120
+ requirement: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ! '>='
109
123
  - !ruby/object:Gem::Version
110
124
  version: '0'
111
125
  - !ruby/object:Gem::Dependency
112
- name: wijet-thor
126
+ type: :development
127
+ prerelease: false
128
+ name: fakeweb
129
+ version_requirements: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - ! '>='
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
113
134
  requirement: !ruby/object:Gem::Requirement
114
135
  requirements:
115
- - - ~>
136
+ - - ! '>='
116
137
  - !ruby/object:Gem::Version
117
- version: 0.14.10
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
118
140
  type: :runtime
119
141
  prerelease: false
142
+ name: wijet-thor
120
143
  version_requirements: !ruby/object:Gem::Requirement
121
144
  requirements:
122
145
  - - ~>
123
146
  - !ruby/object:Gem::Version
124
147
  version: 0.14.10
125
- - !ruby/object:Gem::Dependency
126
- name: rest-client
127
148
  requirement: !ruby/object:Gem::Requirement
128
149
  requirements:
129
- - - '>='
150
+ - - ~>
130
151
  - !ruby/object:Gem::Version
131
- version: '0'
152
+ version: 0.14.10
153
+ - !ruby/object:Gem::Dependency
132
154
  type: :runtime
133
155
  prerelease: false
156
+ name: rest-client
134
157
  version_requirements: !ruby/object:Gem::Requirement
135
158
  requirements:
136
- - - '>='
159
+ - - ! '>='
137
160
  - !ruby/object:Gem::Version
138
161
  version: '0'
139
- - !ruby/object:Gem::Dependency
140
- name: json
141
162
  requirement: !ruby/object:Gem::Requirement
142
163
  requirements:
143
- - - '>='
164
+ - - ! '>='
144
165
  - !ruby/object:Gem::Version
145
166
  version: '0'
167
+ - !ruby/object:Gem::Dependency
146
168
  type: :runtime
147
169
  prerelease: false
170
+ name: json
148
171
  version_requirements: !ruby/object:Gem::Requirement
149
172
  requirements:
150
- - - '>='
173
+ - - ! '>='
151
174
  - !ruby/object:Gem::Version
152
175
  version: '0'
153
- - !ruby/object:Gem::Dependency
154
- name: progressbar
155
176
  requirement: !ruby/object:Gem::Requirement
156
177
  requirements:
157
- - - '>='
178
+ - - ! '>='
158
179
  - !ruby/object:Gem::Version
159
180
  version: '0'
181
+ - !ruby/object:Gem::Dependency
160
182
  type: :runtime
161
183
  prerelease: false
184
+ name: progressbar
162
185
  version_requirements: !ruby/object:Gem::Requirement
163
186
  requirements:
164
- - - '>='
187
+ - - ! '>='
165
188
  - !ruby/object:Gem::Version
166
189
  version: '0'
167
- - !ruby/object:Gem::Dependency
168
- name: launchy
169
190
  requirement: !ruby/object:Gem::Requirement
170
191
  requirements:
171
- - - '>='
192
+ - - ! '>='
172
193
  - !ruby/object:Gem::Version
173
194
  version: '0'
195
+ - !ruby/object:Gem::Dependency
174
196
  type: :runtime
175
197
  prerelease: false
198
+ name: launchy
176
199
  version_requirements: !ruby/object:Gem::Requirement
177
200
  requirements:
178
- - - '>='
201
+ - - ! '>='
179
202
  - !ruby/object:Gem::Version
180
203
  version: '0'
181
- - !ruby/object:Gem::Dependency
182
- name: netrc
183
204
  requirement: !ruby/object:Gem::Requirement
184
205
  requirements:
185
- - - '>='
206
+ - - ! '>='
186
207
  - !ruby/object:Gem::Version
187
208
  version: '0'
209
+ - !ruby/object:Gem::Dependency
188
210
  type: :runtime
189
211
  prerelease: false
212
+ name: netrc
190
213
  version_requirements: !ruby/object:Gem::Requirement
191
214
  requirements:
192
- - - '>='
215
+ - - ! '>='
216
+ - !ruby/object:Gem::Version
217
+ version: '0'
218
+ requirement: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - ! '>='
193
221
  - !ruby/object:Gem::Version
194
222
  version: '0'
195
223
  description: Tool for managing applications and clouds at shellycloud.com
@@ -216,6 +244,7 @@ files:
216
244
  - lib/shelly/app.rb
217
245
  - lib/shelly/backup.rb
218
246
  - lib/shelly/cli/backup.rb
247
+ - lib/shelly/cli/cert.rb
219
248
  - lib/shelly/cli/command.rb
220
249
  - lib/shelly/cli/config.rb
221
250
  - lib/shelly/cli/database.rb
@@ -232,6 +261,7 @@ files:
232
261
  - lib/shelly/client/application_logs.rb
233
262
  - lib/shelly/client/apps.rb
234
263
  - lib/shelly/client/auth.rb
264
+ - lib/shelly/client/cert.rb
235
265
  - lib/shelly/client/configs.rb
236
266
  - lib/shelly/client/database_backups.rb
237
267
  - lib/shelly/client/deployment_logs.rb
@@ -262,6 +292,7 @@ files:
262
292
  - spec/shelly/app_spec.rb
263
293
  - spec/shelly/backup_spec.rb
264
294
  - spec/shelly/cli/backup_spec.rb
295
+ - spec/shelly/cli/cert_spec.rb
265
296
  - spec/shelly/cli/config_spec.rb
266
297
  - spec/shelly/cli/database_spec.rb
267
298
  - spec/shelly/cli/deploy_spec.rb
@@ -290,18 +321,42 @@ require_paths:
290
321
  - lib
291
322
  required_ruby_version: !ruby/object:Gem::Requirement
292
323
  requirements:
293
- - - '>='
324
+ - - ! '>='
294
325
  - !ruby/object:Gem::Version
295
326
  version: '0'
296
327
  required_rubygems_version: !ruby/object:Gem::Requirement
297
328
  requirements:
298
- - - '>='
329
+ - - ! '>='
299
330
  - !ruby/object:Gem::Version
300
331
  version: '0'
301
332
  requirements: []
302
333
  rubyforge_project: shelly
303
- rubygems_version: 2.0.6
334
+ rubygems_version: 2.1.5
304
335
  signing_key:
305
336
  specification_version: 4
306
337
  summary: Shelly Cloud command line tool
307
- test_files: []
338
+ test_files:
339
+ - spec/helpers.rb
340
+ - spec/input_faker.rb
341
+ - spec/shelly/app_spec.rb
342
+ - spec/shelly/backup_spec.rb
343
+ - spec/shelly/cli/backup_spec.rb
344
+ - spec/shelly/cli/cert_spec.rb
345
+ - spec/shelly/cli/config_spec.rb
346
+ - spec/shelly/cli/database_spec.rb
347
+ - spec/shelly/cli/deploy_spec.rb
348
+ - spec/shelly/cli/file_spec.rb
349
+ - spec/shelly/cli/logs_spec.rb
350
+ - spec/shelly/cli/main_spec.rb
351
+ - spec/shelly/cli/organization_spec.rb
352
+ - spec/shelly/cli/runner_spec.rb
353
+ - spec/shelly/cli/user_spec.rb
354
+ - spec/shelly/client_spec.rb
355
+ - spec/shelly/cloudfile_spec.rb
356
+ - spec/shelly/download_progress_bar_spec.rb
357
+ - spec/shelly/model_spec.rb
358
+ - spec/shelly/organization_spec.rb
359
+ - spec/shelly/structure_validator_spec.rb
360
+ - spec/shelly/user_spec.rb
361
+ - spec/spec_helper.rb
362
+ - spec/thor/options_spec.rb