You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@avro.apache.org by bl...@apache.org on 2016/09/04 00:58:49 UTC

avro git commit: AVRO-1848: Ruby: Fix handling of falsey default values.

Repository: avro
Updated Branches:
  refs/heads/master 17cfe99d7 -> d7e123148


AVRO-1848: Ruby: Fix handling of falsey default values.


Project: http://git-wip-us.apache.org/repos/asf/avro/repo
Commit: http://git-wip-us.apache.org/repos/asf/avro/commit/d7e12314
Tree: http://git-wip-us.apache.org/repos/asf/avro/tree/d7e12314
Diff: http://git-wip-us.apache.org/repos/asf/avro/diff/d7e12314

Branch: refs/heads/master
Commit: d7e12314832f1ef58f87d2f5106ac6b49c5a0be9
Parents: 17cfe99
Author: Brian McKelvey <th...@gmail.com>
Authored: Thu May 19 15:43:58 2016 -0700
Committer: Ryan Blue <bl...@apache.org>
Committed: Sat Sep 3 17:58:34 2016 -0700

----------------------------------------------------------------------
 CHANGES.txt                   |  3 +++
 lang/ruby/lib/avro/io.rb      |  4 ++++
 lang/ruby/lib/avro/schema.rb  |  6 +++---
 lang/ruby/test/test_io.rb     | 21 +++++++++++++++++++++
 lang/ruby/test/test_schema.rb | 17 +++++++++++++++++
 5 files changed, 48 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/avro/blob/d7e12314/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 8ed05db..19f921b 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -32,6 +32,9 @@ Trunk (not yet released)
 
     AVRO-1888: Java: Fix single-record encoding marker check. (blue)
 
+    AVRO-1848: Ruby: Fix handling of falsey default values.
+    (Brian McKelvey via blue)
+
 Avro 1.8.1 (14 May 2016)
 
   INCOMPATIBLE CHANGES

http://git-wip-us.apache.org/repos/asf/avro/blob/d7e12314/lang/ruby/lib/avro/io.rb
----------------------------------------------------------------------
diff --git a/lang/ruby/lib/avro/io.rb b/lang/ruby/lib/avro/io.rb
index 1c10c4a..22beea2 100644
--- a/lang/ruby/lib/avro/io.rb
+++ b/lang/ruby/lib/avro/io.rb
@@ -407,6 +407,10 @@ module Avro
       end
 
       def read_default_value(field_schema, default_value)
+        if default_value == :no_default
+          raise AvroError, "Missing data for #{field_schema} with no default"
+        end
+
         # Basically a JSON Decoder?
         case field_schema.type_sym
         when :null

http://git-wip-us.apache.org/repos/asf/avro/blob/d7e12314/lang/ruby/lib/avro/schema.rb
----------------------------------------------------------------------
diff --git a/lang/ruby/lib/avro/schema.rb b/lang/ruby/lib/avro/schema.rb
index ba6067a..8e345e3 100644
--- a/lang/ruby/lib/avro/schema.rb
+++ b/lang/ruby/lib/avro/schema.rb
@@ -211,7 +211,7 @@ module Avro
           if field.respond_to?(:[]) # TODO(jmhodges) wtffffff
             type = field['type']
             name = field['name']
-            default = field['default']
+            default = field.key?('default') ? field['default'] : :no_default
             order = field['order']
             new_field = Field.new(type, name, default, order, names, namespace)
             # make sure field name has not been used yet
@@ -363,7 +363,7 @@ module Avro
     class Field < Schema
       attr_reader :type, :name, :default, :order
 
-      def initialize(type, name, default=nil, order=nil, names=nil, namespace=nil)
+      def initialize(type, name, default=:no_default, order=nil, names=nil, namespace=nil)
         @type = subparse(type, names, namespace)
         @name = name
         @default = default
@@ -372,7 +372,7 @@ module Avro
 
       def to_avro(names=Set.new)
         {'name' => name, 'type' => type.to_avro(names)}.tap do |avro|
-          avro['default'] = default if default
+          avro['default'] = default unless default == :no_default
           avro['order'] = order if order
         end
       end

http://git-wip-us.apache.org/repos/asf/avro/blob/d7e12314/lang/ruby/test/test_io.rb
----------------------------------------------------------------------
diff --git a/lang/ruby/test/test_io.rb b/lang/ruby/test/test_io.rb
index 7dca327..153cb94 100644
--- a/lang/ruby/test/test_io.rb
+++ b/lang/ruby/test/test_io.rb
@@ -342,6 +342,24 @@ EOS
   end
   private
 
+  def check_no_default(schema_json)
+    actual_schema = '{"type": "record", "name": "Foo", "fields": []}'
+    actual = Avro::Schema.parse(actual_schema)
+
+    expected_schema = <<EOS
+      {"type": "record",
+       "name": "Foo",
+       "fields": [{"name": "f", "type": #{schema_json}}]}
+EOS
+    expected = Avro::Schema.parse(expected_schema)
+
+    reader = Avro::IO::DatumReader.new(actual, expected)
+    assert_raise Avro::AvroError do
+      value = reader.read(Avro::IO::BinaryDecoder.new(StringIO.new))
+      assert_not_equal(value, :no_default) # should never return this
+    end
+  end
+
   def check_default(schema_json, default_json, default_value)
     actual_schema = '{"type": "record", "name": "Foo", "fields": []}'
     actual = Avro::Schema.parse(actual_schema)
@@ -381,6 +399,9 @@ EOS
 
     # test writing of data to file
     check_datafile(schema)
+
+    # check that AvroError is raised when there is no default
+    check_no_default(str)
   end
 
   def checkser(schm, randomdata)

http://git-wip-us.apache.org/repos/asf/avro/blob/d7e12314/lang/ruby/test/test_schema.rb
----------------------------------------------------------------------
diff --git a/lang/ruby/test/test_schema.rb b/lang/ruby/test/test_schema.rb
index 0668cf2..1643307 100644
--- a/lang/ruby/test/test_schema.rb
+++ b/lang/ruby/test/test_schema.rb
@@ -143,4 +143,21 @@ class TestSchema < Test::Unit::TestCase
 
     assert_equal '"MissingType" is not a schema we know about.', error.message
   end
+
+  def test_to_avro_handles_falsey_defaults
+    schema = Avro::Schema.parse <<-SCHEMA
+      {"type": "record", "name": "Record", "namespace": "my.name.space",
+        "fields": [
+          {"name": "is_usable", "type": "boolean", "default": false}
+        ]
+      }
+    SCHEMA
+
+    assert_equal schema.to_avro, {
+      'type' => 'record', 'name' => 'Record', 'namespace' => 'my.name.space',
+      'fields' => [
+        {'name' => 'is_usable', 'type' => 'boolean', 'default' => false}
+      ]
+    }
+  end
 end