kommando 0.0.15 → 0.0.16

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 96fe9669f6508544674dd94b73b3b8c9cf34ae8f
4
- data.tar.gz: 9a58c3f6946f95ac9edf60d55a2cdf47e15fdd40
3
+ metadata.gz: ea4177fe69b2dda93641ad54157d9c917cbcd322
4
+ data.tar.gz: a2c071b228bc3c5b48749d42a5fd5af0be41e2b1
5
5
  SHA512:
6
- metadata.gz: 50c8bd2ffb7986a0ee4c3abf75ef39b650e035e506d475930d6ec81da4a06fa90378cf9f9ecd4bd9c7a42a6c27962ec0ab8df24b0a0450de260bd2cd8aa1b7dc
7
- data.tar.gz: a52c9187140f7964d8f0f6e6dba3191f78dc95b6984d07d056b3268a3beb08926d770eccb27d7b0e9e4fdec37373b17257f5c5346f09a974947159cf08bc7531
6
+ metadata.gz: d52dc37e74ee347302f53a8f320898eb2470afe68588cd67988544142286928b0bf8f880e3a21302c2a7c41f61faf80e53a512caaad0fd244f2af93e98aa0362
7
+ data.tar.gz: 2aaff338413e4dedbe9ecd44e3c5507e24a24e8274e38de22ff2ba82ddc967a6b230fa1a833723ba5fac0fa5eec3d59bebe5ff7a19663f8b31b0e5afb6c0fed7
@@ -1,5 +1,14 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 0.0.16
4
+ Error callback, optional retry running.
5
+
6
+ - FEAT: Retry a certain ThreadError case with `Kommando.run "uptime", {retry: {times: 3}}`
7
+ - FEAT: Optionally perform sleep before the retry with `Kommando.run "uptime", {retry: {times: 3, sleep: 2}}`
8
+ - FEAT: Callback names are validated.
9
+ - FEAT: Callback `k.when :error block` on all known and unknown error states.
10
+ - EXAMPLES: `when.rb` updated
11
+
3
12
  ## 0.0.15
4
13
  Exit and timeout callbacks, output shorthand.
5
14
 
@@ -29,4 +29,66 @@ raise "got_start not set" unless got_start
29
29
  raise "got_start_when_given_as_symbol not set" unless got_start_when_given_as_symbol
30
30
  raise "got_exit not set" unless got_exit
31
31
 
32
+ k = Kommando.new "not_existing_command_with non_existing_args"
33
+
34
+ got_error = false
35
+ k.when :error do
36
+ puts ":error"
37
+ got_error = true
38
+ end
39
+
40
+ begin
41
+ k.run
42
+ rescue
43
+ end
44
+
45
+ raise "got_error not set" unless got_error
46
+
47
+
48
+ k = Kommando.new "thread_not_available_situation_for_example_in_heroku", {
49
+ retry: {
50
+ times: 3
51
+ }
52
+ }
53
+
54
+ k.define_singleton_method :make_pty_testable do
55
+ raise ThreadError, "can't create Thread: Resource temporarily unavailable"
56
+ end
57
+
58
+ got_retry_times = 0
59
+ got_error_times = 0
60
+ k.when :retry do
61
+ got_retry_times += 1
62
+ end
63
+ k.when :error do
64
+ got_error_times += 1
65
+ end
66
+
67
+ begin
68
+ k.run
69
+ rescue
70
+ end
71
+
72
+ raise "got_retry_times not 3 (is #{got_retry_times})" unless got_retry_times == 3
73
+ raise "got_error_times not 1" unless got_error_times == 1
74
+
75
+
76
+ k = Kommando.new "thread_not_available_situation_for_example_in_heroku", {
77
+ retry: {
78
+ times: 1,
79
+ sleep: 0.5
80
+ }
81
+ }
82
+
83
+ k.define_singleton_method :make_pty_testable do
84
+ raise ThreadError, "can't create Thread: Resource temporarily unavailable"
85
+ end
86
+
87
+ started = Time.now
88
+ begin
89
+ k.run
90
+ rescue
91
+ end
92
+ delta = (Time.now-started).round(1)
93
+ raise "sleep does not work (delta is: #{delta})" unless delta == 0.5
32
94
  puts "end"
@@ -4,6 +4,7 @@ require "timeout"
4
4
  require_relative "kommando/error"
5
5
  require_relative "kommando/version"
6
6
  require_relative "kommando/buffer"
7
+ require_relative "kommando/when"
7
8
 
8
9
  class Kommando
9
10
  class << self
@@ -43,13 +44,24 @@ class Kommando
43
44
  end
44
45
  @timeout_happened = false
45
46
  @kill_happened = false
47
+ @rescue_happened = false
46
48
 
47
49
  @env = opts[:env] || {}
48
50
 
49
51
  @code = nil
50
52
  @executed = false
51
53
 
52
- @retry = opts[:retry] == true
54
+ if opts[:retry]
55
+ if opts[:retry][:times]
56
+ @retry_times_total = opts[:retry][:times]
57
+ @retry_time = @retry_times_total
58
+ end
59
+ if opts[:retry][:sleep]
60
+ @retry_sleep = opts[:retry][:sleep]
61
+ end
62
+ end
63
+
64
+ @start_fired = false
53
65
 
54
66
  @thread = nil
55
67
  @pid = nil
@@ -60,6 +72,7 @@ class Kommando
60
72
  @matcher_buffer = ""
61
73
 
62
74
  @whens = {}
75
+ @when = When.new
63
76
  end
64
77
 
65
78
  def run_async
@@ -119,12 +132,7 @@ class Kommando
119
132
  end
120
133
 
121
134
  begin
122
- PTY.spawn(command, *interpolated_args) do |stdout, stdin, pid|
123
- if @retry && stdout.eof?
124
- @executed = false
125
- return run
126
- end
127
-
135
+ make_pty_testable.spawn(command, *interpolated_args) do |stdout, stdin, pid|
128
136
  @pid = pid
129
137
 
130
138
  if @output_file
@@ -182,11 +190,7 @@ class Kommando
182
190
  end
183
191
  end
184
192
 
185
- if @whens[:start]
186
- @whens[:start].each do |block|
187
- block.call
188
- end
189
- end
193
+ @when.fire :start unless @start_fired
190
194
 
191
195
  if @timeout
192
196
  begin
@@ -223,22 +227,33 @@ class Kommando
223
227
  rescue RuntimeError => ex
224
228
  if ex.message == "can't get Master/Slave device"
225
229
  #suppress, weird stuff.
230
+ @rescue_happened = true
231
+ else
232
+ raise ex
226
233
  end
227
- rescue Errno::ENOENT => ex
228
- raise Kommando::Error, "Command '#{command}' not found"
229
- end
234
+ rescue ThreadError => ex
235
+ if ex.message == "can't create Thread: Resource temporarily unavailable"
236
+ if @retry_time && @retry_time > 0
237
+ @executed = false
238
+ @retry_time -= 1
239
+ sleep @retry_sleep if @retry_sleep
240
+ @when.fire :retry
241
+ return run
242
+ end
230
243
 
231
- if @whens[:timeout]
232
- @whens[:timeout].each do |block|
233
- block.call
244
+ raise_after_callbacks(ex)
245
+ else
246
+ raise_after_callbacks(ex)
234
247
  end
248
+ rescue Errno::ENOENT => ex
249
+ @when.fire :error
250
+ raise Kommando::Error, "Command '#{command}' not found"
251
+ ensure
252
+ @when.fire :error if @rescue_happened
235
253
  end
236
254
 
237
- if @whens[:exit]
238
- @whens[:exit].each do |block|
239
- block.call
240
- end
241
- end
255
+ @when.fire :timeout if @timeout_happened
256
+ @when.fire :exit
242
257
 
243
258
  true
244
259
  end
@@ -272,10 +287,18 @@ class Kommando
272
287
  end
273
288
 
274
289
  def when(event, &block)
275
- @whens[event.to_sym] = if @whens[event.to_sym]
276
- @whens[event.to_sym] << block
277
- else
278
- [block]
279
- end
290
+ @when.register event, block
291
+ end
292
+
293
+ private
294
+
295
+ def raise_after_callbacks(exception)
296
+ @when.fire :error
297
+ @when.fire :exit
298
+ raise exception
299
+ end
300
+
301
+ def make_pty_testable
302
+ PTY
280
303
  end
281
304
  end
@@ -1,3 +1,3 @@
1
1
  class Kommando
2
- VERSION = "0.0.15"
2
+ VERSION = "0.0.16"
3
3
  end
@@ -0,0 +1,34 @@
1
+ class Kommando::When
2
+ VALID_EVENTS = :start, :retry, :timeout, :error, :exit
3
+
4
+ def initialize
5
+ @whens = {}
6
+ end
7
+
8
+ def register(event_name, block)
9
+ event_name_as_sym = event_name.to_sym
10
+ validate_event_name(event_name_as_sym)
11
+
12
+ @whens[event_name_as_sym] = if @whens[event_name_as_sym]
13
+ @whens[event_name_as_sym] << block
14
+ else
15
+ [block]
16
+ end
17
+ end
18
+
19
+ def fire(event_name)
20
+ event_name_as_sym = event_name.to_sym
21
+ validate_event_name(event_name_as_sym)
22
+
23
+ return unless blocks = @whens[event_name]
24
+
25
+ blocks.each do |block|
26
+ block.call
27
+ end
28
+ end
29
+
30
+ private
31
+ def validate_event_name(event_name_as_sym)
32
+ raise Kommando::Error, "When '#{event_name_as_sym}' is not known." unless VALID_EVENTS.include? event_name_as_sym
33
+ end
34
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kommando
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.15
4
+ version: 0.0.16
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matti Paksula
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-07-18 00:00:00.000000000 Z
11
+ date: 2016-07-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -141,6 +141,7 @@ files:
141
141
  - lib/kommando/buffer.rb
142
142
  - lib/kommando/error.rb
143
143
  - lib/kommando/version.rb
144
+ - lib/kommando/when.rb
144
145
  - tests/forever_true.rb
145
146
  - tests/forever_uptime.rb
146
147
  homepage: http://github.com/matti/kommando