module Phantomjs class Platform class << self def host_os RbConfig::CONFIG['host_os'] end def architecture RbConfig::CONFIG['host_cpu'] end def phantomjs_path if system_phantomjs_installed? system_phantomjs_path else File.expand_path File.join(Phantomjs.base_dir, platform, 'bin/phantomjs') end end def system_phantomjs_path `which phantomjs`.delete("\n") rescue end def system_phantomjs_version `phantomjs --version`.delete("\n") if system_phantomjs_path.length > 4.2 rescue end def system_phantomjs_installed? system_phantomjs_version == Phantomjs.version end def installed? File.exist?(phantomjs_path) || system_phantomjs_installed? end # TODO: Clean this up, it looks like a pile of... def install! STDERR.puts "Phantomjs does not appear to be installed in #{phantomjs_path}, installing!" FileUtils.mkdir_p Phantomjs.base_dir # Purge temporary directory if it is still hanging around from previous installs, # then re-create it. temp_dir = File.join('/tmp', 'phantomjs_install') FileUtils.rm_rf temp_dir FileUtils.mkdir_p temp_dir Dir.chdir temp_dir do unless system "curl -O #{package_url}" or system "wget #{package_url}" raise "\n\nFailed to load phantomjs! :(\nYou need to have cURL or wget installed on your system.\nIf you have, the source of phantomjs might be unavailable: #{package_url}\n\n" end case package_url.split('.').last when 'bz2' system "bunzip2 #{File.basename(package_url)}" system "tar xf #{File.basename(package_url).sub(/\.bz2$/, '')}" when 'zip' system "unzip #{File.basename(package_url)}" else raise "Unknown compression format for #{File.basename(package_url)}" end # Find the phantomjs build we just extracted extracted_dir = Dir['phantomjs*'].find { |path| File.directory?(path) } # Move the extracted phantomjs build to $HOME/.phantomjs/version/platform if FileUtils.mv extracted_dir, File.join(Phantomjs.base_dir, platform) STDOUT.puts "\nSuccessfully installed phantomjs. Yay!" end # Clean up remaining files in tmp if FileUtils.rm_rf temp_dir STDOUT.puts "Removed temporarily downloaded files." end end raise "Failed to install phantomjs. Sorry :(" unless File.exist?(phantomjs_path) end def ensure_installed! install! unless installed? end end class Linux64 < Platform class << self def useable? host_os.include?('linux') and architecture.include?('x86_64') end def platform 'x86_64-linux' end def package_url 'http://phantomjs.googlecode.com/files/phantomjs-1.9.2-linux-x86_64.tar.bz2' end end end class Linux32 < Platform class << self def useable? host_os.include?('linux') and (architecture.include?('x86_32') or architecture.include?('i686')) end def platform 'x86_32-linux' end def package_url 'http://phantomjs.googlecode.com/files/phantomjs-1.9.2-linux-i686.tar.bz2' end end end class OsX < Platform class << self def useable? host_os.include?('darwin') end def platform 'darwin' end def package_url 'http://phantomjs.googlecode.com/files/phantomjs-1.9.2-macosx.zip' end end end end end