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