From e3094a8d803c0b9df33a8a506cce28a89c5fd6e8 Mon Sep 17 00:00:00 2001 From: Josh Haberman Date: Wed, 27 Jul 2016 17:31:16 -0700 Subject: Ruby: added API support for well-known types. --- Makefile.am | 1 + 1 file changed, 1 insertion(+) (limited to 'Makefile.am') diff --git a/Makefile.am b/Makefile.am index ccbfd065..3b177da1 100644 --- a/Makefile.am +++ b/Makefile.am @@ -707,6 +707,7 @@ ruby_EXTRA_DIST= \ ruby/tests/generated_code.proto \ ruby/tests/test_import.proto \ ruby/tests/generated_code_test.rb \ + ruby/tests/well_known_types_test.rb \ ruby/travis-test.sh js_EXTRA_DIST= \ -- cgit v1.2.3 From 3cec2ea8d61f5ebebb64af967db782e867da849f Mon Sep 17 00:00:00 2001 From: Josh Haberman Date: Mon, 1 Aug 2016 14:31:31 -0700 Subject: Ruby: added custom Struct exception type and fixed Makefile.am. --- Makefile.am | 1 + ruby/lib/google/protobuf/well_known_types.rb | 28 +++++++++++++++++----------- ruby/tests/well_known_types_test.rb | 24 ++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 11 deletions(-) (limited to 'Makefile.am') diff --git a/Makefile.am b/Makefile.am index 3b177da1..d4096b03 100644 --- a/Makefile.am +++ b/Makefile.am @@ -681,6 +681,7 @@ ruby_EXTRA_DIST= \ ruby/google-protobuf.gemspec \ ruby/lib/google/protobuf/message_exts.rb \ ruby/lib/google/protobuf/repeated_field.rb \ + ruby/lib/google/protobuf/well_known_types.rb \ ruby/lib/google/protobuf.rb \ ruby/pom.xml \ ruby/src/main/java/com/google/protobuf/jruby/RubyBuilder.java \ diff --git a/ruby/lib/google/protobuf/well_known_types.rb b/ruby/lib/google/protobuf/well_known_types.rb index d0d15045..547de874 100644 --- a/ruby/lib/google/protobuf/well_known_types.rb +++ b/ruby/lib/google/protobuf/well_known_types.rb @@ -90,6 +90,8 @@ module Google end end + class UnexpectedStructType < Google::Protobuf::Error; end + Value.class_eval do def to_ruby(recursive = false) case self.kind @@ -114,31 +116,32 @@ module Google when :bool_value self.bool_value else - raise "Value not set" + raise UnexpectedStructType end end def from_ruby(value) - if value.nil? + case value + when NilClass self.null_value = 0 - elsif value.is_a?(Numeric) + when Numeric self.number_value = value - elsif value.is_a?(String) + when String self.string_value = value - elsif value.is_a?(TrueClass) + when TrueClass self.bool_value = true - elsif value.is_a?(FalseClass) + when FalseClass self.bool_value = false - elsif value.is_a?(Struct) + when Struct self.struct_value = value - elsif value.is_a?(Hash) + when Hash self.struct_value = Struct.from_hash(value) - elsif value.is_a?(ListValue) + when ListValue self.list_value = value - elsif value.is_a?(Array) + when Array self.list_value = ListValue.from_a(value) else - raise "Unexpected type" + raise UnexpectedStructType end end end @@ -149,6 +152,9 @@ module Google end 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].from_ruby(value) end diff --git a/ruby/tests/well_known_types_test.rb b/ruby/tests/well_known_types_test.rb index 32e73f55..9b46632b 100644 --- a/ruby/tests/well_known_types_test.rb +++ b/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["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 def test_any -- cgit v1.2.3