childprocess 0.5.9 → 0.6.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 +4 -4
- data/.document +6 -6
- data/.gitignore +25 -25
- data/.rspec +1 -1
- data/.travis.yml +20 -18
- data/CHANGELOG.md +8 -0
- data/Gemfile +11 -4
- data/LICENSE +20 -20
- data/README.md +178 -178
- data/Rakefile +61 -61
- data/childprocess.gemspec +30 -29
- data/lib/childprocess.rb +184 -177
- data/lib/childprocess/abstract_io.rb +36 -36
- data/lib/childprocess/abstract_process.rb +187 -187
- data/lib/childprocess/errors.rb +26 -26
- data/lib/childprocess/jruby.rb +56 -56
- data/lib/childprocess/jruby/io.rb +16 -16
- data/lib/childprocess/jruby/process.rb +159 -159
- data/lib/childprocess/jruby/pump.rb +52 -52
- data/lib/childprocess/tools/generator.rb +145 -145
- data/lib/childprocess/unix.rb +9 -9
- data/lib/childprocess/unix/fork_exec_process.rb +70 -70
- data/lib/childprocess/unix/io.rb +21 -21
- data/lib/childprocess/unix/lib.rb +186 -186
- data/lib/childprocess/unix/platform/i386-linux.rb +12 -12
- data/lib/childprocess/unix/platform/i386-solaris.rb +11 -11
- data/lib/childprocess/unix/platform/x86_64-linux.rb +12 -12
- data/lib/childprocess/unix/platform/x86_64-macosx.rb +11 -11
- data/lib/childprocess/unix/posix_spawn_process.rb +134 -134
- data/lib/childprocess/unix/process.rb +89 -89
- data/lib/childprocess/version.rb +3 -3
- data/lib/childprocess/windows.rb +33 -33
- data/lib/childprocess/windows/handle.rb +91 -91
- data/lib/childprocess/windows/io.rb +25 -25
- data/lib/childprocess/windows/lib.rb +415 -415
- data/lib/childprocess/windows/process.rb +129 -129
- data/lib/childprocess/windows/process_builder.rb +174 -174
- data/lib/childprocess/windows/structs.rb +148 -148
- data/spec/abstract_io_spec.rb +12 -12
- data/spec/childprocess_spec.rb +291 -256
- data/spec/io_spec.rb +228 -228
- data/spec/jruby_spec.rb +24 -24
- data/spec/pid_behavior.rb +12 -12
- data/spec/spec_helper.rb +253 -253
- data/spec/unix_spec.rb +57 -57
- data/spec/windows_spec.rb +23 -23
- metadata +47 -45
data/Rakefile
CHANGED
@@ -1,61 +1,61 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'rake'
|
3
|
-
require 'tmpdir'
|
4
|
-
|
5
|
-
require 'bundler'
|
6
|
-
Bundler::GemHelper.install_tasks
|
7
|
-
|
8
|
-
include Rake::DSL if defined?(::Rake::DSL)
|
9
|
-
|
10
|
-
require 'rspec/core/rake_task'
|
11
|
-
RSpec::Core::RakeTask.new(:spec) do |spec|
|
12
|
-
spec.ruby_opts = "-I lib:spec -w"
|
13
|
-
spec.pattern = 'spec/**/*_spec.rb'
|
14
|
-
end
|
15
|
-
|
16
|
-
desc 'Run specs for rcov'
|
17
|
-
RSpec::Core::RakeTask.new(:rcov) do |spec|
|
18
|
-
spec.ruby_opts = "-I lib:spec"
|
19
|
-
spec.pattern = 'spec/**/*_spec.rb'
|
20
|
-
spec.rcov = true
|
21
|
-
spec.rcov_opts = %w[--exclude spec,ruby-debug,/Library/Ruby,.gem --include lib/childprocess]
|
22
|
-
end
|
23
|
-
|
24
|
-
task :default => :spec
|
25
|
-
|
26
|
-
begin
|
27
|
-
require 'yard'
|
28
|
-
YARD::Rake::YardocTask.new
|
29
|
-
rescue LoadError
|
30
|
-
task :yardoc do
|
31
|
-
abort "YARD is not available. In order to run yardoc, you must: sudo gem install yard"
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
task :clean do
|
36
|
-
rm_rf "pkg"
|
37
|
-
rm_rf "childprocess.jar"
|
38
|
-
end
|
39
|
-
|
40
|
-
desc 'Create jar to bundle in selenium-webdriver'
|
41
|
-
task :jar => [:clean, :build] do
|
42
|
-
tmpdir = Dir.mktmpdir("childprocess-jar")
|
43
|
-
gem_to_package = Dir['pkg/*.gem'].first
|
44
|
-
gem_name = File.basename(gem_to_package, ".gem")
|
45
|
-
p :gem_to_package => gem_to_package, :gem_name => gem_name
|
46
|
-
|
47
|
-
sh "gem install -i #{tmpdir} #{gem_to_package} --ignore-dependencies --no-rdoc --no-ri"
|
48
|
-
sh "jar cf childprocess.jar -C #{tmpdir}/gems/#{gem_name}/lib ."
|
49
|
-
sh "jar tf childprocess.jar"
|
50
|
-
end
|
51
|
-
|
52
|
-
task :env do
|
53
|
-
$:.unshift File.expand_path("../lib", __FILE__)
|
54
|
-
require 'childprocess'
|
55
|
-
end
|
56
|
-
|
57
|
-
desc 'Calculate size of posix_spawn structs for the current platform'
|
58
|
-
task :generate => :env do
|
59
|
-
require 'childprocess/tools/generator'
|
60
|
-
ChildProcess::Tools::Generator.generate
|
61
|
-
end
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'tmpdir'
|
4
|
+
|
5
|
+
require 'bundler'
|
6
|
+
Bundler::GemHelper.install_tasks
|
7
|
+
|
8
|
+
include Rake::DSL if defined?(::Rake::DSL)
|
9
|
+
|
10
|
+
require 'rspec/core/rake_task'
|
11
|
+
RSpec::Core::RakeTask.new(:spec) do |spec|
|
12
|
+
spec.ruby_opts = "-I lib:spec -w"
|
13
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
14
|
+
end
|
15
|
+
|
16
|
+
desc 'Run specs for rcov'
|
17
|
+
RSpec::Core::RakeTask.new(:rcov) do |spec|
|
18
|
+
spec.ruby_opts = "-I lib:spec"
|
19
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
20
|
+
spec.rcov = true
|
21
|
+
spec.rcov_opts = %w[--exclude spec,ruby-debug,/Library/Ruby,.gem --include lib/childprocess]
|
22
|
+
end
|
23
|
+
|
24
|
+
task :default => :spec
|
25
|
+
|
26
|
+
begin
|
27
|
+
require 'yard'
|
28
|
+
YARD::Rake::YardocTask.new
|
29
|
+
rescue LoadError
|
30
|
+
task :yardoc do
|
31
|
+
abort "YARD is not available. In order to run yardoc, you must: sudo gem install yard"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
task :clean do
|
36
|
+
rm_rf "pkg"
|
37
|
+
rm_rf "childprocess.jar"
|
38
|
+
end
|
39
|
+
|
40
|
+
desc 'Create jar to bundle in selenium-webdriver'
|
41
|
+
task :jar => [:clean, :build] do
|
42
|
+
tmpdir = Dir.mktmpdir("childprocess-jar")
|
43
|
+
gem_to_package = Dir['pkg/*.gem'].first
|
44
|
+
gem_name = File.basename(gem_to_package, ".gem")
|
45
|
+
p :gem_to_package => gem_to_package, :gem_name => gem_name
|
46
|
+
|
47
|
+
sh "gem install -i #{tmpdir} #{gem_to_package} --ignore-dependencies --no-rdoc --no-ri"
|
48
|
+
sh "jar cf childprocess.jar -C #{tmpdir}/gems/#{gem_name}/lib ."
|
49
|
+
sh "jar tf childprocess.jar"
|
50
|
+
end
|
51
|
+
|
52
|
+
task :env do
|
53
|
+
$:.unshift File.expand_path("../lib", __FILE__)
|
54
|
+
require 'childprocess'
|
55
|
+
end
|
56
|
+
|
57
|
+
desc 'Calculate size of posix_spawn structs for the current platform'
|
58
|
+
task :generate => :env do
|
59
|
+
require 'childprocess/tools/generator'
|
60
|
+
ChildProcess::Tools::Generator.generate
|
61
|
+
end
|
data/childprocess.gemspec
CHANGED
@@ -1,29 +1,30 @@
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
2
|
-
$:.push File.expand_path("../lib", __FILE__)
|
3
|
-
require "childprocess/version"
|
4
|
-
|
5
|
-
Gem::Specification.new do |s|
|
6
|
-
s.name = "childprocess"
|
7
|
-
s.version = ChildProcess::VERSION
|
8
|
-
s.platform = Gem::Platform::RUBY
|
9
|
-
s.authors = ["Jari Bakken"]
|
10
|
-
s.email = ["
|
11
|
-
s.homepage = "http://github.com/
|
12
|
-
s.summary = %q{
|
13
|
-
s.description = %q{This gem aims at being a simple and reliable solution for controlling external programs running in the background on any Ruby / OS combination.}
|
14
|
-
|
15
|
-
s.rubyforge_project = "childprocess"
|
16
|
-
s.license = 'MIT'
|
17
|
-
|
18
|
-
s.files = `git ls-files`.split("\n")
|
19
|
-
s.test_files = `git ls-files -- spec/*`.split("\n")
|
20
|
-
s.require_paths = ["lib"]
|
21
|
-
|
22
|
-
s.
|
23
|
-
|
24
|
-
s.add_development_dependency "
|
25
|
-
s.add_development_dependency
|
26
|
-
s.add_runtime_dependency
|
27
|
-
|
28
|
-
|
29
|
-
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "childprocess/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "childprocess"
|
7
|
+
s.version = ChildProcess::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Jari Bakken", "Eric Kessler"]
|
10
|
+
s.email = ["morrow748@gmail.com"]
|
11
|
+
s.homepage = "http://github.com/enkessler/childprocess"
|
12
|
+
s.summary = %q{A simple and reliable solution for controlling external programs running in the background on any Ruby / OS combination.}
|
13
|
+
s.description = %q{This gem aims at being a simple and reliable solution for controlling external programs running in the background on any Ruby / OS combination.}
|
14
|
+
|
15
|
+
s.rubyforge_project = "childprocess"
|
16
|
+
s.license = 'MIT'
|
17
|
+
|
18
|
+
s.files = `git ls-files`.split("\n")
|
19
|
+
s.test_files = `git ls-files -- spec/*`.split("\n")
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
|
22
|
+
s.add_runtime_dependency "ffi", "~> 1.0", ">= 1.0.11"
|
23
|
+
|
24
|
+
s.add_development_dependency "rspec", "~> 3.0"
|
25
|
+
s.add_development_dependency "yard", "~> 0.0"
|
26
|
+
s.add_runtime_dependency 'rake', '< 12.0'
|
27
|
+
s.add_development_dependency 'coveralls', '< 1.0'
|
28
|
+
end
|
29
|
+
|
30
|
+
|
data/lib/childprocess.rb
CHANGED
@@ -1,177 +1,184 @@
|
|
1
|
-
require 'childprocess/
|
2
|
-
require 'childprocess/
|
3
|
-
require 'childprocess/
|
4
|
-
require
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
require
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
#
|
81
|
-
#
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
1
|
+
require 'childprocess/version'
|
2
|
+
require 'childprocess/errors'
|
3
|
+
require 'childprocess/abstract_process'
|
4
|
+
require 'childprocess/abstract_io'
|
5
|
+
require "fcntl"
|
6
|
+
|
7
|
+
module ChildProcess
|
8
|
+
|
9
|
+
@posix_spawn = false
|
10
|
+
|
11
|
+
class << self
|
12
|
+
def new(*args)
|
13
|
+
case os
|
14
|
+
when :macosx, :linux, :solaris, :bsd, :cygwin, :aix
|
15
|
+
if posix_spawn?
|
16
|
+
Unix::PosixSpawnProcess.new(args)
|
17
|
+
elsif jruby?
|
18
|
+
JRuby::Process.new(args)
|
19
|
+
else
|
20
|
+
Unix::ForkExecProcess.new(args)
|
21
|
+
end
|
22
|
+
when :windows
|
23
|
+
Windows::Process.new(args)
|
24
|
+
else
|
25
|
+
raise Error, "unsupported platform #{platform_name.inspect}"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
alias_method :build, :new
|
29
|
+
|
30
|
+
def platform
|
31
|
+
if RUBY_PLATFORM == "java"
|
32
|
+
:jruby
|
33
|
+
elsif defined?(RUBY_ENGINE) && RUBY_ENGINE == "ironruby"
|
34
|
+
:ironruby
|
35
|
+
else
|
36
|
+
os
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def platform_name
|
41
|
+
@platform_name ||= "#{arch}-#{os}"
|
42
|
+
end
|
43
|
+
|
44
|
+
def unix?
|
45
|
+
!windows?
|
46
|
+
end
|
47
|
+
|
48
|
+
def linux?
|
49
|
+
os == :linux
|
50
|
+
end
|
51
|
+
|
52
|
+
def jruby?
|
53
|
+
platform == :jruby
|
54
|
+
end
|
55
|
+
|
56
|
+
def windows?
|
57
|
+
os == :windows
|
58
|
+
end
|
59
|
+
|
60
|
+
def posix_spawn?
|
61
|
+
enabled = @posix_spawn || %w[1 true].include?(ENV['CHILDPROCESS_POSIX_SPAWN'])
|
62
|
+
return false unless enabled
|
63
|
+
|
64
|
+
require 'ffi'
|
65
|
+
begin
|
66
|
+
require "childprocess/unix/platform/#{ChildProcess.platform_name}"
|
67
|
+
rescue LoadError
|
68
|
+
raise ChildProcess::MissingPlatformError
|
69
|
+
end
|
70
|
+
|
71
|
+
require "childprocess/unix/lib"
|
72
|
+
require 'childprocess/unix/posix_spawn_process'
|
73
|
+
|
74
|
+
true
|
75
|
+
rescue ChildProcess::MissingPlatformError => ex
|
76
|
+
warn_once ex.message
|
77
|
+
false
|
78
|
+
end
|
79
|
+
|
80
|
+
#
|
81
|
+
# Set this to true to enable experimental use of posix_spawn.
|
82
|
+
#
|
83
|
+
|
84
|
+
def posix_spawn=(bool)
|
85
|
+
@posix_spawn = bool
|
86
|
+
end
|
87
|
+
|
88
|
+
def os
|
89
|
+
@os ||= (
|
90
|
+
require "rbconfig"
|
91
|
+
host_os = RbConfig::CONFIG['host_os'].downcase
|
92
|
+
|
93
|
+
case host_os
|
94
|
+
when /linux/
|
95
|
+
:linux
|
96
|
+
when /darwin|mac os/
|
97
|
+
:macosx
|
98
|
+
when /mswin|msys|mingw32/
|
99
|
+
:windows
|
100
|
+
when /cygwin/
|
101
|
+
:cygwin
|
102
|
+
when /solaris|sunos/
|
103
|
+
:solaris
|
104
|
+
when /bsd/
|
105
|
+
:bsd
|
106
|
+
when /aix/
|
107
|
+
:aix
|
108
|
+
else
|
109
|
+
raise Error, "unknown os: #{host_os.inspect}"
|
110
|
+
end
|
111
|
+
)
|
112
|
+
end
|
113
|
+
|
114
|
+
def arch
|
115
|
+
@arch ||= (
|
116
|
+
host_cpu = RbConfig::CONFIG['host_cpu'].downcase
|
117
|
+
case host_cpu
|
118
|
+
when /i[3456]86/
|
119
|
+
|
120
|
+
# Ruby 2.4 unifies Bignum and Fixnum into Integer. Also, I've heard that Darwin no
|
121
|
+
# longer has this issue, so on newer Ruby/Darwin combos this check shouldn't be
|
122
|
+
# needed anyway. Leaving it here for older combinations, however.
|
123
|
+
|
124
|
+
# Check for Ruby older version of Ruby
|
125
|
+
if (RUBY_VERSION =~ /^[123]\./) && (os == :macosx) && (0xfee1deadbeef.is_a?(Fixnum))
|
126
|
+
# Darwin always reports i686, even when running in 64bit mod
|
127
|
+
"x86_64"
|
128
|
+
else
|
129
|
+
"i386"
|
130
|
+
end
|
131
|
+
when /amd64|x86_64/
|
132
|
+
"x86_64"
|
133
|
+
when /ppc|powerpc/
|
134
|
+
"powerpc"
|
135
|
+
else
|
136
|
+
host_cpu
|
137
|
+
end
|
138
|
+
)
|
139
|
+
end
|
140
|
+
|
141
|
+
#
|
142
|
+
# By default, a child process will inherit open file descriptors from the
|
143
|
+
# parent process. This helper provides a cross-platform way of making sure
|
144
|
+
# that doesn't happen for the given file/io.
|
145
|
+
#
|
146
|
+
|
147
|
+
def close_on_exec(file)
|
148
|
+
if file.respond_to?(:close_on_exec=)
|
149
|
+
file.close_on_exec = true
|
150
|
+
elsif file.respond_to?(:fcntl) && defined?(Fcntl::FD_CLOEXEC)
|
151
|
+
file.fcntl Fcntl::F_SETFD, Fcntl::FD_CLOEXEC
|
152
|
+
|
153
|
+
if jruby? && posix_spawn?
|
154
|
+
# on JRuby, the fcntl call above apparently isn't enough when
|
155
|
+
# we're launching the process through posix_spawn.
|
156
|
+
fileno = JRuby.posix_fileno_for(file)
|
157
|
+
Unix::Lib.fcntl fileno, Fcntl::F_SETFD, Fcntl::FD_CLOEXEC
|
158
|
+
end
|
159
|
+
elsif windows?
|
160
|
+
Windows::Lib.dont_inherit file
|
161
|
+
else
|
162
|
+
raise Error, "not sure how to set close-on-exec for #{file.inspect} on #{platform_name.inspect}"
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
private
|
167
|
+
|
168
|
+
def warn_once(msg)
|
169
|
+
@warnings ||= {}
|
170
|
+
|
171
|
+
unless @warnings[msg]
|
172
|
+
@warnings[msg] = true
|
173
|
+
$stderr.puts msg
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
end # class << self
|
178
|
+
end # ChildProcess
|
179
|
+
|
180
|
+
require 'jruby' if ChildProcess.jruby?
|
181
|
+
|
182
|
+
require 'childprocess/unix' if ChildProcess.unix?
|
183
|
+
require 'childprocess/windows' if ChildProcess.windows?
|
184
|
+
require 'childprocess/jruby' if ChildProcess.jruby?
|