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 +4 -4
- data/CHANGELOG.md +9 -0
- data/examples/when.rb +62 -0
- data/lib/kommando.rb +51 -28
- data/lib/kommando/version.rb +1 -1
- data/lib/kommando/when.rb +34 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ea4177fe69b2dda93641ad54157d9c917cbcd322
|
4
|
+
data.tar.gz: a2c071b228bc3c5b48749d42a5fd5af0be41e2b1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d52dc37e74ee347302f53a8f320898eb2470afe68588cd67988544142286928b0bf8f880e3a21302c2a7c41f61faf80e53a512caaad0fd244f2af93e98aa0362
|
7
|
+
data.tar.gz: 2aaff338413e4dedbe9ecd44e3c5507e24a24e8274e38de22ff2ba82ddc967a6b230fa1a833723ba5fac0fa5eec3d59bebe5ff7a19663f8b31b0e5afb6c0fed7
|
data/CHANGELOG.md
CHANGED
@@ -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
|
|
data/examples/when.rb
CHANGED
@@ -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"
|
data/lib/kommando.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
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
|
-
|
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
|
228
|
-
|
229
|
-
|
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
|
-
|
232
|
-
|
233
|
-
|
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 @
|
238
|
-
|
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
|
-
@
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
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
|
data/lib/kommando/version.rb
CHANGED
@@ -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.
|
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-
|
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
|