aboutsummaryrefslogtreecommitdiffstats
path: root/lib/rubygems/builder.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rubygems/builder.rb')
-rw-r--r--lib/rubygems/builder.rb81
1 files changed, 81 insertions, 0 deletions
diff --git a/lib/rubygems/builder.rb b/lib/rubygems/builder.rb
new file mode 100644
index 0000000000..f7f07e86bf
--- /dev/null
+++ b/lib/rubygems/builder.rb
@@ -0,0 +1,81 @@
+#--
+# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
+# All rights reserved.
+# See LICENSE.txt for permissions.
+#++
+
+module Gem
+
+ ##
+ # The Builder class processes RubyGem specification files
+ # to produce a .gem file.
+ #
+ class Builder
+
+ include UserInteraction
+ ##
+ # Constructs a builder instance for the provided specification
+ #
+ # spec:: [Gem::Specification] The specification instance
+ #
+ def initialize(spec)
+ require "yaml"
+ require "rubygems/package"
+ require "rubygems/security"
+
+ @spec = spec
+ end
+
+ ##
+ # Builds the gem from the specification. Returns the name of the file
+ # written.
+ #
+ def build
+ @spec.mark_version
+ @spec.validate
+ @signer = sign
+ write_package
+ say success
+ @spec.file_name
+ end
+
+ def success
+ <<-EOM
+ Successfully built RubyGem
+ Name: #{@spec.name}
+ Version: #{@spec.version}
+ File: #{@spec.full_name+'.gem'}
+EOM
+ end
+
+ private
+
+ def sign
+ # if the signing key was specified, then load the file, and swap
+ # to the public key (TODO: we should probably just omit the
+ # signing key in favor of the signing certificate, but that's for
+ # the future, also the signature algorithm should be configurable)
+ signer = nil
+ if @spec.respond_to?(:signing_key) && @spec.signing_key
+ signer = Gem::Security::Signer.new(@spec.signing_key, @spec.cert_chain)
+ @spec.signing_key = nil
+ @spec.cert_chain = signer.cert_chain.map { |cert| cert.to_s }
+ end
+ signer
+ end
+
+ def write_package
+ Package.open(@spec.file_name, "w", @signer) do |pkg|
+ pkg.metadata = @spec.to_yaml
+ @spec.files.each do |file|
+ next if File.directory? file
+ pkg.add_file_simple(file, File.stat(@spec.file_name).mode & 0777,
+ File.size(file)) do |os|
+ os.write File.open(file, "rb"){|f|f.read}
+ end
+ end
+ end
+ end
+ end
+end
+