bps-kafka 0.0.1 → 0.1.3

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: 5c35677b45d9df97c7ab28ef3ce4e910d2edcd6def70caa235923b48ab9cd057
4
- data.tar.gz: 5d4ee5dce8765945dd11a373e4d461e1c5aaf08ee32e77f7e40c64954d934f2e
3
+ metadata.gz: b5d05abc6c4a93507504408f2896d0b58bfd0e0a31b8cc1158880cd10c0f9f4d
4
+ data.tar.gz: dedbc0320b57dab92bdc9496dce28e8bbf0f00d49783fb63b6970adf49ca411e
5
5
  SHA512:
6
- metadata.gz: be7fcda9c77f2f3bb4d29f49bb29ecce4362f0bd41405e6567b93f9ce4c81019e522d3d7bfecb81d52e67d468bbc8e807c562d35cac8a05f1cf01d03d0a7eb61
7
- data.tar.gz: af85befa5ff134a58df21d247b648b72d2c81206ffe1613c92ae8270d43bcb3ba3d12e9adcd31f3832ff0c2966d04e2ae377f93d5a3c8ff348a360e70f0021a5
6
+ metadata.gz: 5aefa008139667df54d170f7f7ddbce4084136885dae21565f2734a71ce4016d3d633964076b9c8b4bcf44a24c0bcc0ad260fb5925eb334599018c7d4a3817b5
7
+ data.tar.gz: 1bc340118cd5b21d996f78f0705f8acd60f8d13a75c1e0576a60bc99f923015d0834a26932efa19a2b05a0f6f631be33395c62f89091ad6515ef0100ad9886e8
@@ -6,13 +6,11 @@ require 'bps/publisher/kafka_async'
6
6
  module BPS
7
7
  module Publisher
8
8
  register('kafka+sync') do |url, **opts|
9
- addrs = CGI.unescape(url.host).split(',')
10
- Kafka.new(addrs, **Kafka.coercer.coerce(opts))
9
+ Kafka.new(url, **Kafka.coercer.coerce(opts))
11
10
  end
12
11
 
13
12
  register('kafka') do |url, **opts|
14
- addrs = CGI.unescape(url.host).split(',')
15
- KafkaAsync.new(addrs, **Kafka.coercer.coerce(opts))
13
+ KafkaAsync.new(url, **Kafka.coercer.coerce(opts))
16
14
  end
17
15
  end
18
16
  end
@@ -3,8 +3,10 @@ require 'bps/kafka'
3
3
  module BPS
4
4
  module Publisher
5
5
  class Kafka < Abstract
6
- class Topic
6
+ class Topic < Abstract::Topic
7
7
  def initialize(producer, topic)
8
+ super()
9
+
8
10
  @producer = producer
9
11
  @topic = topic
10
12
  end
@@ -14,7 +16,7 @@ module BPS
14
16
  after_publish
15
17
  end
16
18
 
17
- def flush
19
+ def flush(**)
18
20
  @producer.deliver_messages
19
21
  end
20
22
 
@@ -74,12 +76,15 @@ module BPS
74
76
  @coercer ||= BPS::Coercer.new(CLIENT_OPTS.merge(PRODUCER_OPTS)).freeze
75
77
  end
76
78
 
77
- # @param [Array<String>] brokers the seed broker addresses.
79
+ # @param [Array<String>,URI] brokers the seed broker addresses.
78
80
  # @param [Hash] opts the options.
79
81
  # @see https://www.rubydoc.info/gems/ruby-kafka/Kafka/Client#initialize-instance_method
80
82
  def initialize(broker_addrs, **opts)
81
- @topics = {}
82
- @client = ::Kafka.new(broker_addrs, **opts.slice(*CLIENT_OPTS.keys))
83
+ super()
84
+
85
+ broker_addrs = parse_url(broker_addrs) if broker_addrs.is_a?(URI)
86
+ @topics = {}
87
+ @client = ::Kafka.new(broker_addrs, **opts.slice(*CLIENT_OPTS.keys))
83
88
  @producer = init_producer(**opts.slice(*PRODUCER_OPTS.keys))
84
89
  end
85
90
 
@@ -94,6 +99,14 @@ module BPS
94
99
 
95
100
  private
96
101
 
102
+ def parse_url(url)
103
+ port = url.port&.to_s || '9092'
104
+ CGI.unescape(url.host).split(',').map do |addr|
105
+ addr << ':' << port unless addr.match(/:\d+$/)
106
+ addr
107
+ end
108
+ end
109
+
97
110
  def init_producer(**opts)
98
111
  @producer = @client.producer(**opts)
99
112
  end
@@ -14,18 +14,18 @@ module BPS
14
14
  # @param [Hash] opts the options.
15
15
  # @option opts [Integer] :max_queue_size (defaults to: 1000)
16
16
  # the maximum number of messages allowed in the queue.
17
- # @option opts [Integer] :delivery_threshold (defaults to: 0)
17
+ # @option opts [Integer] :delivery_threshold (defaults to: 1000)
18
18
  # if greater than zero, the number of buffered messages that will automatically
19
19
  # trigger a delivery.
20
- # @option opts [Integer] :delivery_interval (defaults to: 0) if greater than zero, the number of
20
+ # @option opts [Integer] :delivery_interval (defaults to: 30) if greater than zero, the number of
21
21
  # seconds between automatic message deliveries.
22
- def initialize(broker_addrs, **opts)
22
+ def initialize(broker_addrs, **opts) # rubocop:disable Lint/UselessMethodDefinition
23
23
  super
24
24
  end
25
25
 
26
26
  private
27
27
 
28
- def init_producer(max_queue_size: 1000, delivery_threshold: 0, delivery_interval: 0)
28
+ def init_producer(max_queue_size: 1000, delivery_threshold: 1000, delivery_interval: 30)
29
29
  @client.async_producer(
30
30
  max_queue_size: max_queue_size,
31
31
  delivery_threshold: delivery_threshold,
@@ -1,38 +1,63 @@
1
1
  require 'spec_helper'
2
2
  require 'bps/kafka'
3
3
 
4
- def kafka_addrs
5
- ENV.fetch('KAFKA_ADDRS', '127.0.0.1:9092').split(',').freeze
6
- end
4
+ RSpec.describe 'Kafka', kafka: true do
5
+ context 'resolve addrs' do
6
+ let(:client) { double('Kafka', producer: nil) }
7
+ before { allow(::Kafka).to receive(:new).and_return(client) }
7
8
 
8
- run_spec = \
9
- begin
10
- ::Kafka.new(kafka_addrs).brokers
11
- true
12
- rescue StandardError => e
13
- warn "WARNING: unable to run #{File.basename __FILE__}: #{e.message}"
14
- false
15
- end
9
+ it 'should resolve simple URLs' do
10
+ if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.7')
11
+ expect(::Kafka).to receive(:new).with(['test.host:9092'], {}).and_return(client)
12
+ else
13
+ expect(::Kafka).to receive(:new).with(['test.host:9092']).and_return(client)
14
+ end
15
+ BPS::Publisher.resolve(URI.parse('kafka+sync://test.host:9092'))
16
+ end
16
17
 
17
- helper = proc do
18
- def read_messages(topic_name, num_messages)
19
- client = ::Kafka.new(kafka_addrs)
20
- Enumerator.new do |y|
21
- client.each_message(topic: topic_name, start_from_beginning: true) do |msg|
22
- y << msg.value
18
+ it 'should resolve URLs with multiple hosts' do
19
+ if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.7')
20
+ expect(::Kafka).to receive(:new).with(['foo.host:9092', 'bar.host:9092'], {}).and_return(client)
21
+ else
22
+ expect(::Kafka).to receive(:new).with(['foo.host:9092', 'bar.host:9092']).and_return(client)
23
23
  end
24
- end.take(num_messages)
25
- ensure
26
- client&.close
27
- end
28
- end
24
+ BPS::Publisher.resolve(URI.parse('kafka+sync://foo.host,bar.host:9092'))
25
+ end
29
26
 
30
- RSpec.describe 'Kafka', if: run_spec do
31
- context BPS::Publisher::Kafka do
32
- it_behaves_like 'publisher', url: "kafka+sync://#{kafka_addrs.join(',')}/", &helper
27
+ it 'should resolve URLs with multiple hosts/ports' do
28
+ if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.7')
29
+ expect(::Kafka).to receive(:new).with(['foo.host:9093', 'bar.host:9092'], {}).and_return(client)
30
+ else
31
+ expect(::Kafka).to receive(:new).with(['foo.host:9093', 'bar.host:9092']).and_return(client)
32
+ end
33
+ BPS::Publisher.resolve(URI.parse('kafka+sync://foo.host%3A9093,bar.host'))
34
+ end
33
35
  end
34
36
 
35
- context BPS::Publisher::KafkaAsync do
36
- it_behaves_like 'publisher', url: "kafka://#{kafka_addrs.join(',')}/", &helper
37
+ describe 'publishers' do
38
+ let(:kafka_addrs) { ENV.fetch('KAFKA_ADDRS', '127.0.0.1:9092').split(',') }
39
+
40
+ def read_messages(topic_name, num_messages)
41
+ client = ::Kafka.new(kafka_addrs)
42
+ Enumerator.new do |y|
43
+ client.each_message(topic: topic_name, start_from_beginning: true) do |msg|
44
+ y << msg.value
45
+ end
46
+ end.take(num_messages)
47
+ ensure
48
+ client&.close
49
+ end
50
+
51
+ context BPS::Publisher::Kafka do
52
+ let(:publisher_url) { "kafka+sync://#{CGI.escape(kafka_addrs.join(','))}/" }
53
+
54
+ it_behaves_like 'publisher'
55
+ end
56
+
57
+ context BPS::Publisher::KafkaAsync do
58
+ let(:publisher_url) { "kafka://#{CGI.escape(kafka_addrs.join(','))}/" }
59
+
60
+ it_behaves_like 'publisher'
61
+ end
37
62
  end
38
63
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bps-kafka
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Black Square Media
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-07-01 00:00:00.000000000 Z
11
+ date: 2020-11-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bps
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 0.0.1
19
+ version: 0.1.3
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: 0.0.1
26
+ version: 0.1.3
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: ruby-kafka
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -69,7 +69,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
69
69
  - !ruby/object:Gem::Version
70
70
  version: '0'
71
71
  requirements: []
72
- rubygems_version: 3.1.4
72
+ rubygems_version: 3.1.2
73
73
  signing_key:
74
74
  specification_version: 4
75
75
  summary: Kafka adapter for bps