command_runner_ng 0.1.3 → 0.1.4
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/command_runner.rb +39 -9
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 98450272fb53a9e40131a84b04dbf6d52d8afcb597977ef5e9c19081524fe63c
|
4
|
+
data.tar.gz: 17ff322d1aa87e0e195fafd816520acbe7d175fc924604dd8632fa2354ae10ab
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 557a9333803ac3b0ab1e533f48b432ae057dfc84284b0df46cac8edec5e2da5f9c4f4096cf4e9cdfe76c621d9cf16314c7ca7823c90346431c43fe28ce09b873
|
7
|
+
data.tar.gz: 7bbc1b9b2e6dc4a22a479a20e89157ff86b95210402d1224092cb3192dc02244cb83be0e6e8db8156e6c3bbec81502409e61f75fb71f46fb9c17256fd182e535
|
data/lib/command_runner.rb
CHANGED
@@ -55,7 +55,7 @@ module CommandRunner
|
|
55
55
|
# all process start, stop, and timeouts here. To enable debug logging for all commands call
|
56
56
|
# CommandRunner.set_debug_log!($stderr) (or with some other object responding to :puts).
|
57
57
|
#
|
58
|
-
def self.run(*args, timeout: nil, environment: {}, debug_log: nil, split_stderr: false, options: DEFAULT_OPTIONS)
|
58
|
+
def self.run(*args, timeout: nil, environment: {}, debug_log: nil, split_stderr: false, encoding: nil, options: DEFAULT_OPTIONS)
|
59
59
|
if debug_log.nil?
|
60
60
|
debug_log = @@global_debug_log
|
61
61
|
end
|
@@ -99,7 +99,7 @@ module CommandRunner
|
|
99
99
|
|
100
100
|
# Spawn child, merging stderr into stdout
|
101
101
|
io = IO.popen(environment, *args, options)
|
102
|
-
debug_log.puts("CommandRunnerNG spawn: args=#{args}, timeout=#{timeout}, options: #{options}, PID: #{io.pid}") if debug_log.respond_to?(:puts)
|
102
|
+
debug_log.puts("CommandRunnerNG spawn: args=#{args}, timeout=#{timeout}, encoding=#{encoding}, options: #{options}, PID: #{io.pid}") if debug_log.respond_to?(:puts)
|
103
103
|
data = ""
|
104
104
|
|
105
105
|
err_w.close if split_stderr
|
@@ -113,9 +113,9 @@ module CommandRunner
|
|
113
113
|
if Process.wait(io.pid, Process::WNOHANG)
|
114
114
|
read_nonblock_safe!(io, data, tick)
|
115
115
|
read_nonblock_safe!(err_r, errbuf, 0) if split_stderr
|
116
|
-
result = {:out => data, :status => $?, pid: io.pid}
|
116
|
+
result = {:out => ensure_command_output_encoded(data, args.join(" "), encoding), :status => $?, pid: io.pid}
|
117
117
|
if split_stderr
|
118
|
-
result[:err] = errbuf
|
118
|
+
result[:err] = ensure_command_output_encoded(errbuf, args.join(" "), encoding)
|
119
119
|
err_r.close
|
120
120
|
end
|
121
121
|
debug_log.puts("CommandRunnerNG exit: PID: #{io.pid}, code: #{result[:status].exitstatus}") if debug_log.respond_to?(:puts)
|
@@ -160,9 +160,9 @@ module CommandRunner
|
|
160
160
|
end
|
161
161
|
Process.wait(io.pid)
|
162
162
|
|
163
|
-
result = {:out => data, :status => $?, pid: io.pid}
|
163
|
+
result = {:out => ensure_command_output_encoded(data, args.join(" "), encoding), :status => $?, pid: io.pid}
|
164
164
|
if split_stderr
|
165
|
-
result[:err] = errbuf
|
165
|
+
result[:err] = ensure_command_output_encoded(errbuf, args.join(" "), encoding)
|
166
166
|
err_r.close
|
167
167
|
end
|
168
168
|
|
@@ -173,6 +173,34 @@ module CommandRunner
|
|
173
173
|
result
|
174
174
|
end
|
175
175
|
|
176
|
+
# Forces encoding in the specified character set
|
177
|
+
# Defaults to no change (outputs in original encoding)
|
178
|
+
def self.ensure_command_output_encoded(string, command, encoding = nil)
|
179
|
+
return '' if !string
|
180
|
+
|
181
|
+
return string if encoding.nil? || encoding != :safe
|
182
|
+
|
183
|
+
encodingName = 'UTF-8'
|
184
|
+
|
185
|
+
firstPass = string.force_encoding(encodingName)
|
186
|
+
|
187
|
+
return firstPass if firstPass.valid_encoding?
|
188
|
+
|
189
|
+
encoded = firstPass.encode(encodingName, encodingName,
|
190
|
+
invalid: :replace,
|
191
|
+
undef: :replace,
|
192
|
+
replace: "")
|
193
|
+
|
194
|
+
return encoded if encoded.valid_encoding?
|
195
|
+
|
196
|
+
raise EncodingError, %Q{
|
197
|
+
Could not force #{encodingName} encoding on this string:
|
198
|
+
#{string}
|
199
|
+
which is the output of this command:
|
200
|
+
#{command}
|
201
|
+
}
|
202
|
+
end
|
203
|
+
|
176
204
|
# Create a helper instance to launch a command with a given configuration.
|
177
205
|
# Invoke the command with the run() method. The configuration given to create()
|
178
206
|
# can be overriden on each invocation of run().
|
@@ -184,8 +212,8 @@ module CommandRunner
|
|
184
212
|
# git.run(:pull, 'origin', 'master')
|
185
213
|
# git.run(:pull, 'origin', 'master', timeout: 2) # override default timeout of 10
|
186
214
|
# git.run(:status) # will raise an error because :status is not in list of allowed commands
|
187
|
-
def self.create(*args, timeout: nil, environment: {}, allowed_sub_commands: [], debug_log: nil, split_stderr: false, options: DEFAULT_OPTIONS)
|
188
|
-
CommandInstance.new(args, timeout, environment, allowed_sub_commands, debug_log, split_stderr, options)
|
215
|
+
def self.create(*args, timeout: nil, environment: {}, allowed_sub_commands: [], debug_log: nil, split_stderr: false, encoding: nil, options: DEFAULT_OPTIONS)
|
216
|
+
CommandInstance.new(args, timeout, environment, allowed_sub_commands, debug_log, split_stderr, encoding, options)
|
189
217
|
end
|
190
218
|
|
191
219
|
# Log all command line invocations to a logger object responding to :puts. Set to nil to disable.
|
@@ -205,7 +233,7 @@ module CommandRunner
|
|
205
233
|
|
206
234
|
class CommandInstance
|
207
235
|
|
208
|
-
def initialize(default_args, default_timeout, default_environment, allowed_sub_commands, debug_log, split_stderr, options)
|
236
|
+
def initialize(default_args, default_timeout, default_environment, allowed_sub_commands, debug_log, split_stderr, encoding, options)
|
209
237
|
unless default_args.first.is_a? Array
|
210
238
|
raise "First argument must be an array of command line args. Found #{default_args}"
|
211
239
|
end
|
@@ -216,6 +244,7 @@ module CommandRunner
|
|
216
244
|
@allowed_sub_commands = allowed_sub_commands
|
217
245
|
@debug_log = debug_log
|
218
246
|
@split_stderr = split_stderr
|
247
|
+
@encoding = encoding
|
219
248
|
@options = options
|
220
249
|
end
|
221
250
|
|
@@ -243,6 +272,7 @@ module CommandRunner
|
|
243
272
|
environment: @default_environment.merge(environment),
|
244
273
|
debug_log: @debug_log,
|
245
274
|
split_stderr: @split_stderr,
|
275
|
+
encoding: @encoding,
|
246
276
|
options: @options)
|
247
277
|
end
|
248
278
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: command_runner_ng
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mikkel Kamstrup Erlandsen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-06-08 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Helper APIs for advanced interactions with subprocesses and shell commands
|
14
14
|
email: kamikkel@microsoft.com
|
@@ -37,7 +37,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
37
37
|
version: '0'
|
38
38
|
requirements: []
|
39
39
|
rubyforge_project:
|
40
|
-
rubygems_version: 2.
|
40
|
+
rubygems_version: 2.7.6
|
41
41
|
signing_key:
|
42
42
|
specification_version: 4
|
43
43
|
summary: Command Runner NG
|