open3 0.1.0 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6f1dc26c8d711ed9394d746ea2fad6222de3cce813178dfb2d1aa52eb4fc0432
4
- data.tar.gz: 121bb5a4ee245b344004afdf1bdabf0af421c5acaa306b08de5ff62865a896c3
3
+ metadata.gz: b3ab5dfcb825c74af61129ee82254609322af777421f454eb90053875bdbc851
4
+ data.tar.gz: fdf3f7c0783de3763390a6e62a7ec984f262d61ca5d8906e186ad7e7deeff5d2
5
5
  SHA512:
6
- metadata.gz: ccb106824f5e6a47f6cf4324bc7638af0ea27fda57b87da181fb32c60cec309590a6d828635bb27afbfb13b3113e857a1d23cf88665a1630eeb5ea4e4e2dfe2c
7
- data.tar.gz: '0918ee950ed53eeed0b64b569034496953b5e788d937bac2fb30c1ee1608c645adc5cd1c76c1982e263a3ae999af23e0783648c48a08e7f3a14d9fe1f3331924'
6
+ metadata.gz: 3e3508856456efd5c0700447c9e122163ea490b32a7bd4cc09d2d4fa79639b53baac5b8f45d983e5185dd439c93cfba2b546c302569e1dccf6d4086c0a3b0858
7
+ data.tar.gz: a79fd57d1a714b793ecc3849231cf3d58fd07bcc962ffad144b98ec7443d8da1642e97ab10e6f251c720cc9d0cfe72a809fb71c0c915226fcbed0b2a1c607839
@@ -0,0 +1,6 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: 'github-actions'
4
+ directory: '/'
5
+ schedule:
6
+ interval: 'weekly'
@@ -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
@@ -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: [ '3.0', 2.7, 2.6, head ]
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/Rakefile CHANGED
@@ -7,4 +7,11 @@ Rake::TestTask.new(:test) do |t|
7
7
  t.test_files = FileList["test/**/test_*.rb"]
8
8
  end
9
9
 
10
+ task :sync_tool do
11
+ require 'fileutils'
12
+ FileUtils.cp "../ruby/tool/lib/core_assertions.rb", "./test/lib"
13
+ FileUtils.cp "../ruby/tool/lib/envutil.rb", "./test/lib"
14
+ FileUtils.cp "../ruby/tool/lib/find_executable.rb", "./test/lib"
15
+ end
16
+
10
17
  task :default => :test
@@ -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/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Open3
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.2"
3
3
  end
data/lib/open3.rb CHANGED
@@ -29,6 +29,8 @@
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
35
 
34
36
  # Open stdin, stdout, and stderr streams and start external executable.
@@ -206,6 +208,13 @@ module Open3
206
208
  opts[[:out, :err]] = out_w
207
209
 
208
210
  popen_run(cmd, opts, [in_r, out_w], [in_w, out_r], &block)
211
+ ensure
212
+ if block
213
+ in_r.close
214
+ in_w.close
215
+ out_r.close
216
+ out_w.close
217
+ end
209
218
  end
210
219
  module_function :popen2e
211
220
 
@@ -750,3 +759,6 @@ module Open3
750
759
  end
751
760
 
752
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,17 +1,23 @@
1
- lib = File.expand_path("lib", __dir__)
2
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
- require "open3/version"
1
+ # frozen_string_literal: true
2
+
3
+ name = File.basename(__FILE__, ".gemspec")
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
+ /^\s*VERSION\s*=\s*"(.*)"/ =~ line and break $1
7
+ end rescue nil
8
+ end
4
9
 
5
10
  Gem::Specification.new do |spec|
6
- spec.name = "open3"
7
- spec.version = Open3::VERSION
8
- spec.authors = ["Hiroshi SHIBATA"]
9
- spec.email = ["hsbt@ruby-lang.org"]
11
+ spec.name = name
12
+ spec.version = version
13
+ spec.authors = ["Yukihiro Matsumoto"]
14
+ spec.email = ["matz@ruby-lang.org"]
10
15
 
11
16
  spec.summary = %q{Popen, but with stderr, too}
12
17
  spec.description = spec.summary
13
18
  spec.homepage = "https://github.com/ruby/open3"
14
- spec.license = "BSD-2-Clause"
19
+ spec.licenses = ["Ruby", "BSD-2-Clause"]
20
+ spec.required_ruby_version = ">= 2.6.0"
15
21
 
16
22
  spec.metadata["homepage_uri"] = spec.homepage
17
23
  spec.metadata["source_code_uri"] = spec.homepage
@@ -19,7 +25,7 @@ Gem::Specification.new do |spec|
19
25
  # Specify which files should be added to the gem when it is released.
20
26
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
21
27
  spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
22
- `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
28
+ `git ls-files -z 2>/dev/null`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
23
29
  end
24
30
  spec.bindir = "exe"
25
31
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
metadata CHANGED
@@ -1,24 +1,26 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: open3
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
- - Hiroshi SHIBATA
8
- autorequire:
7
+ - Yukihiro Matsumoto
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-11-06 00:00:00.000000000 Z
11
+ date: 2022-12-14 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Popen, but with stderr, too
14
14
  email:
15
- - hsbt@ruby-lang.org
15
+ - matz@ruby-lang.org
16
16
  executables: []
17
17
  extensions: []
18
18
  extra_rdoc_files: []
19
19
  files:
20
+ - ".github/dependabot.yml"
21
+ - ".github/workflows/test-jruby.yml"
22
+ - ".github/workflows/test.yml"
20
23
  - ".gitignore"
21
- - ".travis.yml"
22
24
  - Gemfile
23
25
  - LICENSE.txt
24
26
  - README.md
@@ -26,15 +28,17 @@ files:
26
28
  - bin/console
27
29
  - bin/setup
28
30
  - lib/open3.rb
31
+ - lib/open3/jruby_windows.rb
29
32
  - lib/open3/version.rb
30
33
  - open3.gemspec
31
34
  homepage: https://github.com/ruby/open3
32
35
  licenses:
36
+ - Ruby
33
37
  - BSD-2-Clause
34
38
  metadata:
35
39
  homepage_uri: https://github.com/ruby/open3
36
40
  source_code_uri: https://github.com/ruby/open3
37
- post_install_message:
41
+ post_install_message:
38
42
  rdoc_options: []
39
43
  require_paths:
40
44
  - lib
@@ -42,15 +46,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
42
46
  requirements:
43
47
  - - ">="
44
48
  - !ruby/object:Gem::Version
45
- version: '0'
49
+ version: 2.6.0
46
50
  required_rubygems_version: !ruby/object:Gem::Requirement
47
51
  requirements:
48
52
  - - ">="
49
53
  - !ruby/object:Gem::Version
50
54
  version: '0'
51
55
  requirements: []
52
- rubygems_version: 3.0.3
53
- signing_key:
56
+ rubygems_version: 3.4.0.dev
57
+ signing_key:
54
58
  specification_version: 4
55
59
  summary: Popen, but with stderr, too
56
60
  test_files: []
data/.travis.yml DELETED
@@ -1,6 +0,0 @@
1
- language: ruby
2
- cache: bundler
3
- rvm:
4
- - 2.6.3
5
- - ruby-head
6
- script: rake test