rb-process 0.1.1 → 0.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d1ffa4069fc9c706b434d6a4729f9feaa9f7a698253e15b10bb1be3b38a3621b
4
- data.tar.gz: 31ace92e9ed794539a4be81b2bdcd264045189428efe892dbee1e08f786c3f9e
3
+ metadata.gz: ab790cec5e95ea3f1ea4d012052d7475f74664d4442e5d64488e0eaebdc39542
4
+ data.tar.gz: 0cf40472af862fdde9b81b0e0541b69afb3a14dba3d05e826dc57a007a042ff1
5
5
  SHA512:
6
- metadata.gz: a98ad3a144425b94b9a4a16bb4be1f66b1762dfe40aa872577392f58f32968f9a12fd08efb68320b8d0126e8b57ef23330252f1822d375d67c3795e64e242a55
7
- data.tar.gz: 9cf46ca2a81b9b128d497742f855bb9fbf8685e3718d27d0803207e79c8d0040f13b96880a60b6b9170f7df18dc54e7c2c76523042e13554c1aa26ec8abac8ee
6
+ metadata.gz: eb46766cb0400392384051ea2dfcc5b730a0e1147c576ae5cc3be5d0fe21bd5b593e5f968009091397da70b00675a6b06d9d6f260d8b7fc0c9a44f0047c38896
7
+ data.tar.gz: ed178815ae250bbe906de430225eb54181e7caa51928a512951ffaa56d4328414f2f0897199a5737b6dd3cb9afe4b6201a9293689a010af22676c42ef90e4cf5
data/.rubocop.yml CHANGED
@@ -10,5 +10,14 @@ Metrics/BlockLength:
10
10
  Metrics/AbcSize:
11
11
  Enabled: false
12
12
 
13
+ Metrics/CyclomaticComplexity:
14
+ Enabled: false
15
+
16
+ Metrics/PerceivedComplexity:
17
+ Enabled: false
18
+
13
19
  Style/ConditionalAssignment:
14
20
  Enabled: false
21
+
22
+ Style/GlobalStdStream:
23
+ Enabled: false
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Process
4
- VERSION = "0.1.1"
4
+ VERSION = "0.2.0"
5
5
  end
data/lib/rb/process.rb CHANGED
@@ -1,31 +1,75 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "multi_io"
4
+ require "stringio"
4
5
  require_relative "process/version"
5
6
 
6
7
  module Process
7
- def self.run(*args, log_file: nil, **options)
8
- if log_file && !log_file.is_a?(File)
9
- raise ArgumentError.new("log_file must be a File with mode")
10
- end
8
+ def self.run(*args, output: STDOUT, error: STDERR, **options)
9
+ output_strio = StringIO.new
10
+ error_strio = StringIO.new
11
11
 
12
- mio = log_file ? MultiIO.new($stdout, log_file) : $stdout
13
- result = String.new
12
+ output_writter = if !output.is_a?(IO)
13
+ output
14
+ elsif output != STDOUT
15
+ MultiIO.new(STDOUT, output, output_strio)
16
+ else
17
+ MultiIO.new(STDOUT, output_strio)
18
+ end
19
+ error_writter = if !error.is_a?(IO)
20
+ error
21
+ elsif error != STDERR
22
+ MultiIO.new(STDERR, error, error_strio)
23
+ else
24
+ MultiIO.new(STDERR, error_strio)
25
+ end
14
26
 
15
- IO.popen(*args, **options) do |pipe|
16
- if block_given?
17
- yield pipe
18
- pipe.close_write
19
- end
20
- while !pipe.eof
21
- line = pipe.gets
22
- mio.write(line)
23
- result << line
27
+ # spawn don't support MultiIO nor StringIO
28
+ in_r, in_w = IO.pipe
29
+ out_r, out_w = IO.pipe
30
+ err_r, err_w = IO.pipe
31
+
32
+ # override the options, so put the option after the options
33
+ pid = spawn(*args, **options, in: in_r, out: out_w, err: err_w)
34
+
35
+ if block_given?
36
+ begin
37
+ yield in_w, out_r, err_r
38
+ rescue StandardError => e
39
+ Process.detach(pid)
40
+ raise e
24
41
  end
25
42
  end
26
43
 
27
- log_file.close if log_file
28
- result
44
+ in_w.close
45
+ out_w.close
46
+ err_w.close
47
+
48
+ out_r.each_line do |line|
49
+ output_writter.write(line)
50
+ end
51
+
52
+ err_r.each_line do |line|
53
+ error_writter.write(line)
54
+ end
55
+
56
+ in_r.close
57
+ out_r.close
58
+ err_r.close
59
+
60
+ pid, status = Process.wait2(pid)
61
+
62
+ output.close unless !output.is_a?(IO) || output == STDOUT
63
+ error.close unless !error.is_a?(IO) || error == STDERR
64
+ output_strio.close
65
+ error_strio.close
66
+
67
+ case status.success?
68
+ when true
69
+ output_strio.string
70
+ else
71
+ [output_strio.string, error_strio.string, status]
72
+ end
29
73
  end
30
74
 
31
75
  def self.output(...)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rb-process
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - initdc
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2026-02-17 00:00:00.000000000 Z
11
+ date: 2026-02-19 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Add the missing methods to the Ruby Process, you can use it with method
14
14
  chaining