rdkafka 0.8.1 → 0.11.1

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.
@@ -1,8 +1,9 @@
1
1
  require "spec_helper"
2
+ require "zlib"
2
3
 
3
4
  describe Rdkafka::Producer do
4
- let(:producer) { rdkafka_config.producer }
5
- let(:consumer) { rdkafka_config.consumer }
5
+ let(:producer) { rdkafka_producer_config.producer }
6
+ let(:consumer) { rdkafka_consumer_config.consumer }
6
7
 
7
8
  after do
8
9
  # Registry should always end up being empty
@@ -12,47 +13,92 @@ describe Rdkafka::Producer do
12
13
  end
13
14
 
14
15
  context "delivery callback" do
15
- it "should set the callback" do
16
- expect {
17
- producer.delivery_callback = lambda do |delivery_handle|
18
- puts stats
16
+ context "with a proc/lambda" do
17
+ it "should set the callback" do
18
+ expect {
19
+ producer.delivery_callback = lambda do |delivery_handle|
20
+ puts delivery_handle
21
+ end
22
+ }.not_to raise_error
23
+ expect(producer.delivery_callback).to respond_to :call
24
+ end
25
+
26
+ it "should call the callback when a message is delivered" do
27
+ @callback_called = false
28
+
29
+ producer.delivery_callback = lambda do |report|
30
+ expect(report).not_to be_nil
31
+ expect(report.partition).to eq 1
32
+ expect(report.offset).to be >= 0
33
+ @callback_called = true
19
34
  end
20
- }.not_to raise_error
21
- expect(producer.delivery_callback).to be_a Proc
22
- end
23
35
 
24
- it "should not accept a callback that's not a proc" do
25
- expect {
26
- producer.delivery_callback = 'a string'
27
- }.to raise_error(TypeError)
28
- end
36
+ # Produce a message
37
+ handle = producer.produce(
38
+ topic: "produce_test_topic",
39
+ payload: "payload",
40
+ key: "key"
41
+ )
29
42
 
30
- it "should call the callback when a message is delivered" do
31
- @callback_called = false
43
+ # Wait for it to be delivered
44
+ handle.wait(max_wait_timeout: 15)
32
45
 
46
+ # Join the producer thread.
47
+ producer.close
33
48
 
34
- producer.delivery_callback = lambda do |report|
35
- expect(report).not_to be_nil
36
- expect(report.partition).to eq 1
37
- expect(report.offset).to be >= 0
38
- @callback_called = true
49
+ # Callback should have been called
50
+ expect(@callback_called).to be true
39
51
  end
52
+ end
40
53
 
41
- # Produce a message
42
- handle = producer.produce(
43
- topic: "produce_test_topic",
44
- payload: "payload",
45
- key: "key"
46
- )
54
+ context "with a callable object" do
55
+ it "should set the callback" do
56
+ callback = Class.new do
57
+ def call(stats); end
58
+ end
59
+ expect {
60
+ producer.delivery_callback = callback.new
61
+ }.not_to raise_error
62
+ expect(producer.delivery_callback).to respond_to :call
63
+ end
47
64
 
48
- # Wait for it to be delivered
49
- handle.wait(max_wait_timeout: 15)
65
+ it "should call the callback when a message is delivered" do
66
+ called_report = []
67
+ callback = Class.new do
68
+ def initialize(called_report)
69
+ @called_report = called_report
70
+ end
50
71
 
51
- # Join the producer thread.
52
- producer.close
72
+ def call(report)
73
+ @called_report << report
74
+ end
75
+ end
76
+ producer.delivery_callback = callback.new(called_report)
77
+
78
+ # Produce a message
79
+ handle = producer.produce(
80
+ topic: "produce_test_topic",
81
+ payload: "payload",
82
+ key: "key"
83
+ )
84
+
85
+ # Wait for it to be delivered
86
+ handle.wait(max_wait_timeout: 15)
87
+
88
+ # Join the producer thread.
89
+ producer.close
53
90
 
54
- # Callback should have been called
55
- expect(@callback_called).to be true
91
+ # Callback should have been called
92
+ expect(called_report.first).not_to be_nil
93
+ expect(called_report.first.partition).to eq 1
94
+ expect(called_report.first.offset).to be >= 0
95
+ end
96
+ end
97
+
98
+ it "should not accept a callback that's not callable" do
99
+ expect {
100
+ producer.delivery_callback = 'a string'
101
+ }.to raise_error(TypeError)
56
102
  end
57
103
  end
58
104
 
@@ -343,7 +389,7 @@ describe Rdkafka::Producer do
343
389
  reader.close
344
390
 
345
391
  # Avoids sharing the socket between processes.
346
- producer = rdkafka_config.producer
392
+ producer = rdkafka_producer_config.producer
347
393
 
348
394
  handle = producer.produce(
349
395
  topic: "produce_test_topic",
data/spec/spec_helper.rb CHANGED
@@ -8,27 +8,57 @@ end
8
8
  require "pry"
9
9
  require "rspec"
10
10
  require "rdkafka"
11
+ require "timeout"
11
12
 
12
- def rdkafka_config(config_overrides={})
13
- config = {
13
+ def rdkafka_base_config
14
+ {
14
15
  :"api.version.request" => false,
15
16
  :"broker.version.fallback" => "1.0",
16
17
  :"bootstrap.servers" => "localhost:9092",
17
- :"group.id" => "ruby-test-#{Random.new.rand(0..1_000_000)}",
18
- :"auto.offset.reset" => "earliest",
19
- :"enable.partition.eof" => false
20
18
  }
19
+ end
20
+
21
+ def rdkafka_config(config_overrides={})
22
+ # Generate the base config
23
+ config = rdkafka_base_config
24
+ # Merge overrides
25
+ config.merge!(config_overrides)
26
+ # Return it
27
+ Rdkafka::Config.new(config)
28
+ end
29
+
30
+ def rdkafka_consumer_config(config_overrides={})
31
+ # Generate the base config
32
+ config = rdkafka_base_config
33
+ # Add consumer specific fields to it
34
+ config[:"auto.offset.reset"] = "earliest"
35
+ config[:"enable.partition.eof"] = false
36
+ config[:"group.id"] = "ruby-test-#{Random.new.rand(0..1_000_000)}"
37
+ # Enable debug mode if required
38
+ if ENV["DEBUG_CONSUMER"]
39
+ config[:debug] = "cgrp,topic,fetch"
40
+ end
41
+ # Merge overrides
42
+ config.merge!(config_overrides)
43
+ # Return it
44
+ Rdkafka::Config.new(config)
45
+ end
46
+
47
+ def rdkafka_producer_config(config_overrides={})
48
+ # Generate the base config
49
+ config = rdkafka_base_config
50
+ # Enable debug mode if required
21
51
  if ENV["DEBUG_PRODUCER"]
22
52
  config[:debug] = "broker,topic,msg"
23
- elsif ENV["DEBUG_CONSUMER"]
24
- config[:debug] = "cgrp,topic,fetch"
25
53
  end
54
+ # Merge overrides
26
55
  config.merge!(config_overrides)
56
+ # Return it
27
57
  Rdkafka::Config.new(config)
28
58
  end
29
59
 
30
60
  def new_native_client
31
- config = rdkafka_config
61
+ config = rdkafka_consumer_config
32
62
  config.send(:native_kafka, config.send(:native_config), :rd_kafka_producer)
33
63
  end
34
64
 
@@ -42,7 +72,7 @@ end
42
72
 
43
73
  def wait_for_message(topic:, delivery_report:, timeout_in_seconds: 30, consumer: nil)
44
74
  new_consumer = !!consumer
45
- consumer ||= rdkafka_config.consumer
75
+ consumer ||= rdkafka_consumer_config.consumer
46
76
  consumer.subscribe(topic)
47
77
  timeout = Time.now.to_i + timeout_in_seconds
48
78
  loop do
@@ -75,6 +105,9 @@ def wait_for_unassignment(consumer)
75
105
  end
76
106
 
77
107
  RSpec.configure do |config|
108
+ config.filter_run focus: true
109
+ config.run_all_when_everything_filtered = true
110
+
78
111
  config.before(:suite) do
79
112
  admin = rdkafka_config.admin
80
113
  {
@@ -95,4 +128,12 @@ RSpec.configure do |config|
95
128
  end
96
129
  admin.close
97
130
  end
131
+
132
+ config.around(:each) do |example|
133
+ # Timeout specs after a minute. If they take longer
134
+ # they are probably stuck
135
+ Timeout::timeout(60) do
136
+ example.run
137
+ end
138
+ end
98
139
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rdkafka
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.1
4
+ version: 0.11.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thijs Cadier
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-12-07 00:00:00.000000000 Z
11
+ date: 2021-11-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi
@@ -16,56 +16,56 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.9'
19
+ version: '1.15'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.9'
26
+ version: '1.15'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: mini_portile2
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '2.1'
33
+ version: '2.6'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '2.1'
40
+ version: '2.6'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - ">"
46
46
  - !ruby/object:Gem::Version
47
- version: '12.3'
47
+ version: '12'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - ">"
53
53
  - !ruby/object:Gem::Version
54
- version: '12.3'
54
+ version: '12'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: pry
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: '0.10'
61
+ version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: '0.10'
68
+ version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rspec
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -84,46 +84,78 @@ dependencies:
84
84
  name: rake
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - "~>"
87
+ - - ">="
88
88
  - !ruby/object:Gem::Version
89
- version: '12.0'
89
+ version: '0'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - "~>"
94
+ - - ">="
95
95
  - !ruby/object:Gem::Version
96
- version: '12.0'
96
+ version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: simplecov
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - "~>"
101
+ - - ">="
102
102
  - !ruby/object:Gem::Version
103
- version: '0.15'
103
+ version: '0'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - "~>"
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: guard
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: guard-rspec
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
109
137
  - !ruby/object:Gem::Version
110
- version: '0.15'
138
+ version: '0'
111
139
  description: Modern Kafka client library for Ruby based on librdkafka
112
140
  email:
113
141
  - thijs@appsignal.com
114
- executables: []
142
+ executables:
143
+ - console
115
144
  extensions:
116
145
  - ext/Rakefile
117
146
  extra_rdoc_files: []
118
147
  files:
119
148
  - ".gitignore"
149
+ - ".rspec"
120
150
  - ".semaphore/semaphore.yml"
121
151
  - ".yardopts"
122
152
  - CHANGELOG.md
123
153
  - Gemfile
154
+ - Guardfile
124
155
  - LICENSE
125
156
  - README.md
126
157
  - Rakefile
158
+ - bin/console
127
159
  - docker-compose.yml
128
160
  - ext/README.md
129
161
  - ext/Rakefile
@@ -172,7 +204,7 @@ homepage: https://github.com/thijsc/rdkafka-ruby
172
204
  licenses:
173
205
  - MIT
174
206
  metadata: {}
175
- post_install_message:
207
+ post_install_message:
176
208
  rdoc_options: []
177
209
  require_paths:
178
210
  - lib
@@ -180,15 +212,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
180
212
  requirements:
181
213
  - - ">="
182
214
  - !ruby/object:Gem::Version
183
- version: '2.4'
215
+ version: '2.6'
184
216
  required_rubygems_version: !ruby/object:Gem::Requirement
185
217
  requirements:
186
218
  - - ">="
187
219
  - !ruby/object:Gem::Version
188
220
  version: '0'
189
221
  requirements: []
190
- rubygems_version: 3.1.2
191
- signing_key:
222
+ rubygems_version: 3.1.4
223
+ signing_key:
192
224
  specification_version: 4
193
225
  summary: The rdkafka gem is a modern Kafka client library for Ruby based on librdkafka.
194
226
  It wraps the production-ready C client using the ffi gem and targets Kafka 1.0+