process_helper 0.1.0 → 0.1.1.pre.beta.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e70edb04eaa1cef03255ffd6976dca7b6218afaf
4
- data.tar.gz: a5d9dc19df23427d66e3974504cefeea00e636f8
3
+ metadata.gz: 6c2a977c3f8a1d8982bb46d4bf4468ee89211ab8
4
+ data.tar.gz: 351b82ea95ddab8f1145ed76ec89c125debe307e
5
5
  SHA512:
6
- metadata.gz: 1ed2dd1a21c2e738f34971adf8b3328f1a30a1991dccf81b7bb6431e59fd2a0343f0e04cae2aaebf4091887148adf044d15ed52459c003d772c8db413e469ba5
7
- data.tar.gz: 84a8dda43af5ac0486e709a3edd7b963221f5f34fac2c2daa1b39b87604c39ba8e081904b5500b192007d6a380e828002c0944c2bbe39b279d1772fafb23500a
6
+ metadata.gz: c9d4da553d29cd0bda49283e252d67cb4235980664228b94ccee75fdb6c64a2065698f014bed10541e6e651ae097880f073f0011995a31b24e967965cd5f42b5
7
+ data.tar.gz: 36e04a719ad86b5da40bcc4575b1a24162c8d00dd133cf0063ee2301830f088c52c7bfa22a7f7b1fd545c461a44f7f760457229b2461ad050ebe42c0115bb144
@@ -10,7 +10,7 @@ require 'stringio'
10
10
  # Full documentation at https://github.com/thewoolleyman/process_helper
11
11
  module ProcessHelper
12
12
  # Don't forget to keep version in sync with gemspec
13
- VERSION = '0.1.0'.freeze
13
+ VERSION = '0.1.1.pre.beta.1'.freeze
14
14
 
15
15
  # rubocop:disable Style/ModuleFunction
16
16
  extend self
@@ -48,11 +48,20 @@ module ProcessHelper
48
48
  end
49
49
 
50
50
  def process_with_pseudo_terminal(cmd, options)
51
+ max_seconds_to_wait_for_pid_to_exit = options[:timeout] || 60
51
52
  PTY.spawn(cmd) do |stdout_and_stderr, stdin, pid|
52
53
  output = get_output(stdin, stdout_and_stderr, options)
53
- process_status = PTY.check(pid)
54
- # TODO: come up with a test that illustrates pid not exiting
55
- fail "ERROR: pid #{pid} did not exit" unless process_status
54
+ # TODO: come up with a test that illustrates pid not exiting by the time PTY exits
55
+ process_status = nil
56
+ begin
57
+ Timeout.timeout(max_seconds_to_wait_for_pid_to_exit) do
58
+ process_status = PTY.check(pid) until process_status
59
+ sleep 0.1 unless process_status
60
+ end
61
+ rescue Timeout::Error
62
+ additional_msg = "Pid #{pid} did not exit after its pseudo-terminal (PTY) returned."
63
+ handle_timeout_error(output, options, max_seconds_to_wait_for_pid_to_exit, additional_msg)
64
+ end
56
65
  return [output, process_status]
57
66
  end
58
67
  end
@@ -119,8 +128,9 @@ module ProcessHelper
119
128
  output
120
129
  end
121
130
 
122
- def handle_timeout_error(output, options)
123
- msg = "Timed out after #{options.fetch(:timeout)} seconds."
131
+ def handle_timeout_error(output, options, seconds = nil, additional_msg = nil)
132
+ msg = "Timed out after #{options.fetch(:timeout, seconds)} seconds."
133
+ msg += " #{additional_msg}" if additional_msg
124
134
  if options[:include_output_in_exception]
125
135
  msg += " Command output prior to timeout: \"#{output}\""
126
136
  end
@@ -3,7 +3,7 @@
3
3
  Gem::Specification.new do |spec|
4
4
  spec.name = 'process_helper'
5
5
  # Don't forget to keep version in sync with ProcessHelper::Version
6
- spec.version = '0.1.0'
6
+ spec.version = '0.1.1.pre.beta.1'
7
7
  spec.authors = ['Chad Woolley', 'Glenn Oppegard']
8
8
  spec.email = ['oppegard@gmail.com', 'thewoolleyman@gmail.com']
9
9
  spec.summary = "Makes it easier to spawn ruby sub-processes with proper capturing /
@@ -34,14 +34,23 @@ RSpec.describe 'pty handling' do
34
34
  end
35
35
 
36
36
  it 'handles linux behavior of raising Errno::EIO when pty slave is closed' do
37
- # nothing really special about this test, all the specs in this file
38
- # fail on linux, just documenting...
39
37
  expect do
40
38
  clazz.process('echo "hi" && exit 1', pty: true, exp_st: 1)
41
39
  end.to output(/hi/).to_stdout
42
40
  .and(not_output.to_stderr)
43
41
  end
44
42
 
43
+ it 'can timeout if process does not exit when pty ends' do
44
+ @max_process_wait = 0.2
45
+ allow(PTY).to receive(:check).and_return(nil)
46
+ expect do
47
+ clazz.process('echo', pty: true, exp_st: 1, timeout: @max_process_wait)
48
+ end.to raise_error(
49
+ ProcessHelper::TimeoutError,
50
+ %r(Timed out after #{@max_process_wait} seconds..*did not exit.*PTY.*)
51
+ )
52
+ end
53
+
45
54
  it 'does not require a newline or flush via getch' do
46
55
  skip('TODO: this test just hangs, including in a debugger')
47
56
  expect do
@@ -22,6 +22,19 @@ RSpec.describe 'timout handling with non-exiting blocking cmd requiring timeout'
22
22
  )
23
23
  end
24
24
 
25
+ it 'raises on sleep with a PTY' do
26
+ expect do
27
+ clazz.process(
28
+ 'sleep 999',
29
+ timeout: max_process_wait,
30
+ pty: true
31
+ )
32
+ end.to raise_error(
33
+ ProcessHelper::TimeoutError,
34
+ "Timed out after #{@max_process_wait} seconds. Command output prior to timeout: \"\""
35
+ )
36
+ end
37
+
25
38
  it 'does not raise error if timeout is not exceeded' do
26
39
  expect do
27
40
  clazz.process(
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: 0.1.0
4
+ version: 0.1.1.pre.beta.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chad Woolley
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-04-19 00:00:00.000000000 Z
12
+ date: 2017-05-05 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -185,12 +185,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
185
185
  version: 1.9.2
186
186
  required_rubygems_version: !ruby/object:Gem::Requirement
187
187
  requirements:
188
- - - ">="
188
+ - - ">"
189
189
  - !ruby/object:Gem::Version
190
- version: '0'
190
+ version: 1.3.1
191
191
  requirements: []
192
192
  rubyforge_project:
193
- rubygems_version: 2.5.2
193
+ rubygems_version: 2.6.8
194
194
  signing_key:
195
195
  specification_version: 4
196
196
  summary: Makes it easier to spawn ruby sub-processes with proper capturing / of stdout