avro_turf 1.7.0 → 1.8.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 +7 -2
- data/lib/avro_turf/cached_confluent_schema_registry.rb +2 -2
- data/lib/avro_turf/core_ext/date.rb +1 -1
- data/lib/avro_turf/disk_cache.rb +25 -15
- data/lib/avro_turf/messaging.rb +16 -4
- data/lib/avro_turf/version.rb +1 -1
- data/spec/avro_turf_spec.rb +39 -2
- data/spec/core_ext/date_spec.rb +2 -2
- data/spec/spec_helper.rb +10 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 67ff8ee9b578227cd54a33d76a95fed8bd2c9a396aa360ad9df9f52d01e5c25a
|
4
|
+
data.tar.gz: 8bca24236ce42f19f6db457ad13d76d33e89b18703dc0eb74a8adca53b2c7b6e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 859e8fa6938679007704d35b1b4a54616da7637c83f41c58cbd10828216e0af198846e755334f465613ceb9086ec0c63a823dc2cbf3ddbdc191a97423d2e3147
|
7
|
+
data.tar.gz: 7900a85abaf9dd55ac3b89bba2d04935ddbafc850a92fb1941ff8984df864cfaa4bb5527ca4d48a74ef3715915d598044b7c486363909f2705ece83b0ffca50f
|
data/CHANGELOG.md
CHANGED
@@ -2,9 +2,14 @@
|
|
2
2
|
|
3
3
|
## Unreleased
|
4
4
|
|
5
|
+
## v1.8.0
|
6
|
+
|
7
|
+
- add support for `Date` via appropriate logicalType defintion. This is a backwards incompatible change (#177)
|
8
|
+
- Fixed schema file cache truncation on multiple running instances and parallel access to the cache files.
|
9
|
+
|
5
10
|
## v1.7.0
|
6
11
|
|
7
|
-
- Added extra params for the validation message
|
12
|
+
- Added extra params for the validation message schema before encode (#169)
|
8
13
|
- Fix infinite retry when loading schema with nested primary type in separate file (#165)
|
9
14
|
|
10
15
|
## v1.6.0
|
@@ -60,7 +65,7 @@
|
|
60
65
|
## v0.9.0
|
61
66
|
|
62
67
|
- Compatibility with Avro v1.9.0 (#94)
|
63
|
-
- Disable the auto
|
68
|
+
- Disable the auto registration of schema (#95)
|
64
69
|
- abstracted caching from CachedConfluentSchemaRegistry (#74)
|
65
70
|
- Load avro-patches if installed to silence deprecation errors (#85)
|
66
71
|
- Make schema store to be thread safe (#92)
|
@@ -13,7 +13,7 @@ class AvroTurf::CachedConfluentSchemaRegistry
|
|
13
13
|
# cache - Optional user provided Cache object that responds to all methods in the AvroTurf::InMemoryCache interface.
|
14
14
|
def initialize(upstream, cache: nil)
|
15
15
|
@upstream = upstream
|
16
|
-
@cache = cache || AvroTurf::InMemoryCache.new
|
16
|
+
@cache = cache || AvroTurf::InMemoryCache.new
|
17
17
|
end
|
18
18
|
|
19
19
|
# Delegate the following methods to the upstream
|
@@ -34,7 +34,7 @@ class AvroTurf::CachedConfluentSchemaRegistry
|
|
34
34
|
|
35
35
|
def subject_version(subject, version = 'latest')
|
36
36
|
return @upstream.subject_version(subject, version) if version == 'latest'
|
37
|
-
|
37
|
+
|
38
38
|
@cache.lookup_by_version(subject, version) ||
|
39
39
|
@cache.store_by_version(subject, version, @upstream.subject_version(subject, version))
|
40
40
|
end
|
data/lib/avro_turf/disk_cache.rb
CHANGED
@@ -1,20 +1,18 @@
|
|
1
1
|
# A cache for the CachedConfluentSchemaRegistry.
|
2
2
|
# Extends the InMemoryCache to provide a write-thru to disk for persistent cache.
|
3
|
-
class AvroTurf::DiskCache
|
3
|
+
class AvroTurf::DiskCache
|
4
4
|
|
5
5
|
def initialize(disk_path, logger: Logger.new($stdout))
|
6
|
-
super()
|
7
|
-
|
8
6
|
@logger = logger
|
9
7
|
|
10
8
|
# load the write-thru cache on startup, if it exists
|
11
9
|
@schemas_by_id_path = File.join(disk_path, 'schemas_by_id.json')
|
12
10
|
hash = read_from_disk_cache(@schemas_by_id_path)
|
13
|
-
@schemas_by_id = hash
|
11
|
+
@schemas_by_id = hash || {}
|
14
12
|
|
15
13
|
@ids_by_schema_path = File.join(disk_path, 'ids_by_schema.json')
|
16
14
|
hash = read_from_disk_cache(@ids_by_schema_path)
|
17
|
-
@ids_by_schema = hash
|
15
|
+
@ids_by_schema = hash || {}
|
18
16
|
|
19
17
|
@schemas_by_subject_version_path = File.join(disk_path, 'schemas_by_subject_version.json')
|
20
18
|
@schemas_by_subject_version = {}
|
@@ -24,15 +22,16 @@ class AvroTurf::DiskCache < AvroTurf::InMemoryCache
|
|
24
22
|
# the write-thru cache (json) does not store keys in numeric format
|
25
23
|
# so, convert id to a string for caching purposes
|
26
24
|
def lookup_by_id(id)
|
27
|
-
|
25
|
+
@schemas_by_id[id.to_s]
|
28
26
|
end
|
29
27
|
|
30
28
|
# override to include write-thru cache after storing result from upstream
|
31
29
|
def store_by_id(id, schema)
|
32
30
|
# must return the value from storing the result (i.e. do not return result from file write)
|
33
|
-
|
34
|
-
|
35
|
-
|
31
|
+
@schemas_by_id[id.to_s] = schema
|
32
|
+
write_to_disk_cache(@schemas_by_id_path, @schemas_by_id)
|
33
|
+
|
34
|
+
schema
|
36
35
|
end
|
37
36
|
|
38
37
|
# override to use a json serializable cache key
|
@@ -45,7 +44,8 @@ class AvroTurf::DiskCache < AvroTurf::InMemoryCache
|
|
45
44
|
def store_by_schema(subject, schema, id)
|
46
45
|
key = "#{subject}#{schema}"
|
47
46
|
@ids_by_schema[key] = id
|
48
|
-
|
47
|
+
|
48
|
+
write_to_disk_cache(@ids_by_schema_path, @ids_by_schema)
|
49
49
|
id
|
50
50
|
end
|
51
51
|
|
@@ -78,7 +78,7 @@ class AvroTurf::DiskCache < AvroTurf::InMemoryCache
|
|
78
78
|
hash[key] = schema
|
79
79
|
hash
|
80
80
|
else
|
81
|
-
{key => schema}
|
81
|
+
{ key => schema }
|
82
82
|
end
|
83
83
|
|
84
84
|
write_to_disk_cache(@schemas_by_subject_version_path, hash)
|
@@ -90,17 +90,27 @@ class AvroTurf::DiskCache < AvroTurf::InMemoryCache
|
|
90
90
|
# Parse the file from disk, if it exists and is not zero length
|
91
91
|
private def read_from_disk_cache(path)
|
92
92
|
if File.exist?(path)
|
93
|
-
if File.size(path)!=0
|
94
|
-
|
93
|
+
if File.size(path) != 0
|
94
|
+
json_data = File.open(path, 'r') do |file|
|
95
|
+
file.flock(File::LOCK_SH)
|
96
|
+
file.read
|
97
|
+
end
|
98
|
+
|
99
|
+
return JSON.parse(json_data)
|
95
100
|
else
|
96
101
|
# just log a message if skipping zero length file
|
97
102
|
@logger.warn "skipping JSON.parse of zero length file at #{path}"
|
98
103
|
end
|
99
104
|
end
|
100
|
-
|
105
|
+
|
106
|
+
nil
|
101
107
|
end
|
102
108
|
|
103
109
|
private def write_to_disk_cache(path, hash)
|
104
|
-
|
110
|
+
# don't use "w" because it truncates the file before lock
|
111
|
+
File.open(path, File::RDWR | File::CREAT, 0644) do |file|
|
112
|
+
file.flock(File::LOCK_EX)
|
113
|
+
file.write(JSON.pretty_generate(hash))
|
114
|
+
end
|
105
115
|
end
|
106
116
|
end
|
data/lib/avro_turf/messaging.rb
CHANGED
@@ -21,8 +21,20 @@ class AvroTurf
|
|
21
21
|
# 1: https://github.com/confluentinc/schema-registry
|
22
22
|
class Messaging
|
23
23
|
MAGIC_BYTE = [0].pack("C").freeze
|
24
|
-
|
25
|
-
|
24
|
+
|
25
|
+
class DecodedMessage
|
26
|
+
attr_reader :schema_id
|
27
|
+
attr_reader :writer_schema
|
28
|
+
attr_reader :reader_schema
|
29
|
+
attr_reader :message
|
30
|
+
|
31
|
+
def initialize(schema_id, writer_schema, reader_schema, message)
|
32
|
+
@schema_id = schema_id
|
33
|
+
@writer_schema = writer_schema
|
34
|
+
@reader_schema = reader_schema
|
35
|
+
@message = message
|
36
|
+
end
|
37
|
+
end
|
26
38
|
|
27
39
|
# Instantiate a new Messaging instance with the given configuration.
|
28
40
|
#
|
@@ -34,7 +46,7 @@ class AvroTurf
|
|
34
46
|
# namespace - The String default schema namespace.
|
35
47
|
# registry_path_prefix - The String URL path prefix used to namespace schema registry requests (optional).
|
36
48
|
# logger - The Logger that should be used to log information (optional).
|
37
|
-
#
|
49
|
+
# proxy - Forward the request via proxy (optional).
|
38
50
|
# user - User for basic auth (optional).
|
39
51
|
# password - Password for basic auth (optional).
|
40
52
|
# ssl_ca_file - Name of file containing CA certificate (optional).
|
@@ -130,7 +142,7 @@ class AvroTurf
|
|
130
142
|
writer.write(message, encoder)
|
131
143
|
|
132
144
|
stream.string
|
133
|
-
rescue Excon::
|
145
|
+
rescue Excon::Error::NotFound
|
134
146
|
if schema_id
|
135
147
|
raise SchemaNotFoundError.new("Schema with id: #{schema_id} is not found on registry")
|
136
148
|
else
|
data/lib/avro_turf/version.rb
CHANGED
data/spec/avro_turf_spec.rb
CHANGED
@@ -16,6 +16,13 @@ describe AvroTurf do
|
|
16
16
|
{
|
17
17
|
"type": "string",
|
18
18
|
"name": "full_name"
|
19
|
+
},
|
20
|
+
{
|
21
|
+
"name": "birth_date",
|
22
|
+
"type": {
|
23
|
+
"type": "int",
|
24
|
+
"logicalType": "date"
|
25
|
+
}
|
19
26
|
}
|
20
27
|
]
|
21
28
|
}
|
@@ -24,7 +31,8 @@ describe AvroTurf do
|
|
24
31
|
|
25
32
|
it "encodes data with Avro" do
|
26
33
|
data = {
|
27
|
-
"full_name" => "John Doe"
|
34
|
+
"full_name" => "John Doe",
|
35
|
+
"birth_date" => Date.new(1934, 1, 2)
|
28
36
|
}
|
29
37
|
|
30
38
|
encoded_data = avro.encode(data, schema_name: "person")
|
@@ -36,7 +44,8 @@ describe AvroTurf do
|
|
36
44
|
compressed_avro = AvroTurf.new(schemas_path: "spec/schemas/", codec: "deflate")
|
37
45
|
|
38
46
|
data = {
|
39
|
-
"full_name" => "John Doe" * 100
|
47
|
+
"full_name" => "John Doe" * 100,
|
48
|
+
"birth_date" => Date.new(1934, 1, 2)
|
40
49
|
}
|
41
50
|
|
42
51
|
uncompressed_data = avro.encode(data, schema_name: "person")
|
@@ -329,5 +338,33 @@ describe AvroTurf do
|
|
329
338
|
datum = { message: "hello" }
|
330
339
|
expect(avro.valid?(datum, schema_name: "postcard")).to eq true
|
331
340
|
end
|
341
|
+
|
342
|
+
it "handles logicalType of date in schema" do
|
343
|
+
define_schema "postcard.avsc", <<-AVSC
|
344
|
+
{
|
345
|
+
"name": "postcard",
|
346
|
+
"type": "record",
|
347
|
+
"fields": [
|
348
|
+
{
|
349
|
+
"name": "message",
|
350
|
+
"type": "string"
|
351
|
+
},
|
352
|
+
{
|
353
|
+
"name": "sent_date",
|
354
|
+
"type": {
|
355
|
+
"type": "int",
|
356
|
+
"logicalType": "date"
|
357
|
+
}
|
358
|
+
}
|
359
|
+
]
|
360
|
+
}
|
361
|
+
AVSC
|
362
|
+
|
363
|
+
datum = {
|
364
|
+
message: "hello",
|
365
|
+
sent_date: Date.new(2022, 9, 11)
|
366
|
+
}
|
367
|
+
expect(avro.valid?(datum, schema_name: "postcard")).to eq true
|
368
|
+
end
|
332
369
|
end
|
333
370
|
end
|
data/spec/core_ext/date_spec.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -22,6 +22,16 @@ module Helpers
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
+
# gem `fakefs` does not support flock for the file, and require patch
|
26
|
+
# https://github.com/fakefs/fakefs/issues/433
|
27
|
+
module FakeFS
|
28
|
+
class File < StringIO
|
29
|
+
def flock(*)
|
30
|
+
true
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
25
35
|
RSpec.configure do |config|
|
26
36
|
config.include FakeFS::SpecHelpers
|
27
37
|
config.include Helpers
|
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.8.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: 2022-
|
11
|
+
date: 2022-11-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: avro
|