Class: LibGems::Commands::UnpackCommand
- Inherits:
-
LibGems::Command
- Object
- LibGems::Command
- LibGems::Commands::UnpackCommand
- 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
-
#arguments ⇒ Object
:nodoc:.
-
#defaults_str ⇒ Object
:nodoc:.
- #download(dependency) ⇒ Object
-
#execute ⇒ Object
– TODO: allow, e.g., ‘gem unpack rake-0.3.1’.
-
#find_in_cache(filename) ⇒ Object
Find cached filename in LibGems.path.
-
#get_path(dependency) ⇒ Object
Return the full path to the cached gem file matching the given name and version requirement.
-
#initialize ⇒ UnpackCommand
constructor
A new instance of UnpackCommand.
-
#usage ⇒ Object
:nodoc:.
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
Methods included from DefaultUserInteraction
ui, #ui, ui=, #ui=, use_ui, #use_ui
Constructor Details
#initialize ⇒ UnpackCommand
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, | [:target] = value end add_version_option end |
Instance Method Details
#arguments ⇒ Object
:nodoc:
23 24 25 |
# File 'lib/libgems/commands/unpack_command.rb', line 23 def arguments # :nodoc: "GEMNAME name of gem to unpack" end |
#defaults_str ⇒ Object
: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 |
#execute ⇒ Object
– 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, [:version] path = get_path dependency if path then basename = File.basename path, '.gem' target_dir = File. basename, [: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 |
#usage ⇒ Object
:nodoc:
31 32 33 |
# File 'lib/libgems/commands/unpack_command.rb', line 31 def usage # :nodoc: "#{program_name} GEMNAME" end |