In Files

  • rubygems/commands/unpack_command.rb

Class/Module Index [+]

Quicksearch

Gem::Commands::UnpackCommand

Public Class Methods

new() click to toggle source
 
               # File rubygems/commands/unpack_command.rb, line 10
def initialize
  super 'unpack', 'Unpack an installed gem to the current directory',
        :version => Gem::Requirement.default,
        :target  => Dir.pwd

  add_option('--target=DIR',
             'target directory for unpacking') do |value, options|
    options[:target] = value
  end

  add_version_option
end
            

Public Instance Methods

download(dependency) click to toggle source
 
               # File rubygems/commands/unpack_command.rb, line 35
def download dependency
  found = Gem::SpecFetcher.fetcher.fetch dependency

  return if found.empty?

  spec, source_uri = found.first

  Gem::RemoteFetcher.fetcher.download spec, source_uri
end
            
execute() click to toggle source
 
               # File rubygems/commands/unpack_command.rb, line 50
def execute
  get_all_gem_names.each do |name|
    dependency = Gem::Dependency.new name, options[:version]
    path = get_path dependency

    if path then
      basename = File.basename path, '.gem'
      target_dir = File.expand_path basename, options[:target]
      FileUtils.mkdir_p target_dir
      Gem::Installer.new(path, :unpack => true).unpack target_dir
      say "Unpacked gem: '#{target_dir}'"
    else
      alert_error "Gem '#{name}' not installed."
    end
  end
end
            
get_path(dependency) click to toggle source

Return the full path to the cached gem file matching the given name and version requirement. Returns 'nil' if no match.

Example:

get_path 'rake', '> 0.4' # "/usr/lib/ruby/gems/1.8/cache/rake-0.4.2.gem"
get_path 'rake', '< 0.1' # nil
get_path 'rak'           # nil (exact name required)
 
               # File rubygems/commands/unpack_command.rb, line 84
def get_path dependency
  return dependency.name if dependency.name =~ /\.gem$/

  specs = Gem.source_index.search dependency

  selected = specs.sort_by { |s| s.version }.last

  return download(dependency) if selected.nil?

  return unless dependency.name =~ /^#{selected.name}$/

  # We expect to find (basename).gem in the 'cache' directory.  Furthermore,
  # the name match must be exact (ignoring case).
  filename = selected.file_name
  path = nil

  Gem.path.find do |gem_dir|
    path = File.join gem_dir, 'cache', filename
    File.exist? path
  end

  path
end