Commit 3cec2ea8 authored by Josh Haberman's avatar Josh Haberman

Ruby: added custom Struct exception type and fixed Makefile.am.

parent a207a2bd
...@@ -681,6 +681,7 @@ ruby_EXTRA_DIST= \ ...@@ -681,6 +681,7 @@ ruby_EXTRA_DIST= \
ruby/google-protobuf.gemspec \ ruby/google-protobuf.gemspec \
ruby/lib/google/protobuf/message_exts.rb \ ruby/lib/google/protobuf/message_exts.rb \
ruby/lib/google/protobuf/repeated_field.rb \ ruby/lib/google/protobuf/repeated_field.rb \
ruby/lib/google/protobuf/well_known_types.rb \
ruby/lib/google/protobuf.rb \ ruby/lib/google/protobuf.rb \
ruby/pom.xml \ ruby/pom.xml \
ruby/src/main/java/com/google/protobuf/jruby/RubyBuilder.java \ ruby/src/main/java/com/google/protobuf/jruby/RubyBuilder.java \
......
...@@ -90,6 +90,8 @@ module Google ...@@ -90,6 +90,8 @@ module Google
end end
end end
class UnexpectedStructType < Google::Protobuf::Error; end
Value.class_eval do Value.class_eval do
def to_ruby(recursive = false) def to_ruby(recursive = false)
case self.kind case self.kind
...@@ -114,31 +116,32 @@ module Google ...@@ -114,31 +116,32 @@ module Google
when :bool_value when :bool_value
self.bool_value self.bool_value
else else
raise "Value not set" raise UnexpectedStructType
end end
end end
def from_ruby(value) def from_ruby(value)
if value.nil? case value
when NilClass
self.null_value = 0 self.null_value = 0
elsif value.is_a?(Numeric) when Numeric
self.number_value = value self.number_value = value
elsif value.is_a?(String) when String
self.string_value = value self.string_value = value
elsif value.is_a?(TrueClass) when TrueClass
self.bool_value = true self.bool_value = true
elsif value.is_a?(FalseClass) when FalseClass
self.bool_value = false self.bool_value = false
elsif value.is_a?(Struct) when Struct
self.struct_value = value self.struct_value = value
elsif value.is_a?(Hash) when Hash
self.struct_value = Struct.from_hash(value) self.struct_value = Struct.from_hash(value)
elsif value.is_a?(ListValue) when ListValue
self.list_value = value self.list_value = value
elsif value.is_a?(Array) when Array
self.list_value = ListValue.from_a(value) self.list_value = ListValue.from_a(value)
else else
raise "Unexpected type" raise UnexpectedStructType
end end
end end
end end
...@@ -149,6 +152,9 @@ module Google ...@@ -149,6 +152,9 @@ module Google
end end
def []=(key, value) def []=(key, value)
unless key.is_a?(String)
raise UnexpectedStructType, "Struct keys must be strings."
end
self.fields[key] ||= Google::Protobuf::Value.new self.fields[key] ||= Google::Protobuf::Value.new
self.fields[key].from_ruby(value) self.fields[key].from_ruby(value)
end end
......
...@@ -85,6 +85,30 @@ class TestWellKnownTypes < Test::Unit::TestCase ...@@ -85,6 +85,30 @@ class TestWellKnownTypes < Test::Unit::TestCase
assert_equal(should_equal, struct.to_h) assert_equal(should_equal, struct.to_h)
assert_equal(should_equal["sublist"].length, struct["sublist"].length) assert_equal(should_equal["sublist"].length, struct["sublist"].length)
assert_raise Google::Protobuf::UnexpectedStructType do
struct[123] = 5
end
assert_raise Google::Protobuf::UnexpectedStructType do
struct[5] = Time.new
end
assert_raise Google::Protobuf::UnexpectedStructType do
struct[5] = [Time.new]
end
assert_raise Google::Protobuf::UnexpectedStructType do
struct[5] = {123 => 456}
end
assert_raise Google::Protobuf::UnexpectedStructType do
struct = Google::Protobuf::Struct.new
struct.fields["foo"] = Google::Protobuf::Value.new
# Tries to return a Ruby value for a Value class whose type
# hasn't been filled in.
struct["foo"]
end
end end
def test_any def test_any
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment