shelly 0.1.4.pre → 0.1.4.pre2

Sign up to get free protection for your applications and to get access to all the features.
data/lib/shelly/app.rb CHANGED
@@ -77,8 +77,8 @@ module Shelly
77
77
  shelly.deploy_log(code_name, log)
78
78
  end
79
79
 
80
- def application_logs
81
- shelly.application_logs(code_name)
80
+ def application_logs(options = {})
81
+ shelly.application_logs(code_name, options)
82
82
  end
83
83
 
84
84
  def database_backups
@@ -259,19 +259,28 @@ We have been notified about it. We will be adding new resources shortly}
259
259
 
260
260
  desc "logs", "Show latest application logs"
261
261
  method_option :cloud, :type => :string, :aliases => "-c", :desc => "Specify cloud"
262
+ method_option :limit, :type => :numeric, :aliases => "-n", :desc => "Amount of messages to show"
263
+ method_option :tail, :type => :boolean, :aliases => "-f", :desc => "Show new logs automatically"
262
264
  def logs
263
265
  cloud = options[:cloud]
264
266
  app = multiple_clouds(cloud, "logs")
265
267
  begin
266
- logs = app.application_logs
267
- say "Cloud #{app}:", :green
268
- logs.each_with_index do |log, i|
269
- say "Instance #{i+1}:", :green
270
- say log
268
+ logs = app.application_logs(:limit => options[:limit])
269
+ print_logs(logs)
270
+
271
+ if options[:tail]
272
+ loop do
273
+ logs = app.application_logs(:from => logs['range']['last'])
274
+ print_logs(logs)
275
+ sleep 1
276
+ end
271
277
  end
272
278
  rescue Client::NotFoundException => e
273
279
  raise unless e.resource == :cloud
274
280
  say_error "You have no access to '#{cloud || app}' cloud defined in Cloudfile"
281
+ rescue Client::APIException => e
282
+ raise e unless e.status_code == 416
283
+ say_error "You have requested too many log messages. Try a lower number."
275
284
  end
276
285
  end
277
286
 
data/lib/shelly/client.rb CHANGED
@@ -137,8 +137,10 @@ module Shelly
137
137
  get("/apps/#{cloud}/deployment_logs/#{log}")
138
138
  end
139
139
 
140
- def application_logs(cloud)
141
- get("/apps/#{cloud}/application_logs")
140
+ def application_logs(cloud, options = {})
141
+ query = "?" + options.map { |k, v|
142
+ URI.escape(k.to_s) + "=" + URI.escape(v.to_s) }.join("&")
143
+ get("/apps/#{cloud}/application_logs#{query}")
142
144
  end
143
145
 
144
146
  def database_backups(code_name)
@@ -114,5 +114,11 @@ module Shelly
114
114
  app.code_name = cloud || clouds.first
115
115
  app
116
116
  end
117
+
118
+ def print_logs(logs)
119
+ logs['entries'].each do |entry|
120
+ say "%8.8s | %s\n" % entry
121
+ end
122
+ end
117
123
  end
118
124
  end
@@ -1,3 +1,3 @@
1
1
  module Shelly
2
- VERSION = "0.1.4.pre"
2
+ VERSION = "0.1.4.pre2"
3
3
  end
@@ -292,8 +292,8 @@ config
292
292
 
293
293
  describe "#application_logs" do
294
294
  it "should list application_logs" do
295
- @client.should_receive(:application_logs).with("foo-staging").
296
- and_return({"logs" => ["log1", "log2"]})
295
+ @client.should_receive(:application_logs).with("foo-staging", {}).
296
+ and_return({"entries" => [["app1", "log1"], ["app2", "log2"]]})
297
297
  @app.application_logs
298
298
  end
299
299
  end
@@ -56,18 +56,11 @@ OUT
56
56
  end
57
57
 
58
58
  it "should display options in help for logs" do
59
- expected = <<-OUT
60
- Usage:
61
- shelly logs
62
-
63
- Options:
64
- -c, [--cloud=CLOUD] # Specify cloud
65
- [--debug] # Show debug information
66
-
67
- Show latest application logs
68
- OUT
69
59
  out = IO.popen("bin/shelly help logs").read.strip
70
- out.should == expected.strip
60
+ out.should include("-c, [--cloud=CLOUD] # Specify cloud")
61
+ out.should include("-n, [--limit=N] # Amount of messages to show")
62
+ out.should include("-f, [--tail] # Show new logs automatically")
63
+ out.should include("[--debug] # Show debug information")
71
64
  end
72
65
  end
73
66
 
@@ -1070,6 +1063,7 @@ We have been notified about it. We will be adding new resources shortly")
1070
1063
  {"code_name" => "foo-staging"}])
1071
1064
  @app = Shelly::App.new
1072
1065
  Shelly::App.stub(:new).and_return(@app)
1066
+ @sample_logs = {"entries" => [['app1', 'log1'], ['app1', 'log2']]}
1073
1067
  end
1074
1068
 
1075
1069
  it "should ensure user has logged in" do
@@ -1078,7 +1072,7 @@ We have been notified about it. We will be adding new resources shortly")
1078
1072
 
1079
1073
  # multiple_clouds is tested in main_spec.rb in describe "#start" block
1080
1074
  it "should ensure multiple_clouds check" do
1081
- @client.stub(:application_logs).and_return(["log1"])
1075
+ @client.stub(:application_logs).and_return(@sample_logs)
1082
1076
  @main.should_receive(:multiple_clouds).and_return(@app)
1083
1077
  invoke(@main, :logs)
1084
1078
  end
@@ -1091,24 +1085,26 @@ We have been notified about it. We will be adding new resources shortly")
1091
1085
  lambda { invoke(@main, :logs) }.should raise_error(SystemExit)
1092
1086
  end
1093
1087
 
1088
+ it "should exit if user requested too many log lines" do
1089
+ exception = Shelly::Client::APIException.new({}, 416)
1090
+ @client.stub(:application_logs).and_raise(exception)
1091
+ $stdout.should_receive(:puts).
1092
+ with(red "You have requested too many log messages. Try a lower number.")
1093
+ lambda { invoke(@main, :logs) }.should raise_error(SystemExit)
1094
+ end
1095
+
1094
1096
  it "should show logs for the cloud" do
1095
- @client.stub(:application_logs).and_return(["log1"])
1096
- $stdout.should_receive(:puts).with(green "Cloud foo-production:")
1097
- $stdout.should_receive(:puts).with(green "Instance 1:")
1098
- $stdout.should_receive(:puts).with("log1")
1097
+ @client.stub(:application_logs).and_return(@sample_logs)
1098
+ $stdout.should_receive(:puts).with(" app1 | log1\n")
1099
+ $stdout.should_receive(:puts).with(" app1 | log2\n")
1099
1100
  invoke(@main, :logs)
1100
1101
  end
1101
1102
 
1102
- context "multiple instances" do
1103
- it "should show logs from each instance" do
1104
- @client.stub(:application_logs).and_return(["log1", "log2"])
1105
- $stdout.should_receive(:puts).with(green "Cloud foo-production:")
1106
- $stdout.should_receive(:puts).with(green "Instance 1:")
1107
- $stdout.should_receive(:puts).with("log1")
1108
- $stdout.should_receive(:puts).with(green "Instance 2:")
1109
- $stdout.should_receive(:puts).with("log2")
1110
- invoke(@main, :logs)
1111
- end
1103
+ it "should show requested amount of logs" do
1104
+ @client.should_receive(:application_logs).
1105
+ with("foo-production", {:limit => 2}).and_return(@sample_logs)
1106
+ @main.options = {:limit => 2}
1107
+ invoke(@main, :logs)
1112
1108
  end
1113
1109
  end
1114
1110
 
metadata CHANGED
@@ -1,264 +1,250 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: shelly
3
- version: !ruby/object:Gem::Version
4
- version: 0.1.4.pre
3
+ version: !ruby/object:Gem::Version
4
+ hash: -529809128
5
5
  prerelease: 6
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 4
10
+ - pre
11
+ - 2
12
+ version: 0.1.4.pre2
6
13
  platform: ruby
7
- authors:
14
+ authors:
8
15
  - Shelly Cloud team
9
16
  autorequire:
10
17
  bindir: bin
11
18
  cert_chain: []
12
- date: 2012-05-14 00:00:00.000000000 Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
19
+
20
+ date: 2012-05-17 00:00:00 Z
21
+ dependencies:
22
+ - !ruby/object:Gem::Dependency
15
23
  name: rspec
16
- requirement: !ruby/object:Gem::Requirement
24
+ version_requirements: &id001 !ruby/object:Gem::Requirement
17
25
  none: false
18
- requirements:
26
+ requirements:
19
27
  - - ~>
20
- - !ruby/object:Gem::Version
28
+ - !ruby/object:Gem::Version
29
+ hash: 47
30
+ segments:
31
+ - 2
32
+ - 8
33
+ - 0
21
34
  version: 2.8.0
22
35
  type: :development
23
36
  prerelease: false
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
37
+ requirement: *id001
38
+ - !ruby/object:Gem::Dependency
31
39
  name: rake
32
- requirement: !ruby/object:Gem::Requirement
40
+ version_requirements: &id002 !ruby/object:Gem::Requirement
33
41
  none: false
34
- requirements:
35
- - - ! '>='
36
- - !ruby/object:Gem::Version
37
- version: '0'
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ hash: 3
46
+ segments:
47
+ - 0
48
+ version: "0"
38
49
  type: :development
39
50
  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
51
+ requirement: *id002
52
+ - !ruby/object:Gem::Dependency
47
53
  name: guard
48
- requirement: !ruby/object:Gem::Requirement
54
+ version_requirements: &id003 !ruby/object:Gem::Requirement
49
55
  none: false
50
- requirements:
51
- - - ! '>='
52
- - !ruby/object:Gem::Version
53
- version: '0'
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ hash: 3
60
+ segments:
61
+ - 0
62
+ version: "0"
54
63
  type: :development
55
64
  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
65
+ requirement: *id003
66
+ - !ruby/object:Gem::Dependency
63
67
  name: guard-rspec
64
- requirement: !ruby/object:Gem::Requirement
68
+ version_requirements: &id004 !ruby/object:Gem::Requirement
65
69
  none: false
66
- requirements:
67
- - - ! '>='
68
- - !ruby/object:Gem::Version
69
- version: '0'
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ hash: 3
74
+ segments:
75
+ - 0
76
+ version: "0"
70
77
  type: :development
71
78
  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
79
+ requirement: *id004
80
+ - !ruby/object:Gem::Dependency
79
81
  name: simplecov
80
- requirement: !ruby/object:Gem::Requirement
82
+ version_requirements: &id005 !ruby/object:Gem::Requirement
81
83
  none: false
82
- requirements:
83
- - - ! '>='
84
- - !ruby/object:Gem::Version
85
- version: '0'
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ hash: 3
88
+ segments:
89
+ - 0
90
+ version: "0"
86
91
  type: :development
87
92
  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
93
+ requirement: *id005
94
+ - !ruby/object:Gem::Dependency
95
95
  name: ruby_gntp
96
- requirement: !ruby/object:Gem::Requirement
96
+ version_requirements: &id006 !ruby/object:Gem::Requirement
97
97
  none: false
98
- requirements:
99
- - - ! '>='
100
- - !ruby/object:Gem::Version
101
- version: '0'
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ hash: 3
102
+ segments:
103
+ - 0
104
+ version: "0"
102
105
  type: :development
103
106
  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
107
+ requirement: *id006
108
+ - !ruby/object:Gem::Dependency
111
109
  name: rb-fsevent
112
- requirement: !ruby/object:Gem::Requirement
110
+ version_requirements: &id007 !ruby/object:Gem::Requirement
113
111
  none: false
114
- requirements:
115
- - - ! '>='
116
- - !ruby/object:Gem::Version
117
- version: '0'
112
+ requirements:
113
+ - - ">="
114
+ - !ruby/object:Gem::Version
115
+ hash: 3
116
+ segments:
117
+ - 0
118
+ version: "0"
118
119
  type: :development
119
120
  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
121
+ requirement: *id007
122
+ - !ruby/object:Gem::Dependency
127
123
  name: fakefs
128
- requirement: !ruby/object:Gem::Requirement
124
+ version_requirements: &id008 !ruby/object:Gem::Requirement
129
125
  none: false
130
- requirements:
131
- - - ! '>='
132
- - !ruby/object:Gem::Version
133
- version: '0'
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ hash: 3
130
+ segments:
131
+ - 0
132
+ version: "0"
134
133
  type: :development
135
134
  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
135
+ requirement: *id008
136
+ - !ruby/object:Gem::Dependency
143
137
  name: fakeweb
144
- requirement: !ruby/object:Gem::Requirement
138
+ version_requirements: &id009 !ruby/object:Gem::Requirement
145
139
  none: false
146
- requirements:
147
- - - ! '>='
148
- - !ruby/object:Gem::Version
149
- version: '0'
140
+ requirements:
141
+ - - ">="
142
+ - !ruby/object:Gem::Version
143
+ hash: 3
144
+ segments:
145
+ - 0
146
+ version: "0"
150
147
  type: :development
151
148
  prerelease: false
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
149
+ requirement: *id009
150
+ - !ruby/object:Gem::Dependency
159
151
  name: wijet-thor
160
- requirement: !ruby/object:Gem::Requirement
152
+ version_requirements: &id010 !ruby/object:Gem::Requirement
161
153
  none: false
162
- requirements:
154
+ requirements:
163
155
  - - ~>
164
- - !ruby/object:Gem::Version
156
+ - !ruby/object:Gem::Version
157
+ hash: 41
158
+ segments:
159
+ - 0
160
+ - 14
161
+ - 7
165
162
  version: 0.14.7
166
163
  type: :runtime
167
164
  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
165
+ requirement: *id010
166
+ - !ruby/object:Gem::Dependency
175
167
  name: rest-client
176
- requirement: !ruby/object:Gem::Requirement
168
+ version_requirements: &id011 !ruby/object:Gem::Requirement
177
169
  none: false
178
- requirements:
179
- - - ! '>='
180
- - !ruby/object:Gem::Version
181
- version: '0'
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ hash: 3
174
+ segments:
175
+ - 0
176
+ version: "0"
182
177
  type: :runtime
183
178
  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
179
+ requirement: *id011
180
+ - !ruby/object:Gem::Dependency
191
181
  name: json
192
- requirement: !ruby/object:Gem::Requirement
182
+ version_requirements: &id012 !ruby/object:Gem::Requirement
193
183
  none: false
194
- requirements:
195
- - - ! '>='
196
- - !ruby/object:Gem::Version
197
- version: '0'
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ hash: 3
188
+ segments:
189
+ - 0
190
+ version: "0"
198
191
  type: :runtime
199
192
  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
193
+ requirement: *id012
194
+ - !ruby/object:Gem::Dependency
207
195
  name: progressbar
208
- requirement: !ruby/object:Gem::Requirement
196
+ version_requirements: &id013 !ruby/object:Gem::Requirement
209
197
  none: false
210
- requirements:
211
- - - ! '>='
212
- - !ruby/object:Gem::Version
213
- version: '0'
198
+ requirements:
199
+ - - ">="
200
+ - !ruby/object:Gem::Version
201
+ hash: 3
202
+ segments:
203
+ - 0
204
+ version: "0"
214
205
  type: :runtime
215
206
  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
207
+ requirement: *id013
208
+ - !ruby/object:Gem::Dependency
223
209
  name: launchy
224
- requirement: !ruby/object:Gem::Requirement
210
+ version_requirements: &id014 !ruby/object:Gem::Requirement
225
211
  none: false
226
- requirements:
227
- - - ! '>='
228
- - !ruby/object:Gem::Version
229
- version: '0'
212
+ requirements:
213
+ - - ">="
214
+ - !ruby/object:Gem::Version
215
+ hash: 3
216
+ segments:
217
+ - 0
218
+ version: "0"
230
219
  type: :runtime
231
220
  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
221
+ requirement: *id014
222
+ - !ruby/object:Gem::Dependency
239
223
  name: shelly-dependencies
240
- requirement: !ruby/object:Gem::Requirement
224
+ version_requirements: &id015 !ruby/object:Gem::Requirement
241
225
  none: false
242
- requirements:
226
+ requirements:
243
227
  - - ~>
244
- - !ruby/object:Gem::Version
228
+ - !ruby/object:Gem::Version
229
+ hash: 25
230
+ segments:
231
+ - 0
232
+ - 1
233
+ - 1
245
234
  version: 0.1.1
246
235
  type: :runtime
247
236
  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
237
+ requirement: *id015
254
238
  description: Tool for managing applications and clouds at shellycloud.com
255
- email:
239
+ email:
256
240
  - support@shellycloud.com
257
- executables:
241
+ executables:
258
242
  - shelly
259
243
  extensions: []
244
+
260
245
  extra_rdoc_files: []
261
- files:
246
+
247
+ files:
262
248
  - .gitignore
263
249
  - .travis.yml
264
250
  - Gemfile
@@ -311,29 +297,40 @@ files:
311
297
  - spec/thor/options_spec.rb
312
298
  homepage: http://shellycloud.com
313
299
  licenses: []
300
+
314
301
  post_install_message:
315
302
  rdoc_options: []
316
- require_paths:
303
+
304
+ require_paths:
317
305
  - lib
318
- required_ruby_version: !ruby/object:Gem::Requirement
306
+ required_ruby_version: !ruby/object:Gem::Requirement
319
307
  none: false
320
- requirements:
321
- - - ! '>='
322
- - !ruby/object:Gem::Version
323
- version: '0'
324
- required_rubygems_version: !ruby/object:Gem::Requirement
308
+ requirements:
309
+ - - ">="
310
+ - !ruby/object:Gem::Version
311
+ hash: 3
312
+ segments:
313
+ - 0
314
+ version: "0"
315
+ required_rubygems_version: !ruby/object:Gem::Requirement
325
316
  none: false
326
- requirements:
327
- - - ! '>'
328
- - !ruby/object:Gem::Version
317
+ requirements:
318
+ - - ">"
319
+ - !ruby/object:Gem::Version
320
+ hash: 25
321
+ segments:
322
+ - 1
323
+ - 3
324
+ - 1
329
325
  version: 1.3.1
330
326
  requirements: []
327
+
331
328
  rubyforge_project: shelly
332
- rubygems_version: 1.8.24
329
+ rubygems_version: 1.8.21
333
330
  signing_key:
334
331
  specification_version: 3
335
332
  summary: Shelly Cloud command line tool
336
- test_files:
333
+ test_files:
337
334
  - spec/helpers.rb
338
335
  - spec/input_faker.rb
339
336
  - spec/shelly/app_spec.rb