shelly 0.4.21 → 0.4.22
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.
- checksums.yaml +5 -13
- data/.gitignore +3 -0
- data/CHANGELOG.md +6 -0
- data/lib/shelly/cli/main.rb +20 -10
- data/lib/shelly/cli/runner.rb +5 -2
- data/lib/shelly/version.rb +1 -1
- data/shelly.gemspec +1 -1
- data/spec/shelly/cli/main_spec.rb +29 -7
- data/spec/shelly/cli/runner_spec.rb +4 -4
- metadata +68 -68
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
NGNhNjJjZmIzZTE4NDkyMjIzOThkYWE0Yjk1Y2RjODdmNDJlODc0ZQ==
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 545be45650bd9ce16d17c0ab7dfec2792a6b4edd
|
4
|
+
data.tar.gz: e80d05c0fad6c11775d524a43562f8cf95939720
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
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
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
|
data/lib/shelly/cli/main.rb
CHANGED
@@ -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
|
-
|
61
|
-
|
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
|
-
|
471
|
-
|
472
|
-
|
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 #{
|
475
|
-
|
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 - #{
|
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
|
data/lib/shelly/cli/runner.rb
CHANGED
@@ -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
|
-
|
32
|
-
|
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
|
data/lib/shelly/version.rb
CHANGED
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
|
-
|
158
|
-
let(:key_path) { File.expand_path("~/.ssh/id_rsa.pub") }
|
159
|
-
|
157
|
+
shared_examples "login" do
|
160
158
|
before do
|
161
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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(:
|
62
|
-
|
63
|
-
lambda {
|
62
|
+
$stdout.should_receive(:print).with("Update shelly gem? ")
|
63
|
+
fake_stdin(["yes"]) do
|
64
64
|
runner.start
|
65
|
-
|
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.
|
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-
|
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
|
-
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
18
16
|
requirements:
|
19
17
|
- - ~>
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: 2.11.0
|
22
|
-
|
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:
|
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:
|
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:
|
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
|
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: '
|
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: '
|
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.
|
323
|
+
rubygems_version: 2.1.11
|
324
324
|
signing_key:
|
325
325
|
specification_version: 4
|
326
326
|
summary: Shelly Cloud command line tool
|