rdkafka 0.21.1.alpha2 → 0.22.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.
@@ -53,7 +53,7 @@ describe Rdkafka::Producer do
53
53
  let(:producer) do
54
54
  rdkafka_producer_config(
55
55
  'message.timeout.ms': 1_000_000,
56
- :"bootstrap.servers" => "localhost:9094",
56
+ :"bootstrap.servers" => "127.0.0.1:9094",
57
57
  ).producer
58
58
  end
59
59
 
@@ -340,7 +340,7 @@ describe Rdkafka::Producer do
340
340
  )
341
341
  end
342
342
 
343
- expect(messages[0].partition).to eq 0
343
+ expect(messages[0].partition).to be >= 0
344
344
  expect(messages[0].key).to eq 'a'
345
345
  end
346
346
 
@@ -364,6 +364,48 @@ describe Rdkafka::Producer do
364
364
  expect(message.key).to eq "key utf8"
365
365
  end
366
366
 
367
+ it "should produce a message to a non-existing topic with key and partition key" do
368
+ new_topic = "it-#{SecureRandom.uuid}"
369
+
370
+ handle = producer.produce(
371
+ # Needs to be a new topic each time
372
+ topic: new_topic,
373
+ payload: "payload",
374
+ key: "key",
375
+ partition_key: "partition_key",
376
+ label: "label"
377
+ )
378
+
379
+ # Should be pending at first
380
+ expect(handle.pending?).to be true
381
+ expect(handle.label).to eq "label"
382
+
383
+ # Check delivery handle and report
384
+ report = handle.wait(max_wait_timeout: 5)
385
+ expect(handle.pending?).to be false
386
+ expect(report).not_to be_nil
387
+ expect(report.partition).to eq 0
388
+ expect(report.offset).to be >= 0
389
+ expect(report.label).to eq "label"
390
+
391
+ # Flush and close producer
392
+ producer.flush
393
+ producer.close
394
+
395
+ # Consume message and verify its content
396
+ message = wait_for_message(
397
+ topic: new_topic,
398
+ delivery_report: report,
399
+ consumer: consumer
400
+ )
401
+ expect(message.partition).to eq 0
402
+ expect(message.payload).to eq "payload"
403
+ expect(message.key).to eq "key"
404
+ # Since api.version.request is on by default we will get
405
+ # the message creation timestamp if it's not set.
406
+ expect(message.timestamp).to be_within(10).of(Time.now)
407
+ end
408
+
367
409
  context "timestamp" do
368
410
  it "should raise a type error if not nil, integer or time" do
369
411
  expect {
@@ -623,7 +665,7 @@ describe Rdkafka::Producer do
623
665
  context "when not being able to deliver the message" do
624
666
  let(:producer) do
625
667
  rdkafka_producer_config(
626
- "bootstrap.servers": "localhost:9093",
668
+ "bootstrap.servers": "127.0.0.1:9093",
627
669
  "message.timeout.ms": 100
628
670
  ).producer
629
671
  end
@@ -637,6 +679,25 @@ describe Rdkafka::Producer do
637
679
  end
638
680
  end
639
681
 
682
+ context "when topic does not exist and allow.auto.create.topics is false" do
683
+ let(:producer) do
684
+ rdkafka_producer_config(
685
+ "bootstrap.servers": "127.0.0.1:9092",
686
+ "message.timeout.ms": 100,
687
+ "allow.auto.create.topics": false
688
+ ).producer
689
+ end
690
+
691
+ it "should contain the error in the response when not deliverable" do
692
+ handler = producer.produce(topic: "it-#{SecureRandom.uuid}", payload: nil, label: 'na')
693
+ # Wait for the async callbacks and delivery registry to update
694
+ sleep(2)
695
+ expect(handler.create_result.error).to be_a(Rdkafka::RdkafkaError)
696
+ expect(handler.create_result.error.code).to eq(:msg_timed_out)
697
+ expect(handler.create_result.label).to eq('na')
698
+ end
699
+ end
700
+
640
701
  describe '#partition_count' do
641
702
  it { expect(producer.partition_count('consume_test_topic')).to eq(3) }
642
703
 
@@ -693,7 +754,7 @@ describe Rdkafka::Producer do
693
754
  context 'when it cannot flush due to a timeout' do
694
755
  let(:producer) do
695
756
  rdkafka_producer_config(
696
- "bootstrap.servers": "localhost:9093",
757
+ "bootstrap.servers": "127.0.0.1:9093",
697
758
  "message.timeout.ms": 2_000
698
759
  ).producer
699
760
  end
@@ -740,7 +801,7 @@ describe Rdkafka::Producer do
740
801
  context 'when there are outgoing things in the queue' do
741
802
  let(:producer) do
742
803
  rdkafka_producer_config(
743
- "bootstrap.servers": "localhost:9093",
804
+ "bootstrap.servers": "127.0.0.1:9093",
744
805
  "message.timeout.ms": 2_000
745
806
  ).producer
746
807
  end
@@ -859,7 +920,6 @@ describe Rdkafka::Producer do
859
920
  end
860
921
  end
861
922
 
862
-
863
923
  describe 'with active statistics callback' do
864
924
  let(:producer) do
865
925
  rdkafka_producer_config('statistics.interval.ms': 1_000).producer
@@ -988,4 +1048,298 @@ describe Rdkafka::Producer do
988
1048
  end
989
1049
  end
990
1050
  end
1051
+
1052
+ let(:producer) { rdkafka_producer_config.producer }
1053
+ let(:all_partitioners) { %w(random consistent consistent_random murmur2 murmur2_random fnv1a fnv1a_random) }
1054
+
1055
+ describe "partitioner behavior through producer API" do
1056
+ context "testing all partitioners with same key" do
1057
+ it "should not return partition 0 for all partitioners" do
1058
+ test_key = "test-key-123"
1059
+ results = {}
1060
+
1061
+ all_partitioners.each do |partitioner|
1062
+ handle = producer.produce(
1063
+ topic: "partitioner_test_topic",
1064
+ payload: "test payload",
1065
+ partition_key: test_key,
1066
+ partitioner: partitioner
1067
+ )
1068
+
1069
+ report = handle.wait(max_wait_timeout: 5)
1070
+ results[partitioner] = report.partition
1071
+ end
1072
+
1073
+ # Should not all be the same partition (especially not all 0)
1074
+ unique_partitions = results.values.uniq
1075
+ expect(unique_partitions.size).to be > 1
1076
+ end
1077
+ end
1078
+
1079
+ context "empty string partition key" do
1080
+ it "should produce message with empty partition key without crashing and go to partition 0 for all partitioners" do
1081
+ all_partitioners.each do |partitioner|
1082
+ handle = producer.produce(
1083
+ topic: "partitioner_test_topic",
1084
+ payload: "test payload",
1085
+ key: "test-key",
1086
+ partition_key: "",
1087
+ partitioner: partitioner
1088
+ )
1089
+
1090
+ report = handle.wait(max_wait_timeout: 5)
1091
+ expect(report.partition).to be >= 0
1092
+ end
1093
+ end
1094
+ end
1095
+
1096
+ context "nil partition key" do
1097
+ it "should handle nil partition key gracefully" do
1098
+ handle = producer.produce(
1099
+ topic: "partitioner_test_topic",
1100
+ payload: "test payload",
1101
+ key: "test-key",
1102
+ partition_key: nil
1103
+ )
1104
+
1105
+ report = handle.wait(max_wait_timeout: 5)
1106
+ expect(report.partition).to be >= 0
1107
+ expect(report.partition).to be < producer.partition_count("partitioner_test_topic")
1108
+ end
1109
+ end
1110
+
1111
+ context "various key types and lengths with different partitioners" do
1112
+ it "should handle very short keys with all partitioners" do
1113
+ all_partitioners.each do |partitioner|
1114
+ handle = producer.produce(
1115
+ topic: "partitioner_test_topic",
1116
+ payload: "test payload",
1117
+ partition_key: "a",
1118
+ partitioner: partitioner
1119
+ )
1120
+
1121
+ report = handle.wait(max_wait_timeout: 5)
1122
+ expect(report.partition).to be >= 0
1123
+ expect(report.partition).to be < producer.partition_count("partitioner_test_topic")
1124
+ end
1125
+ end
1126
+
1127
+ it "should handle very long keys with all partitioners" do
1128
+ long_key = "a" * 1000
1129
+
1130
+ all_partitioners.each do |partitioner|
1131
+ handle = producer.produce(
1132
+ topic: "partitioner_test_topic",
1133
+ payload: "test payload",
1134
+ partition_key: long_key,
1135
+ partitioner: partitioner
1136
+ )
1137
+
1138
+ report = handle.wait(max_wait_timeout: 5)
1139
+ expect(report.partition).to be >= 0
1140
+ expect(report.partition).to be < producer.partition_count("partitioner_test_topic")
1141
+ end
1142
+ end
1143
+
1144
+ it "should handle unicode keys with all partitioners" do
1145
+ unicode_key = "测试键值🚀"
1146
+
1147
+ all_partitioners.each do |partitioner|
1148
+ handle = producer.produce(
1149
+ topic: "partitioner_test_topic",
1150
+ payload: "test payload",
1151
+ partition_key: unicode_key,
1152
+ partitioner: partitioner
1153
+ )
1154
+
1155
+ report = handle.wait(max_wait_timeout: 5)
1156
+ expect(report.partition).to be >= 0
1157
+ expect(report.partition).to be < producer.partition_count("partitioner_test_topic")
1158
+ end
1159
+ end
1160
+ end
1161
+
1162
+ context "consistency testing for deterministic partitioners" do
1163
+ %w(consistent murmur2 fnv1a).each do |partitioner|
1164
+ it "should consistently route same partition key to same partition with #{partitioner}" do
1165
+ partition_key = "consistent-test-key"
1166
+
1167
+ # Produce multiple messages with same partition key
1168
+ reports = 5.times.map do
1169
+ handle = producer.produce(
1170
+ topic: "partitioner_test_topic",
1171
+ payload: "test payload #{Time.now.to_f}",
1172
+ partition_key: partition_key,
1173
+ partitioner: partitioner
1174
+ )
1175
+ handle.wait(max_wait_timeout: 5)
1176
+ end
1177
+
1178
+ # All should go to same partition
1179
+ partitions = reports.map(&:partition).uniq
1180
+ expect(partitions.size).to eq(1)
1181
+ end
1182
+ end
1183
+ end
1184
+
1185
+ context "randomness testing for random partitioners" do
1186
+ %w(random consistent_random murmur2_random fnv1a_random).each do |partitioner|
1187
+ it "should potentially distribute across partitions with #{partitioner}" do
1188
+ # Note: random partitioners might still return same value by chance
1189
+ partition_key = "random-test-key"
1190
+
1191
+ reports = 10.times.map do
1192
+ handle = producer.produce(
1193
+ topic: "partitioner_test_topic",
1194
+ payload: "test payload #{Time.now.to_f}",
1195
+ partition_key: partition_key,
1196
+ partitioner: partitioner
1197
+ )
1198
+ handle.wait(max_wait_timeout: 5)
1199
+ end
1200
+
1201
+ partitions = reports.map(&:partition)
1202
+
1203
+ # Just ensure they're valid partitions
1204
+ partitions.each do |partition|
1205
+ expect(partition).to be >= 0
1206
+ expect(partition).to be < producer.partition_count("partitioner_test_topic")
1207
+ end
1208
+ end
1209
+ end
1210
+ end
1211
+
1212
+ context "comparing different partitioners with same key" do
1213
+ it "should route different partition keys to potentially different partitions" do
1214
+ keys = ["key1", "key2", "key3", "key4", "key5"]
1215
+
1216
+ all_partitioners.each do |partitioner|
1217
+ reports = keys.map do |key|
1218
+ handle = producer.produce(
1219
+ topic: "partitioner_test_topic",
1220
+ payload: "test payload",
1221
+ partition_key: key,
1222
+ partitioner: partitioner
1223
+ )
1224
+ handle.wait(max_wait_timeout: 5)
1225
+ end
1226
+
1227
+ partitions = reports.map(&:partition).uniq
1228
+
1229
+ # Should distribute across multiple partitions for most partitioners
1230
+ # (though some might hash all keys to same partition by chance)
1231
+ expect(partitions.all? { |p| p >= 0 && p < producer.partition_count("partitioner_test_topic") }).to be true
1232
+ end
1233
+ end
1234
+ end
1235
+
1236
+ context "partition key vs regular key behavior" do
1237
+ it "should use partition key for partitioning when both key and partition_key are provided" do
1238
+ # Use keys that would hash to different partitions
1239
+ regular_key = "regular-key-123"
1240
+ partition_key = "partition-key-456"
1241
+
1242
+ # Message with both keys
1243
+ handle1 = producer.produce(
1244
+ topic: "partitioner_test_topic",
1245
+ payload: "test payload 1",
1246
+ key: regular_key,
1247
+ partition_key: partition_key
1248
+ )
1249
+
1250
+ # Message with only partition key (should go to same partition)
1251
+ handle2 = producer.produce(
1252
+ topic: "partitioner_test_topic",
1253
+ payload: "test payload 2",
1254
+ partition_key: partition_key
1255
+ )
1256
+
1257
+ # Message with only regular key (should go to different partition)
1258
+ handle3 = producer.produce(
1259
+ topic: "partitioner_test_topic",
1260
+ payload: "test payload 3",
1261
+ key: regular_key
1262
+ )
1263
+
1264
+ report1 = handle1.wait(max_wait_timeout: 5)
1265
+ report2 = handle2.wait(max_wait_timeout: 5)
1266
+ report3 = handle3.wait(max_wait_timeout: 5)
1267
+
1268
+ # Messages 1 and 2 should go to same partition (both use partition_key)
1269
+ expect(report1.partition).to eq(report2.partition)
1270
+
1271
+ # Message 3 should potentially go to different partition (uses regular key)
1272
+ expect(report3.partition).not_to eq(report1.partition)
1273
+ end
1274
+ end
1275
+
1276
+ context "edge case combinations with different partitioners" do
1277
+ it "should handle nil partition key with all partitioners" do
1278
+ all_partitioners.each do |partitioner|
1279
+ handle = producer.produce(
1280
+ topic: "partitioner_test_topic",
1281
+ payload: "test payload",
1282
+ key: "test-key",
1283
+ partition_key: nil,
1284
+ partitioner: partitioner
1285
+ )
1286
+
1287
+ report = handle.wait(max_wait_timeout: 5)
1288
+ expect(report.partition).to be >= 0
1289
+ expect(report.partition).to be < producer.partition_count("partitioner_test_topic")
1290
+ end
1291
+ end
1292
+
1293
+ it "should handle whitespace-only partition key with all partitioners" do
1294
+ all_partitioners.each do |partitioner|
1295
+ handle = producer.produce(
1296
+ topic: "partitioner_test_topic",
1297
+ payload: "test payload",
1298
+ partition_key: " ",
1299
+ partitioner: partitioner
1300
+ )
1301
+
1302
+ report = handle.wait(max_wait_timeout: 5)
1303
+ expect(report.partition).to be >= 0
1304
+ expect(report.partition).to be < producer.partition_count("partitioner_test_topic")
1305
+ end
1306
+ end
1307
+
1308
+ it "should handle newline characters in partition key with all partitioners" do
1309
+ all_partitioners.each do |partitioner|
1310
+ handle = producer.produce(
1311
+ topic: "partitioner_test_topic",
1312
+ payload: "test payload",
1313
+ partition_key: "key\nwith\nnewlines",
1314
+ partitioner: partitioner
1315
+ )
1316
+
1317
+ report = handle.wait(max_wait_timeout: 5)
1318
+ expect(report.partition).to be >= 0
1319
+ expect(report.partition).to be < producer.partition_count("partitioner_test_topic")
1320
+ end
1321
+ end
1322
+ end
1323
+
1324
+ context "debugging partitioner issues" do
1325
+ it "should show if all partitioners return 0 (indicating a problem)" do
1326
+ test_key = "debug-test-key"
1327
+ zero_count = 0
1328
+
1329
+ all_partitioners.each do |partitioner|
1330
+ handle = producer.produce(
1331
+ topic: "partitioner_test_topic",
1332
+ payload: "debug payload",
1333
+ partition_key: test_key,
1334
+ partitioner: partitioner
1335
+ )
1336
+
1337
+ report = handle.wait(max_wait_timeout: 5)
1338
+ zero_count += 1 if report.partition == 0
1339
+ end
1340
+
1341
+ expect(zero_count).to be < all_partitioners.size
1342
+ end
1343
+ end
1344
+ end
991
1345
  end
data/spec/spec_helper.rb CHANGED
@@ -17,7 +17,7 @@ def rdkafka_base_config
17
17
  {
18
18
  :"api.version.request" => false,
19
19
  :"broker.version.fallback" => "1.0",
20
- :"bootstrap.servers" => "localhost:9092",
20
+ :"bootstrap.servers" => "127.0.0.1:9092",
21
21
  # Display statistics and refresh often just to cover those in specs
22
22
  :'statistics.interval.ms' => 1_000,
23
23
  :'topic.metadata.refresh.interval.ms' => 1_000
@@ -78,18 +78,32 @@ end
78
78
 
79
79
  def wait_for_message(topic:, delivery_report:, timeout_in_seconds: 30, consumer: nil)
80
80
  new_consumer = consumer.nil?
81
- consumer ||= rdkafka_consumer_config.consumer
81
+ consumer ||= rdkafka_consumer_config('allow.auto.create.topics': true).consumer
82
82
  consumer.subscribe(topic)
83
83
  timeout = Time.now.to_i + timeout_in_seconds
84
+ retry_count = 0
85
+ max_retries = 10
86
+
84
87
  loop do
85
88
  if timeout <= Time.now.to_i
86
89
  raise "Timeout of #{timeout_in_seconds} seconds reached in wait_for_message"
87
90
  end
88
- message = consumer.poll(100)
89
- if message &&
90
- message.partition == delivery_report.partition &&
91
- message.offset == delivery_report.offset
92
- return message
91
+
92
+ begin
93
+ message = consumer.poll(100)
94
+ if message &&
95
+ message.partition == delivery_report.partition &&
96
+ message.offset == delivery_report.offset
97
+ return message
98
+ end
99
+ rescue Rdkafka::RdkafkaError => e
100
+ if e.code == :unknown_topic_or_part && retry_count < max_retries
101
+ retry_count += 1
102
+ sleep(0.1) # Small delay before retry
103
+ next
104
+ else
105
+ raise
106
+ end
93
107
  end
94
108
  end
95
109
  ensure
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rdkafka
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.21.1.alpha2
4
+ version: 0.22.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thijs Cadier
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.15'
27
+ - !ruby/object:Gem::Dependency
28
+ name: logger
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: mini_portile2
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -53,7 +67,7 @@ dependencies:
53
67
  - !ruby/object:Gem::Version
54
68
  version: '12'
55
69
  - !ruby/object:Gem::Dependency
56
- name: pry
70
+ name: ostruct
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
73
  - - ">="
@@ -67,21 +81,7 @@ dependencies:
67
81
  - !ruby/object:Gem::Version
68
82
  version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
- name: rspec
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: '3.5'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: '3.5'
83
- - !ruby/object:Gem::Dependency
84
- name: rake
84
+ name: pry
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - ">="
@@ -95,21 +95,21 @@ dependencies:
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
- name: simplecov
98
+ name: rspec
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - ">="
101
+ - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '0'
103
+ version: '3.5'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - ">="
108
+ - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '0'
110
+ version: '3.5'
111
111
  - !ruby/object:Gem::Dependency
112
- name: guard
112
+ name: rake
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - ">="
@@ -123,7 +123,7 @@ dependencies:
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
125
  - !ruby/object:Gem::Dependency
126
- name: guard-rspec
126
+ name: simplecov
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
129
  - - ">="
@@ -146,8 +146,13 @@ extra_rdoc_files: []
146
146
  files:
147
147
  - ".github/CODEOWNERS"
148
148
  - ".github/FUNDING.yml"
149
- - ".github/workflows/ci.yml"
150
- - ".github/workflows/push.yml"
149
+ - ".github/workflows/ci_linux_x86_64_gnu.yml"
150
+ - ".github/workflows/ci_linux_x86_64_musl.yml"
151
+ - ".github/workflows/ci_macos_arm64.yml"
152
+ - ".github/workflows/push_linux_x86_64_gnu.yml"
153
+ - ".github/workflows/push_linux_x86_64_musl.yml"
154
+ - ".github/workflows/push_macos_arm64.yml"
155
+ - ".github/workflows/push_ruby.yml"
151
156
  - ".github/workflows/verify-action-pins.yml"
152
157
  - ".gitignore"
153
158
  - ".rspec"
@@ -156,7 +161,6 @@ files:
156
161
  - ".yardopts"
157
162
  - CHANGELOG.md
158
163
  - Gemfile
159
- - Guardfile
160
164
  - MIT-LICENSE
161
165
  - README.md
162
166
  - Rakefile
@@ -165,6 +169,10 @@ files:
165
169
  - docker-compose.yml
166
170
  - ext/README.md
167
171
  - ext/Rakefile
172
+ - ext/build_common.sh
173
+ - ext/build_linux_x86_64_gnu.sh
174
+ - ext/build_linux_x86_64_musl.sh
175
+ - ext/build_macos_arm64.sh
168
176
  - lib/rdkafka.rb
169
177
  - lib/rdkafka/abstract_handle.rb
170
178
  - lib/rdkafka/admin.rb
@@ -234,7 +242,7 @@ files:
234
242
  - spec/rdkafka/native_kafka_spec.rb
235
243
  - spec/rdkafka/producer/delivery_handle_spec.rb
236
244
  - spec/rdkafka/producer/delivery_report_spec.rb
237
- - spec/rdkafka/producer/partitions_count_spec.rb
245
+ - spec/rdkafka/producer/partitions_count_cache_spec.rb
238
246
  - spec/rdkafka/producer_spec.rb
239
247
  - spec/spec_helper.rb
240
248
  licenses:
@@ -261,37 +269,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
261
269
  - !ruby/object:Gem::Version
262
270
  version: '0'
263
271
  requirements: []
264
- rubygems_version: 3.6.7
272
+ rubygems_version: 3.6.9
265
273
  specification_version: 4
266
274
  summary: The rdkafka gem is a modern Kafka client library for Ruby based on librdkafka.
267
275
  It wraps the production-ready C client using the ffi gem and targets Kafka 1.0+
268
276
  and Ruby 2.7+.
269
- test_files:
270
- - spec/rdkafka/abstract_handle_spec.rb
271
- - spec/rdkafka/admin/create_acl_handle_spec.rb
272
- - spec/rdkafka/admin/create_acl_report_spec.rb
273
- - spec/rdkafka/admin/create_topic_handle_spec.rb
274
- - spec/rdkafka/admin/create_topic_report_spec.rb
275
- - spec/rdkafka/admin/delete_acl_handle_spec.rb
276
- - spec/rdkafka/admin/delete_acl_report_spec.rb
277
- - spec/rdkafka/admin/delete_topic_handle_spec.rb
278
- - spec/rdkafka/admin/delete_topic_report_spec.rb
279
- - spec/rdkafka/admin/describe_acl_handle_spec.rb
280
- - spec/rdkafka/admin/describe_acl_report_spec.rb
281
- - spec/rdkafka/admin_spec.rb
282
- - spec/rdkafka/bindings_spec.rb
283
- - spec/rdkafka/callbacks_spec.rb
284
- - spec/rdkafka/config_spec.rb
285
- - spec/rdkafka/consumer/headers_spec.rb
286
- - spec/rdkafka/consumer/message_spec.rb
287
- - spec/rdkafka/consumer/partition_spec.rb
288
- - spec/rdkafka/consumer/topic_partition_list_spec.rb
289
- - spec/rdkafka/consumer_spec.rb
290
- - spec/rdkafka/error_spec.rb
291
- - spec/rdkafka/metadata_spec.rb
292
- - spec/rdkafka/native_kafka_spec.rb
293
- - spec/rdkafka/producer/delivery_handle_spec.rb
294
- - spec/rdkafka/producer/delivery_report_spec.rb
295
- - spec/rdkafka/producer/partitions_count_spec.rb
296
- - spec/rdkafka/producer_spec.rb
297
- - spec/spec_helper.rb
277
+ test_files: []