瀏覽代碼

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

Josh Haberman 9 年之前
父節點
當前提交
3cec2ea8d6
共有 3 個文件被更改,包括 42 次插入11 次删除
  1. 1 0
      Makefile.am
  2. 17 11
      ruby/lib/google/protobuf/well_known_types.rb
  3. 24 0
      ruby/tests/well_known_types_test.rb

+ 1 - 0
Makefile.am

@@ -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              \

+ 17 - 11
ruby/lib/google/protobuf/well_known_types.rb

@@ -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
         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
       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

+ 24 - 0
ruby/tests/well_known_types_test.rb

@@ -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