lib/warning_shot/gem_handler.rb in warning-shot-0.9.1 vs lib/warning_shot/gem_handler.rb in warning-shot-0.9.2

- old
+ new

@@ -4,104 +4,76 @@ require 'rubygems/installer' require 'rubygems/dependency_installer' module RippleNetworks module WarningShot - class GemHandler + class GemHandler < Array DEFAULT_VERSION = ">0.0.0".freeze CONDITIONAL_RGX = /[^\d]*/.freeze VERSION_RGX = /[\d\.]+/.freeze + CandidateGem = Struct.new(:name,:version,:status,:details) - attr_reader :gems_to_install, :missing_gems, :failed_gems, :installed_gems, :found_gems + DEFAULTS = { + :install_all => false, + :gem_path => Gem.dir + } - def initialize(gem_list,install_all=false,install_dir=Gem.dir) - @install_dir = install_dir + def initialize(gem_list,opts={}) + @opts = DEFAULTS.merge(opts) - @missing_gems = {} # gems that will attempted to be installed - @failed_gems = {} # gems taht failed installation - @installed_gems = [] # gems that were installed by this process - @found_gems = {} # gems that were already installed + Gem.path.clear + #Add custom paths to gem.. + unless @opts[:gem_path].nil? || @opts[:gem_path].empty? + @opts[:gem_path].split(";").each do |alt_path| + Gem.path.push(alt_path) + end + end - @gems_to_install = split(gem_list) - #TODO Create a Gem<Strunct(name,status,version,details) and get rid of all these - #different gem variables + #Add candidate gems to array + split(gem_list).each do |rgem,ver| + self.push(CandidateGem.new(rgem,ver,:unchecked,"")) + end + #Check status of gems check_gems - install! if install_all + install_all! if @opts[:install_all] end def split(gem_list) gems = {} gem_list.collect do |gem| - gem_name, gem_ver = gem.chomp.split(":") + case gem + when String + gem_name, gem_ver = gem.chomp.split(":") + when Hash + gem_name, gem_ver = gem.keys.first, gem.values.first + end gems[gem_name] = gem_ver || DEFAULT_VERSION #Default to newest gem end - + return gems end def add(gems) - @gems_to_install.merge!(split(gems)) + #@gems_to_install.merge!(split(gems)) check_gems end def remove(gems) - gems.collect { |g| @gems_to_install.delete(g) } + #gems.collect { |g| @gems_to_install.delete(g) } check_gems end - - def install(gem_name,gem_version) - begin - #RubyGems DependencyInstaller installs all dependencies, and the gem, woot! - dep_inst = Gem::DependencyInstaller.new(gem_name,gem_version,{:install_dir => @install_dir}) - rescue Exception => e - #Invalid Gem Name / Version - @failed_gems[gem_name] = "Bad gem name or version #{gem_name} #{gem_version}" - return false - end - #Determine what dependencies are missing - dep_inst.gather_dependencies - - begin - #Install the dependencies and the gem - dep_inst.install - - #Add list of installed gems to @installed_gems - @installed_gems.push(*dep_inst.installed_gems) - - #Remove any isntalled gems from failed list - dep_inst.installed_gems.each do |gem| - @failed_gems.delete(gem.name) if @failed_gems.has_key?(gem.name) - end - - #Update the local gem cache - Gem::cache.refresh! - - #Update missing gems - check_gems - return true - rescue Errno::EACCES => e - @failed_gems[gem_name] = "Invalid permissions . . . try running w/ su" - rescue Gem::FilePermissionError => e - @failed_gems[gem_name] = "Invalid permissions . . . try running w/ su" - rescue Exception => e - @failed_gems[gem_name] = e.message - end - - return false - end - def install! - @missing_gems.each do |gem_name,gem_version| - install(gem_name,gem_version) + #Loop over candidate gems, install each + def install_all! + self.each do |c_gem| + install(c_gem) if c_gem.status != :installed end - - return @failed_gems.length == 0 end =begin rdoc *Name*:: installed? @@ -170,24 +142,65 @@ return gem_info end private + + #Install a candidate gem + def install(c_gem) + begin + #RubyGems DependencyInstaller installs all dependencies, and the gem, woot! + dep_inst = Gem::DependencyInstaller.new(c_gem.name,c_gem.version,{:install_dir => Gem.path.first}) + rescue Gem::GemNotFoundException => e + #Invalid Gem Name / Version + c_gem.status = :invalid + c_gem.details = "Invalid gem name or version #{c_gem.name} #{c_gem.version}" + return false + end + + #Determine what dependencies are missing + dep_inst.gather_dependencies + + begin + #Install the dependencies and the gem + dep_inst.install + + #add dependency details to gem + c_gem.details = "Installed Dependencies: " << dep_inst.installed_gems.collect { |d_gem| d_gem.name }.join(",") + + #Update the local gem cache + Gem::cache.refresh! + + #Update missing gems + check_gems + return true + rescue Errno::EACCES => e + c_gem.status = :failed + c_gem.details = "Invalid permissions . . . try running w/ su" + rescue Gem::FilePermissionError => e + c_gem.status = :failed + c_gem.details = "Invalid permissions . . . try running w/ su" + rescue Exception => e + c_gem.status = :failed + c_gem.details = e.message + end + + return false + end + + =begin rdoc *Name*:: check_gems *Access*:: private *Description*:: Checks to see if the @gems_to_install are installed, results stored in @missing_gems *Last_Edited*:: Tue Feb 19 15:09:00 PST 2008 =end def check_gems - @missing_gems = {} - - @gems_to_install.each do |gem_name,gem_version| - gem_info = installed?(gem_name,gem_version) + self.each do |c_gem| + gem_info = installed?(c_gem.name,c_gem.version) if gem_info[:installed] - @found_gems[gem_name] = gem_version - else - @missing_gems[gem_name] = gem_version + c_gem.status = :installed + c_gem.details = gem_info[:info] end end end end \ No newline at end of file