open3 0.1.1 → 0.1.2
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 +4 -4
- data/.github/dependabot.yml +6 -0
- data/.github/workflows/test-jruby.yml +21 -0
- data/.github/workflows/test.yml +4 -7
- data/Rakefile +1 -1
- data/lib/open3/jruby_windows.rb +127 -0
- data/lib/open3/version.rb +3 -0
- data/lib/open3.rb +5 -1
- data/open3.gemspec +2 -2
- metadata +7 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b3ab5dfcb825c74af61129ee82254609322af777421f454eb90053875bdbc851
|
4
|
+
data.tar.gz: fdf3f7c0783de3763390a6e62a7ec984f262d61ca5d8906e186ad7e7deeff5d2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3e3508856456efd5c0700447c9e122163ea490b32a7bd4cc09d2d4fa79639b53baac5b8f45d983e5185dd439c93cfba2b546c302569e1dccf6d4086c0a3b0858
|
7
|
+
data.tar.gz: a79fd57d1a714b793ecc3849231cf3d58fd07bcc962ffad144b98ec7443d8da1642e97ab10e6f251c720cc9d0cfe72a809fb71c0c915226fcbed0b2a1c607839
|
@@ -0,0 +1,21 @@
|
|
1
|
+
name: test
|
2
|
+
|
3
|
+
on: [push, pull_request]
|
4
|
+
|
5
|
+
jobs:
|
6
|
+
build:
|
7
|
+
name: build (${{ matrix.ruby }} / ${{ matrix.os }})
|
8
|
+
strategy:
|
9
|
+
matrix:
|
10
|
+
ruby: [ 2.7, 2.6, head, jruby-9.3 ]
|
11
|
+
os: [ ubuntu-latest, macos-latest ]
|
12
|
+
runs-on: ${{ matrix.os }}
|
13
|
+
steps:
|
14
|
+
- uses: actions/checkout@v3
|
15
|
+
- name: Set up Ruby
|
16
|
+
uses: ruby/setup-ruby@v1
|
17
|
+
with:
|
18
|
+
ruby-version: ${{ matrix.ruby }}
|
19
|
+
bundler-cache: true # 'bundle install' and cache
|
20
|
+
- name: Run test
|
21
|
+
run: bundle exec rake test
|
data/.github/workflows/test.yml
CHANGED
@@ -7,18 +7,15 @@ jobs:
|
|
7
7
|
name: build (${{ matrix.ruby }} / ${{ matrix.os }})
|
8
8
|
strategy:
|
9
9
|
matrix:
|
10
|
-
ruby: [ 2.7, 2.6, head ]
|
10
|
+
ruby: [ '3.0', 2.7, 2.6, head ]
|
11
11
|
os: [ ubuntu-latest, macos-latest ]
|
12
12
|
runs-on: ${{ matrix.os }}
|
13
13
|
steps:
|
14
|
-
- uses: actions/checkout@
|
14
|
+
- uses: actions/checkout@v3
|
15
15
|
- name: Set up Ruby
|
16
16
|
uses: ruby/setup-ruby@v1
|
17
17
|
with:
|
18
18
|
ruby-version: ${{ matrix.ruby }}
|
19
|
-
|
20
|
-
run: |
|
21
|
-
gem install bundler --no-document
|
22
|
-
bundle install
|
19
|
+
bundler-cache: true # 'bundle install' and cache
|
23
20
|
- name: Run test
|
24
|
-
run: rake test
|
21
|
+
run: bundle exec rake test
|
data/Rakefile
CHANGED
@@ -9,7 +9,7 @@ end
|
|
9
9
|
|
10
10
|
task :sync_tool do
|
11
11
|
require 'fileutils'
|
12
|
-
FileUtils.cp "../ruby/tool/lib/
|
12
|
+
FileUtils.cp "../ruby/tool/lib/core_assertions.rb", "./test/lib"
|
13
13
|
FileUtils.cp "../ruby/tool/lib/envutil.rb", "./test/lib"
|
14
14
|
FileUtils.cp "../ruby/tool/lib/find_executable.rb", "./test/lib"
|
15
15
|
end
|
@@ -0,0 +1,127 @@
|
|
1
|
+
#
|
2
|
+
# Custom implementation of Open3.popen{3,2,2e} that uses java.lang.ProcessBuilder rather than pipes and spawns.
|
3
|
+
#
|
4
|
+
|
5
|
+
require 'jruby' # need access to runtime for RubyStatus construction
|
6
|
+
|
7
|
+
module Open3
|
8
|
+
|
9
|
+
java_import java.lang.ProcessBuilder
|
10
|
+
java_import org.jruby.RubyProcess
|
11
|
+
java_import org.jruby.util.ShellLauncher
|
12
|
+
|
13
|
+
def popen3(*cmd, &block)
|
14
|
+
if cmd.size > 0 && Hash === cmd[-1]
|
15
|
+
opts = cmd.pop
|
16
|
+
else
|
17
|
+
opts = {}
|
18
|
+
end
|
19
|
+
processbuilder_run(cmd, opts, io: IO_3, &block)
|
20
|
+
end
|
21
|
+
module_function :popen3
|
22
|
+
|
23
|
+
IO_3 = proc do |process|
|
24
|
+
[process.getOutputStream.to_io, process.getInputStream.to_io, process.getErrorStream.to_io]
|
25
|
+
end
|
26
|
+
|
27
|
+
BUILD_2 = proc do |builder|
|
28
|
+
builder.redirectError(ProcessBuilder::Redirect::INHERIT)
|
29
|
+
end
|
30
|
+
|
31
|
+
IO_2 = proc do |process|
|
32
|
+
[process.getOutputStream.to_io, process.getInputStream.to_io]
|
33
|
+
end
|
34
|
+
|
35
|
+
def popen2(*cmd, &block)
|
36
|
+
if cmd.size > 0 && Hash === cmd[-1]
|
37
|
+
opts = cmd.pop
|
38
|
+
else
|
39
|
+
opts = {}
|
40
|
+
end
|
41
|
+
processbuilder_run(cmd, opts, build: BUILD_2, io: IO_2, &block)
|
42
|
+
end
|
43
|
+
module_function :popen2
|
44
|
+
|
45
|
+
BUILD_2E = proc do |builder|
|
46
|
+
builder.redirectErrorStream(true)
|
47
|
+
end
|
48
|
+
|
49
|
+
def popen2e(*cmd, &block)
|
50
|
+
if cmd.size > 0 && Hash === cmd[-1]
|
51
|
+
opts = cmd.pop
|
52
|
+
else
|
53
|
+
opts = {}
|
54
|
+
end
|
55
|
+
processbuilder_run(cmd, opts, build: BUILD_2E, io: IO_2, &block)
|
56
|
+
end
|
57
|
+
module_function :popen2e
|
58
|
+
|
59
|
+
def processbuilder_run(cmd, opts, build: nil, io:)
|
60
|
+
opts.each do |k, v|
|
61
|
+
if Integer === k
|
62
|
+
if IO == v || !(String === v || v.respond_to?(:to_path))
|
63
|
+
# target is an open IO or a non-pathable object, bail out
|
64
|
+
raise NotImplementedError.new("redirect to an open IO is not implemented on this platform")
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
if Hash === cmd[0]
|
70
|
+
env = cmd.shift;
|
71
|
+
else
|
72
|
+
env = {}
|
73
|
+
end
|
74
|
+
|
75
|
+
if cmd.size == 1 && (cmd[0] =~ / / || ShellLauncher.shouldUseShell(cmd[0]))
|
76
|
+
cmd = [RbConfig::CONFIG['SHELL'], JRuby::Util::ON_WINDOWS ? '/c' : '-c', cmd[0]]
|
77
|
+
end
|
78
|
+
|
79
|
+
builder = ProcessBuilder.new(cmd.to_java(:string))
|
80
|
+
|
81
|
+
builder.directory(java.io.File.new(opts[:chdir] || Dir.pwd))
|
82
|
+
|
83
|
+
environment = builder.environment
|
84
|
+
env.each { |k, v| v.nil? ? environment.remove(k) : environment.put(k, v) }
|
85
|
+
|
86
|
+
build.call(builder) if build
|
87
|
+
|
88
|
+
process = builder.start
|
89
|
+
|
90
|
+
pid = org.jruby.util.ShellLauncher.getPidFromProcess(process)
|
91
|
+
|
92
|
+
parent_io = io.call(process)
|
93
|
+
|
94
|
+
parent_io.each {|i| i.sync = true}
|
95
|
+
|
96
|
+
wait_thr = DetachThread.new(pid) { RubyProcess::RubyStatus.newProcessStatus(JRuby.runtime, process.waitFor << 8, pid) }
|
97
|
+
|
98
|
+
result = [*parent_io, wait_thr]
|
99
|
+
|
100
|
+
if defined? yield
|
101
|
+
begin
|
102
|
+
return yield(*result)
|
103
|
+
ensure
|
104
|
+
parent_io.each(&:close)
|
105
|
+
wait_thr.join
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
result
|
110
|
+
end
|
111
|
+
module_function :processbuilder_run
|
112
|
+
class << self
|
113
|
+
private :processbuilder_run
|
114
|
+
end
|
115
|
+
|
116
|
+
class DetachThread < Thread
|
117
|
+
attr_reader :pid
|
118
|
+
|
119
|
+
def initialize(pid)
|
120
|
+
super
|
121
|
+
|
122
|
+
@pid = pid
|
123
|
+
self[:pid] = pid
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
end
|
data/lib/open3.rb
CHANGED
@@ -29,8 +29,9 @@
|
|
29
29
|
# - Open3.pipeline : run a pipeline and wait for its completion
|
30
30
|
#
|
31
31
|
|
32
|
+
require 'open3/version'
|
33
|
+
|
32
34
|
module Open3
|
33
|
-
VERSION = "0.1.1"
|
34
35
|
|
35
36
|
# Open stdin, stdout, and stderr streams and start external executable.
|
36
37
|
# In addition, a thread to wait for the started process is created.
|
@@ -758,3 +759,6 @@ module Open3
|
|
758
759
|
end
|
759
760
|
|
760
761
|
end
|
762
|
+
|
763
|
+
# JRuby uses different popen logic on Windows, require it here to reuse wrapper methods above.
|
764
|
+
require 'open3/jruby_windows' if RUBY_ENGINE == 'jruby' && JRuby::Util::ON_WINDOWS
|
data/open3.gemspec
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
name = File.basename(__FILE__, ".gemspec")
|
4
|
-
version = ["lib", Array.new(name.count("-"), "..").join("/")].find do |dir|
|
5
|
-
break File.foreach(File.join(__dir__, dir, "#{name.tr('-', '/')}.rb")) do |line|
|
4
|
+
version = ["lib", Array.new(name.count("-")+1, "..").join("/")].find do |dir|
|
5
|
+
break File.foreach(File.join(__dir__, dir, "#{name.tr('-', '/')}/version.rb")) do |line|
|
6
6
|
/^\s*VERSION\s*=\s*"(.*)"/ =~ line and break $1
|
7
7
|
end rescue nil
|
8
8
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: open3
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yukihiro Matsumoto
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-12-14 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Popen, but with stderr, too
|
14
14
|
email:
|
@@ -17,6 +17,8 @@ executables: []
|
|
17
17
|
extensions: []
|
18
18
|
extra_rdoc_files: []
|
19
19
|
files:
|
20
|
+
- ".github/dependabot.yml"
|
21
|
+
- ".github/workflows/test-jruby.yml"
|
20
22
|
- ".github/workflows/test.yml"
|
21
23
|
- ".gitignore"
|
22
24
|
- Gemfile
|
@@ -26,6 +28,8 @@ files:
|
|
26
28
|
- bin/console
|
27
29
|
- bin/setup
|
28
30
|
- lib/open3.rb
|
31
|
+
- lib/open3/jruby_windows.rb
|
32
|
+
- lib/open3/version.rb
|
29
33
|
- open3.gemspec
|
30
34
|
homepage: https://github.com/ruby/open3
|
31
35
|
licenses:
|
@@ -49,7 +53,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
49
53
|
- !ruby/object:Gem::Version
|
50
54
|
version: '0'
|
51
55
|
requirements: []
|
52
|
-
rubygems_version: 3.
|
56
|
+
rubygems_version: 3.4.0.dev
|
53
57
|
signing_key:
|
54
58
|
specification_version: 4
|
55
59
|
summary: Popen, but with stderr, too
|