Class: LibGems::Commands::UnpackCommand

Inherits:
LibGems::Command show all
Includes:
VersionOption
Defined in:
lib/libgems/commands/unpack_command.rb

Instance Attribute Summary

Attributes inherited from LibGems::Command

#command, #defaults, #options, #program_name, #summary

Instance Method Summary collapse

Methods included from VersionOption

#add_platform_option, #add_prerelease_option, #add_version_option

Methods inherited from LibGems::Command

add_common_option, #add_extra_args, #add_option, add_specific_extra_args, #begins?, build_args, build_args=, common_options, #description, extra_args, extra_args=, #get_all_gem_names, #get_one_gem_name, #get_one_optional_argument, #handle_options, #handles?, #invoke, #merge_options, #remove_option, #show_help, #show_lookup_failure, specific_extra_args, specific_extra_args_hash, #when_invoked

Methods included from UserInteraction

#methname

Methods included from DefaultUserInteraction

ui, #ui, ui=, #ui=, use_ui, #use_ui

Constructor Details

#initializeUnpackCommand

Returns a new instance of UnpackCommand.



10
11
12
13
14
15
16
17
18
19
20
21
# File 'lib/libgems/commands/unpack_command.rb', line 10

def initialize
  super 'unpack', 'Unpack an installed gem to the current directory',
        :version => LibGems::Requirement.default,
        :target  => Dir.pwd

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

  add_version_option
end

Instance Method Details

#argumentsObject

:nodoc:



23
24
25
# File 'lib/libgems/commands/unpack_command.rb', line 23

def arguments # :nodoc:
  "GEMNAME       name of gem to unpack"
end

#defaults_strObject

:nodoc:



27
28
29
# File 'lib/libgems/commands/unpack_command.rb', line 27

def defaults_str # :nodoc:
  "--version '#{LibGems::Requirement.default}'"
end

#download(dependency) ⇒ Object



35
36
37
38
39
40
41
42
43
# File 'lib/libgems/commands/unpack_command.rb', line 35

def download dependency
  found = LibGems::SpecFetcher.fetcher.fetch dependency

  return if found.empty?

  spec, source_uri = found.first

  LibGems::RemoteFetcher.fetcher.download spec, source_uri
end

#executeObject

– TODO: allow, e.g., ‘gem unpack rake-0.3.1’. Find a general solution for this, so that it works for uninstall as well. (And check other commands at the same time.)



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/libgems/commands/unpack_command.rb', line 50

def execute
  get_all_gem_names.each do |name|
    dependency = LibGems::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
      LibGems::Installer.new(path, :unpack => true).unpack target_dir
      say "Unpacked gem: '#{target_dir}'"
    else
      alert_error "Gem '#{name}' not installed."
    end
  end
end

#find_in_cache(filename) ⇒ Object

Find cached filename in LibGems.path. Returns nil if the file cannot be found.

– TODO: see comments in get_path() about general service.



74
75
76
77
78
79
80
81
# File 'lib/libgems/commands/unpack_command.rb', line 74

def find_in_cache(filename)
  LibGems.path.each do |gem_dir|
    this_path = File.join gem_dir, 'cache', filename
    return this_path if File.exist? this_path
  end

  return nil
end

#get_path(dependency) ⇒ Object

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)

– TODO: This should be refactored so that it’s a general service. I don’t think any of our existing classes are the right place though. Just maybe ‘Cache’?

TODO: It just uses LibGems.dir for now. What’s an easy way to get the list of source directories?



100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# File 'lib/libgems/commands/unpack_command.rb', line 100

def get_path dependency
  return dependency.name if dependency.name =~ /\.gem$/i

  specs = LibGems.source_index.search dependency

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

  return download(dependency) if selected.nil?

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

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

  path
end

#usageObject

:nodoc:



31
32
33
# File 'lib/libgems/commands/unpack_command.rb', line 31

def usage # :nodoc:
  "#{program_name} GEMNAME"
end