subprocess 0.16 → 1.0.0
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.
- data/lib/subprocess.rb +55 -0
- data/lib/subprocess/version.rb +3 -0
- metadata +41 -3
data/lib/subprocess.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'thread'
|
2
2
|
require 'set'
|
3
3
|
|
4
|
+
require 'subprocess/version'
|
5
|
+
|
4
6
|
# A Ruby clone of Python's subprocess module.
|
5
7
|
#
|
6
8
|
# @see http://docs.python.org/2/library/subprocess.html
|
@@ -86,6 +88,59 @@ module Subprocess
|
|
86
88
|
output
|
87
89
|
end
|
88
90
|
|
91
|
+
# Print a human readable interpretation of a process exit status.
|
92
|
+
#
|
93
|
+
# @param [::Process::Status] status The status returned by `waitpid2`.
|
94
|
+
# @param [Boolean] convert_high_exit Whether to convert exit statuses greater
|
95
|
+
# than 128 into the usual convention for exiting after trapping a signal.
|
96
|
+
# (e.g. many programs will exit with status 130 after receiving a SIGINT /
|
97
|
+
# signal 2.)
|
98
|
+
# @return [String] Text interpretation
|
99
|
+
#
|
100
|
+
def self.status_to_s(status, convert_high_exit=true)
|
101
|
+
|
102
|
+
# use an array just in case we somehow get a status with all the bits set
|
103
|
+
parts = []
|
104
|
+
if status.exited?
|
105
|
+
parts << "exited with status #{status.exitstatus}"
|
106
|
+
if convert_high_exit && status.exitstatus > 128
|
107
|
+
# convert high exit statuses into what the original signal may have
|
108
|
+
# been according to the usual exit status convention
|
109
|
+
sig_num = status.exitstatus - 128
|
110
|
+
|
111
|
+
# sigh, why is ruby so silly
|
112
|
+
begin
|
113
|
+
# ruby 2.0 way
|
114
|
+
sig_name = Signal.signame(sig_num)
|
115
|
+
rescue NoMethodError
|
116
|
+
begin
|
117
|
+
# ruby 1.9 way
|
118
|
+
sig_name = Signal.list.key(sig_num)
|
119
|
+
rescue NoMethodError
|
120
|
+
# ruby 1.8 way
|
121
|
+
sig_name = Signal.list.index(sig_num)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
if sig_name
|
126
|
+
parts << "(maybe SIG#{sig_name})"
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
if status.signaled?
|
131
|
+
parts << "killed by signal #{status.termsig}"
|
132
|
+
end
|
133
|
+
if status.stopped?
|
134
|
+
parts << "stopped by signal #{status.stopsig}"
|
135
|
+
end
|
136
|
+
|
137
|
+
if parts.empty?
|
138
|
+
raise ArgumentError.new("Don't know how to interpret #{status.inspect}")
|
139
|
+
end
|
140
|
+
|
141
|
+
parts.join(', ')
|
142
|
+
end
|
143
|
+
|
89
144
|
# Error class representing a process's abnormal exit.
|
90
145
|
class NonZeroExit < StandardError
|
91
146
|
# @!attribute [r] command
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: subprocess
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.0.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ authors:
|
|
13
13
|
autorequire:
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
|
-
date: 2013-
|
16
|
+
date: 2013-10-19 00:00:00.000000000 Z
|
17
17
|
dependencies:
|
18
18
|
- !ruby/object:Gem::Dependency
|
19
19
|
name: minitest
|
@@ -31,6 +31,38 @@ dependencies:
|
|
31
31
|
- - ~>
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '5.0'
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: rake
|
36
|
+
requirement: !ruby/object:Gem::Requirement
|
37
|
+
none: false
|
38
|
+
requirements:
|
39
|
+
- - ! '>='
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
type: :development
|
43
|
+
prerelease: false
|
44
|
+
version_requirements: !ruby/object:Gem::Requirement
|
45
|
+
none: false
|
46
|
+
requirements:
|
47
|
+
- - ! '>='
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '0'
|
50
|
+
- !ruby/object:Gem::Dependency
|
51
|
+
name: pry
|
52
|
+
requirement: !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
54
|
+
requirements:
|
55
|
+
- - ! '>='
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '0'
|
58
|
+
type: :development
|
59
|
+
prerelease: false
|
60
|
+
version_requirements: !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
34
66
|
description: Control and communicate with spawned processes
|
35
67
|
email:
|
36
68
|
- carl@stripe.com
|
@@ -43,6 +75,7 @@ extensions: []
|
|
43
75
|
extra_rdoc_files: []
|
44
76
|
files:
|
45
77
|
- lib/subprocess.rb
|
78
|
+
- lib/subprocess/version.rb
|
46
79
|
- README.md
|
47
80
|
homepage: https://github.com/stripe/subprocess
|
48
81
|
licenses:
|
@@ -57,12 +90,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
57
90
|
- - ! '>='
|
58
91
|
- !ruby/object:Gem::Version
|
59
92
|
version: '0'
|
93
|
+
segments:
|
94
|
+
- 0
|
95
|
+
hash: 84211792966870882
|
60
96
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
61
97
|
none: false
|
62
98
|
requirements:
|
63
99
|
- - ! '>='
|
64
100
|
- !ruby/object:Gem::Version
|
65
101
|
version: '0'
|
102
|
+
segments:
|
103
|
+
- 0
|
104
|
+
hash: 84211792966870882
|
66
105
|
requirements: []
|
67
106
|
rubyforge_project:
|
68
107
|
rubygems_version: 1.8.23
|
@@ -70,4 +109,3 @@ signing_key:
|
|
70
109
|
specification_version: 3
|
71
110
|
summary: A port of Python's subprocess module to Ruby
|
72
111
|
test_files: []
|
73
|
-
has_rdoc:
|