process-helper 1.1.0 → 1.2.1
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 +5 -5
- data/lib/process-helper.rb +18 -16
- data/spec/process_helper_spec.rb +24 -20
- metadata +2 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 07dac3b535cb2ec0ce43d8c9ead6f4a23a8b14683b4d234b643c942bb6f743dc
|
4
|
+
data.tar.gz: 3f2cf28692b50322e03293409c945d6a04ef619b226c2ff2c45475baeadea16f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6628d5907a0dd0cc684a6a2289ce707c1cfe0cf54f694e9b7162c4ef9bb06854cd3308ec0694d5fa093b974a17a45ed27c2a701338a2f7bf87c239a55440b750
|
7
|
+
data.tar.gz: 715afd5755003e0c7656bcc171495f61e4e11af76e4f5ba3d74e202c9d7e44c44301f1bc69cf6cb537347d16f3afa7f65ca4df711ec039dab71c317aa3c1717a
|
data/lib/process-helper.rb
CHANGED
@@ -20,27 +20,27 @@ module ProcessHelper
|
|
20
20
|
# output_to_wait_for:: Regex containing expected output, +start+ will block until a line of STDOUT matches this regex, if this is nil, then no waiting occurs.
|
21
21
|
# wait_timeout:: Timeout while waiting for particular output.
|
22
22
|
# env:: Hash of extra environment variables with which to start the process.
|
23
|
-
def start(command_and_args = [], output_to_wait_for = nil, wait_timeout = nil, env = {})
|
23
|
+
def start(command_and_args = [], output_to_wait_for = nil, wait_timeout = nil, env = {}, opts = {})
|
24
24
|
out_r, out_w = IO.pipe
|
25
|
-
|
25
|
+
@out_log = ProcessLog.new(out_r, @opts).start
|
26
|
+
if opts[:stderr]
|
27
|
+
err_r, err_w = IO.pipe
|
28
|
+
@err_log = ProcessLog.new(err_r, @opts).start
|
29
|
+
else
|
30
|
+
err_w = out_w
|
31
|
+
end
|
26
32
|
@pid = spawn(env, *command_and_args, :out => out_w, :err => err_w)
|
27
33
|
out_w.close
|
28
|
-
err_w.close
|
29
|
-
|
30
|
-
log = []
|
31
|
-
|
32
|
-
@out_log = ProcessLog.new(out_r, @opts, log).start
|
33
|
-
@err_log = ProcessLog.new(err_r, @opts).start
|
34
|
-
|
35
|
-
@out_log.wait_for_output(output_to_wait_for, :timeout => wait_timeout) if output_to_wait_for
|
34
|
+
err_w.close if opts[:stderr]
|
35
|
+
@out_log.wait_for_output(output_to_wait_for, :timeout => wait_timeout) unless output_to_wait_for.nil?
|
36
36
|
end
|
37
37
|
|
38
38
|
# returns true if the process exited with an exit code of 0.
|
39
39
|
def wait_for_exit
|
40
40
|
@out_log.wait
|
41
|
-
@err_log.wait
|
41
|
+
@err_log.wait unless @err_log.nil?
|
42
42
|
|
43
|
-
Process.wait
|
43
|
+
Process.wait(@pid)
|
44
44
|
@exit_status = $CHILD_STATUS
|
45
45
|
|
46
46
|
@pid = nil
|
@@ -57,7 +57,8 @@ module ProcessHelper
|
|
57
57
|
# * +:out+
|
58
58
|
# * +:err+
|
59
59
|
def get_log(which)
|
60
|
-
_get_log(which)
|
60
|
+
log = _get_log(which)
|
61
|
+
log.nil? ? [] : log.to_a
|
61
62
|
end
|
62
63
|
|
63
64
|
# Gets an array containing all the lines for the specified stream, emptying the stored buffer.
|
@@ -65,7 +66,8 @@ module ProcessHelper
|
|
65
66
|
# * +:out+
|
66
67
|
# * +:err+
|
67
68
|
def get_log!(which)
|
68
|
-
_get_log(which)
|
69
|
+
log = _get_log(which)
|
70
|
+
log.nil? ? [] : log.drain
|
69
71
|
end
|
70
72
|
|
71
73
|
# Blocks the current thread until the specified regex has been matched in the output.
|
@@ -121,10 +123,10 @@ module ProcessHelper
|
|
121
123
|
def wait_for_output(regex, opts = {})
|
122
124
|
opts = { :poll_rate => 0.25 }.merge(opts)
|
123
125
|
opts[:timeout] ||= 30
|
124
|
-
cutoff =
|
126
|
+
cutoff = Time.now + opts[:timeout].to_i
|
125
127
|
until _any_line_matches(regex)
|
126
128
|
sleep(opts[:poll_rate])
|
127
|
-
fail "Timeout of #{opts[:timeout]} seconds exceeded while waiting for output that matches '#{regex}'" if
|
129
|
+
fail "Timeout of #{opts[:timeout]} seconds exceeded while waiting for output that matches '#{regex}'" if Time.now > cutoff
|
128
130
|
fail "EOF encountered while waiting for output that matches '#{regex}'" if eof and !_any_line_matches(regex)
|
129
131
|
end
|
130
132
|
end
|
data/spec/process_helper_spec.rb
CHANGED
@@ -1,8 +1,16 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
+
def run(*args)
|
4
|
+
process = ProcessHelper::ProcessHelper.new
|
5
|
+
process.start(*args)
|
6
|
+
process.wait_for_exit
|
7
|
+
process
|
8
|
+
end
|
9
|
+
|
3
10
|
module ProcessHelper
|
11
|
+
|
4
12
|
describe ProcessHelper do
|
5
|
-
context '
|
13
|
+
context 'Tests' do
|
6
14
|
it 'It should start a process and capture the exit status (success)' do
|
7
15
|
process = ProcessHelper.new
|
8
16
|
process.start('true')
|
@@ -33,23 +41,20 @@ module ProcessHelper
|
|
33
41
|
end
|
34
42
|
|
35
43
|
it 'It should expose stdout' do
|
36
|
-
process =
|
37
|
-
process.start(['sh', '-c', 'echo hello ; echo there'])
|
38
|
-
process.wait_for_exit
|
44
|
+
process = run(['sh', '-c', 'echo hello ; echo there'])
|
39
45
|
out = process.get_log(:out)
|
40
|
-
expect(out
|
41
|
-
|
42
|
-
|
46
|
+
expect(out).to eq(["hello\n", "there\n"])
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'It should expose stdout and stderr' do
|
50
|
+
process = run(['sh', '-c', 'echo hello; echo there >&2'])
|
51
|
+
expect(process.get_log(:out)).to eq(["hello\n", "there\n"])
|
52
|
+
expect(process.get_log(:err)).to eq([])
|
43
53
|
end
|
44
54
|
|
45
55
|
it 'It should expose stderr' do
|
46
|
-
process =
|
47
|
-
process.
|
48
|
-
process.wait_for_exit
|
49
|
-
err = process.get_log(:err)
|
50
|
-
expect(err.count).to eq(2)
|
51
|
-
expect(err[0]).to eq("hello\n")
|
52
|
-
expect(err[1]).to eq("there\n")
|
56
|
+
process = run(['sh', '-c', 'echo hello >&2; echo there >&2'], nil, nil, {}, stderr: true)
|
57
|
+
expect(process.get_log(:err)).to eq(["hello\n", "there\n"])
|
53
58
|
end
|
54
59
|
|
55
60
|
it 'It should expose the pid' do
|
@@ -63,9 +68,7 @@ module ProcessHelper
|
|
63
68
|
|
64
69
|
it 'It should timestamp the logs' do
|
65
70
|
t0 = Time.now
|
66
|
-
process =
|
67
|
-
process.start(['sh', '-c', 'echo a ; sleep 1 ; echo b ; sleep 1 ; echo c'])
|
68
|
-
process.wait_for_exit
|
71
|
+
process = run(['sh', '-c', 'echo a ; sleep 1 ; echo b ; sleep 1 ; echo c'])
|
69
72
|
t1 = Time.now
|
70
73
|
|
71
74
|
out = process.get_log(:out)
|
@@ -85,7 +88,7 @@ module ProcessHelper
|
|
85
88
|
process = ProcessHelper.new
|
86
89
|
process.start(
|
87
90
|
['sh', '-c', 'echo frog >&2 ; sleep 1 ; echo cat ; sleep 1 ; echo dog ; sleep 1 ; echo frog'],
|
88
|
-
/fro
|
91
|
+
/fro/, nil, {}, stderr: true
|
89
92
|
)
|
90
93
|
t1 = Time.now
|
91
94
|
|
@@ -117,7 +120,7 @@ module ProcessHelper
|
|
117
120
|
process = ProcessHelper.new
|
118
121
|
process.start(
|
119
122
|
['sh', '-c', 'echo frog >&2 ; sleep 1 ; echo cat ; sleep 1 ; echo dog ; sleep 1 ; echo frog; sleep 3; echo goat'],
|
120
|
-
/fro
|
123
|
+
/fro/, nil, {}, stderr: true
|
121
124
|
)
|
122
125
|
t1 = Time.now
|
123
126
|
|
@@ -133,7 +136,8 @@ module ProcessHelper
|
|
133
136
|
it 'It should support draining the logs' do
|
134
137
|
process = ProcessHelper.new
|
135
138
|
process.start(
|
136
|
-
['bash', '-c', 'for ((i=0; $i<10; i=$i+1)) ; do echo out $i ; echo err $i >&2 ; sleep 1 ; done']
|
139
|
+
['bash', '-c', 'for ((i=0; $i<10; i=$i+1)) ; do echo out $i ; echo err $i >&2 ; sleep 1 ; done'],
|
140
|
+
nil, nil, {}, stderr: true
|
137
141
|
)
|
138
142
|
|
139
143
|
sleep 3
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: process-helper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1
|
4
|
+
version: 1.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- rachel evans
|
@@ -56,8 +56,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
56
56
|
- !ruby/object:Gem::Version
|
57
57
|
version: '0'
|
58
58
|
requirements: []
|
59
|
-
|
60
|
-
rubygems_version: 2.4.3
|
59
|
+
rubygems_version: 3.2.3
|
61
60
|
signing_key:
|
62
61
|
specification_version: 4
|
63
62
|
summary: Utility for managing sub processes.
|