Class: Gem::Package::Old
| Relationships & Source Files | |
| Super Chains via Extension / Inclusion / Inheritance | |
| Class Chain: 
          self,
          ::Gem::Package
         | |
| Instance Chain: | |
| Inherits: | Gem::Package 
 | 
| Defined in: | lib/rubygems/package/old.rb | 
Overview
The format class knows the guts of the ancient .gem file format and provides the capability to read such ancient gems.
Please pretend this doesn't exist.
Class Method Summary
- 
    
      .new(gem, security_policy)  ⇒ Old 
    
    constructor
    Creates a new old-format package reader for gem.
::Gem::Package - Inherited
| .build, | |
| .new | Creates a new ::Gem::Package for the file at  | 
Instance Attribute Summary
::Gem::Package - Inherited
| #checksums | Checksums for the contents of the package. | 
| #files | The files in this package. | 
| #security_policy | The security policy used for verifying the contents of this package. | 
| #spec | The spec for this gem. | 
| #spec= | Sets the ::Gem::Specification to use to build this package. | 
| #build_time | |
::Gem::DefaultUserInteraction - Included
Instance Method Summary
- 
    
      #contents  
    
    A list of file names contained in this gem. 
- 
    
      #extract_files(destination_dir)  
    
    Extracts the files in this package into destination_dir
- 
    
      #spec  
    
    The specification for this gem. 
- 
    
      #verify  
    
    Raises an exception if a security policy that verifies data is active. 
- 
    
      #file_list(io)  
    
    Internal use only
    Reads the file list section from the old-format gem io
- 
    
      #read_until_dashes(io)  
    
    Internal use only
    Reads lines until a “—” separator is found. 
- 
    
      #skip_ruby(io)  
    
    Internal use only
    Skips the Ruby self-install header in io.
::Gem::Package - Inherited
| #add_checksums | Adds a checksum for each entry in the gem to checksums.yaml.gz. | 
| #build | Builds this package based on the specification set by #spec= | 
| #contents | A list of file names contained in this gem. | 
| #copy_to | Copies this package to Gem.path (if possible). | 
| #extract_files | Extracts the files in this package into  | 
| #gzip_to | Gzips content written to  | 
| #initialize | Creates a new package that will read or write to the file  | 
| #mkdir_p_safe, | |
| #read_checksums | Reads and loads checksums.yaml.gz from the tar file  | 
| #realpath | See additional method definition at line 649. | 
| #setup_signer | Prepares the gem for signing and checksum generation. | 
| #verify | Verifies that this gem: | 
| #verify_entry | Verifies  | 
| #verify_files | Verifies the files of the  | 
| #add_contents | Adds the files listed in the packages's ::Gem::Specification to data.tar.gz and adds this file to the  | 
| #add_files | Adds files included the package's ::Gem::Specification to the  | 
| #add_metadata | Adds the package's ::Gem::Specification to the  | 
| #digest | Creates a digest of the TarEntry  | 
| #extract_tar_gz | Extracts all the files in the gzipped tar archive  | 
| #install_location | Returns the full path for installing  | 
| #load_spec | Loads a ::Gem::Specification from the TarEntry  | 
| #open_tar_gz | Opens  | 
| #verify_checksums | Verifies the #checksums against the  | 
| #verify_gz | Verifies that  | 
::Gem::UserInteraction - Included
| #alert | Displays an alert  | 
| #alert_error | Displays an error  | 
| #alert_warning | Displays a warning  | 
| #ask | Asks a  | 
| #ask_for_password | Asks for a password with a  | 
| #ask_yes_no | Asks a yes or no  | 
| #choose_from_list | Asks the user to answer  | 
| #say | Displays the given  | 
| #terminate_interaction | Terminates the RubyGems process with the given  | 
| #verbose | Calls  | 
::Gem::DefaultUserInteraction - Included
::Gem::Text - Included
| #clean_text | Remove any non-printable characters and make the text suitable for printing. | 
| #format_text | Wraps  | 
| #levenshtein_distance | This code is based directly on the ::Gem::Text gem implementation Returns a value representing the “cost” of transforming str1 into str2. | 
| #truncate_text, #min3 | |
Constructor Details
    .new(gem, security_policy)  ⇒ Old 
  
Creates a new old-format package reader for gem.  Old-format packages cannot be written.
# File 'lib/rubygems/package/old.rb', line 22
def initialize gem, security_policy require 'fileutils' require 'zlib' Gem.load_yaml @contents = nil @gem = gem @security_policy = security_policy @spec = nil end
Instance Method Details
#contents
A list of file names contained in this gem
# File 'lib/rubygems/package/old.rb', line 36
def contents verify return @contents if @contents @gem.with_read_io do |io| read_until_dashes io # spec header = file_list io @contents = header.map { |file| file['path'] } end end
#extract_files(destination_dir)
Extracts the files in this package into destination_dir
# File 'lib/rubygems/package/old.rb', line 52
def extract_files destination_dir verify errstr = "Error reading files from gem" @gem.with_read_io do |io| read_until_dashes io # spec header = file_list io raise Gem::Exception, errstr unless header header.each do |entry| full_name = entry['path'] destination = install_location full_name, destination_dir file_data = String.new read_until_dashes io do |line| file_data << line end file_data = file_data.strip.unpack("m")[0] file_data = Zlib::Inflate.inflate file_data raise Gem::Package::FormatError, "#{full_name} in #{@gem} is corrupt" if file_data.length != entry['size'].to_i FileUtils.rm_rf destination FileUtils.mkdir_p File.dirname destination File.open destination, 'wb', entry['mode'] do |out| out.write file_data end verbose destination end end rescue Zlib::DataError raise Gem::Exception, errstr end
#file_list(io)
Reads the file list section from the old-format gem io
# File 'lib/rubygems/package/old.rb', line 97
def file_list io # :nodoc: header = String.new read_until_dashes io do |line| header << line end Gem::SafeYAML.safe_load header end
#read_until_dashes(io)
Reads lines until a “—” separator is found
# File 'lib/rubygems/package/old.rb', line 110
def read_until_dashes io # :nodoc: while (line = io.gets) && line.chomp.strip != "---" do yield line if block_given? end end
#skip_ruby(io)
Skips the Ruby self-install header in io.
#spec
The specification for this gem
# File 'lib/rubygems/package/old.rb', line 133
def spec verify return @spec if @spec yaml = String.new @gem.with_read_io do |io| skip_ruby io read_until_dashes io do |line| yaml << line end end yaml_error = if RUBY_VERSION < '1.9' then YAML::ParseError elsif YAML.const_defined?(:ENGINE) && YAML::ENGINE.yamler == 'syck' then YAML::ParseError else YAML::SyntaxError end begin @spec = Gem::Specification.from_yaml yaml rescue yaml_error raise Gem::Exception, "Failed to parse gem specification out of gem file" end rescue ArgumentError raise Gem::Exception, "Failed to parse gem specification out of gem file" end
#verify
Raises an exception if a security policy that verifies data is active. Old format gems cannot be verified as signed.