class Bindeps::Dependency

Attributes

binaries[R]
libraries[R]
name[R]
version[R]

Public Class Methods

new(name, binaries, versionconfig, urlconfig, unpack, libraries=[]) click to toggle source
# File lib/bindeps.rb, line 66
def initialize(name, binaries, versionconfig, urlconfig,
               unpack, libraries=[])
  @name = name
  unless binaries.is_a? Array
    raise ArgumentError,
          "binaries must be an array"
  end
  @binaries = binaries
  @libraries = libraries
  @version = versionconfig['number']
  @version_cmd = versionconfig['command']
  @url = choose_url urlconfig
  @unpack = unpack
end

Public Instance Methods

all_installed?() click to toggle source
# File lib/bindeps.rb, line 154
def all_installed?
  @binaries.each do |bin|
    unless installed? bin
      return false
    end
  end
  true
end
choose_url(urlconfig) click to toggle source
# File lib/bindeps.rb, line 90
def choose_url urlconfig
  arch = System.arch
  if urlconfig.key? arch
    sys = urlconfig[arch]
    os = System.os.to_s
    if sys.key? os
      return sys[os]
    else
      raise UnsupportedSystemError,
            "bindeps config for #{@name} #{arch} doesn't " +
            "contain an entry for #{os}"
    end
  else
    raise UnsupportedSystemError,
          "bindeps config for #{@name} doesn't contain an " +
          "entry for #{arch}"
  end
end
download() click to toggle source
# File lib/bindeps.rb, line 109
def download
  wget = which('wget').first
  curl = which('curl').first
  if wget
    cmd = "#{wget} #{@url}"
    stdout, stderr, status = Open3.capture3 cmd
  elsif curl
    cmd = "#{curl} -O -J -L #{@url}"
    stdout, stderr, status = Open3.capture3 cmd
  else
    msg = "You don't have curl or wget?! What kind of computer is "
    msg << "this?! Windows?! BeOS? OS/2?"
    raise DownloadFailedError.new(msg)
  end
  if !status.success?
    raise DownloadFailedError,
          "download of #{@url} for #{@name} failed:\n#{stdout}\n#{stderr}"
  end
end
install(src, dest, destprefix, destdir = '') click to toggle source
# File lib/bindeps.rb, line 182
def install(src, dest, destprefix, destdir = '')
  gem_home = ENV['GEM_HOME']
  home = ENV['HOME']
  basedir = File.join(home, '.local')
  if destdir.length > 0
    basedir = destdir
  elsif gem_home.nil?
    ENV['PATH'] = ENV['PATH'] + ":#{File.join(basedir, 'bin')}"
  else
    basedir = ENV['GEM_HOME']
  end
  FileUtils.mkdir_p File.join(basedir, 'bin')
  FileUtils.mkdir_p File.join(basedir, 'lib')
  destprefix = 'bin' if destprefix == '.'
  install_location = File.join(basedir, destprefix, File.basename(dest))
  FileUtils.install(src, install_location, :mode => 0775)
end
install_missing(destdir='') click to toggle source
# File lib/bindeps.rb, line 81
def install_missing destdir=''
  destdir = File.expand_path destdir unless destdir.empty?
  unless all_installed?
    puts "Installing #{@name} (#{@version})..."
    download
    unpack destdir
  end
end
installed?(bin) click to toggle source
# File lib/bindeps.rb, line 163
def installed? bin
  path = which(bin)
  if path.length > 0
    ret = `#{@version_cmd} 2>&1`.split("\n").map{ |l| l.strip }.join('|')
    if ret && (/#{@version}/ =~ ret)
      return path
    end
  else
    if Dir.exist?("#{ENV['HOME']}/.local/bin")
      ENV['PATH'] = ENV['PATH'] + ":#{ENV['HOME']}/.local/bin"
      path = which(bin)
      if path.length > 0
        return path
      end
    end
  end
  false
end
unpack(destdir = '') click to toggle source
# File lib/bindeps.rb, line 129
def unpack destdir = ''
  destdir = File.expand_path destdir unless destdir.empty?
  archive = File.basename(@url)
  if @unpack
    Unpacker.archive? archive
    Unpacker.unpack(archive) do |dir|
      Dir.chdir dir do
        Dir['**/*'].each do |extracted|
          file = File.basename(extracted)
          if @binaries.include?(file) || @libraries.include?(file)
            dir = File.dirname(extracted).split(File::PATH_SEPARATOR).last
            dir = %w[bin lib].include?(dir) ? dir : '.'
            unless File.directory?(extracted)
              install(extracted, extracted, dir, destdir)
            end
          end
        end
      end
    end
  else
    bin = File.basename(@url)
    install(bin, @binaries.first, 'bin', destdir)
  end
end