Class Gem::Uninstaller
In: lib/rubygems/uninstaller.rb
Parent: Object

Methods

Included Modules

Gem::UserInteraction

Public Class methods

Constructs an Uninstaller instance

gem:[String] The Gem name to uninstall

[Source]

    # File lib/rubygems/uninstaller.rb, line 25
25:   def initialize(gem, options = {})
26:     @gem = gem
27:     @version = options[:version] || Gem::Requirement.default
28:     gem_home = options[:install_dir] || Gem.dir
29:     @gem_home = File.expand_path gem_home
30:     @force_executables = options[:executables]
31:     @force_all = options[:all]
32:     @force_ignore = options[:ignore]
33:     @bin_dir = options[:bin_dir] 
34:   end

Public Instance methods

[Source]

     # File lib/rubygems/uninstaller.rb, line 192
192:   def ask_if_ok(spec)
193:     msg = ['']
194:     msg << 'You have requested to uninstall the gem:'
195:     msg << "\t#{spec.full_name}"
196:     spec.dependent_gems.each do |gem,dep,satlist|
197:       msg <<
198:         ("#{gem.name}-#{gem.version} depends on " +
199:         "[#{dep.name} (#{dep.version_requirements})]")
200:     end
201:     msg << 'If you remove this gems, one or more dependencies will not be met.'
202:     msg << 'Continue with Uninstall?'
203:     return ask_yes_no(msg.join("\n"), true)
204:   end

[Source]

     # File lib/rubygems/uninstaller.rb, line 184
184:   def dependencies_ok?(spec)
185:     return true if @force_ignore
186: 
187:     source_index = Gem::SourceIndex.from_installed_gems
188:     deplist = Gem::DependencyList.from_source_index source_index
189:     deplist.ok_to_remove?(spec.full_name) || ask_if_ok(spec)
190:   end

[Source]

     # File lib/rubygems/uninstaller.rb, line 178
178:   def path_ok?(spec)
179:     match_path = File.join @gem_home, 'gems', spec.full_name
180: 
181:     match_path == spec.full_gem_path
182:   end
spec:the spec of the gem to be uninstalled
list:the list of all such gems

Warning: this method modifies the list parameter. Once it has uninstalled a gem, it is removed from that list.

[Source]

     # File lib/rubygems/uninstaller.rb, line 131
131:   def remove(spec, list)
132:     unless dependencies_ok? spec then
133:       raise Gem::DependencyRemovalException,
134:             "Uninstallation aborted due to dependent gem(s)"
135:     end
136: 
137:     unless path_ok? spec then
138:       e = Gem::GemNotInHomeException.new \
139:             "Gem is not installed in directory #{@gem_home}"
140:       e.spec = spec
141: 
142:       raise e
143:     end
144: 
145:     raise Gem::FilePermissionError, spec.installation_path unless
146:       File.writable?(spec.installation_path)
147: 
148:     FileUtils.rm_rf spec.full_gem_path
149: 
150:     original_platform_name = [
151:       spec.name, spec.version, spec.original_platform].join '-'
152: 
153:     spec_dir = File.join spec.installation_path, 'specifications'
154:     gemspec = File.join spec_dir, "#{spec.full_name}.gemspec"
155: 
156:     unless File.exist? gemspec then
157:       gemspec = File.join spec_dir, "#{original_platform_name}.gemspec"
158:     end
159: 
160:     FileUtils.rm_rf gemspec
161: 
162:     cache_dir = File.join spec.installation_path, 'cache'
163:     gem = File.join cache_dir, "#{spec.full_name}.gem"
164: 
165:     unless File.exist? gem then
166:       gem = File.join cache_dir, "#{original_platform_name}.gem"
167:     end
168: 
169:     FileUtils.rm_rf gem
170: 
171:     Gem::DocManager.new(spec).uninstall_doc
172: 
173:     say "Successfully uninstalled #{spec.full_name}"
174: 
175:     list.delete spec
176:   end

Removes all gems in list.

NOTE: removes uninstalled gems from list.

[Source]

     # File lib/rubygems/uninstaller.rb, line 120
120:   def remove_all(list)
121:     list.dup.each { |spec| remove spec, list }
122:   end

Removes installed executables and batch files (windows only) for gemspec.

[Source]

     # File lib/rubygems/uninstaller.rb, line 73
 73:   def remove_executables(gemspec)
 74:     return if gemspec.nil?
 75: 
 76:     if gemspec.executables.size > 0 then
 77:       bindir = @bin_dir ? @bin_dir : (Gem.bindir @gem_home)
 78: 
 79:       list = Gem.source_index.search(gemspec.name).delete_if { |spec|
 80:         spec.version == gemspec.version
 81:       }
 82: 
 83:       executables = gemspec.executables.clone
 84: 
 85:       list.each do |spec|
 86:         spec.executables.each do |exe_name|
 87:           executables.delete(exe_name)
 88:         end
 89:       end
 90: 
 91:       return if executables.size == 0
 92: 
 93:       answer = if @force_executables.nil? then
 94:                  ask_yes_no("Remove executables:\n" \
 95:                             "\t#{gemspec.executables.join(", ")}\n\nin addition to the gem?",
 96:                             true) # " # appease ruby-mode - don't ask
 97:                else
 98:                  @force_executables
 99:                end
100: 
101:       unless answer then
102:         say "Executables and scripts will remain installed."
103:       else
104:         raise Gem::FilePermissionError, bindir unless File.writable? bindir
105: 
106:         gemspec.executables.each do |exe_name|
107:           say "Removing #{exe_name}"
108:           FileUtils.rm_f File.join(bindir, exe_name)
109:           FileUtils.rm_f File.join(bindir, "#{exe_name}.bat")
110:         end
111:       end
112:     end
113:   end

Performs the uninstall of the Gem. This removes the spec, the Gem directory, and the cached .gem file,

[Source]

    # File lib/rubygems/uninstaller.rb, line 40
40:   def uninstall
41:     list = Gem.source_index.search(/^#{@gem}$/, @version)
42: 
43:     if list.empty? then
44:       raise Gem::InstallError, "Unknown gem #{@gem}-#{@version}"
45:     elsif list.size > 1 && @force_all
46:       remove_all(list.dup) 
47:       remove_executables(list.last)
48:     elsif list.size > 1 
49:       say 
50:       gem_names = list.collect {|gem| gem.full_name} + ["All versions"]
51:       gem_name, index =
52:         choose_from_list("Select gem to uninstall:", gem_names)
53:       if index == list.size
54:         remove_all(list.dup) 
55:         remove_executables(list.last)
56:       elsif index >= 0 && index < list.size
57:         to_remove = list[index]
58:         remove(to_remove, list)
59:         remove_executables(to_remove)
60:       else
61:         say "Error: must enter a number [1-#{list.size+1}]"
62:       end
63:     else
64:       remove(list[0], list.dup)
65:       remove_executables(list.last)
66:     end
67:   end

[Validate]