shelly 0.4.21 → 0.4.22

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- NDdlYTA5ZTNlZDdhNTdhNDNmNjFiMzE2Njk0ZDZjN2NiOTBiZjYyMw==
5
- data.tar.gz: !binary |-
6
- NGNhNjJjZmIzZTE4NDkyMjIzOThkYWE0Yjk1Y2RjODdmNDJlODc0ZQ==
2
+ SHA1:
3
+ metadata.gz: 545be45650bd9ce16d17c0ab7dfec2792a6b4edd
4
+ data.tar.gz: e80d05c0fad6c11775d524a43562f8cf95939720
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- NzI5YWUxNDAxNzExNGJkNjFiNGE1ZTM5NjAwN2ZiMmNjYjljODMzNmI5NDdk
10
- ZTEyMjBkNzBhZWY2YmE2NDY0ZDNiMWZlNTFlNjVkMGE0MjFiZWY1M2Q1MDY5
11
- NDkyZjUyYzY2NjQwNmM1YzE1YTYwZjY0MTc0MTdkZDFhZmIzYzM=
12
- data.tar.gz: !binary |-
13
- NjhkYjkwY2QxZTMwMzBjNDU5MzFlODZlMjVkNmQ0NmEwMTAzMTk5MWIxZGMw
14
- MGFlYzhiNjBiNWVlOGYzZTk0YzE1ZjA5ODgyZGZkYjZmYjc2YTdjNGYzMWI4
15
- ZDNlODlkMzYxZTMyNGYzYjhmOTdkM2Q2MDgzMTIzNzcyNDI5YmU=
6
+ metadata.gz: 1172c76aceccf7697fdb9689de43fb0004886c92eef6cc8489a920650afd59579a92a760b51a761706dd0ea28e34975365d4c53eb78293c007fd61876919eee8
7
+ data.tar.gz: a5df073a82931e5ff68b7e7144ca3d841c84621f9284b64175f47fedeb92a1c3845b8c6152099923c89a9261177dcc018e8026aa12ccf34cfd30fc2093f2891f
data/.gitignore CHANGED
@@ -5,3 +5,6 @@ Gemfile.lock
5
5
  pkg/*
6
6
  .rvmrc
7
7
  coverage
8
+
9
+ /.ruby-gemset
10
+ /.ruby-version
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## 0.4.22 / 2014-02-07
2
+
3
+ * [improvement] Update shelly after confirmation
4
+ * [improvement] User can specify SSH public key to be
5
+ uploaded with `shelly login --key PATH` (Done by https://github.com/we5)
6
+
1
7
  ## 0.4.21 / 2014-01-15
2
8
 
3
9
  * [improvement] destination path when uploading files to Shelly Cloud
@@ -55,14 +55,22 @@ module Shelly
55
55
  end
56
56
 
57
57
  desc "login [EMAIL]", "Log into Shelly Cloud"
58
+ method_option :key, :alias => :k, :desc => "Path to specific SSH key", :default => nil
58
59
  def login(email = nil)
59
60
  user = Shelly::User.new
60
- say "Your public SSH key will be uploaded to Shelly Cloud after login."
61
- raise Errno::ENOENT, user.ssh_key.path unless user.ssh_key.exists?
61
+
62
+ if options[:key]
63
+ given_key = Shelly::SshKey.new(options[:key])
64
+ say "Your given SSH key (#{given_key.path}) will be uploaded to Shelly Cloud after login."
65
+ raise Errno::ENOENT, given_key.path unless given_key.exists?
66
+ else
67
+ say "Your public SSH key will be uploaded to Shelly Cloud after login."
68
+ raise Errno::ENOENT, user.ssh_key.path unless user.ssh_key.exists?
69
+ end
62
70
  email ||= ask_for_email
63
71
  password = ask_for_password(:with_confirmation => false)
64
72
  user.login(email, password)
65
- upload_ssh_key
73
+ upload_ssh_key(options[:key])
66
74
  say "Login successful", :green
67
75
  list
68
76
  rescue Client::ValidationException => e
@@ -465,17 +473,19 @@ Wait until cloud is in 'turned off' state and try again.}
465
473
  say_new_line
466
474
  end
467
475
 
468
- def upload_ssh_key
476
+ def upload_ssh_key(given_key_path = nil)
469
477
  user = Shelly::User.new
470
- if user.ssh_key.exists?
471
- if user.ssh_key.uploaded?
472
- say "Your SSH key from #{user.ssh_key.path} is already uploaded"
478
+ ssh_key = given_key_path ? Shelly::SshKey.new(given_key_path) : user.ssh_key
479
+
480
+ if ssh_key.exists?
481
+ if ssh_key.uploaded?
482
+ say "Your SSH key from #{ssh_key.path} is already uploaded"
473
483
  else
474
- say "Uploading your public SSH key from #{user.ssh_key.path}"
475
- user.ssh_key.upload
484
+ say "Uploading your public SSH key from #{ssh_key.path}"
485
+ ssh_key.upload
476
486
  end
477
487
  else
478
- say_error "No such file or directory - #{user.ssh_key_path}", :with_exit => false
488
+ say_error "No such file or directory - #{ssh_key_path}", :with_exit => false
479
489
  say_error "Use ssh-keygen to generate ssh key pair, after that use: `shelly login`", :with_exit => false
480
490
  end
481
491
  rescue Client::ValidationException => e
@@ -28,8 +28,11 @@ module Shelly
28
28
  raise if debug?
29
29
  say "Required shelly gem version: #{e.body["required_version"]}"
30
30
  say "Your version: #{VERSION}"
31
- say "Update shelly gem with `gem install shelly`"
32
- say_error "or `bundle update shelly` when using bundler"
31
+ if yes? "Update shelly gem?"
32
+ system "gem install shelly"
33
+ else
34
+ say_error "Update shelly gem with `gem install shelly`"
35
+ end
33
36
  rescue Interrupt
34
37
  raise if debug?
35
38
  say_new_line
@@ -1,3 +1,3 @@
1
1
  module Shelly
2
- VERSION = "0.4.21"
2
+ VERSION = "0.4.22"
3
3
  end
data/shelly.gemspec CHANGED
@@ -20,7 +20,7 @@ Gem::Specification.new do |s|
20
20
  s.add_development_dependency "ruby_gntp"
21
21
  s.add_development_dependency "rb-fsevent"
22
22
  end
23
- s.add_development_dependency "fakefs"
23
+ s.add_development_dependency "fakefs", "~> 0.4.3"
24
24
  s.add_development_dependency "fakeweb"
25
25
  s.add_runtime_dependency "wijet-thor", "~> 0.14.10"
26
26
  s.add_runtime_dependency "rest-client"
@@ -154,13 +154,12 @@ describe Shelly::CLI::Main do
154
154
  end
155
155
  end
156
156
 
157
- describe "#login" do
158
- let(:key_path) { File.expand_path("~/.ssh/id_rsa.pub") }
159
-
157
+ shared_examples "login" do
160
158
  before do
161
- user.ssh_key.stub(:upload => nil, :uploaded? => false)
159
+ Shelly::SshKey.any_instance.stub(:upload => nil, :uploaded? => false)
162
160
  FileUtils.mkdir_p("~/.ssh")
163
161
  File.open(key_path, "w") { |f| f << "ssh-rsa AAAAB3NzaC1" }
162
+ @main.options = main_options
164
163
  @client.stub(:apps).and_return([
165
164
  {"code_name" => "abc", "state" => "running",
166
165
  "state_description" => "running"},
@@ -187,8 +186,15 @@ describe Shelly::CLI::Main do
187
186
  end
188
187
  end
189
188
 
189
+ it "should accept given path to specific key as parameter" do
190
+ $stdout.should_receive(:puts).with(green "Login successful")
191
+ fake_stdin(["secret"]) do
192
+ invoke(@main, :login, "megan@example.com")
193
+ end
194
+ end
195
+
190
196
  it "should upload user's public SSH key" do
191
- user.ssh_key.should_receive(:upload)
197
+ Shelly::SshKey.any_instance.should_receive(:upload)
192
198
  $stdout.should_receive(:puts).with("Uploading your public SSH key from #{key_path}")
193
199
  fake_stdin(["megan@example.com", "secret"]) do
194
200
  invoke(@main, :login)
@@ -206,7 +212,7 @@ describe Shelly::CLI::Main do
206
212
 
207
213
  context "SSH key already uploaded" do
208
214
  it "should display message to user" do
209
- user.ssh_key.stub(:uploaded? => true)
215
+ Shelly::SshKey.any_instance.stub(:uploaded? => true)
210
216
  $stdout.should_receive(:puts).with("Your SSH key from #{key_path} is already uploaded")
211
217
  fake_stdin(["megan@example.com", "secret"]) do
212
218
  invoke(@main, :login)
@@ -219,7 +225,7 @@ describe Shelly::CLI::Main do
219
225
  body = {"message" => "Validation Failed",
220
226
  "errors" => [["fingerprint", "already exists. This SSH key is already in use"]]}
221
227
  ex = Shelly::Client::ValidationException.new(body)
222
- user.ssh_key.stub(:upload).and_raise(ex)
228
+ Shelly::SshKey.any_instance.stub(:upload).and_raise(ex)
223
229
  user.should_receive(:logout)
224
230
  $stdout.should_receive(:puts).with(red "Fingerprint already exists. This SSH key is already in use")
225
231
  lambda {
@@ -276,6 +282,22 @@ describe Shelly::CLI::Main do
276
282
  end
277
283
  end
278
284
 
285
+ describe "#login" do
286
+ context "with default keys in place" do
287
+ let(:key_path) { File.expand_path("~/.ssh/id_rsa.pub") }
288
+ let(:main_options) { {} }
289
+
290
+ it_behaves_like "login"
291
+ end
292
+
293
+ context "with given path to specific key" do
294
+ let(:key_path) { File.expand_path("~/.ssh/specific.pub") }
295
+ let(:main_options) { {:key => "~/.ssh/specific.pub"} }
296
+
297
+ it_behaves_like "login"
298
+ end
299
+ end
300
+
279
301
  describe "#add" do
280
302
  before do
281
303
  FileUtils.mkdir_p("/projects/foo")
@@ -56,13 +56,13 @@ describe Shelly::CLI::Runner do
56
56
  Shelly::CLI::Main.stub(:start).and_raise(Shelly::Client::GemVersionException.new(
57
57
  {"required_version" => "0.0.48"}))
58
58
  runner = Shelly::CLI::Runner.new(%w(login))
59
+ runner.should_receive(:system).with("gem install shelly")
59
60
  $stdout.should_receive(:puts).with("Required shelly gem version: 0.0.48")
60
61
  $stdout.should_receive(:puts).with("Your version: #{Shelly::VERSION}")
61
- $stdout.should_receive(:puts).with("Update shelly gem with `gem install shelly`")
62
- $stdout.should_receive(:puts).with("or `bundle update shelly` when using bundler")
63
- lambda {
62
+ $stdout.should_receive(:print).with("Update shelly gem? ")
63
+ fake_stdin(["yes"]) do
64
64
  runner.start
65
- }.should raise_error(SystemExit)
65
+ end
66
66
  end
67
67
 
68
68
  describe "API exception handling" do
metadata CHANGED
@@ -1,209 +1,209 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shelly
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.21
4
+ version: 0.4.22
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: 2014-01-15 00:00:00.000000000 Z
11
+ date: 2014-02-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- type: :development
15
- prerelease: false
16
14
  name: rspec
17
- version_requirements: !ruby/object:Gem::Requirement
15
+ requirement: !ruby/object:Gem::Requirement
18
16
  requirements:
19
17
  - - ~>
20
18
  - !ruby/object:Gem::Version
21
19
  version: 2.11.0
22
- requirement: !ruby/object:Gem::Requirement
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !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
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
28
34
  type: :development
29
35
  prerelease: false
30
- name: rake
31
36
  version_requirements: !ruby/object:Gem::Requirement
32
37
  requirements:
33
- - - ! '>='
38
+ - - '>='
34
39
  - !ruby/object:Gem::Version
35
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: simplecov
36
43
  requirement: !ruby/object:Gem::Requirement
37
44
  requirements:
38
- - - ! '>='
45
+ - - '>='
39
46
  - !ruby/object:Gem::Version
40
47
  version: '0'
41
- - !ruby/object:Gem::Dependency
42
48
  type: :development
43
49
  prerelease: false
44
- name: simplecov
45
50
  version_requirements: !ruby/object:Gem::Requirement
46
51
  requirements:
47
- - - ! '>='
52
+ - - '>='
48
53
  - !ruby/object:Gem::Version
49
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: ruby_gntp
50
57
  requirement: !ruby/object:Gem::Requirement
51
58
  requirements:
52
- - - ! '>='
59
+ - - '>='
53
60
  - !ruby/object:Gem::Version
54
61
  version: '0'
55
- - !ruby/object:Gem::Dependency
56
62
  type: :development
57
63
  prerelease: false
58
- name: ruby_gntp
59
64
  version_requirements: !ruby/object:Gem::Requirement
60
65
  requirements:
61
- - - ! '>='
66
+ - - '>='
62
67
  - !ruby/object:Gem::Version
63
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rb-fsevent
64
71
  requirement: !ruby/object:Gem::Requirement
65
72
  requirements:
66
- - - ! '>='
73
+ - - '>='
67
74
  - !ruby/object:Gem::Version
68
75
  version: '0'
69
- - !ruby/object:Gem::Dependency
70
76
  type: :development
71
77
  prerelease: false
72
- name: rb-fsevent
73
78
  version_requirements: !ruby/object:Gem::Requirement
74
79
  requirements:
75
- - - ! '>='
80
+ - - '>='
76
81
  - !ruby/object:Gem::Version
77
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: fakefs
78
85
  requirement: !ruby/object:Gem::Requirement
79
86
  requirements:
80
- - - ! '>='
87
+ - - ~>
81
88
  - !ruby/object:Gem::Version
82
- version: '0'
83
- - !ruby/object:Gem::Dependency
89
+ version: 0.4.3
84
90
  type: :development
85
91
  prerelease: false
86
- name: fakefs
87
92
  version_requirements: !ruby/object:Gem::Requirement
88
93
  requirements:
89
- - - ! '>='
94
+ - - ~>
90
95
  - !ruby/object:Gem::Version
91
- version: '0'
96
+ version: 0.4.3
97
+ - !ruby/object:Gem::Dependency
98
+ name: fakeweb
92
99
  requirement: !ruby/object:Gem::Requirement
93
100
  requirements:
94
- - - ! '>='
101
+ - - '>='
95
102
  - !ruby/object:Gem::Version
96
103
  version: '0'
97
- - !ruby/object:Gem::Dependency
98
104
  type: :development
99
105
  prerelease: false
100
- name: fakeweb
101
106
  version_requirements: !ruby/object:Gem::Requirement
102
107
  requirements:
103
- - - ! '>='
108
+ - - '>='
104
109
  - !ruby/object:Gem::Version
105
110
  version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: wijet-thor
106
113
  requirement: !ruby/object:Gem::Requirement
107
114
  requirements:
108
- - - ! '>='
115
+ - - ~>
109
116
  - !ruby/object:Gem::Version
110
- version: '0'
111
- - !ruby/object:Gem::Dependency
117
+ version: 0.14.10
112
118
  type: :runtime
113
119
  prerelease: false
114
- name: wijet-thor
115
120
  version_requirements: !ruby/object:Gem::Requirement
116
121
  requirements:
117
122
  - - ~>
118
123
  - !ruby/object:Gem::Version
119
124
  version: 0.14.10
125
+ - !ruby/object:Gem::Dependency
126
+ name: rest-client
120
127
  requirement: !ruby/object:Gem::Requirement
121
128
  requirements:
122
- - - ~>
129
+ - - '>='
123
130
  - !ruby/object:Gem::Version
124
- version: 0.14.10
125
- - !ruby/object:Gem::Dependency
131
+ version: '0'
126
132
  type: :runtime
127
133
  prerelease: false
128
- name: rest-client
129
134
  version_requirements: !ruby/object:Gem::Requirement
130
135
  requirements:
131
- - - ! '>='
136
+ - - '>='
132
137
  - !ruby/object:Gem::Version
133
138
  version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: mime-types
134
141
  requirement: !ruby/object:Gem::Requirement
135
142
  requirements:
136
- - - ! '>='
143
+ - - ~>
137
144
  - !ruby/object:Gem::Version
138
- version: '0'
139
- - !ruby/object:Gem::Dependency
145
+ version: '1.16'
140
146
  type: :runtime
141
147
  prerelease: false
142
- name: mime-types
143
148
  version_requirements: !ruby/object:Gem::Requirement
144
149
  requirements:
145
150
  - - ~>
146
151
  - !ruby/object:Gem::Version
147
152
  version: '1.16'
153
+ - !ruby/object:Gem::Dependency
154
+ name: json
148
155
  requirement: !ruby/object:Gem::Requirement
149
156
  requirements:
150
- - - ~>
157
+ - - '>='
151
158
  - !ruby/object:Gem::Version
152
- version: '1.16'
153
- - !ruby/object:Gem::Dependency
159
+ version: '0'
154
160
  type: :runtime
155
161
  prerelease: false
156
- name: json
157
162
  version_requirements: !ruby/object:Gem::Requirement
158
163
  requirements:
159
- - - ! '>='
164
+ - - '>='
160
165
  - !ruby/object:Gem::Version
161
166
  version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: progressbar
162
169
  requirement: !ruby/object:Gem::Requirement
163
170
  requirements:
164
- - - ! '>='
171
+ - - '>='
165
172
  - !ruby/object:Gem::Version
166
173
  version: '0'
167
- - !ruby/object:Gem::Dependency
168
174
  type: :runtime
169
175
  prerelease: false
170
- name: progressbar
171
176
  version_requirements: !ruby/object:Gem::Requirement
172
177
  requirements:
173
- - - ! '>='
178
+ - - '>='
174
179
  - !ruby/object:Gem::Version
175
180
  version: '0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: launchy
176
183
  requirement: !ruby/object:Gem::Requirement
177
184
  requirements:
178
- - - ! '>='
185
+ - - '>='
179
186
  - !ruby/object:Gem::Version
180
187
  version: '0'
181
- - !ruby/object:Gem::Dependency
182
188
  type: :runtime
183
189
  prerelease: false
184
- name: launchy
185
190
  version_requirements: !ruby/object:Gem::Requirement
186
191
  requirements:
187
- - - ! '>='
192
+ - - '>='
188
193
  - !ruby/object:Gem::Version
189
194
  version: '0'
195
+ - !ruby/object:Gem::Dependency
196
+ name: netrc
190
197
  requirement: !ruby/object:Gem::Requirement
191
198
  requirements:
192
- - - ! '>='
199
+ - - '>='
193
200
  - !ruby/object:Gem::Version
194
201
  version: '0'
195
- - !ruby/object:Gem::Dependency
196
202
  type: :runtime
197
203
  prerelease: false
198
- name: netrc
199
204
  version_requirements: !ruby/object:Gem::Requirement
200
205
  requirements:
201
- - - ! '>='
202
- - !ruby/object:Gem::Version
203
- version: '0'
204
- requirement: !ruby/object:Gem::Requirement
205
- requirements:
206
- - - ! '>='
206
+ - - '>='
207
207
  - !ruby/object:Gem::Version
208
208
  version: '0'
209
209
  description: Tool for managing applications and clouds at shellycloud.com
@@ -310,17 +310,17 @@ require_paths:
310
310
  - lib
311
311
  required_ruby_version: !ruby/object:Gem::Requirement
312
312
  requirements:
313
- - - ! '>='
313
+ - - '>='
314
314
  - !ruby/object:Gem::Version
315
315
  version: '0'
316
316
  required_rubygems_version: !ruby/object:Gem::Requirement
317
317
  requirements:
318
- - - ! '>='
318
+ - - '>='
319
319
  - !ruby/object:Gem::Version
320
320
  version: '0'
321
321
  requirements: []
322
322
  rubyforge_project: shelly
323
- rubygems_version: 2.1.5
323
+ rubygems_version: 2.1.11
324
324
  signing_key:
325
325
  specification_version: 4
326
326
  summary: Shelly Cloud command line tool