Adds support for trailing metadata

- removes the status class, replacing it with a Struct
- adds support for trailing metadata, merging into the call's initial metadata

- tracks []
	Change on 2014/12/15 by temiola <temiola@google.com>
-------------
Created by MOE: http://code.google.com/p/moe-java
MOE_MIGRATED_REVID=82193372
diff --git a/src/ruby/spec/call_spec.rb b/src/ruby/spec/call_spec.rb
index 1332b3c..8e8e3d3 100644
--- a/src/ruby/spec/call_spec.rb
+++ b/src/ruby/spec/call_spec.rb
@@ -88,29 +88,30 @@
 
   describe '#start_read' do
     it 'should fail if called immediately' do
-      expect { make_test_call.start_read(@tag) }.to raise_error GRPC::Core::CallError
+      blk = Proc.new { make_test_call.start_read(@tag) }
+      expect(&blk).to raise_error GRPC::Core::CallError
     end
   end
 
   describe '#start_write' do
     it 'should fail if called immediately' do
       bytes = GRPC::Core::ByteBuffer.new('test string')
-      expect { make_test_call.start_write(bytes, @tag) }
-          .to raise_error GRPC::Core::CallError
+      blk = Proc.new { make_test_call.start_write(bytes, @tag) }
+      expect(&blk).to raise_error GRPC::Core::CallError
     end
   end
 
   describe '#start_write_status' do
     it 'should fail if called immediately' do
-      sts = GRPC::Core::Status.new(153, 'test detail')
-      expect { make_test_call.start_write_status(sts, @tag) }
-          .to raise_error GRPC::Core::CallError
+      blk = Proc.new { make_test_call.start_write_status(153, 'x', @tag) }
+      expect(&blk).to raise_error GRPC::Core::CallError
     end
   end
 
   describe '#writes_done' do
     it 'should fail if called immediately' do
-      expect { make_test_call.writes_done(@tag) }.to raise_error GRPC::Core::CallError
+      blk = Proc.new { make_test_call.writes_done(Object.new) }
+      expect(&blk).to raise_error GRPC::Core::CallError
     end
   end
 
@@ -153,9 +154,9 @@
   describe '#status' do
     it 'can save the status and read it back' do
       call = make_test_call
-      sts = GRPC::Core::Status.new(OK, 'OK')
+      sts = Struct::Status.new(OK, 'OK')
       expect { call.status = sts }.not_to raise_error
-      expect(call.status).to be(sts)
+      expect(call.status).to eq(sts)
     end
 
     it 'must be set to a status' do
diff --git a/src/ruby/spec/client_server_spec.rb b/src/ruby/spec/client_server_spec.rb
index 91abfc0..5e68f52 100644
--- a/src/ruby/spec/client_server_spec.rb
+++ b/src/ruby/spec/client_server_spec.rb
@@ -154,8 +154,8 @@
     server_call = ev.call
     server_call.server_accept(@server_queue, @server_finished_tag)
     server_call.server_end_initial_metadata()
-    sts = Status.new(StatusCodes::NOT_FOUND, 'not found')
-    server_call.start_write_status(sts, @server_tag)
+    server_call.start_write_status(StatusCodes::NOT_FOUND, 'not found',
+                                   @server_tag)
 
     # client gets an empty response for the read, preceeded by some metadata.
     call.start_read(@tag)
@@ -175,8 +175,7 @@
     call = new_client_call
     client_sends(call)
     server_call = server_receives_and_responds_with('server_response')
-    sts = Status.new(10101, 'status code is 10101')
-    server_call.start_write_status(sts, @server_tag)
+    server_call.start_write_status(10101, 'status code is 10101', @server_tag)
 
     # first the client says writes are done
     call.start_read(@tag)
@@ -187,7 +186,7 @@
     # but nothing happens until the server sends a status
     expect_next_event_on(@server_queue, FINISH_ACCEPTED, @server_tag)
     ev = expect_next_event_on(@server_queue, FINISHED, @server_finished_tag)
-    expect(ev.result).to be_a(Status)
+    expect(ev.result).to be_a(Struct::Status)
 
     # client gets FINISHED
     expect_next_event_on(@client_queue, FINISH_ACCEPTED, @tag)
diff --git a/src/ruby/spec/status_spec.rb b/src/ruby/spec/status_spec.rb
deleted file mode 100644
index 63dcefb..0000000
--- a/src/ruby/spec/status_spec.rb
+++ /dev/null
@@ -1,166 +0,0 @@
-# Copyright 2014, Google Inc.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-#     * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following disclaimer
-# in the documentation and/or other materials provided with the
-# distribution.
-#     * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-require 'grpc'
-
-
-describe GRPC::Core::StatusCodes do
-
-  StatusCodes = GRPC::Core::StatusCodes
-
-  before(:each) do
-    @known_types = {
-      :OK => 0,
-      :CANCELLED => 1,
-      :UNKNOWN => 2,
-      :INVALID_ARGUMENT => 3,
-      :DEADLINE_EXCEEDED => 4,
-      :NOT_FOUND => 5,
-      :ALREADY_EXISTS => 6,
-      :PERMISSION_DENIED => 7,
-      :RESOURCE_EXHAUSTED => 8,
-      :FAILED_PRECONDITION => 9,
-      :ABORTED => 10,
-      :OUT_OF_RANGE => 11,
-      :UNIMPLEMENTED => 12,
-      :INTERNAL => 13,
-      :UNAVAILABLE => 14,
-      :DATA_LOSS => 15,
-      :UNAUTHENTICATED => 16
-    }
-  end
-
-  it 'should have symbols for all the known status codes' do
-    m = StatusCodes
-    syms_and_codes = m.constants.collect { |c| [c, m.const_get(c)] }
-    expect(Hash[syms_and_codes]).to eq(@known_types)
-  end
-
-end
-
-
-describe GRPC::Core::Status do
-
-  Status = GRPC::Core::Status
-
-  describe '#new' do
-    it 'should create new instances' do
-      expect { Status.new(142, 'test details') }.to_not raise_error
-    end
-  end
-
-  describe '#details' do
-    it 'return the detail' do
-      sts = Status.new(142, 'test details')
-      expect(sts.details).to eq('test details')
-    end
-  end
-
-  describe '#code' do
-    it 'should return the code' do
-      sts = Status.new(142, 'test details')
-      expect(sts.code).to eq(142)
-    end
-  end
-
-  describe '#dup' do
-    it 'should create a copy that returns the correct details' do
-      sts = Status.new(142, 'test details')
-      expect(sts.dup.code).to eq(142)
-    end
-
-    it 'should create a copy that returns the correct code' do
-      sts = Status.new(142, 'test details')
-      expect(sts.dup.details).to eq('test details')
-    end
-  end
-
-
-end
-
-
-describe GRPC::BadStatus do
-
-  BadStatus = GRPC::BadStatus
-
-  describe '#new' do
-    it 'should create new instances' do
-      expect { BadStatus.new(142, 'test details') }.to_not raise_error
-    end
-  end
-
-  describe '#details' do
-    it 'return the detail' do
-      err = BadStatus.new(142, 'test details')
-      expect(err.details).to eq('test details')
-    end
-  end
-
-  describe '#code' do
-    it 'should return the code' do
-      err = BadStatus.new(142, 'test details')
-      expect(err.code).to eq(142)
-    end
-  end
-
-  describe '#dup' do
-    it 'should create a copy that returns the correct details' do
-      err = BadStatus.new(142, 'test details')
-      expect(err.dup.code).to eq(142)
-    end
-
-    it 'should create a copy that returns the correct code' do
-      err = BadStatus.new(142, 'test details')
-      expect(err.dup.details).to eq('test details')
-    end
-  end
-
-  describe '#to_status' do
-    it 'should create a Status with the same code and details' do
-      err = BadStatus.new(142, 'test details')
-      sts = err.to_status
-      expect(sts.code).to eq(142)
-      expect(sts.details).to eq('test details')
-    end
-
-    it 'should create a copy that returns the correct code' do
-      err = BadStatus.new(142, 'test details')
-      expect(err.dup.details).to eq('test details')
-    end
-  end
-
-  describe 'as an exception' do
-
-    it 'can be raised' do
-      blk = Proc.new { raise BadStatus.new(343, 'status 343') }
-      expect(&blk).to raise_error(BadStatus)
-    end
-  end
-
-end