avro 1.8.1 → 1.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d432977a240aa9a9356c21483d0f1f601079131e
4
- data.tar.gz: a3a7f480daee4ae503f2aa32a053efc4c387ff1f
3
+ metadata.gz: 2725b644b8e1c2579bb7aa83a4f60a3f14486122
4
+ data.tar.gz: ce3c78d318872ff111c58d9cfab710fa207006ad
5
5
  SHA512:
6
- metadata.gz: 322bf3242f8e369ed7cbceb8b82ebeb526b68a00137e18a9834cb62ea14e01e3e885549fe0301721e46546f9c657eedf596bfeba39e86f3fdb8a2a3e6ceadc13
7
- data.tar.gz: 95c50679ab7d3c68e47db5e8b32e323460623dffba5fc9c22a7d95cca9a11ecba60951bcbdb3b1cdb34d30d27225dede1dbb44635791b857538aa8fdd4d33c78
6
+ metadata.gz: 54a416f6e98d93cf33de8d6ac2d6fac40337793597cd010e98576501880ca4377398aefb4fc07f7e7d4dd7859eb062ec78e923ebf7d45b8c3084d25c4d389be8
7
+ data.tar.gz: 224c3f0ee1cc0f52bda339f446caf4c66c31fb1200bb9af4fc4ea1b4daa4e5087f5749a524140300ce9271cdf406cac94f33f1d31a3658583e9ff16ec168b995
@@ -1,14 +1,14 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: avro 1.8.1 ruby lib
2
+ # stub: avro 1.8.2 ruby lib
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "avro"
6
- s.version = "1.8.1"
6
+ s.version = "1.8.2"
7
7
 
8
8
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
9
9
  s.require_paths = ["lib"]
10
10
  s.authors = ["Apache Software Foundation"]
11
- s.date = "2016-05-15"
11
+ s.date = "2017-05-07"
12
12
  s.description = "Avro is a data serialization and RPC format"
13
13
  s.email = "dev@avro.apache.org"
14
14
  s.extra_rdoc_files = ["CHANGELOG", "LICENSE", "lib/avro.rb", "lib/avro/data_file.rb", "lib/avro/io.rb", "lib/avro/ipc.rb", "lib/avro/protocol.rb", "lib/avro/schema.rb", "lib/avro/schema_normalization.rb"]
@@ -19,7 +19,7 @@ Gem::Specification.new do |s|
19
19
  s.rubyforge_project = "avro"
20
20
  s.rubygems_version = "2.2.2"
21
21
  s.summary = "Apache Avro for Ruby"
22
- s.test_files = ["test/test_schema_normalization.rb", "test/test_io.rb", "test/test_socket_transport.rb", "test/test_schema.rb", "test/test_fingerprints.rb", "test/test_help.rb", "test/test_datafile.rb", "test/test_protocol.rb"]
22
+ s.test_files = ["test/test_datafile.rb", "test/test_fingerprints.rb", "test/test_help.rb", "test/test_io.rb", "test/test_protocol.rb", "test/test_schema.rb", "test/test_schema_normalization.rb", "test/test_socket_transport.rb"]
23
23
 
24
24
  if s.respond_to? :specification_version then
25
25
  s.specification_version = 4
@@ -338,12 +338,29 @@ module Avro
338
338
 
339
339
  def decompress(data)
340
340
  load_snappy!
341
+ crc32 = data.slice(-4..-1).unpack('N').first
342
+ uncompressed = Snappy.inflate(data.slice(0..-5))
343
+
344
+ if crc32 == Zlib.crc32(uncompressed)
345
+ uncompressed
346
+ else
347
+ # older versions of avro-ruby didn't write the checksum, so if it
348
+ # doesn't match this must assume that it wasn't there and return
349
+ # the entire payload uncompressed.
350
+ Snappy.inflate(data)
351
+ end
352
+ rescue Snappy::Error
353
+ # older versions of avro-ruby didn't write the checksum, so removing
354
+ # the last 4 bytes may cause Snappy to fail. recover by assuming the
355
+ # payload is from an older file and uncompress the entire buffer.
341
356
  Snappy.inflate(data)
342
357
  end
343
358
 
344
359
  def compress(data)
345
360
  load_snappy!
346
- Snappy.deflate(data)
361
+ crc32 = Zlib.crc32(data)
362
+ compressed = Snappy.deflate(data)
363
+ [compressed, crc32].pack('a*N')
347
364
  end
348
365
 
349
366
  private
@@ -407,6 +407,10 @@ module Avro
407
407
  end
408
408
 
409
409
  def read_default_value(field_schema, default_value)
410
+ if default_value == :no_default
411
+ raise AvroError, "Missing data for #{field_schema} with no default"
412
+ end
413
+
410
414
  # Basically a JSON Decoder?
411
415
  case field_schema.type_sym
412
416
  when :null
@@ -211,7 +211,7 @@ module Avro
211
211
  if field.respond_to?(:[]) # TODO(jmhodges) wtffffff
212
212
  type = field['type']
213
213
  name = field['name']
214
- default = field['default']
214
+ default = field.key?('default') ? field['default'] : :no_default
215
215
  order = field['order']
216
216
  new_field = Field.new(type, name, default, order, names, namespace)
217
217
  # make sure field name has not been used yet
@@ -363,7 +363,7 @@ module Avro
363
363
  class Field < Schema
364
364
  attr_reader :type, :name, :default, :order
365
365
 
366
- def initialize(type, name, default=nil, order=nil, names=nil, namespace=nil)
366
+ def initialize(type, name, default=:no_default, order=nil, names=nil, namespace=nil)
367
367
  @type = subparse(type, names, namespace)
368
368
  @name = name
369
369
  @default = default
@@ -372,7 +372,7 @@ module Avro
372
372
 
373
373
  def to_avro(names=Set.new)
374
374
  {'name' => name, 'type' => type.to_avro(names)}.tap do |avro|
375
- avro['default'] = default if default
375
+ avro['default'] = default unless default == :no_default
376
376
  avro['order'] = order if order
377
377
  end
378
378
  end
@@ -340,8 +340,37 @@ EOS
340
340
  assert_equal(incorrect, 0)
341
341
  end
342
342
  end
343
+
344
+ def test_snappy_backward_compat
345
+ # a snappy-compressed block payload without the checksum
346
+ # this has no back-references, just one literal so the last 9
347
+ # bytes are the uncompressed payload.
348
+ old_snappy_bytes = "\x09\x20\x02\x06\x02\x0a\x67\x72\x65\x65\x6e"
349
+ uncompressed_bytes = "\x02\x06\x02\x0a\x67\x72\x65\x65\x6e"
350
+ snappy = Avro::DataFile::SnappyCodec.new
351
+ assert_equal(uncompressed_bytes, snappy.decompress(old_snappy_bytes))
352
+ end
353
+
343
354
  private
344
355
 
356
+ def check_no_default(schema_json)
357
+ actual_schema = '{"type": "record", "name": "Foo", "fields": []}'
358
+ actual = Avro::Schema.parse(actual_schema)
359
+
360
+ expected_schema = <<EOS
361
+ {"type": "record",
362
+ "name": "Foo",
363
+ "fields": [{"name": "f", "type": #{schema_json}}]}
364
+ EOS
365
+ expected = Avro::Schema.parse(expected_schema)
366
+
367
+ reader = Avro::IO::DatumReader.new(actual, expected)
368
+ assert_raise Avro::AvroError do
369
+ value = reader.read(Avro::IO::BinaryDecoder.new(StringIO.new))
370
+ assert_not_equal(value, :no_default) # should never return this
371
+ end
372
+ end
373
+
345
374
  def check_default(schema_json, default_json, default_value)
346
375
  actual_schema = '{"type": "record", "name": "Foo", "fields": []}'
347
376
  actual = Avro::Schema.parse(actual_schema)
@@ -381,6 +410,9 @@ EOS
381
410
 
382
411
  # test writing of data to file
383
412
  check_datafile(schema)
413
+
414
+ # check that AvroError is raised when there is no default
415
+ check_no_default(str)
384
416
  end
385
417
 
386
418
  def checkser(schm, randomdata)
@@ -143,4 +143,21 @@ class TestSchema < Test::Unit::TestCase
143
143
 
144
144
  assert_equal '"MissingType" is not a schema we know about.', error.message
145
145
  end
146
+
147
+ def test_to_avro_handles_falsey_defaults
148
+ schema = Avro::Schema.parse <<-SCHEMA
149
+ {"type": "record", "name": "Record", "namespace": "my.name.space",
150
+ "fields": [
151
+ {"name": "is_usable", "type": "boolean", "default": false}
152
+ ]
153
+ }
154
+ SCHEMA
155
+
156
+ assert_equal schema.to_avro, {
157
+ 'type' => 'record', 'name' => 'Record', 'namespace' => 'my.name.space',
158
+ 'fields' => [
159
+ {'name' => 'is_usable', 'type' => 'boolean', 'default' => false}
160
+ ]
161
+ }
162
+ end
146
163
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: avro
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.1
4
+ version: 1.8.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Apache Software Foundation
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-05-15 00:00:00.000000000 Z
11
+ date: 2017-05-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: multi_json
@@ -96,11 +96,11 @@ signing_key:
96
96
  specification_version: 4
97
97
  summary: Apache Avro for Ruby
98
98
  test_files:
99
- - test/test_schema_normalization.rb
100
- - test/test_io.rb
101
- - test/test_socket_transport.rb
102
- - test/test_schema.rb
99
+ - test/test_datafile.rb
103
100
  - test/test_fingerprints.rb
104
101
  - test/test_help.rb
105
- - test/test_datafile.rb
102
+ - test/test_io.rb
106
103
  - test/test_protocol.rb
104
+ - test/test_schema.rb
105
+ - test/test_schema_normalization.rb
106
+ - test/test_socket_transport.rb