avro_turf 1.10.0 → 1.11.0
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 +4 -4
- data/CHANGELOG.md +6 -0
- data/avro_turf.gemspec +1 -1
- data/lib/avro_turf/schema_store.rb +15 -21
- data/lib/avro_turf/version.rb +1 -1
- data/lib/avro_turf.rb +21 -6
- data/spec/avro_turf_spec.rb +55 -0
- metadata +8 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 31248ad33908f238baea49fc106bc3e6292f45a1fe7fce0c0ae091dc10a9ea17
|
4
|
+
data.tar.gz: 25af934023a269b28acf004a1ec13c052380f5a664696ce881ef27efb209a7e5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6e0796ce28027a654fa189f561f8179567fbebf50ba6c225be9b8623999e7ef424b58b05d1282a151474aaf48057b0000ce7999f6f8aed1c5f56f53f2d1f8cab
|
7
|
+
data.tar.gz: 70fb1dc693589e71691ab8bf18cef28ebe533921efe401c6c0f7c3f1ace8ac880e5e3bd1161bd3235148f7f469c837d5224f90ea96a3867aa0fe24a16de91200
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,12 @@
|
|
2
2
|
|
3
3
|
## Unreleased
|
4
4
|
|
5
|
+
## v1.11.0
|
6
|
+
|
7
|
+
- Add `decode_all` and `decode_all_from_stream` methods to return all entries in a data file (#194)
|
8
|
+
- Improve the way schemas are automatically loaded (#190)
|
9
|
+
- Increment dependency on `avro` gem to v1.8.
|
10
|
+
|
5
11
|
## v1.10.0
|
6
12
|
|
7
13
|
- Add `schema_subject_versions` to `ConfluentSchemaRegistry` to retrieve all subject versions for a schema id. (#189)
|
data/avro_turf.gemspec
CHANGED
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
20
20
|
spec.require_paths = ["lib"]
|
21
21
|
|
22
|
-
spec.add_dependency "avro", ">= 1.
|
22
|
+
spec.add_dependency "avro", ">= 1.8.0", "< 1.12"
|
23
23
|
spec.add_dependency "excon", "~> 0.71"
|
24
24
|
|
25
25
|
spec.add_development_dependency "bundler", "~> 2.0"
|
@@ -70,28 +70,22 @@ class AvroTurf::SchemaStore
|
|
70
70
|
@schemas[fullname] = schema
|
71
71
|
|
72
72
|
schema
|
73
|
-
rescue ::Avro::
|
74
|
-
#
|
75
|
-
# Avro gem
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
# schema.
|
88
|
-
local_schemas_cache.each do |schema_name, schema|
|
89
|
-
local_schemas_cache.delete(schema_name) unless File.exist?(build_schema_path(schema_name))
|
90
|
-
end
|
91
|
-
load_schema!(fullname, @schemas.dup)
|
92
|
-
else
|
93
|
-
raise
|
73
|
+
rescue ::Avro::UnknownSchemaError => e
|
74
|
+
# Try to first resolve a referenced schema from disk.
|
75
|
+
# If this is successful, the Avro gem will have mutated the
|
76
|
+
# local_schemas_cache, adding all the new schemas it found.
|
77
|
+
load_schema!(e.type_name, local_schemas_cache)
|
78
|
+
|
79
|
+
# Attempt to re-parse the original schema now that the dependency
|
80
|
+
# has been resolved and use the now-updated local_schemas_cache to
|
81
|
+
# pick up where we left off.
|
82
|
+
local_schemas_cache.delete(fullname)
|
83
|
+
# Ensure all sub-schemas are cleaned up to avoid conflicts when re-parsing
|
84
|
+
# schema.
|
85
|
+
local_schemas_cache.each_key do |schema_name|
|
86
|
+
local_schemas_cache.delete(schema_name) unless File.exist?(build_schema_path(schema_name))
|
94
87
|
end
|
88
|
+
load_schema!(fullname, @schemas.dup)
|
95
89
|
rescue Errno::ENOENT, Errno::ENAMETOOLONG
|
96
90
|
raise AvroTurf::SchemaNotFoundError, "could not find Avro schema at `#{schema_path}'"
|
97
91
|
end
|
data/lib/avro_turf/version.rb
CHANGED
data/lib/avro_turf.rb
CHANGED
@@ -93,24 +93,39 @@ class AvroTurf
|
|
93
93
|
# namespace - The namespace of the Avro schema used to decode the data.
|
94
94
|
#
|
95
95
|
# Returns whatever is encoded in the data.
|
96
|
-
def
|
96
|
+
def decode_first(encoded_data, schema_name: nil, namespace: @namespace)
|
97
97
|
stream = StringIO.new(encoded_data)
|
98
98
|
decode_stream(stream, schema_name: schema_name, namespace: namespace)
|
99
99
|
end
|
100
100
|
|
101
|
-
|
101
|
+
alias decode decode_first
|
102
|
+
|
103
|
+
# Returns all entries encoded in the data.
|
104
|
+
def decode_all(encoded_data, schema_name: nil, namespace: @namespace)
|
105
|
+
stream = StringIO.new(encoded_data)
|
106
|
+
decode_all_from_stream(stream, schema_name: schema_name, namespace: namespace)
|
107
|
+
end
|
108
|
+
|
109
|
+
# Decodes the first entry from an IO stream containing Avro data.
|
102
110
|
#
|
103
111
|
# stream - An IO object containing Avro data.
|
104
112
|
# schema_name - The String name of the schema that should be used to read
|
105
113
|
# the data. If nil, the writer schema will be used.
|
106
114
|
# namespace - The namespace of the Avro schema used to decode the data.
|
107
115
|
#
|
108
|
-
# Returns
|
109
|
-
def
|
116
|
+
# Returns first entry encoded in the stream.
|
117
|
+
def decode_first_from_stream(stream, schema_name: nil, namespace: @namespace)
|
118
|
+
data = decode_all_from_stream(stream, schema_name: schema_name, namespace: namespace)
|
119
|
+
data.first
|
120
|
+
end
|
121
|
+
|
122
|
+
alias decode_stream decode_first_from_stream
|
123
|
+
|
124
|
+
# Returns all entries encoded in the stream.
|
125
|
+
def decode_all_from_stream(stream, schema_name: nil, namespace: @namespace)
|
110
126
|
schema = schema_name && @schema_store.find(schema_name, namespace)
|
111
127
|
reader = Avro::IO::DatumReader.new(nil, schema)
|
112
|
-
|
113
|
-
dr.first
|
128
|
+
Avro::DataFile::Reader.new(stream, reader)
|
114
129
|
end
|
115
130
|
|
116
131
|
# Validates data against an Avro schema.
|
data/spec/avro_turf_spec.rb
CHANGED
@@ -186,6 +186,47 @@ describe AvroTurf do
|
|
186
186
|
end
|
187
187
|
end
|
188
188
|
|
189
|
+
describe "#decode_all" do
|
190
|
+
context "when data contains multiple entries" do
|
191
|
+
let(:encoded_data) { "Obj\u0001\u0004\u0014avro.codec\bnull\u0016avro.schema\xB6\u0004[{\"type\": \"record\", \"name\": \"address\", \"fields\": [{\"type\": \"string\", \"name\": \"street\"}, {\"type\": \"string\", \"name\": \"city\"}]}, {\"type\": \"record\", \"name\": \"person\", \"fields\": [{\"type\": \"string\", \"name\": \"name\"}, {\"type\": \"int\", \"name\": \"age\"}, {\"type\": \"address\", \"name\": \"address\"}]}]\u0000\xF9u\x84\xA1c\u0010\x82B\xE2\xCF\xF1\x98\xF7\xF1JH\u0004\x96\u0001\u0002\u0014Python🐍\x80\u0004\u0018Green Street\u001ASan Francisco\u0002\u0010Mojo🐍\u0002\u0016Blue Street\u0014Saturn🪐\xF9u\x84\xA1c\u0010\x82B\xE2\xCF\xF1\x98\xF7\xF1JH" }
|
192
|
+
|
193
|
+
it "returns array of entries decoded using the inlined writer's schema " do
|
194
|
+
expect(avro.decode_all(encoded_data).entries).to eq(
|
195
|
+
[
|
196
|
+
{"name"=>"Python🐍", "age"=>256, "address"=>{"street"=>"Green Street", "city"=>"San Francisco"}},
|
197
|
+
{"name"=>"Mojo🐍", "age"=>1, "address"=>{"street"=>"Blue Street", "city"=>"Saturn🪐"}}
|
198
|
+
]
|
199
|
+
)
|
200
|
+
end
|
201
|
+
|
202
|
+
it "returns array of entries decoded using the specified reader's schema " do
|
203
|
+
FileUtils.mkdir_p("spec/schemas/reader")
|
204
|
+
|
205
|
+
define_schema "reader/person.avsc", <<-AVSC
|
206
|
+
{
|
207
|
+
"name": "person",
|
208
|
+
"type": "record",
|
209
|
+
"fields": [
|
210
|
+
{ "name": "fav_color", "type": "string", "default": "red🟥" },
|
211
|
+
{ "name": "name", "type": "string" },
|
212
|
+
{ "name": "age", "type": "int" }
|
213
|
+
]
|
214
|
+
}
|
215
|
+
AVSC
|
216
|
+
|
217
|
+
expect(
|
218
|
+
AvroTurf.new(schemas_path: "spec/schemas/reader")
|
219
|
+
.decode_all(encoded_data, schema_name: "person").entries
|
220
|
+
).to eq(
|
221
|
+
[
|
222
|
+
{"name"=>"Python🐍", "age"=>256, "fav_color"=>"red🟥"},
|
223
|
+
{"name"=>"Mojo🐍", "age"=>1, "fav_color"=>"red🟥"}
|
224
|
+
]
|
225
|
+
)
|
226
|
+
end
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
189
230
|
describe "#encode_to_stream" do
|
190
231
|
it "writes encoded data to an existing stream" do
|
191
232
|
define_schema "message.avsc", <<-AVSC
|
@@ -304,6 +345,20 @@ describe AvroTurf do
|
|
304
345
|
end
|
305
346
|
end
|
306
347
|
|
348
|
+
describe "#decode_all_from_stream" do
|
349
|
+
it "returns all entries when decodes Avro data from a stream containing multiple entries" do
|
350
|
+
encoded_data = "Obj\u0001\u0004\u0014avro.codec\bnull\u0016avro.schema\xB6\u0004[{\"type\": \"record\", \"name\": \"address\", \"fields\": [{\"type\": \"string\", \"name\": \"street\"}, {\"type\": \"string\", \"name\": \"city\"}]}, {\"type\": \"record\", \"name\": \"person\", \"fields\": [{\"type\": \"string\", \"name\": \"name\"}, {\"type\": \"int\", \"name\": \"age\"}, {\"type\": \"address\", \"name\": \"address\"}]}]\u0000\xF9u\x84\xA1c\u0010\x82B\xE2\xCF\xF1\x98\xF7\xF1JH\u0004\x96\u0001\u0002\u0014Python🐍\x80\u0004\u0018Green Street\u001ASan Francisco\u0002\u0010Mojo🐍\u0002\u0016Blue Street\u0014Saturn🪐\xF9u\x84\xA1c\u0010\x82B\xE2\xCF\xF1\x98\xF7\xF1JH"
|
351
|
+
stream = StringIO.new(encoded_data)
|
352
|
+
|
353
|
+
expect(avro.decode_all_from_stream(stream).entries).to eq(
|
354
|
+
[
|
355
|
+
{"name"=>"Python🐍", "age"=>256, "address"=>{"street"=>"Green Street", "city"=>"San Francisco"}},
|
356
|
+
{"name"=>"Mojo🐍", "age"=>1, "address"=>{"street"=>"Blue Street", "city"=>"Saturn🪐"}}
|
357
|
+
]
|
358
|
+
)
|
359
|
+
end
|
360
|
+
end
|
361
|
+
|
307
362
|
describe "#valid?" do
|
308
363
|
before do
|
309
364
|
define_schema "message.avsc", <<-AVSC
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: avro_turf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.11.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Schierbeck
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-08-
|
11
|
+
date: 2023-08-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: avro
|
@@ -16,7 +16,7 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 1.
|
19
|
+
version: 1.8.0
|
20
20
|
- - "<"
|
21
21
|
- !ruby/object:Gem::Version
|
22
22
|
version: '1.12'
|
@@ -26,7 +26,7 @@ dependencies:
|
|
26
26
|
requirements:
|
27
27
|
- - ">="
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: 1.
|
29
|
+
version: 1.8.0
|
30
30
|
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: '1.12'
|
@@ -156,7 +156,7 @@ dependencies:
|
|
156
156
|
- - ">="
|
157
157
|
- !ruby/object:Gem::Version
|
158
158
|
version: '0'
|
159
|
-
description:
|
159
|
+
description:
|
160
160
|
email:
|
161
161
|
- dasch@zendesk.com
|
162
162
|
executables: []
|
@@ -251,8 +251,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
251
251
|
- !ruby/object:Gem::Version
|
252
252
|
version: '0'
|
253
253
|
requirements: []
|
254
|
-
rubygems_version: 3.
|
255
|
-
signing_key:
|
254
|
+
rubygems_version: 3.4.10
|
255
|
+
signing_key:
|
256
256
|
specification_version: 4
|
257
257
|
summary: A library that makes it easier to use the Avro serialization format from
|
258
258
|
Ruby
|