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