childprocess 0.9.0 → 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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 2f7bcd4a74bf8315015b61ff4a5dcf5774fec372
4
- data.tar.gz: ebb386c0ffd4b05121cbc8c3f18ded1d8721552b
2
+ SHA256:
3
+ metadata.gz: 0f88536969a207dced9e122e8adfbf38e7e4bea75bb0fdb6dc83838db75718b2
4
+ data.tar.gz: 711c4d76098b6f0d7487428cc7af99331f9b95e2b978bd7b1435a5cd65ae7a38
5
5
  SHA512:
6
- metadata.gz: 264821e0ea3147f6d19f63d76f5e290462e0ae8991d6858839b949a470f8ef173b716f5000f24fdfe9b86446eab1da593e7ad81e7cac83880fa7af81e7441563
7
- data.tar.gz: 26f5534f0cb73ad3482e513706ca7a53d87c7f610efeaf09f64f0c4205b293db565548c097290d27a4b49a2b831f9593edbfc4cf7c0da73903d05c1c3fd98b23
6
+ metadata.gz: 958c7579affa791c7c61e0dbe5f7f17118b57805b24f497876fb5a4bf0a35ff113dd69d52e2aaf3e0b3c1f9ae8a5e61104ac8cf17b88744280e94dbc4e1d5817
7
+ data.tar.gz: 7b65d73e847fe42c200cb2e42f8b89303358126d5a2490778f7523db38fd9bd63b209966c6e7eb4f2dbd123400a568f5c23e55e5948bcdb0a8edb949813e005b
@@ -14,14 +14,18 @@ rvm:
14
14
  - 2.5
15
15
  - ruby-head
16
16
 
17
- sudo: true # Necessary to fix JRuby
17
+ sudo: false
18
18
 
19
19
  cache: bundler
20
20
 
21
21
  before_install:
22
22
  - "echo 'gem: --no-document' > ~/.gemrc"
23
- - gem update --system
24
- - gem install bundler # Necessary to fix 1.9.3
23
+ # RubyGems update is supported for Ruby 2.3 and later
24
+ - ruby -e "system('gem update --system') if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.3')"
25
+ - gem install bundler --version '~> 1.17'
26
+
27
+ before_script:
28
+ - 'export JAVA_OPTS="${JAVA_OPTS_FOR_SPECS}"'
25
29
 
26
30
  env:
27
31
  global:
@@ -35,6 +39,10 @@ matrix:
35
39
  - rvm: jruby-9.1.9.0
36
40
  - rvm: ruby-head
37
41
  - env: "CHILDPROCESS_POSIX_SPAWN=true"
42
+ include:
43
+ - rvm: jruby-9.2.5.0
44
+ jdk: openjdk11
45
+ env: "JAVA_OPTS_FOR_SPECS='--add-opens java.base/java.io=org.jruby.dist --add-opens java.base/sun.nio.ch=org.jruby.dist'"
38
46
  exclude:
39
47
  # Travis does not provide 1.9.3 on OSX
40
48
  - rvm: 1.9.3
@@ -1,3 +1,10 @@
1
+ ### Version 1.0.0 / 2019-01-28
2
+
3
+ * [#134](https://github.com/enkessler/childprocess/pull/134): Add support for non-ASCII characters on Windows
4
+ * [#132](https://github.com/enkessler/childprocess/pull/132): Install `ffi` gem requirement on Windows only
5
+ * [#128](https://github.com/enkessler/childprocess/issues/128): Convert environment variable values to strings when `posix_spawn` enabled
6
+ * [#141](https://github.com/enkessler/childprocess/pull/141): Support JRuby on Java >= 9
7
+
1
8
  ### Version 0.9.0 / 2018-03-10
2
9
 
3
10
  * Added support for DragonFly BSD.
data/Gemfile CHANGED
@@ -1,15 +1,18 @@
1
- source "http://rubygems.org"
1
+ source 'http://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in child_process.gemspec
4
4
  gemspec
5
5
 
6
-
7
6
  if RUBY_VERSION =~ /^1\./
8
7
  gem 'tins', '< 1.7' # The 'tins' gem requires Ruby 2.x on/after this version
9
8
  gem 'json', '< 2.0' # The 'json' gem drops pre-Ruby 2.x support on/after this version
10
9
  gem 'term-ansicolor', '< 1.4' # The 'term-ansicolor' gem requires Ruby 2.x on/after this version
11
10
 
12
- if RbConfig::CONFIG['host_os'].downcase =~ /mswin|msys|mingw32/
13
- gem 'ffi', '< 1.9.15' # The 'ffi' gem, for Windows, requires Ruby 2.x on/after this version
14
- end
11
+ # ffi gem for Windows requires Ruby 2.x on/after this version
12
+ gem 'ffi', '< 1.9.15' if ENV['CHILDPROCESS_POSIX_SPAWN'] == 'true' || Gem.win_platform?
13
+ elsif Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.2')
14
+ # Ruby 2.0/2.1 support only ffi before 1.10
15
+ gem 'ffi', '~> 1.9.0' if ENV['CHILDPROCESS_POSIX_SPAWN'] == 'true' || Gem.win_platform?
16
+ else
17
+ gem 'ffi' if ENV['CHILDPROCESS_POSIX_SPAWN'] == 'true' || Gem.win_platform?
15
18
  end
data/README.md CHANGED
@@ -129,6 +129,8 @@ ChildProcess.posix_spawn = true
129
129
  process = ChildProcess.build(*args)
130
130
  ```
131
131
 
132
+ To be able to use this, please make sure that you have the `ffi` gem installed.
133
+
132
134
  ### Ensure entire process tree dies
133
135
 
134
136
  By default, the child process does not create a new process group. This means there's no guarantee that the entire process tree will die when the child process is killed. To solve this:
@@ -171,6 +173,8 @@ ChildProcess.logger = logger
171
173
  ## Caveats
172
174
 
173
175
  * With JRuby on Unix, modifying `ENV["PATH"]` before using childprocess could lead to 'Command not found' errors, since JRuby is unable to modify the environment used for PATH searches in `java.lang.ProcessBuilder`. This can be avoided by setting `ChildProcess.posix_spawn = true`.
176
+ * With JRuby on Java >= 9, the JVM may need to be configured to allow JRuby to access neccessary implementations; this can be done by adding `--add-opens java.base/java.io=org.jruby.dist` and `--add-opens java.base/sun.nio.ch=org.jruby.dist` to the `JAVA_OPTS` environment variable that is used by JRuby when launching the JVM.
177
+
174
178
 
175
179
  # Implementation
176
180
 
@@ -19,12 +19,11 @@ Gem::Specification.new do |s|
19
19
  s.test_files = `git ls-files -- spec/*`.split("\n")
20
20
  s.require_paths = ["lib"]
21
21
 
22
- s.add_runtime_dependency "ffi", "~> 1.0", ">= 1.0.11"
23
-
24
22
  s.add_development_dependency "rspec", "~> 3.0"
25
23
  s.add_development_dependency "yard", "~> 0.0"
26
24
  s.add_development_dependency 'rake', '< 12.0'
27
25
  s.add_development_dependency 'coveralls', '< 1.0'
28
- end
29
-
30
26
 
27
+ # Install FFI gem if we're running on Windows
28
+ s.extensions = 'ext/mkrf_conf.rb'
29
+ end
@@ -0,0 +1,24 @@
1
+ # Based on the example from https://en.wikibooks.org/wiki/Ruby_Programming/RubyGems#How_to_install_different_versions_of_gems_depending_on_which_version_of_ruby_the_installee_is_using
2
+ require 'rubygems'
3
+ require 'rubygems/command.rb'
4
+ require 'rubygems/dependency_installer.rb'
5
+
6
+ begin
7
+ Gem::Command.build_args = ARGV
8
+ rescue NoMethodError # rubocop:disable Lint/HandleExceptions
9
+ end
10
+
11
+ inst = Gem::DependencyInstaller.new
12
+
13
+ begin
14
+ if Gem.win_platform?
15
+ inst.install 'ffi', Gem::Requirement.new('~> 1.0', '>= 1.0.11')
16
+ end
17
+ rescue # rubocop:disable Lint/RescueWithoutErrorClass
18
+ exit(1)
19
+ end
20
+
21
+ # create dummy rakefile to indicate success
22
+ File.open(File.join(File.dirname(__FILE__), 'Rakefile'), 'w') do |f|
23
+ f.write("task :default\n")
24
+ end
@@ -73,7 +73,12 @@ module ChildProcess
73
73
  enabled = @posix_spawn || %w[1 true].include?(ENV['CHILDPROCESS_POSIX_SPAWN'])
74
74
  return false unless enabled
75
75
 
76
- require 'ffi'
76
+ begin
77
+ require 'ffi'
78
+ rescue LoadError
79
+ raise ChildProcess::MissingFFIError
80
+ end
81
+
77
82
  begin
78
83
  require "childprocess/unix/platform/#{ChildProcess.platform_name}"
79
84
  rescue LoadError
@@ -14,6 +14,17 @@ module ChildProcess
14
14
  class LaunchError < Error
15
15
  end
16
16
 
17
+ class MissingFFIError < Error
18
+ def initialize
19
+ message = "FFI is a required pre-requisite for posix_spawn, falling back to default implementation. " +
20
+ "Please add it to your deployment to unlock this functionality. " +
21
+ "If you believe this is an error, please file a bug at http://github.com/enkessler/childprocess/issues"
22
+
23
+ super(message)
24
+ end
25
+
26
+ end
27
+
17
28
  class MissingPlatformError < Error
18
29
  def initialize
19
30
  message = "posix_spawn is not yet supported on #{ChildProcess.platform_name} (#{RUBY_PLATFORM}), falling back to default implementation. " +
@@ -46,24 +46,49 @@ module ChildProcess
46
46
  end
47
47
  end
48
48
 
49
- #
50
- # Only supported in JRuby on a Unix operating system, thanks to limitations
51
- # in Java's classes
52
- #
53
- # @return [Integer] the pid of the process after it has started
54
- # @raise [NotImplementedError] when trying to access pid on non-Unix platform
55
- #
56
- def pid
57
- if @process.getClass.getName != "java.lang.UNIXProcess"
58
- raise NotImplementedError, "pid is only supported by JRuby child processes on Unix"
49
+ # Implementation of ChildProcess::JRuby::Process#pid depends heavily on
50
+ # what Java SDK is being used; here, we look it up once at load, then
51
+ # define the method once to avoid runtime overhead.
52
+ normalised_java_version_major = java.lang.System.get_property("java.version")
53
+ .slice(/^(1\.)?([0-9]+)/, 2)
54
+ .to_i
55
+ if normalised_java_version_major >= 9
56
+
57
+ # On modern Javas, we can simply delegate through to `Process#pid`,
58
+ # which was introduced in Java 9.
59
+ #
60
+ # @return [Integer] the pid of the process after it has started
61
+ # @raise [NotImplementedError] when trying to access pid on platform for
62
+ # which it is unsupported in Java
63
+ def pid
64
+ @process.pid
65
+ rescue java.lang.UnsupportedOperationException => e
66
+ raise NotImplementedError, "pid is not supported on this platform: #{e.message}"
67
+ end
68
+
69
+ else
70
+
71
+ # On Legacy Javas, fall back to reflection.
72
+ #
73
+ # Only supported in JRuby on a Unix operating system, thanks to limitations
74
+ # in Java's classes
75
+ #
76
+ # @return [Integer] the pid of the process after it has started
77
+ # @raise [NotImplementedError] when trying to access pid on non-Unix platform
78
+ #
79
+ def pid
80
+ if @process.getClass.getName != "java.lang.UNIXProcess"
81
+ raise NotImplementedError, "pid is only supported by JRuby child processes on Unix"
82
+ end
83
+
84
+ # About the best way we can do this is with a nasty reflection-based impl
85
+ # Thanks to Martijn Courteaux
86
+ # http://stackoverflow.com/questions/2950338/how-can-i-kill-a-linux-process-in-java-with-sigkill-process-destroy-does-sigter/2951193#2951193
87
+ field = @process.getClass.getDeclaredField("pid")
88
+ field.accessible = true
89
+ field.get(@process)
59
90
  end
60
91
 
61
- # About the best way we can do this is with a nasty reflection-based impl
62
- # Thanks to Martijn Courteaux
63
- # http://stackoverflow.com/questions/2950338/how-can-i-kill-a-linux-process-in-java-with-sigkill-process-destroy-does-sigter/2951193#2951193
64
- field = @process.getClass.getDeclaredField("pid")
65
- field.accessible = true
66
- field.get(@process)
67
92
  end
68
93
 
69
94
  private
@@ -111,11 +111,11 @@ module ChildProcess
111
111
  @ptrs = env.map do |key, val|
112
112
  next if val.nil?
113
113
 
114
- if key =~ /=|\0/ || val.include?("\0")
115
- raise InvalidEnvironmentVariable, "#{key.inspect} => #{val.inspect}"
114
+ if key =~ /=|\0/ || val.to_s.include?("\0")
115
+ raise InvalidEnvironmentVariable, "#{key.inspect} => #{val.to_s.inspect}"
116
116
  end
117
117
 
118
- FFI::MemoryPointer.from_string("#{key}=#{val}")
118
+ FFI::MemoryPointer.from_string("#{key}=#{val.to_s}")
119
119
  end.compact
120
120
 
121
121
  @ptrs << FFI::Pointer.new(0)
@@ -1,3 +1,3 @@
1
1
  module ChildProcess
2
- VERSION = '0.9.0'
2
+ VERSION = '1.0.0'
3
3
  end
@@ -55,9 +55,9 @@ module ChildProcess
55
55
  # );
56
56
  #
57
57
 
58
- attach_function :create_process, :CreateProcessA, [
59
- :pointer,
58
+ attach_function :create_process, :CreateProcessW, [
60
59
  :pointer,
60
+ :buffer_inout,
61
61
  :pointer,
62
62
  :pointer,
63
63
  :bool,
@@ -39,9 +39,14 @@ module ChildProcess
39
39
 
40
40
  private
41
41
 
42
+ def to_wide_string(str)
43
+ newstr = str + "\0".encode(str.encoding)
44
+ newstr.encode!('UTF-16LE')
45
+ end
46
+
42
47
  def create_command_pointer
43
- string = @args.map { |arg| quote_if_necessary(arg.to_s) }.join ' '
44
- @cmd_ptr = FFI::MemoryPointer.from_string string
48
+ string = @args.map { |arg| quote_if_necessary(arg.to_s) }.join(' ')
49
+ @cmd_ptr = to_wide_string(string)
45
50
  end
46
51
 
47
52
  def create_environment_pointer
@@ -59,15 +64,12 @@ module ChildProcess
59
64
  strings << "#{key}=#{val}\0"
60
65
  end
61
66
 
62
- strings << "\0" # terminate the env block
63
- env_str = strings.join
64
-
65
- @env_ptr = FFI::MemoryPointer.new(:long, env_str.bytesize)
66
- @env_ptr.put_bytes 0, env_str, 0, env_str.bytesize
67
+ env_str = to_wide_string(strings.join)
68
+ @env_ptr = FFI::MemoryPointer.from_string(env_str)
67
69
  end
68
70
 
69
71
  def create_cwd_pointer
70
- @cwd_ptr = FFI::MemoryPointer.from_string(@cwd || Dir.pwd)
72
+ @cwd_ptr = FFI::MemoryPointer.from_string(to_wide_string(@cwd || Dir.pwd))
71
73
  end
72
74
 
73
75
  def create_process
@@ -98,6 +100,7 @@ module ChildProcess
98
100
  end
99
101
 
100
102
  def setup_flags
103
+ @flags |= CREATE_UNICODE_ENVIRONMENT
101
104
  @flags |= DETACHED_PROCESS if @detach
102
105
  @flags |= CREATE_BREAKAWAY_FROM_JOB if @leader
103
106
  end
@@ -83,11 +83,13 @@ describe ChildProcess do
83
83
 
84
84
  it "lets child process inherit the environment of the current process" do
85
85
  Tempfile.open("env-spec") do |file|
86
+ file.close
86
87
  with_env('INHERITED' => 'yes') do
87
88
  process = write_env(file.path).start
88
89
  process.wait
89
90
  end
90
91
 
92
+ file.open
91
93
  child_env = eval rewind_and_read(file)
92
94
  expect(child_env['INHERITED']).to eql 'yes'
93
95
  end
@@ -95,6 +97,7 @@ describe ChildProcess do
95
97
 
96
98
  it "can override env vars only for the current process" do
97
99
  Tempfile.open("env-spec") do |file|
100
+ file.close
98
101
  process = write_env(file.path)
99
102
  process.environment['CHILD_ONLY'] = '1'
100
103
  process.start
@@ -103,13 +106,30 @@ describe ChildProcess do
103
106
 
104
107
  process.wait
105
108
 
109
+ file.open
106
110
  child_env = eval rewind_and_read(file)
107
111
  expect(child_env['CHILD_ONLY']).to eql '1'
108
112
  end
109
113
  end
110
114
 
115
+ it 'allows unicode characters in the environment' do
116
+ Tempfile.open("env-spec") do |file|
117
+ file.close
118
+ process = write_env(file.path)
119
+ process.environment['FOö'] = 'baör'
120
+ process.start
121
+ process.wait
122
+
123
+ file.open
124
+ child_env = eval rewind_and_read(file)
125
+
126
+ expect(child_env['FOö']).to eql 'baör'
127
+ end
128
+ end
129
+
111
130
  it "inherits the parent's env vars also when some are overridden" do
112
131
  Tempfile.open("env-spec") do |file|
132
+ file.close
113
133
  with_env('INHERITED' => 'yes', 'CHILD_ONLY' => 'no') do
114
134
  process = write_env(file.path)
115
135
  process.environment['CHILD_ONLY'] = 'yes'
@@ -117,6 +137,7 @@ describe ChildProcess do
117
137
  process.start
118
138
  process.wait
119
139
 
140
+ file.open
120
141
  child_env = eval rewind_and_read(file)
121
142
 
122
143
  expect(child_env['INHERITED']).to eq 'yes'
@@ -127,6 +148,7 @@ describe ChildProcess do
127
148
 
128
149
  it "can unset env vars" do
129
150
  Tempfile.open("env-spec") do |file|
151
+ file.close
130
152
  ENV['CHILDPROCESS_UNSET'] = '1'
131
153
  process = write_env(file.path)
132
154
  process.environment['CHILDPROCESS_UNSET'] = nil
@@ -134,6 +156,7 @@ describe ChildProcess do
134
156
 
135
157
  process.wait
136
158
 
159
+ file.open
137
160
  child_env = eval rewind_and_read(file)
138
161
  expect(child_env).to_not have_key('CHILDPROCESS_UNSET')
139
162
  end
@@ -141,12 +164,14 @@ describe ChildProcess do
141
164
 
142
165
  it 'does not see env vars unset in parent' do
143
166
  Tempfile.open('env-spec') do |file|
167
+ file.close
144
168
  ENV['CHILDPROCESS_UNSET'] = nil
145
169
  process = write_env(file.path)
146
170
  process.start
147
171
 
148
172
  process.wait
149
173
 
174
+ file.open
150
175
  child_env = eval rewind_and_read(file)
151
176
  expect(child_env).to_not have_key('CHILDPROCESS_UNSET')
152
177
  end
@@ -0,0 +1,13 @@
1
+ param($p1)
2
+ $env_list = Get-ChildItem Env:
3
+
4
+ # Builds a ruby hash compatible string
5
+ $hash_string = "{"
6
+
7
+ foreach ($item in $env_list)
8
+ {
9
+ $hash_string += "`"" + $item.Name + "`" => `"" + $item.value.replace('\','\\').replace('"','\"') + "`","
10
+ }
11
+ $hash_string += "}"
12
+
13
+ $hash_string | out-File -Encoding "UTF8" $p1
@@ -20,6 +20,10 @@ module ChildProcessSpecHelper
20
20
  @process = ChildProcess.build(RUBY , *args)
21
21
  end
22
22
 
23
+ def windows_process(*args)
24
+ @process = ChildProcess.build("powershell", *args)
25
+ end
26
+
23
27
  def sleeping_ruby(seconds = nil)
24
28
  if seconds
25
29
  ruby_process("-e", "sleep #{seconds}")
@@ -42,11 +46,16 @@ module ChildProcessSpecHelper
42
46
  end
43
47
 
44
48
  def write_env(path)
45
- code = <<-RUBY
46
- File.open(#{path.inspect}, "w") { |f| f << ENV.inspect }
47
- RUBY
48
-
49
- ruby_process tmp_script(code)
49
+ if ChildProcess.os == :windows
50
+ ps_env_file_path = File.expand_path(File.dirname(__FILE__))
51
+ args = ['-File', "#{ps_env_file_path}/get_env.ps1", path]
52
+ windows_process(*args)
53
+ else
54
+ code = <<-RUBY
55
+ File.open(#{path.inspect}, "w") { |f| f << ENV.inspect }
56
+ RUBY
57
+ ruby_process tmp_script(code)
58
+ end
50
59
  end
51
60
 
52
61
  def write_argv(path, *args)
@@ -102,7 +111,7 @@ module ChildProcessSpecHelper
102
111
  ruby(<<-CODE)
103
112
  STDIN.sync = STDOUT.sync = true
104
113
  IO.copy_stream(STDIN, STDOUT)
105
- CODE
114
+ CODE
106
115
  else
107
116
  ChildProcess.build("cat")
108
117
  end
@@ -115,7 +124,7 @@ module ChildProcessSpecHelper
115
124
  STDOUT.sync = true
116
125
 
117
126
  puts "hello"
118
- CODE
127
+ CODE
119
128
  else
120
129
  ChildProcess.build("echo", "hello")
121
130
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: childprocess
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jari Bakken
@@ -9,28 +9,8 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2018-03-10 00:00:00.000000000 Z
12
+ date: 2019-01-30 00:00:00.000000000 Z
13
13
  dependencies:
14
- - !ruby/object:Gem::Dependency
15
- name: ffi
16
- requirement: !ruby/object:Gem::Requirement
17
- requirements:
18
- - - "~>"
19
- - !ruby/object:Gem::Version
20
- version: '1.0'
21
- - - ">="
22
- - !ruby/object:Gem::Version
23
- version: 1.0.11
24
- type: :runtime
25
- prerelease: false
26
- version_requirements: !ruby/object:Gem::Requirement
27
- requirements:
28
- - - "~>"
29
- - !ruby/object:Gem::Version
30
- version: '1.0'
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: 1.0.11
34
14
  - !ruby/object:Gem::Dependency
35
15
  name: rspec
36
16
  requirement: !ruby/object:Gem::Requirement
@@ -92,7 +72,8 @@ description: This gem aims at being a simple and reliable solution for controlli
92
72
  email:
93
73
  - morrow748@gmail.com
94
74
  executables: []
95
- extensions: []
75
+ extensions:
76
+ - ext/mkrf_conf.rb
96
77
  extra_rdoc_files: []
97
78
  files:
98
79
  - ".document"
@@ -106,6 +87,7 @@ files:
106
87
  - Rakefile
107
88
  - appveyor.yml
108
89
  - childprocess.gemspec
90
+ - ext/mkrf_conf.rb
109
91
  - lib/childprocess.rb
110
92
  - lib/childprocess/abstract_io.rb
111
93
  - lib/childprocess/abstract_process.rb
@@ -135,6 +117,7 @@ files:
135
117
  - lib/childprocess/windows/structs.rb
136
118
  - spec/abstract_io_spec.rb
137
119
  - spec/childprocess_spec.rb
120
+ - spec/get_env.ps1
138
121
  - spec/io_spec.rb
139
122
  - spec/jruby_spec.rb
140
123
  - spec/pid_behavior.rb
@@ -162,7 +145,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
162
145
  version: '0'
163
146
  requirements: []
164
147
  rubyforge_project: childprocess
165
- rubygems_version: 2.5.2
148
+ rubygems_version: 2.7.6
166
149
  signing_key:
167
150
  specification_version: 4
168
151
  summary: A simple and reliable solution for controlling external programs running
@@ -170,6 +153,7 @@ summary: A simple and reliable solution for controlling external programs runnin
170
153
  test_files:
171
154
  - spec/abstract_io_spec.rb
172
155
  - spec/childprocess_spec.rb
156
+ - spec/get_env.ps1
173
157
  - spec/io_spec.rb
174
158
  - spec/jruby_spec.rb
175
159
  - spec/pid_behavior.rb