avro_turf 0.7.2 → 0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0df3c290be95bcafd27a4473ba75df36a5275a6b
4
- data.tar.gz: 17e1a0283f0479c60a691d3c52e33fb8eaf3f30c
3
+ metadata.gz: a708b9aabeca7d45e1db532e180b2d80e4a5aecb
4
+ data.tar.gz: acb21f2435fd5126efed47803395d84eb4f5a220
5
5
  SHA512:
6
- metadata.gz: 7df0d445557d08c28a9a6e0357dea7b76159846ab3f3e456b1200e4a28c84bb1853727d4259bcf94432567f8031cfb34e80b30963b5fb1e1f43fff5ce0a52e1e
7
- data.tar.gz: 144873d0859cb6c937898b94ca3649dca34284b9fa16ebaa122244faef4c20d838c871ab51ecf91c9c69d803d84fd55215867544ac57d5283a86b18fbc8ffc9f
6
+ metadata.gz: 4bcc5e9832804eafb4f295a6fc85273a5a52c17a515f87ab3da0deb31034ed428c6aaee3754abcaa45d78d37daf6062c6c1d1007644f8578e2561b17f70f1614
7
+ data.tar.gz: 89071ed406d0be937344cc70814499e29206f05e52484fd4ba4f797f12bcb9236c36c4b080f22ffedd815ac3f6081e13405cb10fa1dc4184cfe73c8bbb279952
data/CHANGELOG.md ADDED
@@ -0,0 +1,9 @@
1
+ # avro_turf
2
+
3
+ ## v0.8.0
4
+ - The names `AvroTurf::SchemaRegistry`, `AvroTurf::CachedSchemaRegistry`, and
5
+ `FakeSchemaRegistryServer` are deprecated and will be removed in a future release.
6
+ Use `AvroTurf::ConfluentSchemaRegistry`, `AvroTurf::CachedConfluentSchemaRegistry`,
7
+ and `FakeConfluentSchemaRegistryServer` instead.
8
+ - Add support for the Config API (http://docs.confluent.io/3.1.2/schema-registry/docs/api.html#config)
9
+ to `AvroTurf::ConfluentSchemaRegistry`.
data/README.md CHANGED
@@ -5,6 +5,17 @@ AvroTurf is a library that makes it easier to encode and decode data using the [
5
5
  * Provides an idiomatic Ruby interface.
6
6
  * Allows referencing schemas defined in another file.
7
7
 
8
+ ## Deprecation Notice
9
+
10
+ The `AvroTurf::SchemaRegistry`, `AvroTurf::CachedSchemaRegistry`,
11
+ and `FakeSchemaRegistryServer` names have been deprecated because the Avro spec recently
12
+ introduced an incompatible [single-message encoding format](https://github.com/apache/avro/commit/30408a9c192c5f4eaaf42f01f0ffbfffd705aa57).
13
+
14
+ These classes have been renamed to `AvroTurf::ConfluentSchemaRegistry`,
15
+ `AvroTurf::CachedConfluentSchemaRegistry`, and `FakeConfluentSchemaRegistry`.
16
+
17
+ The aliases for the original names will be removed in a future release.
18
+
8
19
  ## Installation
9
20
 
10
21
  Add this line to your application's Gemfile:
@@ -80,11 +91,8 @@ In the example above, the `person` schema references the `address` schema, even
80
91
  ```json
81
92
  // person_list.avsc
82
93
  {
83
- "name": "person_list",
84
- "type": {
85
- "type": "array",
86
- "items": "person"
87
- }
94
+ "type": "array",
95
+ "items": "person"
88
96
  }
89
97
  ```
90
98
 
@@ -121,11 +129,14 @@ data = avro.encode({ "title" => "hello, world" }, schema_name: "greeting")
121
129
  avro.decode(data) #=> { "title" => "hello, world" }
122
130
  ```
123
131
 
124
- In addition to encoding and decoding data, you can check whether a schema is compatible
125
- with a subject in the registry using the [Compatibility API](http://docs.confluent.io/2.0.0/schema-registry/docs/api.html#compatibility)
132
+ ### Confluent Schema Registry Client
133
+
134
+ The ConfluentSchemaRegistry client used by the Messaging API can also be used directly.
135
+ It can check whether a schema is compatible with a subject in the registry using the [Compatibility API](http://docs.confluent.io/3.1.2/schema-registry/docs/api.html#compatibility):
126
136
 
127
137
  ```ruby
128
- require 'avro_turf/messaging'
138
+ require 'avro_turf'
139
+ require 'avro_turf/confluent_schema_registry'
129
140
 
130
141
  schema = <<-JSON
131
142
  {
@@ -144,15 +155,22 @@ schema = <<-JSON
144
155
  }
145
156
  JSON
146
157
 
147
- avro = AvroTurf::Messaging.new(registry_url: "http://my-registry:8081/")
158
+ registry = AvroTurf::ConfluentSchemaRegistry.new("http://my-registry:8081/")
159
+
160
+ # Returns true if the schema is compatible, nil if the subject or version is not registered, and false if incompatible.
161
+ registry.compatible?("person", schema)
162
+ ```
148
163
 
149
- # Returns true if the schema is compatible, false otherwise.
150
- avro.compatible?("person", schema)
164
+ 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):
165
+
166
+ ```ruby
167
+ registry.update_global_config(compatibility: 'FULL')
168
+ registry.update_subject_config("person", compatibility: 'NONE')
151
169
  ```
152
170
 
153
171
  ### Testing Support
154
172
 
155
- AvroTurf includes a `FakeSchemaRegistryServer` that can be used in tests. The
173
+ AvroTurf includes a `FakeConfluentSchemaRegistryServer` that can be used in tests. The
156
174
  fake schema registry server depends on Sinatra but it is _not_ listed as a runtime
157
175
  dependency for AvroTurf. Sinatra must be added to your Gemfile or gemspec in order
158
176
  to use the fake server.
@@ -160,14 +178,14 @@ to use the fake server.
160
178
  Example using RSpec:
161
179
 
162
180
  ```ruby
163
- require 'avro_turf/test/fake_schema_registry_server'
181
+ require 'avro_turf/test/fake_confluent_schema_registry_server'
164
182
  require 'webmock/rspec'
165
183
 
166
184
  # within an example
167
185
  let(:registry_url) { "http://registry.example.com" }
168
186
  before do
169
- stub_request(:any, /^#{registry_url}/).to_rack(FakeSchemaRegistryServer)
170
- FakeSchemaRegistryServer.clear
187
+ stub_request(:any, /^#{registry_url}/).to_rack(FakeConfluentSchemaRegistryServer)
188
+ FakeConfluentSchemaRegistryServer.clear
171
189
  end
172
190
 
173
191
  # Messaging objects created with the same registry_url will now use the fake server.
data/avro_turf.gemspec CHANGED
@@ -27,4 +27,14 @@ Gem::Specification.new do |spec|
27
27
  spec.add_development_dependency "webmock"
28
28
  spec.add_development_dependency "sinatra"
29
29
  spec.add_development_dependency "json_spec"
30
+
31
+ spec.post_install_message = %{
32
+ avro_turf v0.8.0 deprecates the names AvroTurf::SchemaRegistry,
33
+ AvroTurf::CachedSchemaRegistry, and FakeSchemaRegistryServer.
34
+
35
+ Use AvroTurf::ConfluentSchemaRegistry, AvroTurf::CachedConfluentSchemaRegistry,
36
+ and FakeConfluentSchemaRegistryServer instead.
37
+
38
+ See https://github.com/dasch/avro_turf#deprecation-notice
39
+ }
30
40
  end
@@ -0,0 +1,27 @@
1
+ require 'avro_turf/confluent_schema_registry'
2
+
3
+ # Caches registrations and lookups to the schema registry in memory.
4
+ class AvroTurf::CachedConfluentSchemaRegistry
5
+
6
+ def initialize(upstream)
7
+ @upstream = upstream
8
+ @schemas_by_id = {}
9
+ @ids_by_schema = {}
10
+ end
11
+
12
+ # Delegate the following methods to the upstream
13
+ %i(subjects subject_versions subject_version check compatible?
14
+ global_config update_global_config subject_config update_subject_config).each do |name|
15
+ define_method(name) do |*args|
16
+ instance_variable_get(:@upstream).send(name, *args)
17
+ end
18
+ end
19
+
20
+ def fetch(id)
21
+ @schemas_by_id[id] ||= @upstream.fetch(id)
22
+ end
23
+
24
+ def register(subject, schema)
25
+ @ids_by_schema[subject + schema.to_s] ||= @upstream.register(subject, schema)
26
+ end
27
+ end
@@ -1,26 +1,6 @@
1
- require 'avro_turf/schema_registry'
1
+ require 'avro_turf/cached_confluent_schema_registry'
2
2
 
3
- # Caches registrations and lookups to the schema registry in memory.
4
- class AvroTurf::CachedSchemaRegistry
3
+ # AvroTurf::CachedSchemaRegistry is deprecated and will be removed in a future release.
4
+ # Use AvroTurf::CachedConfluentSchemaRegistry instead.
5
5
 
6
- def initialize(upstream)
7
- @upstream = upstream
8
- @schemas_by_id = {}
9
- @ids_by_schema = {}
10
- end
11
-
12
- # Delegate the following methods to the upstream
13
- %i(subjects subject_versions subject_version check compatible?).each do |name|
14
- define_method(name) do |*args|
15
- instance_variable_get(:@upstream).send(name, *args)
16
- end
17
- end
18
-
19
- def fetch(id)
20
- @schemas_by_id[id] ||= @upstream.fetch(id)
21
- end
22
-
23
- def register(subject, schema)
24
- @ids_by_schema[subject + schema.to_s] ||= @upstream.register(subject, schema)
25
- end
26
- end
6
+ AvroTurf::CachedSchemaRegistry = AvroTurf::CachedConfluentSchemaRegistry
@@ -0,0 +1,106 @@
1
+ require 'excon'
2
+
3
+ class AvroTurf::ConfluentSchemaRegistry
4
+ CONTENT_TYPE = "application/vnd.schemaregistry.v1+json".freeze
5
+
6
+ def initialize(url, logger: Logger.new($stdout))
7
+ @logger = logger
8
+ @connection = Excon.new(url, headers: {
9
+ "Content-Type" => CONTENT_TYPE,
10
+ })
11
+ end
12
+
13
+ def fetch(id)
14
+ @logger.info "Fetching schema with id #{id}"
15
+ data = get("/schemas/ids/#{id}")
16
+ data.fetch("schema")
17
+ end
18
+
19
+ def register(subject, schema)
20
+ data = post("/subjects/#{subject}/versions", body: {
21
+ schema: schema.to_s
22
+ }.to_json)
23
+
24
+ id = data.fetch("id")
25
+
26
+ @logger.info "Registered schema for subject `#{subject}`; id = #{id}"
27
+
28
+ id
29
+ end
30
+
31
+ # List all subjects
32
+ def subjects
33
+ get('/subjects')
34
+ end
35
+
36
+ # List all versions for a subject
37
+ def subject_versions(subject)
38
+ get("/subjects/#{subject}/versions")
39
+ end
40
+
41
+ # Get a specific version for a subject
42
+ def subject_version(subject, version = 'latest')
43
+ get("/subjects/#{subject}/versions/#{version}")
44
+ end
45
+
46
+ # Check if a schema exists. Returns nil if not found.
47
+ def check(subject, schema)
48
+ data = post("/subjects/#{subject}",
49
+ expects: [200, 404],
50
+ body: { schema: schema.to_s }.to_json)
51
+ data unless data.has_key?("error_code")
52
+ end
53
+
54
+ # Check if a schema is compatible with the stored version.
55
+ # Returns:
56
+ # - true if compatible
57
+ # - nil if the subject or version does not exist
58
+ # - false if incompatible
59
+ # http://docs.confluent.io/3.1.2/schema-registry/docs/api.html#compatibility
60
+ def compatible?(subject, schema, version = 'latest')
61
+ data = post("/compatibility/subjects/#{subject}/versions/#{version}",
62
+ expects: [200, 404],
63
+ body: { schema: schema.to_s }.to_json)
64
+ data.fetch('is_compatible', false) unless data.has_key?('error_code')
65
+ end
66
+
67
+ # Get global config
68
+ def global_config
69
+ get("/config")
70
+ end
71
+
72
+ # Update global config
73
+ def update_global_config(config)
74
+ put("/config", { body: config.to_json })
75
+ end
76
+
77
+ # Get config for subject
78
+ def subject_config(subject)
79
+ get("/config/#{subject}")
80
+ end
81
+
82
+ # Update config for subject
83
+ def update_subject_config(subject, config)
84
+ put("/config/#{subject}", { body: config.to_json })
85
+ end
86
+
87
+ private
88
+
89
+ def get(path, **options)
90
+ request(path, method: :get, **options)
91
+ end
92
+
93
+ def put(path, **options)
94
+ request(path, method: :put, **options)
95
+ end
96
+
97
+ def post(path, **options)
98
+ request(path, method: :post, **options)
99
+ end
100
+
101
+ def request(path, **options)
102
+ options = { expects: 200 }.merge!(options)
103
+ response = @connection.request(path: path, **options)
104
+ JSON.parse(response.body)
105
+ end
106
+ end
@@ -1,6 +1,11 @@
1
1
  require 'logger'
2
2
  require 'avro_turf'
3
3
  require 'avro_turf/schema_store'
4
+ require 'avro_turf/confluent_schema_registry'
5
+ require 'avro_turf/cached_confluent_schema_registry'
6
+
7
+ # For back-compatibility require the aliases along with the Messaging API.
8
+ # These names are deprecated and will be removed in a future release.
4
9
  require 'avro_turf/schema_registry'
5
10
  require 'avro_turf/cached_schema_registry'
6
11
 
@@ -20,7 +25,7 @@ class AvroTurf
20
25
  # Instantiate a new Messaging instance with the given configuration.
21
26
  #
22
27
  # registry - A schema registry object that responds to all methods in the
23
- # AvroTurf::SchemaRegistry interface.
28
+ # AvroTurf::ConfluentSchemaRegistry interface.
24
29
  # registry_url - The String URL of the schema registry that should be used.
25
30
  # schema_store - A schema store object that responds to #find(schema_name, namespace).
26
31
  # schemas_path - The String file system path where local schemas are stored.
@@ -30,7 +35,7 @@ class AvroTurf
30
35
  @logger = logger || Logger.new($stderr)
31
36
  @namespace = namespace
32
37
  @schema_store = schema_store || SchemaStore.new(path: schemas_path || DEFAULT_SCHEMAS_PATH)
33
- @registry = registry || CachedSchemaRegistry.new(SchemaRegistry.new(registry_url, logger: @logger))
38
+ @registry = registry || CachedConfluentSchemaRegistry.new(ConfluentSchemaRegistry.new(registry_url, logger: @logger))
34
39
  @schemas_by_id = {}
35
40
  end
36
41
 
@@ -1,79 +1,6 @@
1
- require 'excon'
1
+ require 'avro_turf/confluent_schema_registry'
2
2
 
3
- class AvroTurf::SchemaRegistry
4
- CONTENT_TYPE = "application/vnd.schemaregistry.v1+json".freeze
3
+ # AvroTurf::SchemaRegistry is deprecated and will be removed in a future release.
4
+ # Use AvroTurf::ConfluentSchemaRegistry instead.
5
5
 
6
- def initialize(url, logger: Logger.new($stdout))
7
- @logger = logger
8
- @connection = Excon.new(url, headers: {
9
- "Content-Type" => CONTENT_TYPE,
10
- })
11
- end
12
-
13
- def fetch(id)
14
- @logger.info "Fetching schema with id #{id}"
15
- data = get("/schemas/ids/#{id}")
16
- data.fetch("schema")
17
- end
18
-
19
- def register(subject, schema)
20
- data = post("/subjects/#{subject}/versions", body: {
21
- schema: schema.to_s
22
- }.to_json)
23
-
24
- id = data.fetch("id")
25
-
26
- @logger.info "Registered schema for subject `#{subject}`; id = #{id}"
27
-
28
- id
29
- end
30
-
31
- # List all subjects
32
- def subjects
33
- get('/subjects')
34
- end
35
-
36
- # List all versions for a subject
37
- def subject_versions(subject)
38
- get("/subjects/#{subject}/versions")
39
- end
40
-
41
- # Get a specific version for a subject
42
- def subject_version(subject, version = 'latest')
43
- get("/subjects/#{subject}/versions/#{version}")
44
- end
45
-
46
- # Check if a schema exists. Returns nil if not found.
47
- def check(subject, schema)
48
- data = post("/subjects/#{subject}",
49
- expects: [200, 404],
50
- body: { schema: schema.to_s }.to_json)
51
- data unless data.has_key?("error_code")
52
- end
53
-
54
- # Check if a schema is compatible with the stored version.
55
- # Returns true if compatible, false otherwise
56
- # http://docs.confluent.io/2.0.0/schema-registry/docs/api.html#compatibility
57
- def compatible?(subject, schema, version = 'latest')
58
- data = post("/compatibility/subjects/#{subject}/versions/#{version}",
59
- expects: [200, 404],
60
- body: { schema: schema.to_s }.to_json)
61
- data.fetch('is_compatible', false) unless data.has_key?('error_code')
62
- end
63
-
64
- private
65
-
66
- def get(path, **options)
67
- request(path, method: :get, **options)
68
- end
69
-
70
- def post(path, **options)
71
- request(path, method: :post, **options)
72
- end
73
-
74
- def request(path, **options)
75
- options = { expects: 200 }.merge!(options)
76
- response = @connection.request(path: path, **options)
77
- JSON.parse(response.body)
78
- end
79
- end
6
+ AvroTurf::SchemaRegistry = AvroTurf::ConfluentSchemaRegistry
@@ -0,0 +1,129 @@
1
+ require 'sinatra/base'
2
+
3
+ class FakeConfluentSchemaRegistryServer < Sinatra::Base
4
+ SUBJECTS = Hash.new { Array.new }
5
+ SCHEMAS = []
6
+ CONFIGS = Hash.new
7
+ SUBJECT_NOT_FOUND = { error_code: 40401, message: 'Subject not found' }.to_json.freeze
8
+ VERSION_NOT_FOUND = { error_code: 40402, message: 'Version not found' }.to_json.freeze
9
+ SCHEMA_NOT_FOUND = { error_code: 40403, message: 'Schema not found' }.to_json.freeze
10
+ DEFAULT_GLOBAL_CONFIG = { 'compatibility' => 'BACKWARD'.freeze }.freeze
11
+
12
+ @global_config = DEFAULT_GLOBAL_CONFIG.dup
13
+
14
+ class << self
15
+ attr_reader :global_config
16
+ end
17
+
18
+ helpers do
19
+ def parse_schema
20
+ request.body.rewind
21
+ JSON.parse(request.body.read).fetch("schema").tap do |schema|
22
+ Avro::Schema.parse(schema)
23
+ end
24
+ end
25
+
26
+ def parse_config
27
+ request.body.rewind
28
+ JSON.parse(request.body.read)
29
+ end
30
+
31
+ def global_config
32
+ self.class.global_config
33
+ end
34
+ end
35
+
36
+ post "/subjects/:subject/versions" do
37
+ SCHEMAS << parse_schema
38
+
39
+ schema_id = SCHEMAS.size - 1
40
+ SUBJECTS[params[:subject]] = SUBJECTS[params[:subject]] << schema_id
41
+ { id: schema_id }.to_json
42
+ end
43
+
44
+ get "/schemas/ids/:schema_id" do
45
+ schema = SCHEMAS.at(params[:schema_id].to_i)
46
+ halt(404, SCHEMA_NOT_FOUND) unless schema
47
+ { schema: schema }.to_json
48
+ end
49
+
50
+ get "/subjects" do
51
+ SUBJECTS.keys.to_json
52
+ end
53
+
54
+ get "/subjects/:subject/versions" do
55
+ schema_ids = SUBJECTS[params[:subject]]
56
+ halt(404, SUBJECT_NOT_FOUND) if schema_ids.empty?
57
+ (1..schema_ids.size).to_a.to_json
58
+ end
59
+
60
+ get "/subjects/:subject/versions/:version" do
61
+ schema_ids = SUBJECTS[params[:subject]]
62
+ halt(404, SUBJECT_NOT_FOUND) if schema_ids.empty?
63
+
64
+ schema_id = if params[:version] == 'latest'
65
+ schema_ids.last
66
+ else
67
+ schema_ids.at(Integer(params[:version]) - 1)
68
+ end
69
+ halt(404, VERSION_NOT_FOUND) unless schema_id
70
+
71
+ schema = SCHEMAS.at(schema_id)
72
+
73
+ {
74
+ name: params[:subject],
75
+ version: schema_ids.index(schema_id) + 1,
76
+ schema: schema
77
+ }.to_json
78
+ end
79
+
80
+ post "/subjects/:subject" do
81
+ schema = parse_schema
82
+
83
+ # Note: this does not actually handle the same schema registered under
84
+ # multiple subjects
85
+ schema_id = SCHEMAS.index(schema)
86
+
87
+ halt(404, SCHEMA_NOT_FOUND) unless schema_id
88
+
89
+ {
90
+ subject: params[:subject],
91
+ id: schema_id,
92
+ version: SUBJECTS[params[:subject]].index(schema_id) + 1,
93
+ schema: schema
94
+ }.to_json
95
+ end
96
+
97
+ post "/compatibility/subjects/:subject/versions/:version" do
98
+ # The ruby avro gem does not yet include a compatibility check between schemas.
99
+ # See https://github.com/apache/avro/pull/170
100
+ raise NotImplementedError
101
+ end
102
+
103
+ get "/config" do
104
+ global_config.to_json
105
+ end
106
+
107
+ put "/config" do
108
+ global_config.merge!(parse_config).to_json
109
+ end
110
+
111
+ get "/config/:subject" do
112
+ CONFIGS.fetch(params[:subject], global_config).to_json
113
+ end
114
+
115
+ put "/config/:subject" do
116
+ config = parse_config
117
+ subject = params[:subject]
118
+ CONFIGS.fetch(subject) do
119
+ CONFIGS[subject] = {}
120
+ end.merge!(config).to_json
121
+ end
122
+
123
+ def self.clear
124
+ SUBJECTS.clear
125
+ SCHEMAS.clear
126
+ CONFIGS.clear
127
+ @global_config = DEFAULT_GLOBAL_CONFIG.dup
128
+ end
129
+ end
@@ -1,84 +1,6 @@
1
- require 'sinatra/base'
1
+ require 'avro_turf/test/fake_confluent_schema_registry_server'
2
2
 
3
- class FakeSchemaRegistryServer < Sinatra::Base
4
- SUBJECTS = Hash.new { Array.new }
5
- SCHEMAS = []
6
- SUBJECT_NOT_FOUND = { error_code: 40401, message: 'Subject not found' }.to_json.freeze
7
- VERSION_NOT_FOUND = { error_code: 40402, message: 'Version not found' }.to_json.freeze
8
- SCHEMA_NOT_FOUND = { error_code: 40403, message: 'Schema not found' }.to_json.freeze
3
+ # FakeSchemaRegistryServer is deprecated and will be removed in a future release.
4
+ # Use FakeConfluentSchemaRegistryServer instead.
9
5
 
10
- helpers do
11
- def parse_schema
12
- request.body.rewind
13
- JSON.parse(request.body.read).fetch("schema").tap do |schema|
14
- Avro::Schema.parse(schema)
15
- end
16
- end
17
- end
18
-
19
- post "/subjects/:subject/versions" do
20
- SCHEMAS << parse_schema
21
-
22
- schema_id = SCHEMAS.size - 1
23
- SUBJECTS[params[:subject]] = SUBJECTS[params[:subject]] << schema_id
24
- { id: schema_id }.to_json
25
- end
26
-
27
- get "/schemas/ids/:schema_id" do
28
- schema = SCHEMAS.at(params[:schema_id].to_i)
29
- halt(404, SCHEMA_NOT_FOUND) unless schema
30
- { schema: schema }.to_json
31
- end
32
-
33
- get "/subjects" do
34
- SUBJECTS.keys.to_json
35
- end
36
-
37
- get "/subjects/:subject/versions" do
38
- schema_ids = SUBJECTS[params[:subject]]
39
- halt(404, SUBJECT_NOT_FOUND) if schema_ids.empty?
40
- (1..schema_ids.size).to_a.to_json
41
- end
42
-
43
- get "/subjects/:subject/versions/:version" do
44
- schema_ids = SUBJECTS[params[:subject]]
45
- halt(404, SUBJECT_NOT_FOUND) if schema_ids.empty?
46
-
47
- schema_id = if params[:version] == 'latest'
48
- schema_ids.last
49
- else
50
- schema_ids.at(Integer(params[:version]) - 1)
51
- end
52
- halt(404, VERSION_NOT_FOUND) unless schema_id
53
-
54
- schema = SCHEMAS.at(schema_id)
55
-
56
- {
57
- name: params[:subject],
58
- version: schema_ids.index(schema_id) + 1,
59
- schema: schema
60
- }.to_json
61
- end
62
-
63
- post "/subjects/:subject" do
64
- schema = parse_schema
65
-
66
- # Note: this does not actually handle the same schema registered under
67
- # multiple subjects
68
- schema_id = SCHEMAS.index(schema)
69
-
70
- halt(404, SCHEMA_NOT_FOUND) unless schema_id
71
-
72
- {
73
- subject: params[:subject],
74
- id: schema_id,
75
- version: SUBJECTS[params[:subject]].index(schema_id) + 1,
76
- schema: schema
77
- }.to_json
78
- end
79
-
80
- def self.clear
81
- SUBJECTS.clear
82
- SCHEMAS.clear
83
- end
84
- end
6
+ FakeSchemaRegistryServer = FakeConfluentSchemaRegistryServer
@@ -1,3 +1,3 @@
1
1
  class AvroTurf
2
- VERSION = "0.7.2"
2
+ VERSION = "0.8.0"
3
3
  end
@@ -1,9 +1,9 @@
1
1
  require 'webmock/rspec'
2
- require 'avro_turf/cached_schema_registry'
3
- require 'avro_turf/test/fake_schema_registry_server'
2
+ require 'avro_turf/cached_confluent_schema_registry'
3
+ require 'avro_turf/test/fake_confluent_schema_registry_server'
4
4
 
5
- describe AvroTurf::CachedSchemaRegistry do
6
- let(:upstream) { instance_double(AvroTurf::SchemaRegistry) }
5
+ describe AvroTurf::CachedConfluentSchemaRegistry do
6
+ let(:upstream) { instance_double(AvroTurf::ConfluentSchemaRegistry) }
7
7
  let(:registry) { described_class.new(upstream) }
8
8
  let(:id) { rand(999) }
9
9
  let(:schema) do
@@ -34,8 +34,8 @@ describe AvroTurf::CachedSchemaRegistry do
34
34
  end
35
35
  end
36
36
 
37
- it_behaves_like "a schema registry client" do
38
- let(:upstream) { AvroTurf::SchemaRegistry.new(registry_url, logger: logger) }
37
+ it_behaves_like "a confluent schema registry client" do
38
+ let(:upstream) { AvroTurf::ConfluentSchemaRegistry.new(registry_url, logger: logger) }
39
39
  let(:registry) { described_class.new(upstream) }
40
40
  end
41
41
  end
@@ -0,0 +1,9 @@
1
+ require 'webmock/rspec'
2
+ require 'avro_turf/confluent_schema_registry'
3
+ require 'avro_turf/test/fake_confluent_schema_registry_server'
4
+
5
+ describe AvroTurf::ConfluentSchemaRegistry do
6
+ it_behaves_like "a confluent schema registry client" do
7
+ let(:registry) { described_class.new(registry_url, logger: logger) }
8
+ end
9
+ end
@@ -1,6 +1,6 @@
1
1
  require 'webmock/rspec'
2
2
  require 'avro_turf/messaging'
3
- require 'avro_turf/test/fake_schema_registry_server'
3
+ require 'avro_turf/test/fake_confluent_schema_registry_server'
4
4
 
5
5
  describe AvroTurf::Messaging do
6
6
  let(:registry_url) { "http://registry.example.com" }
@@ -21,8 +21,8 @@ describe AvroTurf::Messaging do
21
21
  end
22
22
 
23
23
  before do
24
- stub_request(:any, /^#{registry_url}/).to_rack(FakeSchemaRegistryServer)
25
- FakeSchemaRegistryServer.clear
24
+ stub_request(:any, /^#{registry_url}/).to_rack(FakeConfluentSchemaRegistryServer)
25
+ FakeConfluentSchemaRegistryServer.clear
26
26
  end
27
27
 
28
28
  before do
@@ -63,7 +63,7 @@ describe AvroTurf::Messaging do
63
63
  it_behaves_like "encoding and decoding"
64
64
 
65
65
  context "with a provided registry" do
66
- let(:registry) { AvroTurf::SchemaRegistry.new(registry_url, logger: logger) }
66
+ let(:registry) { AvroTurf::ConfluentSchemaRegistry.new(registry_url, logger: logger) }
67
67
 
68
68
  let(:avro) do
69
69
  AvroTurf::Messaging.new(
@@ -1,6 +1,6 @@
1
1
  # This shared example expects a registry variable to be defined
2
2
  # with an instance of the registry class being tested.
3
- shared_examples_for "a schema registry client" do
3
+ shared_examples_for "a confluent schema registry client" do
4
4
  let(:logger) { Logger.new(StringIO.new) }
5
5
  let(:registry_url) { "http://registry.example.com" }
6
6
  let(:subject_name) { "some-subject" }
@@ -15,8 +15,8 @@ shared_examples_for "a schema registry client" do
15
15
  end
16
16
 
17
17
  before do
18
- stub_request(:any, /^#{registry_url}/).to_rack(FakeSchemaRegistryServer)
19
- FakeSchemaRegistryServer.clear
18
+ stub_request(:any, /^#{registry_url}/).to_rack(FakeConfluentSchemaRegistryServer)
19
+ FakeConfluentSchemaRegistryServer.clear
20
20
  end
21
21
 
22
22
  describe "#register and #fetch" do
@@ -178,6 +178,67 @@ shared_examples_for "a schema registry client" do
178
178
  end
179
179
  end
180
180
 
181
+ describe "#global_config" do
182
+ let(:expected) do
183
+ { compatibility: 'BACKWARD' }.to_json
184
+ end
185
+
186
+ it "returns the global configuration" do
187
+ expect(registry.global_config).to eq(JSON.parse(expected))
188
+ end
189
+ end
190
+
191
+ describe "#update_global_config" do
192
+ let(:config) do
193
+ { compatibility: 'FORWARD' }
194
+ end
195
+ let(:expected) { config.to_json }
196
+
197
+ it "updates the global configuration and returns it" do
198
+ expect(registry.update_global_config(config)).to eq(JSON.parse(expected))
199
+ expect(registry.global_config).to eq(JSON.parse(expected))
200
+ end
201
+ end
202
+
203
+ describe "#subject_config" do
204
+ let(:expected) do
205
+ { compatibility: 'BACKWARD' }.to_json
206
+ end
207
+
208
+ context "when the subject config is not set" do
209
+ it "returns the global configuration" do
210
+ expect(registry.subject_config(subject_name)).to eq(JSON.parse(expected))
211
+ end
212
+ end
213
+
214
+ context "when the subject config is set" do
215
+ let(:config) do
216
+ { compatibility: 'FULL' }
217
+ end
218
+ let(:expected) { config.to_json }
219
+
220
+ before do
221
+ registry.update_subject_config(subject_name, config)
222
+ end
223
+
224
+ it "returns the subject config" do
225
+ expect(registry.subject_config(subject_name)).to eq(JSON.parse(expected))
226
+ end
227
+ end
228
+ end
229
+
230
+ describe "#update_subject_config" do
231
+ let(:config) do
232
+ { compatibility: 'NONE' }
233
+ end
234
+ let(:expected) { config.to_json }
235
+
236
+ it "updates the subject config and returns it" do
237
+ expect(registry.update_subject_config(subject_name, config)).to eq(JSON.parse(expected))
238
+ expect(registry.subject_config(subject_name)).to eq(JSON.parse(expected))
239
+ end
240
+ end
241
+
181
242
  # Monkey patch an Avro::Schema to simulate the presence of
182
243
  # active_support/core_ext.
183
244
  def break_to_json(avro_schema)
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.7.2
4
+ version: 0.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: 2016-12-16 00:00:00.000000000 Z
11
+ date: 2017-03-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: avro
@@ -151,6 +151,7 @@ extra_rdoc_files: []
151
151
  files:
152
152
  - ".gitignore"
153
153
  - ".rspec"
154
+ - CHANGELOG.md
154
155
  - Gemfile
155
156
  - LICENSE.txt
156
157
  - README.md
@@ -158,7 +159,9 @@ files:
158
159
  - avro_turf.gemspec
159
160
  - circle.yml
160
161
  - lib/avro_turf.rb
162
+ - lib/avro_turf/cached_confluent_schema_registry.rb
161
163
  - lib/avro_turf/cached_schema_registry.rb
164
+ - lib/avro_turf/confluent_schema_registry.rb
162
165
  - lib/avro_turf/core_ext.rb
163
166
  - lib/avro_turf/core_ext/date.rb
164
167
  - lib/avro_turf/core_ext/enumerable.rb
@@ -174,6 +177,7 @@ files:
174
177
  - lib/avro_turf/schema_registry.rb
175
178
  - lib/avro_turf/schema_store.rb
176
179
  - lib/avro_turf/schema_to_avro_patch.rb
180
+ - lib/avro_turf/test/fake_confluent_schema_registry_server.rb
177
181
  - lib/avro_turf/test/fake_schema_registry_server.rb
178
182
  - lib/avro_turf/version.rb
179
183
  - perf/address.avsc
@@ -181,7 +185,8 @@ files:
181
185
  - perf/encoding_speed.rb
182
186
  - perf/person.avsc
183
187
  - spec/avro_turf_spec.rb
184
- - spec/cached_schema_registry_spec.rb
188
+ - spec/cached_confluent_schema_registry_spec.rb
189
+ - spec/confluent_schema_registry_spec.rb
185
190
  - spec/core_ext/date_spec.rb
186
191
  - spec/core_ext/enumerable_spec.rb
187
192
  - spec/core_ext/false_class_spec.rb
@@ -193,16 +198,23 @@ files:
193
198
  - spec/core_ext/time_spec.rb
194
199
  - spec/core_ext/true_class_spec.rb
195
200
  - spec/messaging_spec.rb
196
- - spec/schema_registry_spec.rb
197
201
  - spec/schema_store_spec.rb
198
202
  - spec/schema_to_avro_patch_spec.rb
199
203
  - spec/spec_helper.rb
200
- - spec/support/schema_registry_context.rb
204
+ - spec/support/confluent_schema_registry_context.rb
201
205
  homepage: https://github.com/dasch/avro_turf
202
206
  licenses:
203
207
  - MIT
204
208
  metadata: {}
205
- post_install_message:
209
+ post_install_message: |2
210
+
211
+ avro_turf v0.8.0 deprecates the names AvroTurf::SchemaRegistry,
212
+ AvroTurf::CachedSchemaRegistry, and FakeSchemaRegistryServer.
213
+
214
+ Use AvroTurf::ConfluentSchemaRegistry, AvroTurf::CachedConfluentSchemaRegistry,
215
+ and FakeConfluentSchemaRegistryServer instead.
216
+
217
+ See https://github.com/dasch/avro_turf#deprecation-notice
206
218
  rdoc_options: []
207
219
  require_paths:
208
220
  - lib
@@ -225,7 +237,8 @@ summary: A library that makes it easier to use the Avro serialization format fro
225
237
  Ruby
226
238
  test_files:
227
239
  - spec/avro_turf_spec.rb
228
- - spec/cached_schema_registry_spec.rb
240
+ - spec/cached_confluent_schema_registry_spec.rb
241
+ - spec/confluent_schema_registry_spec.rb
229
242
  - spec/core_ext/date_spec.rb
230
243
  - spec/core_ext/enumerable_spec.rb
231
244
  - spec/core_ext/false_class_spec.rb
@@ -237,9 +250,7 @@ test_files:
237
250
  - spec/core_ext/time_spec.rb
238
251
  - spec/core_ext/true_class_spec.rb
239
252
  - spec/messaging_spec.rb
240
- - spec/schema_registry_spec.rb
241
253
  - spec/schema_store_spec.rb
242
254
  - spec/schema_to_avro_patch_spec.rb
243
255
  - spec/spec_helper.rb
244
- - spec/support/schema_registry_context.rb
245
- has_rdoc:
256
+ - spec/support/confluent_schema_registry_context.rb
@@ -1,9 +0,0 @@
1
- require 'webmock/rspec'
2
- require 'avro_turf/schema_registry'
3
- require 'avro_turf/test/fake_schema_registry_server'
4
-
5
- describe AvroTurf::SchemaRegistry do
6
- it_behaves_like "a schema registry client" do
7
- let(:registry) { described_class.new(registry_url, logger: logger) }
8
- end
9
- end