# 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
# 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
# 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
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
Commenting is here to help enhance the documentation. For example, code samples, or clarification of the documentation.
If you have questions about Ruby or the documentation, please post to one of the Ruby mailing lists. You will get better, faster, help that way.
If you wish to post a correction of the docs, please do so, but also file bug report so that it can be corrected for the next release. Thank you.
If you want to help improve the Ruby documentation, please see Improve the docs, or visit Documenting-ruby.org.