Class Gem::Commands::UnpackCommand
In: lib/rubygems/commands/unpack_command.rb
Parent: Gem::Command

Methods

execute   get_path   new  

Included Modules

Gem::VersionOption

Public Class methods

[Source]

    # File lib/rubygems/commands/unpack_command.rb, line 10
10:   def initialize
11:     super 'unpack', 'Unpack an installed gem to the current directory',
12:           :version => Gem::Requirement.default,
13:           :target  => Dir.pwd
14: 
15:     add_option('--target=DIR', 'target directory for unpacking') do |value, options|
16:       options[:target] = value
17:     end
18: 
19:     add_version_option
20:   end

Public Instance methods

[Source]

    # File lib/rubygems/commands/unpack_command.rb, line 39
39:   def execute
40:     get_all_gem_names.each do |name|
41:       path = get_path name, options[:version]
42: 
43:       if path then
44:         basename = File.basename(path).sub(/\.gem$/, '')
45:         target_dir = File.expand_path File.join(options[:target], basename)
46:         FileUtils.mkdir_p target_dir
47:         Gem::Installer.new(path, :unpack => true).unpack target_dir
48:         say "Unpacked gem: '#{target_dir}'"
49:       else
50:         alert_error "Gem '#{name}' not installed."
51:       end
52:     end
53:   end

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)

[Source]

    # File lib/rubygems/commands/unpack_command.rb, line 70
70:   def get_path(gemname, version_req)
71:     return gemname if gemname =~ /\.gem$/i
72: 
73:     specs = Gem::source_index.find_name gemname, version_req
74: 
75:     selected = specs.sort_by { |s| s.version }.last
76: 
77:     return nil if selected.nil?
78: 
79:     # We expect to find (basename).gem in the 'cache' directory.
80:     # Furthermore, the name match must be exact (ignoring case).
81:     if gemname =~ /^#{selected.name}$/i
82:       filename = selected.full_name + '.gem'
83:       path = nil
84: 
85:       Gem.path.find do |gem_dir|
86:         path = File.join gem_dir, 'cache', filename
87:         File.exist? path
88:       end
89: 
90:       path
91:     else
92:       nil
93:     end
94:   end

[Validate]