kommando 0.0.15 → 0.0.16

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