Class: Gem::Doctor
| Relationships & Source Files | |
| Super Chains via Extension / Inclusion / Inheritance | |
|
Instance Chain:
|
|
| Inherits: | Object |
| Defined in: | lib/rubygems/doctor.rb |
Overview
Cleans up after a partially-failed uninstall or for an invalid Specification.
If a specification was removed by hand this will remove any remaining files.
If a corrupt specification was installed this will clean up warnings by removing the bogus specification.
Constant Summary
-
REPOSITORY_EXTENSION_MAP =
Internal use only
# File 'lib/rubygems/doctor.rb', line 22
Maps a gem subdirectory to the files that are expected to exist in the subdirectory.
[ # :nodoc: ['specifications', '.gemspec'], ['build_info', '.info'], ['cache', '.gem'], ['doc', ''], ['extensions', ''], ['gems', ''], ]
Class Method Summary
-
.new(gem_repository, dry_run = false) ⇒ Doctor
constructor
Creates a new
Doctorthat will clean upgem_repository.
Instance Attribute Summary
-
#gem_repository? ⇒ Boolean
readonly
Are we doctoring a gem repository?
DefaultUserInteraction - Included
Instance Method Summary
-
#doctor
Cleans up uninstalled files and invalid gem specifications.
-
#doctor_child(sub_directory, extension)
Internal use only
Removes files in
sub_directorywithextension -
#doctor_children
Internal use only
Cleans up children of this gem repository.
-
#installed_specs
Internal use only
Specs installed in this gem repository.
UserInteraction - Included
| #alert | Displays an alert |
| #alert_error | Displays an error |
| #alert_warning | Displays a warning |
| #ask | Asks a |
| #ask_for_password | Asks for a password with a |
| #ask_yes_no | Asks a yes or no |
| #choose_from_list | Asks the user to answer |
| #say | Displays the given |
| #terminate_interaction | Terminates the RubyGems process with the given |
| #verbose | Calls |
DefaultUserInteraction - Included
Text - Included
| #clean_text | Remove any non-printable characters and make the text suitable for printing. |
| #format_text | Wraps |
| #levenshtein_distance | This code is based directly on the Text gem implementation Returns a value representing the “cost” of transforming str1 into str2. |
| #truncate_text, #min3 | |
Constructor Details
.new(gem_repository, dry_run = false) ⇒ Doctor
Creates a new Doctor that will clean up gem_repository. Only one gem repository may be cleaned at a time.
If dry_run is true no files or directories will be removed.
# File 'lib/rubygems/doctor.rb', line 44
def initialize gem_repository, dry_run = false @gem_repository = gem_repository @dry_run = dry_run @installed_specs = nil end
Instance Attribute Details
#gem_repository? ⇒ Boolean (readonly)
Are we doctoring a gem repository?
# File 'lib/rubygems/doctor.rb', line 61
def gem_repository? not installed_specs.empty? end
Instance Method Details
#doctor
Cleans up uninstalled files and invalid gem specifications
# File 'lib/rubygems/doctor.rb', line 68
def doctor @orig_home = Gem.dir @orig_path = Gem.path say "Checking #{@gem_repository}" Gem.use_paths @gem_repository.to_s unless gem_repository? then say 'This directory does not appear to be a RubyGems repository, ' + 'skipping' say return end doctor_children say ensure Gem.use_paths @orig_home, *@orig_path end
#doctor_child(sub_directory, extension)
Removes files in sub_directory with extension
# File 'lib/rubygems/doctor.rb', line 102
def doctor_child sub_directory, extension # :nodoc: directory = File.join(@gem_repository, sub_directory) Dir.entries(directory).sort.each do |ent| next if ent == "." || ent == ".." child = File.join(directory, ent) next unless File.exist?(child) basename = File.basename(child, extension) next if installed_specs.include? basename next if /^rubygems-\d/ =~ basename next if 'specifications' == sub_directory and 'default' == basename type = File.directory?(child) ? 'directory' : 'file' action = if @dry_run then 'Extra' else FileUtils.rm_r(child) 'Removed' end say "#{action} #{type} #{sub_directory}/#{File.basename(child)}" end rescue Errno::ENOENT # ignore end
#doctor_children
Cleans up children of this gem repository
# File 'lib/rubygems/doctor.rb', line 93
def doctor_children # :nodoc: REPOSITORY_EXTENSION_MAP.each do |sub_directory, extension| doctor_child sub_directory, extension end end
#installed_specs
Specs installed in this gem repository
# File 'lib/rubygems/doctor.rb', line 54
def installed_specs # :nodoc: @installed_specs ||= Gem::Specification.map { |s| s.full_name } end