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