From 98c3bb564f758ef73ce96f4cb17b7597c7a6e128 Mon Sep 17 00:00:00 2001 From: Jon Leighton Date: Sun, 11 Mar 2012 10:35:02 +0000 Subject: [PATCH] Remove posix-spawn dependency. posix-spawn relies on a C extension. This does work under JRuby, but it won't work on Travis CI as they disallow JRuby C extensions, as they are considered to not be a good practice. Instead we are using either Process.spawn on Ruby 1.9, or the childprocess gem on Ruby 1.8. childprocess uses native JVM APIs on JRuby, and fork+exec on others. --- lib/capybara/poltergeist.rb | 1 + lib/capybara/poltergeist/client.rb | 10 +++++----- lib/capybara/poltergeist/inspector.rb | 4 +--- lib/capybara/poltergeist/spawn.rb | 17 +++++++++++++++++ poltergeist.gemspec | 2 +- spec/unit/inspector_spec.rb | 2 +- 6 files changed, 26 insertions(+), 10 deletions(-) create mode 100644 lib/capybara/poltergeist/spawn.rb diff --git a/lib/capybara/poltergeist.rb b/lib/capybara/poltergeist.rb index f6b086a..f4a15d6 100644 --- a/lib/capybara/poltergeist.rb +++ b/lib/capybara/poltergeist.rb @@ -11,6 +11,7 @@ module Capybara autoload :Client, 'capybara/poltergeist/client' autoload :Util, 'capybara/poltergeist/util' autoload :Inspector, 'capybara/poltergeist/inspector' + autoload :Spawn, 'capybara/poltergeist/spawn' require 'capybara/poltergeist/errors' end diff --git a/lib/capybara/poltergeist/client.rb b/lib/capybara/poltergeist/client.rb index e480152..eddab07 100644 --- a/lib/capybara/poltergeist/client.rb +++ b/lib/capybara/poltergeist/client.rb @@ -1,5 +1,3 @@ -require 'posix/spawn' - module Capybara::Poltergeist class Client PHANTOMJS_SCRIPT = File.expand_path('../client/compiled/main.js', __FILE__) @@ -18,12 +16,14 @@ module Capybara::Poltergeist @port = port @inspector = inspector @path = path || PHANTOMJS_NAME - at_exit { stop } + + pid = Process.pid + at_exit { stop if Process.pid == pid } end def start check_phantomjs_version - @pid = POSIX::Spawn.spawn(command) + @pid = Spawn.spawn(*command) end def stop @@ -55,7 +55,7 @@ module Capybara::Poltergeist parts << PHANTOMJS_SCRIPT parts << port - parts.join(" ") + parts end end diff --git a/lib/capybara/poltergeist/inspector.rb b/lib/capybara/poltergeist/inspector.rb index 4b5043e..4363ab8 100644 --- a/lib/capybara/poltergeist/inspector.rb +++ b/lib/capybara/poltergeist/inspector.rb @@ -1,5 +1,3 @@ -require 'posix/spawn' - module Capybara::Poltergeist class Inspector BROWSERS = %w(chromium chromium-browser google-chrome safari) @@ -26,7 +24,7 @@ module Capybara::Poltergeist def open if browser - POSIX::Spawn.spawn("#{browser} #{url}") + Spawn.spawn(browser, url) else raise Error, "Could not find a browser executable to open #{url}. " \ "You can specify one manually using e.g. `:inspector => 'chromium'` " \ diff --git a/lib/capybara/poltergeist/spawn.rb b/lib/capybara/poltergeist/spawn.rb new file mode 100644 index 0000000..6250a43 --- /dev/null +++ b/lib/capybara/poltergeist/spawn.rb @@ -0,0 +1,17 @@ +require 'childprocess' + +module Capybara::Poltergeist + module Spawn + def self.spawn(*args) + args = args.map(&:to_s) + + if RUBY_VERSION >= "1.9" + Process.spawn(*args) + else + process = ChildProcess.build(*args) + process.start + process.pid + end + end + end +end diff --git a/poltergeist.gemspec b/poltergeist.gemspec index 6697b1c..bbb32fa 100644 --- a/poltergeist.gemspec +++ b/poltergeist.gemspec @@ -16,7 +16,7 @@ Gem::Specification.new do |s| s.add_dependency "capybara", "~> 1.0" s.add_dependency "json", "~> 1.6" - s.add_dependency "posix-spawn", "~> 0.3" + s.add_dependency "childprocess", "~> 0.3" s.add_dependency "http_parser.rb", "~> 0.5.3" s.add_dependency "faye-websocket", "~> 0.4", ">= 0.4.2" diff --git a/spec/unit/inspector_spec.rb b/spec/unit/inspector_spec.rb index 64fe684..70c93d1 100644 --- a/spec/unit/inspector_spec.rb +++ b/spec/unit/inspector_spec.rb @@ -27,7 +27,7 @@ module Capybara::Poltergeist it 'can be opened' do subject.stub(:port => 1234, :browser => 'chromium') - POSIX::Spawn.should_receive(:spawn).with("chromium http://localhost:1234/") + Spawn.should_receive(:spawn).with("chromium", "http://localhost:1234/") subject.open end