shelly 0.1.4.pre → 0.1.4.pre2

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.
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