# class Gem::Package::Old

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.

### Public Class Methods

new (gem, security_policy)
Source

    # 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

Creates a new old-format package reader for `gem`. Old-format packages cannot be written.

### Public Instance Methods

contents ()
Source

    # 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

A list of file names contained in this gem

extract_files (destination_dir)
Source

    # 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.unpack1("m")
          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 && 0o755

          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

Extracts the files in this package into `destination_dir`

spec ()
Source

    # 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 Psych::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

The specification for this gem

verify ()
Source

    # File lib/rubygems/package/old.rb, line 160
    def verify
      return true unless @security_policy

      raise Gem::Security::Exception,
            "old format gems do not contain signatures and cannot be verified" if
        @security_policy.verify_data

      true
    end

Raises an exception if a security policy that verifies data is active. `Old` format gems cannot be verified as signed.