class Webdrivers::System

@api private

Public Class Methods

apple_m1_architecture?() click to toggle source
# File lib/webdrivers/system.rb, line 151
def apple_m1_architecture?
  if platform == 'mac' && RUBY_PLATFORM.include?('arm64-darwin')
    Webdrivers.logger.debug 'Apple architecture: M1 (arm64-darwin)'
    return true
  end

  Webdrivers.logger.debug 'Apple architecture: Intel (mac64)'
  false
end
bitsize() click to toggle source
# File lib/webdrivers/system.rb, line 180
def bitsize
  Selenium::WebDriver::Platform.bitsize
end
cache_version(file_name, version) click to toggle source
# File lib/webdrivers/system.rb, line 41
def cache_version(file_name, version)
  FileUtils.mkdir_p(install_dir) unless File.exist?(install_dir)

  File.open("#{install_dir}/#{file_name.gsub('.exe', '')}.version", 'w+') do |file|
    file.print(version)
  end
end
cached_version(file_name) click to toggle source
# File lib/webdrivers/system.rb, line 49
def cached_version(file_name)
  File.open("#{install_dir}/#{file_name.gsub('.exe', '')}.version", 'r', &:read)
end
call(process, arg = nil) click to toggle source
# File lib/webdrivers/system.rb, line 184
def call(process, arg = nil)
  cmd = arg ? [process, arg] : process # Windows provides powershell command (process) only, no args.
  Webdrivers.logger.debug "making System call: #{cmd}"
  p = IO.popen(cmd)
  out = p.read
  p.close
  raise "Failed to make system call: #{cmd}" unless $CHILD_STATUS.success?

  Webdrivers.logger.debug "System call returned: #{out}"
  out
end
decompress_file(tempfile, file_name, target) click to toggle source
# File lib/webdrivers/system.rb, line 93
def decompress_file(tempfile, file_name, target)
  tempfile = tempfile.to_path
  case tempfile
  when /tar\.gz$/
    untargz_file(tempfile, File.basename(target))
  when /tar\.bz2$/
    untarbz2_file(tempfile)
  when /\.zip$/
    unzip_file(tempfile, File.basename(target))
  else
    Webdrivers.logger.debug 'No Decompression needed'
    FileUtils.cp(tempfile, File.join(Dir.pwd, file_name))
  end
  raise "Could not decompress #{file_name} to get #{target}" unless File.exist?(File.basename(target))
end
delete(file) click to toggle source
# File lib/webdrivers/system.rb, line 19
def delete(file)
  max_attempts = 3
  attempts_made = 0
  delay = 0.5

  begin
    attempts_made += 1
    if File.exist? file
      Webdrivers.logger.debug "Deleting #{file}"
      File.delete file
    end
  rescue Errno::EACCES # Solves an intermittent file locking issue on Windows
    sleep(delay)
    retry if File.exist?(file) && attempts_made <= max_attempts
    raise
  end
end
download(url, target) click to toggle source
# File lib/webdrivers/system.rb, line 60
def download(url, target)
  FileUtils.mkdir_p(install_dir) unless File.exist?(install_dir)

  download_file(url, target)

  FileUtils.chmod 'ugo+rx', target
  Webdrivers.logger.debug "Completed download and processing of #{target}"
  target
end
download_file(url, target) click to toggle source
# File lib/webdrivers/system.rb, line 70
def download_file(url, target)
  file_name = File.basename(url)
  Dir.chdir(install_dir) do
    tempfile = Tempfile.open(['', file_name], binmode: true) do |file|
      file.print Network.get(url)
      file
    end

    raise "Could not download #{url}" unless File.exist?(tempfile.to_path)

    Webdrivers.logger.debug "Successfully downloaded #{tempfile.to_path}"

    decompress_file(tempfile, file_name, target)
    tempfile.close!
  end
end
exists?(file) click to toggle source
# File lib/webdrivers/system.rb, line 87
def exists?(file)
  result = File.exist? file
  Webdrivers.logger.debug "#{file} is#{' not' unless result} already downloaded"
  result
end
install_dir() click to toggle source
# File lib/webdrivers/system.rb, line 37
def install_dir
  Webdrivers.install_dir
end
platform() click to toggle source
# File lib/webdrivers/system.rb, line 139
def platform
  if Selenium::WebDriver::Platform.linux?
    'linux'
  elsif Selenium::WebDriver::Platform.mac?
    'mac'
  elsif Selenium::WebDriver::Platform.windows?
    'win'
  else
    raise NotImplementedError, 'Your OS is not supported by webdrivers gem.'
  end
end
to_win32_path(path) click to toggle source

@param [String] path @return [String]

# File lib/webdrivers/system.rb, line 168
def to_win32_path(path)
  return path if /[a-z]:\\/iu.match?(path)

  call("wslpath -w '#{path}'").chomp
end
to_wsl_path(path) click to toggle source

@param [String] path @return [String]

# File lib/webdrivers/system.rb, line 176
def to_wsl_path(path)
  call("wslpath -u '#{path}'").chomp
end
untarbz2_file(filename) click to toggle source
# File lib/webdrivers/system.rb, line 109
def untarbz2_file(filename)
  Webdrivers.logger.debug "Decompressing #{filename}"

  call("tar xjf #{filename}").gsub('.tar.bz2', '')
end
untargz_file(source, target) click to toggle source
# File lib/webdrivers/system.rb, line 115
def untargz_file(source, target)
  Webdrivers.logger.debug "Decompressing #{source}"

  tar_extract = Gem::Package::TarReader.new(Zlib::GzipReader.open(source))

  File.open(target, 'w+b') do |ucf|
    tar_extract.each { |entry| ucf << entry.read }
    File.basename ucf
  end
end
unzip_file(filename, driver_name) click to toggle source
# File lib/webdrivers/system.rb, line 126
def unzip_file(filename, driver_name)
  Webdrivers.logger.debug "Decompressing #{filename}"

  Zip::File.open(filename) do |zip_file|
    driver = zip_file.get_entry(driver_name)
    f_path = File.join(Dir.pwd, driver.name)
    delete(f_path)
    FileUtils.mkdir_p(File.dirname(f_path)) unless File.exist?(File.dirname(f_path))
    zip_file.extract(driver, f_path)
  end
  driver_name
end
valid_cache?(file_name) click to toggle source
# File lib/webdrivers/system.rb, line 53
def valid_cache?(file_name)
  file = "#{install_dir}/#{file_name.gsub('.exe', '')}.version"
  return false unless File.exist?(file)

  Time.now - File.mtime(file) < Webdrivers.cache_time
end
wsl_v1?() click to toggle source

@return [TrueClass, FalseClass]

# File lib/webdrivers/system.rb, line 162
def wsl_v1?
  platform == 'linux' && File.open('/proc/version').read.include?('Microsoft')
end