def add( io )
      # spooling to a temp file because Gem::Format.from_io() closes the io
      # stream it is sent.  Why it does this, I do not know. This may be
      # removed once we are no longer using older rubygems
      tempfile = Tempfile.new(  "uploaded-gem.", temp_dir )
      tempfile.write( io.read )
      tempfile.rewind

      container = Stickler::GemContainer.new( tempfile.path )
      spec      = Stickler::SpecLite.new( container.spec.name, container.spec.version, container.spec.platform )
      specs     = search_for( spec )

      raise Error, "gem #{spec.full_name} already exists" unless specs.empty?

      tempfile.rewind
      return install( spec, tempfile )
    ensure
      tempfile.close!
    end
def add( io )
      # spooling to a temp file because Gem::Format.from_io() closes the io
      # stream it is sent.  Why it does this, I do not know. This may be
      # removed once we are no longer using older rubygems
      tempfile = Tempfile.new(  "uploaded-gem.", temp_dir )
      tempfile.write( io.read )
      tempfile.rewind

      container = Stickler::GemContainer.new( tempfile.path )
      spec      = Stickler::SpecLite.new( container.spec.name, container.spec.version, container.spec.platform )
      specs     = search_for( spec )

      raise Error, "gem #{spec.full_name} already exists" unless specs.empty?

      tempfile.rewind
      return install( spec, tempfile )
    ensure
      tempfile.close!
    end
:call-seq:
   repo.add( io ) -> Stickler::SpecLite

 A lower level version of #push.  The item passed in is an IO like object
 that contains the binary stream that is a .gem file.  IO must respond to
 #read and #rewind.