avro_turf 1.4.0 → 1.6.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ebbfdd602e4d6c23894efe960ef21e01bc6bbc770c6076105260fc36de3c8e1e
4
- data.tar.gz: 1113f99b28e58f641a13c9cec7b8b314bb113b34e07e3c27aab5559c524568b4
3
+ metadata.gz: db17e2aed8677c0288cd1c817b2e4ecae50da47255663c2b0a75d64a43e91152
4
+ data.tar.gz: e88f6481337b05b80db9710283daf20818fcad9621c09ca9ebd75e533ca5135c
5
5
  SHA512:
6
- metadata.gz: 56c4235851a345cf81abfd7170961f973eed218437187a20ef1b717e600ad19f6cbea8df41a755af5d54f2c98adac0ea3d5c236b822d4fdda10e17c1f6987d5c
7
- data.tar.gz: 8caefcd9b974120c84f0a7910f26aff6106578eb80623119ac48c0c25c1775092c6e18b55a47cb97a2d000e7be7e110905cf0fb2d30a5f80e6bb0a800f98bc6c
6
+ metadata.gz: 3c226b186752b4feed4519d329e7789dc02ad29793d3573ca2832a182074010652c16746308f785320018bed528d00b241c9b6354b2a3271a72278812d552d56
7
+ data.tar.gz: c07515285fbd182752764d43c350d529f9a60bce1ad7d7aa6992cb1cda9fb958c189092d78a432a6e141eca380c8e9459857b29e2b038f03e32b645f5b4f0461
data/CHANGELOG.md CHANGED
@@ -2,6 +2,19 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## v1.6.0
6
+
7
+ - Schema registry path prefix (#162)
8
+
9
+ ## v1.5.0
10
+
11
+ - Add CA cert file option (#157)
12
+ - Add compatibility with Avro v1.11.x.
13
+
14
+ ## v1.4.1
15
+
16
+ - Purge sub-schemas from cache before re-parsing schema (#151)
17
+
5
18
  ## v1.4.0
6
19
 
7
20
  - Add support for Ruby 3 (#146)
data/avro_turf.gemspec CHANGED
@@ -12,12 +12,14 @@ Gem::Specification.new do |spec|
12
12
  spec.homepage = "https://github.com/dasch/avro_turf"
13
13
  spec.license = "MIT"
14
14
 
15
+ spec.metadata["rubygems_mfa_required"] = "true"
16
+
15
17
  spec.files = `git ls-files -z`.split("\x0")
16
18
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
19
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
20
  spec.require_paths = ["lib"]
19
21
 
20
- spec.add_dependency "avro", ">= 1.7.7", "< 1.11"
22
+ spec.add_dependency "avro", ">= 1.7.7", "< 1.12"
21
23
  spec.add_dependency "excon", "~> 0.71"
22
24
 
23
25
  spec.add_development_dependency "bundler", "~> 2.0"
@@ -9,12 +9,15 @@ class AvroTurf::ConfluentSchemaRegistry
9
9
  proxy: nil,
10
10
  user: nil,
11
11
  password: nil,
12
+ ssl_ca_file: nil,
12
13
  client_cert: nil,
13
14
  client_key: nil,
14
15
  client_key_pass: nil,
15
16
  client_cert_data: nil,
16
- client_key_data: nil
17
+ client_key_data: nil,
18
+ path_prefix: nil
17
19
  )
20
+ @path_prefix = path_prefix
18
21
  @logger = logger
19
22
  headers = {
20
23
  "Content-Type" => CONTENT_TYPE
@@ -25,6 +28,7 @@ class AvroTurf::ConfluentSchemaRegistry
25
28
  headers: headers,
26
29
  user: user,
27
30
  password: password,
31
+ ssl_ca_file: ssl_ca_file,
28
32
  client_cert: client_cert,
29
33
  client_key: client_key,
30
34
  client_key_pass: client_key_pass,
@@ -120,6 +124,7 @@ class AvroTurf::ConfluentSchemaRegistry
120
124
 
121
125
  def request(path, **options)
122
126
  options = { expects: 200 }.merge!(options)
127
+ path = File.join(@path_prefix, path) unless @path_prefix.nil?
123
128
  response = @connection.request(path: path, **options)
124
129
  JSON.parse(response.body)
125
130
  end
@@ -26,31 +26,35 @@ class AvroTurf
26
26
 
27
27
  # Instantiate a new Messaging instance with the given configuration.
28
28
  #
29
- # registry - A schema registry object that responds to all methods in the
30
- # AvroTurf::ConfluentSchemaRegistry interface.
31
- # registry_url - The String URL of the schema registry that should be used.
32
- # schema_store - A schema store object that responds to #find(schema_name, namespace).
33
- # schemas_path - The String file system path where local schemas are stored.
34
- # namespace - The String default schema namespace.
35
- # logger - The Logger that should be used to log information (optional).
36
- # proxy - Forward the request via proxy (optional).
37
- # user - User for basic auth (optional).
38
- # password - Password for basic auth (optional).
39
- # client_cert - Name of file containing client certificate (optional).
40
- # client_key - Name of file containing client private key to go with client_cert (optional).
41
- # client_key_pass - Password to go with client_key (optional).
42
- # client_cert_data - In-memory client certificate (optional).
43
- # client_key_data - In-memory client private key to go with client_cert_data (optional).
29
+ # registry - A schema registry object that responds to all methods in the
30
+ # AvroTurf::ConfluentSchemaRegistry interface.
31
+ # registry_url - The String URL of the schema registry that should be used.
32
+ # schema_store - A schema store object that responds to #find(schema_name, namespace).
33
+ # schemas_path - The String file system path where local schemas are stored.
34
+ # namespace - The String default schema namespace.
35
+ # registry_path_prefix - The String URL path prefix used to namespace schema registry requests (optional).
36
+ # logger - The Logger that should be used to log information (optional).
37
+ # proxy - Forward the request via proxy (optional).
38
+ # user - User for basic auth (optional).
39
+ # password - Password for basic auth (optional).
40
+ # ssl_ca_file - Name of file containing CA certificate (optional).
41
+ # client_cert - Name of file containing client certificate (optional).
42
+ # client_key - Name of file containing client private key to go with client_cert (optional).
43
+ # client_key_pass - Password to go with client_key (optional).
44
+ # client_cert_data - In-memory client certificate (optional).
45
+ # client_key_data - In-memory client private key to go with client_cert_data (optional).
44
46
  def initialize(
45
47
  registry: nil,
46
48
  registry_url: nil,
47
49
  schema_store: nil,
48
50
  schemas_path: nil,
49
51
  namespace: nil,
52
+ registry_path_prefix: nil,
50
53
  logger: nil,
51
54
  proxy: nil,
52
55
  user: nil,
53
56
  password: nil,
57
+ ssl_ca_file: nil,
54
58
  client_cert: nil,
55
59
  client_key: nil,
56
60
  client_key_pass: nil,
@@ -67,11 +71,13 @@ class AvroTurf
67
71
  proxy: proxy,
68
72
  user: user,
69
73
  password: password,
74
+ ssl_ca_file: ssl_ca_file,
70
75
  client_cert: client_cert,
71
76
  client_key: client_key,
72
77
  client_key_pass: client_key_pass,
73
78
  client_cert_data: client_cert_data,
74
- client_key_data: client_key_data
79
+ client_key_data: client_key_data,
80
+ path_prefix: registry_path_prefix
75
81
  )
76
82
  )
77
83
  @schemas_by_id = {}
@@ -83,10 +83,10 @@ class AvroTurf::SchemaStore
83
83
  # has been resolved and use the now-updated local_schemas_cache to
84
84
  # pick up where we left off.
85
85
  local_schemas_cache.delete(fullname)
86
- # Ensure enum schemas are cleaned up to avoid conflicts when re-parsing
86
+ # Ensure all sub-schemas are cleaned up to avoid conflicts when re-parsing
87
87
  # schema.
88
88
  local_schemas_cache.each do |schema_name, schema|
89
- local_schemas_cache.delete(schema_name) if schema.type_sym == :enum
89
+ local_schemas_cache.delete(schema_name) unless File.exist?(build_schema_path(schema_name))
90
90
  end
91
91
  load_schema!(fullname, local_schemas_cache)
92
92
  else
@@ -0,0 +1,102 @@
1
+ require 'sinatra/base'
2
+
3
+ class FakePrefixedConfluentSchemaRegistryServer < FakeConfluentSchemaRegistryServer
4
+ post "/prefix/subjects/:subject/versions" do
5
+ schema = parse_schema
6
+ ids_for_subject = SUBJECTS[params[:subject]]
7
+
8
+ schemas_for_subject =
9
+ SCHEMAS.select
10
+ .with_index { |_, i| ids_for_subject.include?(i) }
11
+
12
+ if schemas_for_subject.include?(schema)
13
+ schema_id = SCHEMAS.index(schema)
14
+ else
15
+ SCHEMAS << schema
16
+ schema_id = SCHEMAS.size - 1
17
+ SUBJECTS[params[:subject]] = SUBJECTS[params[:subject]] << schema_id
18
+ end
19
+
20
+ { id: schema_id }.to_json
21
+ end
22
+
23
+ get "/prefix/schemas/ids/:schema_id" do
24
+ schema = SCHEMAS.at(params[:schema_id].to_i)
25
+ halt(404, SCHEMA_NOT_FOUND) unless schema
26
+ { schema: schema }.to_json
27
+ end
28
+
29
+ get "/prefix/subjects" do
30
+ SUBJECTS.keys.to_json
31
+ end
32
+
33
+ get "/prefix/subjects/:subject/versions" do
34
+ schema_ids = SUBJECTS[params[:subject]]
35
+ halt(404, SUBJECT_NOT_FOUND) if schema_ids.empty?
36
+ (1..schema_ids.size).to_a.to_json
37
+ end
38
+
39
+ get "/prefix/subjects/:subject/versions/:version" do
40
+ schema_ids = SUBJECTS[params[:subject]]
41
+ halt(404, SUBJECT_NOT_FOUND) if schema_ids.empty?
42
+
43
+ schema_id = if params[:version] == 'latest'
44
+ schema_ids.last
45
+ else
46
+ schema_ids.at(Integer(params[:version]) - 1)
47
+ end
48
+ halt(404, VERSION_NOT_FOUND) unless schema_id
49
+
50
+ schema = SCHEMAS.at(schema_id)
51
+
52
+ {
53
+ name: params[:subject],
54
+ version: schema_ids.index(schema_id) + 1,
55
+ id: schema_id,
56
+ schema: schema
57
+ }.to_json
58
+ end
59
+
60
+ post "/prefix/subjects/:subject" do
61
+ schema = parse_schema
62
+
63
+ # Note: this does not actually handle the same schema registered under
64
+ # multiple subjects
65
+ schema_id = SCHEMAS.index(schema)
66
+
67
+ halt(404, SCHEMA_NOT_FOUND) unless schema_id
68
+
69
+ {
70
+ subject: params[:subject],
71
+ id: schema_id,
72
+ version: SUBJECTS[params[:subject]].index(schema_id) + 1,
73
+ schema: schema
74
+ }.to_json
75
+ end
76
+
77
+ post "/prefix/compatibility/subjects/:subject/versions/:version" do
78
+ # The ruby avro gem does not yet include a compatibility check between schemas.
79
+ # See https://github.com/apache/avro/pull/170
80
+ raise NotImplementedError
81
+ end
82
+
83
+ get "/prefix/config" do
84
+ global_config.to_json
85
+ end
86
+
87
+ put "/prefix/config" do
88
+ global_config.merge!(parse_config).to_json
89
+ end
90
+
91
+ get "/prefix/config/:subject" do
92
+ CONFIGS.fetch(params[:subject], global_config).to_json
93
+ end
94
+
95
+ put "/prefix/config/:subject" do
96
+ config = parse_config
97
+ subject = params[:subject]
98
+ CONFIGS.fetch(subject) do
99
+ CONFIGS[subject] = {}
100
+ end.merge!(config).to_json
101
+ end
102
+ end
@@ -1,3 +1,3 @@
1
1
  class AvroTurf
2
- VERSION = "1.4.0"
2
+ VERSION = "1.6.0"
3
3
  end
@@ -68,11 +68,23 @@ describe AvroTurf do
68
68
  "type": "array",
69
69
  "items": "message"
70
70
  }
71
+ },
72
+ {
73
+ "name": "status",
74
+ "type": "publishing_status"
71
75
  }
72
76
  ]
73
77
  }
74
78
  AVSC
75
79
 
80
+ define_schema "publishing_status.avsc", <<-AVSC
81
+ {
82
+ "name": "publishing_status",
83
+ "type": "enum",
84
+ "symbols": ["draft", "published", "archived"]
85
+ }
86
+ AVSC
87
+
76
88
  define_schema "message.avsc", <<-AVSC
77
89
  {
78
90
  "name": "message",
@@ -89,6 +101,10 @@ describe AvroTurf do
89
101
  "name": "label",
90
102
  "symbols": ["foo", "bar"]
91
103
  }
104
+ },
105
+ {
106
+ "name": "status",
107
+ "type": "publishing_status"
92
108
  }
93
109
  ]
94
110
  }
@@ -101,9 +117,11 @@ describe AvroTurf do
101
117
  "messages" => [
102
118
  {
103
119
  "content" => "hello",
104
- "label" => "bar"
120
+ "label" => "bar",
121
+ "status" => "draft"
105
122
  }
106
- ]
123
+ ],
124
+ "status" => "published"
107
125
  }
108
126
 
109
127
  encoded_data = avro.encode(data, schema_name: "post")
@@ -177,7 +195,7 @@ describe AvroTurf do
177
195
  context "validating" do
178
196
  subject(:encode_to_stream) do
179
197
  stream = StringIO.new
180
- avro.encode_to_stream(message, stream: stream, schema_name: "message", validate: true)
198
+ avro.encode_to_stream(message, stream: stream, schema_name: "message", validate: true)
181
199
  end
182
200
 
183
201
  context "with a valid message" do
@@ -1,6 +1,7 @@
1
1
  require 'webmock/rspec'
2
2
  require 'avro_turf/messaging'
3
3
  require 'avro_turf/test/fake_confluent_schema_registry_server'
4
+ require 'avro_turf/test/fake_prefixed_confluent_schema_registry_server'
4
5
 
5
6
  describe AvroTurf::Messaging do
6
7
  let(:registry_url) { "http://registry.example.com" }
@@ -8,7 +9,7 @@ describe AvroTurf::Messaging do
8
9
  let(:client_key) { "test client key" }
9
10
  let(:client_key_pass) { "test client key password" }
10
11
  let(:logger) { Logger.new(StringIO.new) }
11
-
12
+ let(:path_prefix) { nil }
12
13
  let(:avro) {
13
14
  AvroTurf::Messaging.new(
14
15
  registry_url: registry_url,
@@ -72,7 +73,7 @@ describe AvroTurf::Messaging do
72
73
 
73
74
  shared_examples_for 'encoding and decoding with the schema from registry' do
74
75
  before do
75
- registry = AvroTurf::ConfluentSchemaRegistry.new(registry_url, logger: logger)
76
+ registry = AvroTurf::ConfluentSchemaRegistry.new(registry_url, logger: logger, path_prefix: path_prefix)
76
77
  registry.register('person', schema)
77
78
  registry.register('people', schema)
78
79
  end
@@ -102,7 +103,7 @@ describe AvroTurf::Messaging do
102
103
 
103
104
  shared_examples_for 'encoding and decoding with the schema_id from registry' do
104
105
  before do
105
- registry = AvroTurf::ConfluentSchemaRegistry.new(registry_url, logger: logger)
106
+ registry = AvroTurf::ConfluentSchemaRegistry.new(registry_url, logger: logger, path_prefix: path_prefix)
106
107
  registry.register('person', schema)
107
108
  registry.register('people', schema)
108
109
  end
@@ -399,4 +400,29 @@ describe AvroTurf::Messaging do
399
400
  end
400
401
  end
401
402
  end
402
- end
403
+
404
+ context 'with a registry path prefix' do
405
+ let(:path_prefix) { '/prefix' }
406
+
407
+ let(:avro) {
408
+ AvroTurf::Messaging.new(
409
+ registry_path_prefix: path_prefix,
410
+ registry_url: registry_url,
411
+ schemas_path: "spec/schemas",
412
+ logger: logger,
413
+ client_cert: client_cert,
414
+ client_key: client_key,
415
+ client_key_pass: client_key_pass
416
+ )
417
+ }
418
+
419
+ before do
420
+ stub_request(:any, /^#{registry_url}/).to_rack(FakePrefixedConfluentSchemaRegistryServer)
421
+ FakePrefixedConfluentSchemaRegistryServer.clear
422
+ end
423
+
424
+ it_behaves_like "encoding and decoding with the schema from schema store"
425
+ it_behaves_like 'encoding and decoding with the schema from registry'
426
+ it_behaves_like 'encoding and decoding with the schema_id from registry'
427
+ end
428
+ end
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.0
4
+ version: 1.6.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: 2021-06-18 00:00:00.000000000 Z
11
+ date: 2022-06-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: avro
@@ -19,7 +19,7 @@ dependencies:
19
19
  version: 1.7.7
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
- version: '1.11'
22
+ version: '1.12'
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -29,7 +29,7 @@ dependencies:
29
29
  version: 1.7.7
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
- version: '1.11'
32
+ version: '1.12'
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: excon
35
35
  requirement: !ruby/object:Gem::Requirement
@@ -196,6 +196,7 @@ files:
196
196
  - lib/avro_turf/schema_store.rb
197
197
  - lib/avro_turf/schema_to_avro_patch.rb
198
198
  - lib/avro_turf/test/fake_confluent_schema_registry_server.rb
199
+ - lib/avro_turf/test/fake_prefixed_confluent_schema_registry_server.rb
199
200
  - lib/avro_turf/test/fake_schema_registry_server.rb
200
201
  - lib/avro_turf/version.rb
201
202
  - perf/address.avsc
@@ -225,7 +226,8 @@ files:
225
226
  homepage: https://github.com/dasch/avro_turf
226
227
  licenses:
227
228
  - MIT
228
- metadata: {}
229
+ metadata:
230
+ rubygems_mfa_required: 'true'
229
231
  post_install_message: |2
230
232
 
231
233
  avro_turf v0.8.0 deprecates the names AvroTurf::SchemaRegistry,