Fix up Rubinius specific library specs.
[rbx.git] / lib / rubygems / format.rb
blob7dc127d5f4bd120ca8515b2e233cf23df7490ef1
1 #--
2 # Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
3 # All rights reserved.
4 # See LICENSE.txt for permissions.
5 #++
7 require 'fileutils'
9 require 'rubygems/package'
11 module Gem
13   ##
14   # The format class knows the guts of the RubyGem .gem file format
15   # and provides the capability to read gem files
16   #
17   class Format
18     attr_accessor :spec, :file_entries, :gem_path
19     extend Gem::UserInteraction
20   
21     ##
22     # Constructs an instance of a Format object, representing the gem's
23     # data structure.
24     #
25     # gem:: [String] The file name of the gem
26     #
27     def initialize(gem_path)
28       @gem_path = gem_path
29     end
30     
31     ##
32     # Reads the named gem file and returns a Format object, representing 
33     # the data from the gem file
34     #
35     # file_path:: [String] Path to the gem file
36     #
37     def self.from_file_by_path(file_path, security_policy = nil)
38       format = nil
40       unless File.exist?(file_path)
41         raise Gem::Exception, "Cannot load gem at [#{file_path}] in #{Dir.pwd}"
42       end
44       # check for old version gem
45       if File.read(file_path, 20).include?("MD5SUM =")
46         require 'rubygems/old_format'
48         format = OldFormat.from_file_by_path(file_path)
49       else
50         open file_path, Gem.binary_mode do |io|
51           format = from_io io, file_path, security_policy
52         end
53       end
55       return format
56     end
58     ##
59     # Reads a gem from an io stream and returns a Format object, representing
60     # the data from the gem file
61     #
62     # io:: [IO] Stream from which to read the gem
63     #
64     def self.from_io(io, gem_path="(io)", security_policy = nil)
65       format = new gem_path
67       Package.open io, 'r', security_policy do |pkg|
68         format.spec = pkg.metadata
69         format.file_entries = []
71         pkg.each do |entry|
72           size = entry.header.size
73           mode = entry.header.mode
75           format.file_entries << [{
76               "size" => size, "mode" => mode, "path" => entry.full_name,
77             },
78             entry.read
79           ]
80         end
81       end
83       format
84     end
86   end
87 end