shelly 0.2.12 → 0.2.13

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- ODAyNzViYTA0NThiYmE0ZDliNDI4ZjE1YmY4MzRlN2EwZjc1NDkwZA==
4
+ YzAwOWRmMjEyZDA5OWNlOTg1NTJjYzkxNjY1MTFjODA5MzI0NDA5Yw==
5
5
  data.tar.gz: !binary |-
6
- OTE1MjY5MTU2MThiNTJhYTk1MWFjOWU4M2FhNTFmM2U2MzMwYjFjZQ==
6
+ NDg0YjA5MTcxMDdkYTE2NDJiY2Q3NDRlNmM2NzJjODk1ZDM2NTIxMQ==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- ZGY4OTNjZTVkNzEwNmZkZDBkNGQzNzNlYjQzNzIwYTAyMjhhMjZlZTZkMTM2
10
- NDYyZjg5MTc1MzQ5NWE0ZjEzZTkwNDJiYzMxNTQ0M2ZmYTBmMDkyZGYxOTM0
11
- YmY2NjMwNDlhZDk4MGE5MjYzNDhjZjU5ZDA5ZTgxZTE5MzMwMWU=
9
+ NjRlYjYzMzUzOGFiMTljNmYxNzNhMWUzMjE5OWZiNmQ0MDFlZjNiMzI1OGIy
10
+ ZjVkNmQxNWMzMzllZDU1NDcxMmFmMGUyYjA0ZGYwYmY3NGI0ZTJiZjE5NzVj
11
+ NWU1NzNjZGRkZDc0NjUzYjZiZGE4MjQ2ZWY2ODY3YWE4NzhmODA=
12
12
  data.tar.gz: !binary |-
13
- N2MyYjE2ZjNjNDRjYWRhY2IxYjg4NDc3ZjYwOWJhMzQxZmZhMjY1NWIwMmYw
14
- MTQ4ZjBiY2FjMmIxMTY3ZGQ0ZjBlNzA2ZDFkZWViMmNjMTAzNmExY2E5NWQ3
15
- MmEzMTNlNjU5N2YyOGQ1MzY2ZTA1MDQ5MzlhMmQ3MzA0NGRhYzM=
13
+ NzYwZGVlMWVlNWY5NTk3ODU0YTM0MzJmNGI2ZjljM2RhODU3MDk4NjMyOTJm
14
+ MTc1N2I0MWQyZTFiYWNlMmUwZDEzYWI0M2M2ODA2YzNlZWY4Y2JlN2YzZjcw
15
+ MWQzZjc5MTUwYTFkZmQyZTFiMjQxZmY1NjRiY2M5NzdjODYzNTY=
@@ -1,3 +1,7 @@
1
+ ## 0.2.13 / 2013-03-28
2
+
3
+ * [improvement] More verbose output for redeploy, start and stop
4
+
1
5
  ## 0.2.12 / 2013-03-25
2
6
 
3
7
  * [bug] shelly check recognizes puma as allowed web server
@@ -111,15 +111,20 @@ module Shelly
111
111
  end
112
112
 
113
113
  def start
114
- shelly.start_cloud(code_name)
114
+ shelly.start_cloud(code_name)["deployment"]["id"]
115
115
  end
116
116
 
117
117
  def stop
118
- shelly.stop_cloud(code_name)
118
+ shelly.stop_cloud(code_name)["deployment"]["id"]
119
119
  end
120
120
 
121
+ # returns the id of created deployment
121
122
  def redeploy
122
- shelly.redeploy(code_name)
123
+ shelly.redeploy(code_name)["deployment"]["id"]
124
+ end
125
+
126
+ def deployment(deployment_id)
127
+ shelly.deployment(code_name, deployment_id)
123
128
  end
124
129
 
125
130
  def self.guess_code_name
@@ -194,10 +194,9 @@ module Shelly
194
194
  method_option :cloud, :type => :string, :aliases => "-c", :desc => "Specify cloud"
195
195
  def start
196
196
  app = multiple_clouds(options[:cloud], "start")
197
- app.start
197
+ deployment_id = app.start
198
198
  say "Starting cloud #{app}.", :green
199
- say "This can take up to 10 minutes."
200
- say "Check status with: `shelly list`"
199
+ deployment_progress(app, deployment_id, "Starting cloud")
201
200
  rescue Client::ConflictException => e
202
201
  case e[:state]
203
202
  when "running"
@@ -267,9 +266,9 @@ Wait until cloud is in 'turned off' state and try again.}
267
266
  app = multiple_clouds(options[:cloud], "stop")
268
267
  stop_question = "Are you sure you want to shut down '#{app}' cloud (yes/no):"
269
268
  if ask(stop_question) == "yes"
270
- app.stop
269
+ deployment_id = app.stop
271
270
  say_new_line
272
- say "Cloud '#{app}' stopped"
271
+ deployment_progress(app, deployment_id, "Stopping cloud")
273
272
  end
274
273
  rescue Client::ConflictException => e
275
274
  case e[:state]
@@ -368,8 +367,9 @@ Wait until cloud is in 'turned off' state and try again.}
368
367
  :desc => "Specify which cloud to redeploy application for"
369
368
  def redeploy
370
369
  app = multiple_clouds(options[:cloud], "redeploy")
371
- app.redeploy
370
+ deployment_id = app.redeploy
372
371
  say "Redeploying your application for cloud '#{app}'", :green
372
+ deployment_progress(app, deployment_id, "Cloud redeploy")
373
373
  rescue Client::ConflictException => e
374
374
  case e[:state]
375
375
  when "deploying", "configuring"
@@ -202,6 +202,10 @@ module Shelly
202
202
  post("/apps/#{cloud}/deploys")
203
203
  end
204
204
 
205
+ def deployment(cloud, deployment_id)
206
+ get("/apps/#{cloud}/deploys/#{deployment_id}")
207
+ end
208
+
205
209
  def query(options = {})
206
210
  "?" + options.map { |k, v|
207
211
  URI.escape(k.to_s) + "=" + URI.escape(v.to_s) }.join("&")
@@ -140,5 +140,29 @@ More info at http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository}
140
140
  end
141
141
  say " #{indicator} #{message}"
142
142
  end
143
+
144
+ def deployment_progress(app, deployment_id, action_name)
145
+ printed_messages = []
146
+ loop do
147
+ @deployment = app.deployment(deployment_id)
148
+ new_messages = @deployment["messages"] - printed_messages
149
+ new_messages.each do |message|
150
+ color = (message =~ /failed/) ? :red : :green
151
+ say message, color
152
+ printed_messages << message
153
+ end
154
+
155
+ break if @deployment["state"] != "running"
156
+ sleep 5
157
+ end
158
+
159
+ say_new_line
160
+
161
+ if @deployment["result"] == "success"
162
+ say "#{action_name} successful", :green
163
+ else
164
+ say "#{action_name} failed. See logs with `shelly deploy show last`", :red
165
+ end
166
+ end
143
167
  end
144
168
  end
@@ -1,3 +1,3 @@
1
1
  module Shelly
2
- VERSION = "0.2.12"
2
+ VERSION = "0.2.13"
3
3
  end
@@ -196,13 +196,15 @@ describe Shelly::App do
196
196
 
197
197
  describe "#start & #stop" do
198
198
  it "should start cloud" do
199
- @client.should_receive(:start_cloud).with("foo-staging")
200
- @app.start
199
+ @client.should_receive(:start_cloud).with("foo-staging").
200
+ and_return("deployment" => {"id" => "DEPLOYMENT_ID"})
201
+ @app.start.should == "DEPLOYMENT_ID"
201
202
  end
202
203
 
203
204
  it "should stop cloud" do
204
- @client.should_receive(:stop_cloud).with("foo-staging")
205
- @app.stop
205
+ @client.should_receive(:stop_cloud).with("foo-staging").
206
+ and_return("deployment" => {"id" => "DEPLOYMENT_ID"})
207
+ @app.stop.should == "DEPLOYMENT_ID"
206
208
  end
207
209
  end
208
210
 
@@ -288,8 +290,9 @@ describe Shelly::App do
288
290
 
289
291
  describe "#redeploy" do
290
292
  it "should redeploy app via API" do
291
- @client.should_receive(:redeploy).with("foo-staging")
292
- @app.redeploy
293
+ @client.should_receive(:redeploy).with("foo-staging").
294
+ and_return("deployment" => {"id" => "DEPLOYMENT_ID"})
295
+ @app.redeploy.should == "DEPLOYMENT_ID"
293
296
  end
294
297
  end
295
298
 
@@ -679,6 +679,10 @@ More info at http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository\e[0m
679
679
  @client.stub(:apps).and_return([
680
680
  {"code_name" => "foo-production", "state" => "running"},
681
681
  {"code_name" => "foo-staging", "state" => "no_code"}])
682
+ @client.stub(:start_cloud => {"deployment" => {"id" => "DEPLOYMENT_ID"}})
683
+ @deployment = {"messages" => ["message1"],
684
+ "result" => "success", "state" => "finished"}
685
+ @app.stub(:deployment => @deployment)
682
686
  end
683
687
 
684
688
  it "should ensure user has logged in" do
@@ -687,10 +691,9 @@ More info at http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository\e[0m
687
691
 
688
692
  context "single cloud in Cloudfile" do
689
693
  it "should start the cloud" do
690
- @client.stub(:start_cloud)
691
694
  $stdout.should_receive(:puts).with(green "Starting cloud foo-production.")
692
- $stdout.should_receive(:puts).with("This can take up to 10 minutes.")
693
- $stdout.should_receive(:puts).with("Check status with: `shelly list`")
695
+ $stdout.should_receive(:puts).with(green "message1")
696
+ $stdout.should_receive(:puts).with(green "Starting cloud successful")
694
697
  invoke(@main, :start)
695
698
  end
696
699
  end
@@ -699,7 +702,6 @@ More info at http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository\e[0m
699
702
  context "without Cloudfile" do
700
703
  it "should use cloud from params" do
701
704
  Dir.chdir("/projects")
702
- @client.stub(:start_cloud)
703
705
  $stdout.should_receive(:puts).with(green "Starting cloud foo-production.")
704
706
  @main.options = {:cloud => "foo-production"}
705
707
  invoke(@main, :start)
@@ -707,7 +709,6 @@ More info at http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository\e[0m
707
709
 
708
710
  it "should ask user to specify cloud, list all clouds and exit" do
709
711
  Dir.chdir("/projects")
710
- @client.stub(:start_cloud)
711
712
  $stdout.should_receive(:puts).with(red "You have to specify cloud.")
712
713
  $stdout.should_receive(:puts).with("Select cloud using `shelly start --cloud CLOUD_NAME`")
713
714
  $stdout.should_receive(:puts).with(green "You have following clouds available:")
@@ -736,8 +737,11 @@ More info at http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository\e[0m
736
737
 
737
738
  it "should fetch from command line which cloud to start" do
738
739
  @client.should_receive(:start_cloud).with("foo-staging")
740
+ @client.should_receive(:deployment).
741
+ with("foo-staging", "DEPLOYMENT_ID").and_return(@deployment)
739
742
  $stdout.should_receive(:puts).with(green "Starting cloud foo-staging.")
740
- $stdout.should_receive(:puts).with("Check status with: `shelly list`")
743
+ $stdout.should_receive(:puts).with(green "message1")
744
+ $stdout.should_receive(:puts).with(green "Starting cloud successful")
741
745
  @main.options = {:cloud => "foo-staging"}
742
746
  invoke(@main, :start)
743
747
  end
@@ -827,6 +831,9 @@ Wait until cloud is in 'turned off' state and try again.")
827
831
  @client.stub(:apps).and_return([{"code_name" => "foo-production"}, {"code_name" => "foo-staging"}])
828
832
  @app = Shelly::App.new("foo-production")
829
833
  Shelly::App.stub(:new).and_return(@app)
834
+ @client.stub(:stop_cloud => {"deployment" => {"id" => "DEPLOYMENT_ID"}})
835
+ @app.stub(:deployment => {"messages" => ["message1"],
836
+ "result" => "success", "state" => "finished"})
830
837
  end
831
838
 
832
839
  it "should ensure user has logged in" do
@@ -835,7 +842,6 @@ Wait until cloud is in 'turned off' state and try again.")
835
842
 
836
843
  # multiple_clouds is tested in main_spec.rb in describe "#start" block
837
844
  it "should ensure multiple_clouds check" do
838
- @client.stub(:stop_cloud)
839
845
  @main.should_receive(:multiple_clouds).and_return(@app)
840
846
  fake_stdin(["yes"]) do
841
847
  invoke(@main, :stop)
@@ -853,10 +859,10 @@ Wait until cloud is in 'turned off' state and try again.")
853
859
  end
854
860
 
855
861
  it "should stop the cloud" do
856
- @client.stub(:stop_cloud)
857
862
  $stdout.should_receive(:print).with("Are you sure you want to shut down 'foo-production' cloud (yes/no): ")
858
863
  $stdout.should_receive(:puts).with("\n")
859
- $stdout.should_receive(:puts).with("Cloud 'foo-production' stopped")
864
+ $stdout.should_receive(:puts).with(green "message1")
865
+ $stdout.should_receive(:puts).with(green "Stopping cloud successful")
860
866
  fake_stdin(["yes"]) do
861
867
  invoke(@main, :stop)
862
868
  end
@@ -1303,11 +1309,13 @@ Wait until cloud is in 'turned off' state and try again.")
1303
1309
  describe "#redeploy" do
1304
1310
  before do
1305
1311
  setup_project
1312
+ @client.stub(:redeploy => {"deployment" => {"id" => "DEPLOYMENT_ID"}})
1313
+ @app.stub(:deployment => {"messages" => ["message1"],
1314
+ "result" => "success", "state" => "finished"})
1306
1315
  end
1307
1316
 
1308
1317
  # multiple_clouds is tested in main_spec.rb in describe "#start" block
1309
1318
  it "should ensure multiple_clouds check" do
1310
- @client.stub(:redeploy)
1311
1319
  @main.should_receive(:multiple_clouds).and_return(@app)
1312
1320
  invoke(@main, :redeploy)
1313
1321
  end
@@ -1318,6 +1326,12 @@ Wait until cloud is in 'turned off' state and try again.")
1318
1326
  invoke(@main, :redeploy)
1319
1327
  end
1320
1328
 
1329
+ it "should print deployment messages" do
1330
+ $stdout.should_receive(:puts).with(green "message1")
1331
+ $stdout.should_receive(:puts).with(green "Cloud redeploy successful")
1332
+ invoke(@main, :redeploy)
1333
+ end
1334
+
1321
1335
  context "on redeploy failure" do
1322
1336
  %w(deploying configuring).each do |state|
1323
1337
  context "when application is in #{state} state" do
metadata CHANGED
@@ -1,183 +1,211 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shelly
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.12
4
+ version: 0.2.13
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-03-25 00:00:00.000000000 Z
11
+ date: 2013-03-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: rspec
15
14
  requirement: !ruby/object:Gem::Requirement
16
15
  requirements:
17
16
  - - ~>
18
17
  - !ruby/object:Gem::Version
19
18
  version: 2.11.0
20
- type: :development
21
- prerelease: false
22
19
  version_requirements: !ruby/object:Gem::Requirement
23
20
  requirements:
24
21
  - - ~>
25
22
  - !ruby/object:Gem::Version
26
23
  version: 2.11.0
24
+ type: :development
25
+ prerelease: false
26
+ name: rspec
27
27
  - !ruby/object:Gem::Dependency
28
- name: rake
29
28
  requirement: !ruby/object:Gem::Requirement
30
29
  requirements:
31
30
  - - ! '>='
32
31
  - !ruby/object:Gem::Version
33
32
  version: '0'
34
- type: :development
35
- prerelease: false
36
33
  version_requirements: !ruby/object:Gem::Requirement
37
34
  requirements:
38
35
  - - ! '>='
39
36
  - !ruby/object:Gem::Version
40
37
  version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ name: rake
41
41
  - !ruby/object:Gem::Dependency
42
- name: guard
43
42
  requirement: !ruby/object:Gem::Requirement
44
43
  requirements:
45
44
  - - ! '>='
46
45
  - !ruby/object:Gem::Version
47
46
  version: '0'
48
- type: :development
49
- prerelease: false
50
47
  version_requirements: !ruby/object:Gem::Requirement
51
48
  requirements:
52
49
  - - ! '>='
53
50
  - !ruby/object:Gem::Version
54
51
  version: '0'
52
+ type: :development
53
+ prerelease: false
54
+ name: guard
55
55
  - !ruby/object:Gem::Dependency
56
- name: guard-rspec
57
56
  requirement: !ruby/object:Gem::Requirement
58
57
  requirements:
59
58
  - - ! '>='
60
59
  - !ruby/object:Gem::Version
61
60
  version: '0'
62
- type: :development
63
- prerelease: false
64
61
  version_requirements: !ruby/object:Gem::Requirement
65
62
  requirements:
66
63
  - - ! '>='
67
64
  - !ruby/object:Gem::Version
68
65
  version: '0'
66
+ type: :development
67
+ prerelease: false
68
+ name: guard-rspec
69
69
  - !ruby/object:Gem::Dependency
70
- name: simplecov
71
70
  requirement: !ruby/object:Gem::Requirement
72
71
  requirements:
73
72
  - - ! '>='
74
73
  - !ruby/object:Gem::Version
75
74
  version: '0'
76
- type: :development
77
- prerelease: false
78
75
  version_requirements: !ruby/object:Gem::Requirement
79
76
  requirements:
80
77
  - - ! '>='
81
78
  - !ruby/object:Gem::Version
82
79
  version: '0'
80
+ type: :development
81
+ prerelease: false
82
+ name: simplecov
83
83
  - !ruby/object:Gem::Dependency
84
- name: fakefs
85
84
  requirement: !ruby/object:Gem::Requirement
86
85
  requirements:
87
86
  - - ! '>='
88
87
  - !ruby/object:Gem::Version
89
88
  version: '0'
89
+ version_requirements: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
90
94
  type: :development
91
95
  prerelease: false
96
+ name: ruby_gntp
97
+ - !ruby/object:Gem::Dependency
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ! '>='
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
92
103
  version_requirements: !ruby/object:Gem::Requirement
93
104
  requirements:
94
105
  - - ! '>='
95
106
  - !ruby/object:Gem::Version
96
107
  version: '0'
108
+ type: :development
109
+ prerelease: false
110
+ name: rb-fsevent
97
111
  - !ruby/object:Gem::Dependency
98
- name: fakeweb
99
112
  requirement: !ruby/object:Gem::Requirement
100
113
  requirements:
101
114
  - - ! '>='
102
115
  - !ruby/object:Gem::Version
103
116
  version: '0'
117
+ version_requirements: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - ! '>='
120
+ - !ruby/object:Gem::Version
121
+ version: '0'
104
122
  type: :development
105
123
  prerelease: false
124
+ name: fakefs
125
+ - !ruby/object:Gem::Dependency
126
+ requirement: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ! '>='
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
106
131
  version_requirements: !ruby/object:Gem::Requirement
107
132
  requirements:
108
133
  - - ! '>='
109
134
  - !ruby/object:Gem::Version
110
135
  version: '0'
136
+ type: :development
137
+ prerelease: false
138
+ name: fakeweb
111
139
  - !ruby/object:Gem::Dependency
112
- name: wijet-thor
113
140
  requirement: !ruby/object:Gem::Requirement
114
141
  requirements:
115
142
  - - ~>
116
143
  - !ruby/object:Gem::Version
117
144
  version: 0.14.9
118
- type: :runtime
119
- prerelease: false
120
145
  version_requirements: !ruby/object:Gem::Requirement
121
146
  requirements:
122
147
  - - ~>
123
148
  - !ruby/object:Gem::Version
124
149
  version: 0.14.9
150
+ type: :runtime
151
+ prerelease: false
152
+ name: wijet-thor
125
153
  - !ruby/object:Gem::Dependency
126
- name: rest-client
127
154
  requirement: !ruby/object:Gem::Requirement
128
155
  requirements:
129
156
  - - ! '>='
130
157
  - !ruby/object:Gem::Version
131
158
  version: '0'
132
- type: :runtime
133
- prerelease: false
134
159
  version_requirements: !ruby/object:Gem::Requirement
135
160
  requirements:
136
161
  - - ! '>='
137
162
  - !ruby/object:Gem::Version
138
163
  version: '0'
164
+ type: :runtime
165
+ prerelease: false
166
+ name: rest-client
139
167
  - !ruby/object:Gem::Dependency
140
- name: json
141
168
  requirement: !ruby/object:Gem::Requirement
142
169
  requirements:
143
170
  - - ! '>='
144
171
  - !ruby/object:Gem::Version
145
172
  version: '0'
146
- type: :runtime
147
- prerelease: false
148
173
  version_requirements: !ruby/object:Gem::Requirement
149
174
  requirements:
150
175
  - - ! '>='
151
176
  - !ruby/object:Gem::Version
152
177
  version: '0'
178
+ type: :runtime
179
+ prerelease: false
180
+ name: json
153
181
  - !ruby/object:Gem::Dependency
154
- name: progressbar
155
182
  requirement: !ruby/object:Gem::Requirement
156
183
  requirements:
157
184
  - - ! '>='
158
185
  - !ruby/object:Gem::Version
159
186
  version: '0'
160
- type: :runtime
161
- prerelease: false
162
187
  version_requirements: !ruby/object:Gem::Requirement
163
188
  requirements:
164
189
  - - ! '>='
165
190
  - !ruby/object:Gem::Version
166
191
  version: '0'
192
+ type: :runtime
193
+ prerelease: false
194
+ name: progressbar
167
195
  - !ruby/object:Gem::Dependency
168
- name: launchy
169
196
  requirement: !ruby/object:Gem::Requirement
170
197
  requirements:
171
198
  - - ! '>='
172
199
  - !ruby/object:Gem::Version
173
200
  version: '0'
174
- type: :runtime
175
- prerelease: false
176
201
  version_requirements: !ruby/object:Gem::Requirement
177
202
  requirements:
178
203
  - - ! '>='
179
204
  - !ruby/object:Gem::Version
180
205
  version: '0'
206
+ type: :runtime
207
+ prerelease: false
208
+ name: launchy
181
209
  description: Tool for managing applications and clouds at shellycloud.com
182
210
  email:
183
211
  - devs@shellycloud.com
@@ -265,8 +293,29 @@ required_rubygems_version: !ruby/object:Gem::Requirement
265
293
  version: '0'
266
294
  requirements: []
267
295
  rubyforge_project: shelly
268
- rubygems_version: 2.0.2
296
+ rubygems_version: 2.0.3
269
297
  signing_key:
270
298
  specification_version: 4
271
299
  summary: Shelly Cloud command line tool
272
- test_files: []
300
+ test_files:
301
+ - spec/helpers.rb
302
+ - spec/input_faker.rb
303
+ - spec/shelly/app_spec.rb
304
+ - spec/shelly/backup_spec.rb
305
+ - spec/shelly/cli/backup_spec.rb
306
+ - spec/shelly/cli/config_spec.rb
307
+ - spec/shelly/cli/deploy_spec.rb
308
+ - spec/shelly/cli/file_spec.rb
309
+ - spec/shelly/cli/main_spec.rb
310
+ - spec/shelly/cli/organization_spec.rb
311
+ - spec/shelly/cli/runner_spec.rb
312
+ - spec/shelly/cli/user_spec.rb
313
+ - spec/shelly/client_spec.rb
314
+ - spec/shelly/cloudfile_spec.rb
315
+ - spec/shelly/download_progress_bar_spec.rb
316
+ - spec/shelly/model_spec.rb
317
+ - spec/shelly/organization_spec.rb
318
+ - spec/shelly/structure_validator_spec.rb
319
+ - spec/shelly/user_spec.rb
320
+ - spec/spec_helper.rb
321
+ - spec/thor/options_spec.rb