avro_turf 0.1.1 → 0.2.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/lib/avro_turf/version.rb +1 -1
- data/lib/avro_turf.rb +16 -12
- data/spec/avro_spec.rb +31 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 64620bcf8c0a04337ecf571abe2d0e51098fce4a
|
4
|
+
data.tar.gz: cc45ee47d74ea7ee364463b105f8cfc92345058b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 090cf294b97ea232c5ec8372eced0244d87f87a6fd3d9cdffdfb2ad73e467e52be0ae1ab3108e53a3e5aabfdd7a3bd2a35aae70c89ca1b448a74305d61d48964
|
7
|
+
data.tar.gz: 657f8b32c84d5b6e01a614bab06a4d17987e3c1832641e62bac8548c139810e60febfc72684983b1342e4839c889b667d037fcbb09932c940366636e32198c5f
|
data/lib/avro_turf/version.rb
CHANGED
data/lib/avro_turf.rb
CHANGED
@@ -6,8 +6,10 @@ class AvroTurf
|
|
6
6
|
class Error < StandardError; end
|
7
7
|
class SchemaError < Error; end
|
8
8
|
|
9
|
-
def initialize(schemas_path:)
|
9
|
+
def initialize(schemas_path:, namespace: nil)
|
10
10
|
@schemas_path = schemas_path or raise "Please specify a schema path"
|
11
|
+
@schemas = Hash.new
|
12
|
+
@namespace = namespace
|
11
13
|
end
|
12
14
|
|
13
15
|
# Encodes data to Avro using the specified schema.
|
@@ -16,8 +18,8 @@ class AvroTurf
|
|
16
18
|
# schema_name - The name of a schema in the `schemas_path`.
|
17
19
|
#
|
18
20
|
# Returns a String containing the encoded data.
|
19
|
-
def encode(data, schema_name:)
|
20
|
-
schema = resolve_schema(schema_name)
|
21
|
+
def encode(data, schema_name:, namespace: @namespace)
|
22
|
+
schema = resolve_schema(schema_name, namespace)
|
21
23
|
writer = Avro::IO::DatumWriter.new(schema)
|
22
24
|
|
23
25
|
io = StringIO.new
|
@@ -35,9 +37,9 @@ class AvroTurf
|
|
35
37
|
# the data. If nil, the writer schema will be used.
|
36
38
|
#
|
37
39
|
# Returns whatever is encoded in the data.
|
38
|
-
def decode(encoded_data, schema_name: nil)
|
40
|
+
def decode(encoded_data, schema_name: nil, namespace: @namespace)
|
39
41
|
io = StringIO.new(encoded_data)
|
40
|
-
schema = schema_name && resolve_schema(schema_name)
|
42
|
+
schema = schema_name && resolve_schema(schema_name, namespace)
|
41
43
|
reader = Avro::IO::DatumReader.new(nil, schema)
|
42
44
|
dr = Avro::DataFile::Reader.new(io, reader)
|
43
45
|
dr.first
|
@@ -48,15 +50,17 @@ class AvroTurf
|
|
48
50
|
# Resolves and returns a schema.
|
49
51
|
#
|
50
52
|
# schema_name - The String name of the schema to resolve.
|
51
|
-
# names - A Hash mapping schema names to Avro::Schema instances. Used
|
52
|
-
# when referencing custom types.
|
53
53
|
#
|
54
54
|
# Returns an Avro::Schema.
|
55
|
-
def resolve_schema(
|
55
|
+
def resolve_schema(name, namespace = nil)
|
56
|
+
fullname = Avro::Name.make_fullname(name, namespace)
|
57
|
+
|
58
|
+
return @schemas[fullname] if @schemas.key?(fullname)
|
59
|
+
|
56
60
|
*namespace, schema_name = fullname.split(".")
|
57
61
|
schema_path = File.join(@schemas_path, *namespace, schema_name + ".avsc")
|
58
62
|
schema_json = JSON.parse(File.read(schema_path))
|
59
|
-
schema = Avro::Schema.real_parse(schema_json,
|
63
|
+
schema = Avro::Schema.real_parse(schema_json, @schemas)
|
60
64
|
|
61
65
|
if schema.respond_to?(:fullname) && schema.fullname != fullname
|
62
66
|
raise SchemaError, "expected schema `#{schema_path}' to define type `#{fullname}'"
|
@@ -67,11 +71,11 @@ class AvroTurf
|
|
67
71
|
# This is a hack in order to figure out exactly which type was missing. The
|
68
72
|
# Avro gem ought to provide this data directly.
|
69
73
|
if e.to_s =~ /"([\w\.]+)" is not a schema we know about/
|
70
|
-
resolve_schema($1
|
74
|
+
resolve_schema($1)
|
71
75
|
|
72
76
|
# Re-resolve the original schema now that the dependency has been resolved.
|
73
|
-
|
74
|
-
resolve_schema(fullname
|
77
|
+
@schemas.delete(fullname)
|
78
|
+
resolve_schema(fullname)
|
75
79
|
else
|
76
80
|
raise
|
77
81
|
end
|
data/spec/avro_spec.rb
CHANGED
@@ -161,9 +161,9 @@ describe AvroTurf do
|
|
161
161
|
}
|
162
162
|
}
|
163
163
|
|
164
|
-
encoded_data = avro.encode(data, schema_name: "test.people
|
164
|
+
encoded_data = avro.encode(data, schema_name: "person", namespace: "test.people")
|
165
165
|
|
166
|
-
expect(avro.decode(encoded_data, schema_name: "test.people
|
166
|
+
expect(avro.decode(encoded_data, schema_name: "person", namespace: "test.people")).to eq(data)
|
167
167
|
end
|
168
168
|
|
169
169
|
it "raises AvroTurf::SchemaError if the schema's namespace doesn't match the file location" do
|
@@ -190,6 +190,35 @@ describe AvroTurf do
|
|
190
190
|
}.to raise_error(AvroTurf::SchemaError, "expected schema `spec/schemas/test/people/person.avsc' to define type `test.people.person'")
|
191
191
|
end
|
192
192
|
|
193
|
+
it "caches schemas in memory" do
|
194
|
+
define_schema "person.avsc", <<-AVSC
|
195
|
+
{
|
196
|
+
"name": "person",
|
197
|
+
"type": "record",
|
198
|
+
"fields": [
|
199
|
+
{
|
200
|
+
"type": "string",
|
201
|
+
"name": "full_name"
|
202
|
+
}
|
203
|
+
]
|
204
|
+
}
|
205
|
+
AVSC
|
206
|
+
|
207
|
+
data = {
|
208
|
+
"full_name" => "John Doe"
|
209
|
+
}
|
210
|
+
|
211
|
+
# Warm the schema cache.
|
212
|
+
avro.encode(data, schema_name: "person")
|
213
|
+
|
214
|
+
# Force a failure if the schema file is read again.
|
215
|
+
FileUtils.rm("spec/schemas/person.avsc")
|
216
|
+
|
217
|
+
encoded_data = avro.encode(data, schema_name: "person")
|
218
|
+
|
219
|
+
expect(avro.decode(encoded_data, schema_name: "person")).to eq(data)
|
220
|
+
end
|
221
|
+
|
193
222
|
def define_schema(path, content)
|
194
223
|
File.open(File.join("spec/schemas", path), "w") do |f|
|
195
224
|
f.write(content)
|
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: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Schierbeck
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-03-
|
11
|
+
date: 2015-03-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: avro
|