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  | 
| .raw_spec | Extracts the  | 
Instance Attribute Summary
::Gem::Package - Inherited
| #checksums | Checksums for the contents of the package. | 
| #data_mode | Permission for other files. | 
| #dir_mode | Permission for directories. | 
| #files | The files in this package. | 
| #gem | Reference to the gem being packaged. | 
| #prog_mode | Permission for program files. | 
| #security_policy | The security policy used for verifying the contents of this package. | 
| #spec | The spec for this gem. | 
| #spec= | Sets the  | 
| #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 #gem. | 
| #mkdir_p_safe, #normalize_path, | |
| #read_checksums | Reads and loads checksums.yaml.gz from the tar file #gem | 
| #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 #gem | 
| #add_contents | Adds the files listed in the packages’s  | 
| #add_files | Adds files included the package’s  | 
| #add_metadata | Adds the package’s  | 
| #digest | Creates a digest of the TarEntry  | 
| #extract_tar_gz | Extracts all the files in the gzipped tar archive  | 
| #file_mode, | |
| #install_location | Returns the full path for installing  | 
| #load_spec | Loads a  | 
| #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  | 
| #truncate_text, #min3 | |
Constructor Details
    .new(gem, security_policy)  ⇒ Old 
  
Creates a new old-format package reader for Gem::Package#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), :mode => dir_mode && 0755 File.open destination, 'wb', file_mode(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 begin @spec = Gem::Specification.from_yaml yaml rescue YAML::SyntaxError 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.