avro_turf 1.16.0 → 1.18.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2345cdad9c7472c5fd79aa3710150c40095ff2b970b28ea17b3db8b951fd143f
4
- data.tar.gz: 264fbec47c582106134b51fc80823f93a82c9f1053a2d61e8899eac72a27256f
3
+ metadata.gz: 1c6f4cafa2c752c6b0dbe23703a4d2efccf558e11cec1c33db5a1af911cca43a
4
+ data.tar.gz: 61c9bc9c1963bb89f8b00c01ad0c4195d8cf48473ea191b3d91afa88361c7aa5
5
5
  SHA512:
6
- metadata.gz: 2f17112a66c063514d56c7a4a5d785fa61e1c2079b7a02eede619b1b030997ba689b897ac8fc55f355fc781a1fd48dd77c545315478155b70853a0263fd571ac
7
- data.tar.gz: 9d34639b83ee204e15143cc073aacd24157556eaede70e855384ba43ec769c6ed12505ffa2cf6d17ae6e216095c0ad097ace8af42579efaec4fc34ad92c482fe
6
+ metadata.gz: 1b7792365879b2d4dab3f7a160687ba7308c8f5cb6f9d788506ad087bfb56056f867328bc5357ab011917588bb7e67219300c00e3cadcdef389b927f8cf398de
7
+ data.tar.gz: 834dcc062ca3e2a6f6b4eafecd8425abacad9ca64d972bbe03100def4e7af2adb706d2fcde541d31d6ff199e9b3ce51f47774269adc55191a7b6d9dc2ed5e224
@@ -0,0 +1,24 @@
1
+ on:
2
+ push:
3
+ branches:
4
+ - master
5
+ jobs:
6
+ push:
7
+ name: Push gem to RubyGems.org
8
+ runs-on: ubuntu-latest
9
+
10
+ permissions:
11
+ id-token: write # IMPORTANT: this permission is mandatory for trusted publishing
12
+ contents: write # IMPORTANT: this permission is required for `rake release` to push the release tag
13
+
14
+ steps:
15
+ # Set up
16
+ - uses: actions/checkout@v4
17
+ - name: Set up Ruby
18
+ uses: ruby/setup-ruby@v1
19
+ with:
20
+ bundler-cache: true
21
+ ruby-version: ruby
22
+
23
+ # Release
24
+ - uses: rubygems/release-gem@v1
data/CHANGELOG.md CHANGED
@@ -2,6 +2,15 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## v1.18.0
6
+
7
+ - Add `compatibility_issues` method to `ConfluentSchemaRegistry` to debug compatibility issues between a schema versions for a given subject (#212)
8
+ - Update tests to support `sinatra` version 4.1 that includes a new `host_authorization` parameter to permit only authorized requests
9
+
10
+ ## v1.17.0
11
+
12
+ - Add `register_schemas` option to `encode` method [#210](https://github.com/dasch/avro_turf/pull/210)
13
+
5
14
  ## v1.16.0
6
15
 
7
16
  - Add compatibility with Avro v1.12.x.
data/README.md CHANGED
@@ -92,6 +92,9 @@ avro.encode({ "name" => "Jane", "age" => 28 }, schema_name: "person")
92
92
  # Data can be validated before encoding to get a description of problem through
93
93
  # Avro::SchemaValidator::ValidationError exception
94
94
  avro.encode({ "titl" => "hello, world" }, schema_name: "person", validate: true)
95
+
96
+ # If you do not want to register the schema in case it does not exist, you can pass the register_schemas option as false
97
+ avro.encode({ "name" => "Jane", "age" => 28 }, schema_name: "person", register_schemas: false)
95
98
  ```
96
99
 
97
100
  ### Inter-schema references
@@ -251,6 +254,9 @@ registry = AvroTurf::ConfluentSchemaRegistry.new("http://my-registry:8081/")
251
254
 
252
255
  # Returns true if the schema is compatible, nil if the subject or version is not registered, and false if incompatible.
253
256
  registry.compatible?("person", schema)
257
+
258
+ # Returns an array of any breaking changes, nil if the subject or version is not registered
259
+ registry.compatibility_issues("person", schema)
254
260
  ```
255
261
 
256
262
  The ConfluentSchemaRegistry client can also change the global compatibility level or the compatibility level for an individual subject using the [Config API](http://docs.confluent.io/3.1.2/schema-registry/docs/api.html#config):
@@ -267,17 +273,23 @@ fake schema registry server depends on Sinatra but it is _not_ listed as a runti
267
273
  dependency for AvroTurf. Sinatra must be added to your Gemfile or gemspec in order
268
274
  to use the fake server.
269
275
 
276
+ Given the recent update in `sinatra` to fix [CVE-2024-21510](https://github.com/advisories/GHSA-hxx2-7vcw-mqr3) that included a new `HostAuthorization` middleware, the `FakeConfluentSchemaRegistryServer` is provided as a base implementation that has to be inherited into a new class and configured by the user so requests are properly authorised to the test registry host.
277
+
270
278
  Example using RSpec:
271
279
 
272
280
  ```ruby
273
281
  require 'avro_turf/test/fake_confluent_schema_registry_server'
274
282
  require 'webmock/rspec'
275
283
 
284
+ class AuthorizedFakeConfluentSchemaRegistryServer < FakeConfluentSchemaRegistryServer
285
+ set :host_authentication, permitted_hosts: ['registry.example.com']
286
+ end
287
+
276
288
  # within an example
277
289
  let(:registry_url) { "http://registry.example.com" }
278
290
  before do
279
- stub_request(:any, /^#{registry_url}/).to_rack(FakeConfluentSchemaRegistryServer)
280
- FakeConfluentSchemaRegistryServer.clear
291
+ stub_request(:any, /^#{registry_url}/).to_rack(AuthorizedFakeConfluentSchemaRegistryServer)
292
+ AuthorizedFakeConfluentSchemaRegistryServer.clear
281
293
  end
282
294
 
283
295
  # Messaging objects created with the same registry_url will now use the fake server.
@@ -17,13 +17,17 @@ class AvroTurf::CachedConfluentSchemaRegistry
17
17
  end
18
18
 
19
19
  # Delegate the following methods to the upstream
20
- %i(subjects subject_versions schema_subject_versions check compatible?
20
+ %i(subjects subject_versions schema_subject_versions compatible?
21
21
  global_config update_global_config subject_config update_subject_config).each do |name|
22
22
  define_method(name) do |*args|
23
23
  instance_variable_get(:@upstream).send(name, *args)
24
24
  end
25
25
  end
26
26
 
27
+ def check(subject, schema)
28
+ @cache.lookup_data_by_schema(subject, schema) || @cache.store_data_by_schema(subject, schema, @upstream.check(subject, schema))
29
+ end
30
+
27
31
  def fetch(id)
28
32
  @cache.lookup_by_id(id) || @cache.store_by_id(id, @upstream.fetch(id))
29
33
  end
@@ -101,6 +101,18 @@ class AvroTurf::ConfluentSchemaRegistry
101
101
  data.fetch('is_compatible', false) unless data.has_key?('error_code')
102
102
  end
103
103
 
104
+ # Check for specific schema compatibility issues
105
+ # Returns:
106
+ # - nil if the subject or version does not exist
107
+ # - a list of compatibility issues
108
+ # https://docs.confluent.io/platform/current/schema-registry/develop/api.html#sr-api-compatibility
109
+ def compatibility_issues(subject, schema, version = 'latest')
110
+ data = post("/compatibility/subjects/#{@schema_context_prefix}#{subject}/versions/#{version}",
111
+ expects: [200, 404], body: { schema: schema.to_s }.to_json, query: { verbose: true }, idempotent: true)
112
+
113
+ data.fetch('messages', []) unless data.has_key?('error_code')
114
+ end
115
+
104
116
  # Get global config
105
117
  def global_config
106
118
  get("/config", idempotent: true)
@@ -16,6 +16,10 @@ class AvroTurf::DiskCache
16
16
 
17
17
  @schemas_by_subject_version_path = File.join(disk_path, 'schemas_by_subject_version.json')
18
18
  @schemas_by_subject_version = {}
19
+
20
+ @data_by_schema_path = File.join(disk_path, 'data_by_schema.json')
21
+ hash = read_from_disk_cache(@data_by_schema_path)
22
+ @data_by_schema = hash || {}
19
23
  end
20
24
 
21
25
  # override
@@ -40,6 +44,12 @@ class AvroTurf::DiskCache
40
44
  @ids_by_schema[key]
41
45
  end
42
46
 
47
+ # override to use a json serializable cache key
48
+ def lookup_data_by_schema(subject, schema)
49
+ key = "#{subject}#{schema}"
50
+ @data_by_schema[key]
51
+ end
52
+
43
53
  # override to use a json serializable cache key and update the file cache
44
54
  def store_by_schema(subject, schema, id)
45
55
  key = "#{subject}#{schema}"
@@ -49,6 +59,15 @@ class AvroTurf::DiskCache
49
59
  id
50
60
  end
51
61
 
62
+ def store_data_by_schema(subject, schema, data)
63
+ return unless data
64
+
65
+ key = "#{subject}#{schema}"
66
+ @data_by_schema[key] = data
67
+ write_to_disk_cache(@data_by_schema_path, @data_by_schema)
68
+ data
69
+ end
70
+
52
71
  # checks instance var (in-memory cache) for schema
53
72
  # checks disk cache if in-memory cache doesn't exists
54
73
  # if file exists but no in-memory cache, read from file and sync in-memory cache
@@ -1,11 +1,11 @@
1
1
  # A cache for the CachedConfluentSchemaRegistry.
2
2
  # Simply stores the schemas and ids in in-memory hashes.
3
3
  class AvroTurf::InMemoryCache
4
-
5
4
  def initialize
6
5
  @schemas_by_id = {}
7
6
  @ids_by_schema = {}
8
7
  @schema_by_subject_version = {}
8
+ @data_by_schema = {}
9
9
  end
10
10
 
11
11
  def lookup_by_id(id)
@@ -21,11 +21,23 @@ class AvroTurf::InMemoryCache
21
21
  @ids_by_schema[key]
22
22
  end
23
23
 
24
+ def lookup_data_by_schema(subject, schema)
25
+ key = [subject, schema]
26
+ @data_by_schema[key]
27
+ end
28
+
24
29
  def store_by_schema(subject, schema, id)
25
30
  key = [subject, schema]
26
31
  @ids_by_schema[key] = id
27
32
  end
28
33
 
34
+ def store_data_by_schema(subject, schema, data)
35
+ return unless data
36
+
37
+ key = [subject, schema]
38
+ @data_by_schema[key] = data
39
+ end
40
+
29
41
  def lookup_by_version(subject, version)
30
42
  key = "#{subject}#{version}"
31
43
  @schema_by_subject_version[key]
@@ -106,27 +106,33 @@ class AvroTurf
106
106
 
107
107
  # Encodes a message using the specified schema.
108
108
  #
109
- # message - The message that should be encoded. Must be compatible with
110
- # the schema.
111
- # schema_name - The String name of the schema that should be used to encode
112
- # the data.
113
- # namespace - The namespace of the schema (optional).
114
- # subject - The subject name the schema should be registered under in
115
- # the schema registry (optional).
116
- # version - The integer version of the schema that should be used to decode
117
- # the data. Must match the schema used when encoding (optional).
118
- # schema_id - The integer id of the schema that should be used to encode
119
- # the data.
120
- # validate - The boolean for performing complete message validation before
121
- # encoding it, Avro::SchemaValidator::ValidationError with
122
- # a descriptive message will be raised in case of invalid message.
109
+ # message - The message that should be encoded. Must be compatible with
110
+ # the schema.
111
+ # schema_name - The String name of the schema that should be used to encode
112
+ # the data.
113
+ # namespace - The namespace of the schema (optional).
114
+ # subject - The subject name the schema should be registered under in
115
+ # the schema registry (optional).
116
+ # version - The integer version of the schema that should be used to decode
117
+ # the data. Must match the schema used when encoding (optional).
118
+ # schema_id - The integer id of the schema that should be used to encode
119
+ # the data.
120
+ # validate - The boolean for performing complete message validation before
121
+ # encoding it, Avro::SchemaValidator::ValidationError with
122
+ # a descriptive message will be raised in case of invalid message.
123
+ # register_schemas - The boolean that indicates whether or not the schema should be
124
+ # registered in case it does not exist, or if it should be fetched
125
+ # from the registry without registering it (register_schemas: false).
123
126
  #
124
127
  # Returns the encoded data as a String.
125
- def encode(message, schema_name: nil, namespace: @namespace, subject: nil, version: nil, schema_id: nil, validate: false)
128
+ def encode(message, schema_name: nil, namespace: @namespace, subject: nil, version: nil, schema_id: nil, validate: false,
129
+ register_schemas: true)
126
130
  schema, schema_id = if schema_id
127
131
  fetch_schema_by_id(schema_id)
128
132
  elsif subject && version
129
133
  fetch_schema(subject: subject, version: version)
134
+ elsif schema_name && !register_schemas
135
+ fetch_schema_by_body(subject: subject, schema_name: schema_name, namespace: namespace)
130
136
  elsif schema_name
131
137
  register_schema(subject: subject, schema_name: schema_name, namespace: namespace)
132
138
  else
@@ -228,6 +234,14 @@ class AvroTurf
228
234
  [schema, schema_id]
229
235
  end
230
236
 
237
+ def fetch_schema_by_body(schema_name:, subject: nil, namespace: nil)
238
+ schema = @schema_store.find(schema_name, namespace)
239
+ schema_data = @registry.check(subject || schema.fullname, schema)
240
+ raise SchemaNotFoundError.new("Schema with structure: #{schema} not found on registry") unless schema_data
241
+
242
+ [schema, schema_data["id"]]
243
+ end
244
+
231
245
  # Schemas are registered under the full name of the top level Avro record
232
246
  # type, or `subject` if it's provided.
233
247
  def register_schema(schema_name:, subject: nil, namespace: nil)
@@ -92,6 +92,6 @@ class AvroTurf::SchemaStore
92
92
 
93
93
  def build_schema_path(fullname)
94
94
  *namespace, schema_name = fullname.split(".")
95
- schema_path = File.join(@path, *namespace, schema_name + ".avsc")
95
+ File.join(@path, *namespace, "#{schema_name}.avsc")
96
96
  end
97
97
  end
@@ -64,7 +64,8 @@ class FakePrefixedConfluentSchemaRegistryServer < FakeConfluentSchemaRegistrySer
64
64
 
65
65
  # Note: this does not actually handle the same schema registered under
66
66
  # multiple subjects
67
- schema_id = SCHEMAS.index(schema)
67
+ context, _subject = parse_qualified_subject(params[:subject])
68
+ schema_id = SCHEMAS[context].index(schema)
68
69
 
69
70
  halt(404, SCHEMA_NOT_FOUND) unless schema_id
70
71
 
@@ -1,3 +1,3 @@
1
1
  class AvroTurf
2
- VERSION = "1.16.0"
2
+ VERSION = "1.18.0"
3
3
  end
@@ -6,6 +6,7 @@ describe AvroTurf::CachedConfluentSchemaRegistry do
6
6
  let(:upstream) { instance_double(AvroTurf::ConfluentSchemaRegistry) }
7
7
  let(:registry) { described_class.new(upstream) }
8
8
  let(:id) { rand(999) }
9
+ let(:subject_name) { 'a_subject' }
9
10
  let(:schema) do
10
11
  {
11
12
  type: "record",
@@ -25,8 +26,6 @@ describe AvroTurf::CachedConfluentSchemaRegistry do
25
26
  end
26
27
 
27
28
  describe "#register" do
28
- let(:subject_name) { "a_subject" }
29
-
30
29
  it "caches the result of register" do
31
30
  # multiple calls return same result, with only one upstream call
32
31
  allow(upstream).to receive(:register).with(subject_name, schema).and_return(id)
@@ -36,8 +35,29 @@ describe AvroTurf::CachedConfluentSchemaRegistry do
36
35
  end
37
36
  end
38
37
 
38
+ describe "#check" do
39
+ let(:schema_data) do
40
+ {
41
+ "subject" => subject_name,
42
+ "version" => 123,
43
+ "id" => id,
44
+ "schema" => schema
45
+ }
46
+ end
47
+
48
+ before do
49
+ allow(upstream).to receive(:check).with(subject_name, schema).and_return(schema_data)
50
+ end
51
+
52
+ it "caches the result of check" do
53
+ # multiple calls return same result, with only one upstream call
54
+ expect(registry.check(subject_name, schema)).to eq(schema_data)
55
+ expect(registry.check(subject_name, schema)).to eq(schema_data)
56
+ expect(upstream).to have_received(:check).exactly(1).times
57
+ end
58
+ end
59
+
39
60
  describe '#subject_version' do
40
- let(:subject_name) { 'a_subject' }
41
61
  let(:version) { 1 }
42
62
  let(:schema_with_meta) do
43
63
  {
@@ -222,6 +222,66 @@ describe AvroTurf::CachedConfluentSchemaRegistry do
222
222
  end
223
223
  end
224
224
 
225
+ describe "#check" do
226
+ let(:city_name) { "a_city" }
227
+ let(:schema_data) do
228
+ {
229
+ "subject" => subject,
230
+ "version" => version,
231
+ "id" => id,
232
+ "schema" => schema
233
+ }
234
+ end
235
+
236
+ let(:city_schema_data) do
237
+ {
238
+ "subject" => city_name,
239
+ "version" => version,
240
+ "id" => city_id,
241
+ "schema" => city_schema
242
+ }
243
+ end
244
+
245
+ let(:cache_before) do
246
+ {
247
+ "#{subject}#{schema}" => schema_data
248
+ }
249
+ end
250
+
251
+ let(:cache_after) do
252
+ {
253
+ "#{subject}#{schema}" => schema_data,
254
+ "#{city_name}#{city_schema}" => city_schema_data
255
+ }
256
+ end
257
+
258
+ # setup the disk cache to avoid performing the upstream fetch
259
+ before do
260
+ store_cache("data_by_schema.json", cache_before)
261
+ allow(upstream).to receive(:check).with(subject, schema).and_return(schema_data)
262
+ allow(upstream).to receive(:check).with(city_name, city_schema).and_return(city_schema_data)
263
+ end
264
+
265
+ context "when the schema is not found in the cache" do
266
+ it "makes only one request using upstream" do
267
+ expect(registry.check(city_name, city_schema)).to eq(city_schema_data)
268
+ expect(registry.check(city_name, city_schema)).to eq(city_schema_data)
269
+ expect(upstream).to have_received(:check).with(city_name, city_schema).exactly(1).times
270
+ expect(load_cache("data_by_schema.json")).to eq cache_after
271
+ end
272
+ end
273
+
274
+ context "when schema is already in the cache" do
275
+ it "uses preloaded disk cache" do
276
+ # multiple calls return same result, with zero upstream calls
277
+ expect(registry.check(subject, schema)).to eq(schema_data)
278
+ expect(registry.check(subject, schema)).to eq(schema_data)
279
+ expect(upstream).to have_received(:check).exactly(0).times
280
+ expect(load_cache("data_by_schema.json")).to eq cache_before
281
+ end
282
+ end
283
+ end
284
+
225
285
  it_behaves_like "a confluent schema registry client" do
226
286
  let(:upstream) { AvroTurf::ConfluentSchemaRegistry.new(registry_url, logger: logger) }
227
287
  let(:registry) { described_class.new(upstream) }
@@ -1,7 +1,5 @@
1
1
  require 'webmock/rspec'
2
2
  require 'avro_turf/messaging'
3
- require 'avro_turf/test/fake_confluent_schema_registry_server'
4
- require 'avro_turf/test/fake_prefixed_confluent_schema_registry_server'
5
3
 
6
4
  describe AvroTurf::Messaging do
7
5
  let(:registry_url) { "http://registry.example.com" }
@@ -36,6 +34,24 @@ describe AvroTurf::Messaging do
36
34
  }
37
35
  AVSC
38
36
  end
37
+
38
+ let(:city_message) { { "name" => "Paris" } }
39
+ let(:city_schema_json) do
40
+ <<-AVSC
41
+ {
42
+ "name": "city",
43
+ "type": "record",
44
+ "fields": [
45
+ {
46
+ "type": "string",
47
+ "name": "name"
48
+ }
49
+ ]
50
+ }
51
+ AVSC
52
+ end
53
+
54
+ let(:city_schema) { Avro::Schema.parse(city_schema_json) }
39
55
  let(:schema) { Avro::Schema.parse(schema_json) }
40
56
 
41
57
  before do
@@ -43,12 +59,13 @@ describe AvroTurf::Messaging do
43
59
  end
44
60
 
45
61
  before do
46
- stub_request(:any, /^#{registry_url}/).to_rack(FakeConfluentSchemaRegistryServer)
47
- FakeConfluentSchemaRegistryServer.clear
62
+ stub_request(:any, /^#{registry_url}/).to_rack(AuthorizedFakeConfluentSchemaRegistryServer)
63
+ AuthorizedFakeConfluentSchemaRegistryServer.clear
48
64
  end
49
65
 
50
66
  before do
51
67
  define_schema "person.avsc", schema_json
68
+ define_schema "city.avsc", city_schema_json
52
69
  end
53
70
 
54
71
  shared_examples_for "encoding and decoding with the schema from schema store" do
@@ -92,6 +109,16 @@ describe AvroTurf::Messaging do
92
109
  expect { avro.encode(message, subject: 'missing', version: 1) }.to raise_error(AvroTurf::SchemaNotFoundError)
93
110
  end
94
111
 
112
+ it 'raises AvroTurf::SchemaNotFoundError when the schema does not exist on registry and register_schemas false' do
113
+ expect { avro.encode(city_message, schema_name: 'city', register_schemas: false) }.
114
+ to raise_error(AvroTurf::SchemaNotFoundError, "Schema with structure: #{city_schema} not found on registry")
115
+ end
116
+
117
+ it 'encodes with register_schemas false when the schema exists on the registry' do
118
+ data = avro.encode(message, schema_name: 'person', register_schemas: false)
119
+ expect(avro.decode(data, schema_name: 'person')).to eq message
120
+ end
121
+
95
122
  it 'caches parsed schemas for decoding' do
96
123
  data = avro.encode(message, subject: 'person', version: 1)
97
124
  avro.decode(data)
@@ -364,6 +391,34 @@ describe AvroTurf::Messaging do
364
391
  end
365
392
  end
366
393
 
394
+ context 'using fetch_schema_by_body' do
395
+ let(:subject_name) { 'city' }
396
+ let(:schema_name) { 'city' }
397
+ let(:namespace) { 'namespace' }
398
+ let(:city_schema_id) { 125 }
399
+ let(:city_schema_data) do
400
+ {
401
+ "subject" => subject_name,
402
+ "version" => 123,
403
+ "id" => city_schema_id,
404
+ "schema" => city_schema
405
+ }
406
+ end
407
+
408
+ subject(:fetch_schema_by_body) do
409
+ avro.fetch_schema_by_body(schema_name: schema_name, namespace: namespace, subject: subject_name)
410
+ end
411
+
412
+ before do
413
+ allow(schema_store).to receive(:find).with(schema_name, namespace).and_return(city_schema)
414
+ allow(registry).to receive(:check).with(subject_name, city_schema).and_return(city_schema_data)
415
+ end
416
+
417
+ it 'gets schema from registry' do
418
+ expect(fetch_schema_by_body).to eq([city_schema, city_schema_id])
419
+ end
420
+ end
421
+
367
422
  context 'using register_schema' do
368
423
  let(:schema_name) { 'schema_name' }
369
424
 
@@ -417,8 +472,8 @@ describe AvroTurf::Messaging do
417
472
  }
418
473
 
419
474
  before do
420
- stub_request(:any, /^#{registry_url}/).to_rack(FakePrefixedConfluentSchemaRegistryServer)
421
- FakePrefixedConfluentSchemaRegistryServer.clear
475
+ stub_request(:any, /^#{registry_url}/).to_rack(AuthorizedFakePrefixedConfluentSchemaRegistryServer)
476
+ AuthorizedFakePrefixedConfluentSchemaRegistryServer.clear
422
477
  end
423
478
 
424
479
  it_behaves_like "encoding and decoding with the schema from schema store"
@@ -0,0 +1,5 @@
1
+ require 'avro_turf/test/fake_confluent_schema_registry_server'
2
+
3
+ class AuthorizedFakeConfluentSchemaRegistryServer < FakeConfluentSchemaRegistryServer
4
+ set :host_authorization, permitted_hosts: ['example.org', 'registry.example.com']
5
+ end
@@ -0,0 +1,5 @@
1
+ require 'avro_turf/test/fake_prefixed_confluent_schema_registry_server'
2
+
3
+ class AuthorizedFakePrefixedConfluentSchemaRegistryServer < FakePrefixedConfluentSchemaRegistryServer
4
+ set :host_authorization, permitted_hosts: ['example.org', 'registry.example.com']
5
+ end
@@ -26,9 +26,9 @@ shared_examples_for "a confluent schema registry client" do |schema_context: nil
26
26
  before do
27
27
  stub_request(:any, /^#{registry_url}/)
28
28
  .with(headers: headers)
29
- .to_rack(FakeConfluentSchemaRegistryServer)
29
+ .to_rack(AuthorizedFakeConfluentSchemaRegistryServer)
30
30
 
31
- FakeConfluentSchemaRegistryServer.clear
31
+ AuthorizedFakeConfluentSchemaRegistryServer.clear
32
32
  end
33
33
 
34
34
  describe "#register and #fetch" do
@@ -1,10 +1,9 @@
1
1
  require 'rack/test'
2
- require 'avro_turf/test/fake_confluent_schema_registry_server'
3
2
 
4
3
  describe FakeConfluentSchemaRegistryServer do
5
4
  include Rack::Test::Methods
6
5
 
7
- def app; described_class; end
6
+ def app; AuthorizedFakeConfluentSchemaRegistryServer; end
8
7
 
9
8
  describe 'POST /subjects/:subject/versions' do
10
9
  it 'returns the same schema ID when invoked with same schema and same subject' do
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.16.0
4
+ version: 1.18.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: 2024-08-12 00:00:00.000000000 Z
11
+ date: 2024-12-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: avro
@@ -170,13 +170,14 @@ dependencies:
170
170
  - - ">="
171
171
  - !ruby/object:Gem::Version
172
172
  version: '0'
173
- description:
173
+ description:
174
174
  email:
175
175
  - dasch@zendesk.com
176
176
  executables: []
177
177
  extensions: []
178
178
  extra_rdoc_files: []
179
179
  files:
180
+ - ".github/workflows/push_gem.yml"
180
181
  - ".github/workflows/ruby.yml"
181
182
  - ".github/workflows/stale.yml"
182
183
  - ".gitignore"
@@ -235,6 +236,8 @@ files:
235
236
  - spec/schema_store_spec.rb
236
237
  - spec/schema_to_avro_patch_spec.rb
237
238
  - spec/spec_helper.rb
239
+ - spec/support/authorized_fake_confluent_schema_registry_server.rb
240
+ - spec/support/authorized_fake_prefixed_confluent_schema_registry_server.rb
238
241
  - spec/support/confluent_schema_registry_context.rb
239
242
  - spec/test/fake_confluent_schema_registry_server_spec.rb
240
243
  homepage: https://github.com/dasch/avro_turf
@@ -265,8 +268,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
265
268
  - !ruby/object:Gem::Version
266
269
  version: '0'
267
270
  requirements: []
268
- rubygems_version: 3.4.10
269
- signing_key:
271
+ rubygems_version: 3.5.22
272
+ signing_key:
270
273
  specification_version: 4
271
274
  summary: A library that makes it easier to use the Avro serialization format from
272
275
  Ruby
@@ -289,5 +292,7 @@ test_files:
289
292
  - spec/schema_store_spec.rb
290
293
  - spec/schema_to_avro_patch_spec.rb
291
294
  - spec/spec_helper.rb
295
+ - spec/support/authorized_fake_confluent_schema_registry_server.rb
296
+ - spec/support/authorized_fake_prefixed_confluent_schema_registry_server.rb
292
297
  - spec/support/confluent_schema_registry_context.rb
293
298
  - spec/test/fake_confluent_schema_registry_server_spec.rb