Support for the Ruby 2.4 series has ended. See here for reference.
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.
Creates a new old-format package reader for gem. Old-format packages cannot be written.
# File 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
A list of file names contained in this gem
# File 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
Extracts the files in this package into destination_dir
# File 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
open destination, 'wb', entry['mode'] do |out|
out.write file_data
end
verbose destination
end
end
rescue Zlib::DataError
raise Gem::Exception, errstr
end
The specification for this gem
# File 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
Raises an exception if a security policy that verifies data is active. Old format gems cannot be verified as signed.
# File rubygems/package/old.rb, line 168
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