sidekiq-eventbus 0.0.2 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 08e5b4cf0e6ab67f298d005fe238b18504b83b56
4
- data.tar.gz: 1c333e9f8a673cd70abae2d3a170ecfe57f29350
2
+ SHA256:
3
+ metadata.gz: 9eaab7d24f9c7b4c0c99abba98571139000d64f3ada45407715da23db8c98098
4
+ data.tar.gz: e0a830587be3568625753368fab690eae383f03a547d553c71030090daea9499
5
5
  SHA512:
6
- metadata.gz: 6872239db41e62e1993ce91134adecdba84b6388a52c5ce456ee6e68e12bbd6284418b962c24cfffed9412dde5090ec47b66ef1ad291e7e41db80135a7440724
7
- data.tar.gz: db02caf8fb432a9e88f1e9678304b95a7f0da799d599f6ba4e497267b04e7a49a6869ce472352f560d61c77baefddd94251fcd14c8df9bb2228067fcebd814be
6
+ metadata.gz: e2544bded9aff5a1e694e786b6a8406cfb985f0d9ec191f140fe8d5dddbb861fedcb9c214f30069dc205a87c7a0908b5da5ff11b50fe71b608baa5506cd80ff2
7
+ data.tar.gz: 115b47ceda5d54b64125b9e9a61dc32ccad32be24c99b0da4aa40e4967b80b3985680e7c2e3933ad48a02a965d6faeded6a3c8c7d0b83553d2bf0bf134668192
data/README.md CHANGED
@@ -0,0 +1,4 @@
1
+ # sidekiq-eventbus
2
+
3
+ A simple event bus implementation written to offload event handling via Sidekiq.
4
+
@@ -8,14 +8,14 @@ module Sidekiq
8
8
  autoload :Consumer, 'sidekiq/event_bus/consumer'
9
9
  autoload :Producer, 'sidekiq/event_bus/producer'
10
10
 
11
- autoload :TopicMiddleware, 'sidekiq/event_bus/topic_middleware'
12
11
  autoload :EventWorker, 'sidekiq/event_bus/event_worker'
13
12
 
14
13
  module Adapters
15
14
  autoload :Default, 'sidekiq/event_bus/adapters/default'
15
+ autoload :Buffered, 'sidekiq/event_bus/adapters/buffered'
16
16
  autoload :Inline, 'sidekiq/event_bus/adapters/inline'
17
17
  autoload :Test, 'sidekiq/event_bus/adapters/test'
18
- autoload :Log, 'sidekiq/event_bus/adapters/log'
18
+ autoload :Log, 'sidekiq/event_bus/adapters/log'
19
19
  end
20
20
 
21
21
  def self.config
@@ -23,7 +23,7 @@ module Sidekiq
23
23
  end
24
24
 
25
25
  def self.utils
26
- @utils ||= Utils.new(config)
26
+ @utils ||= Utils.new
27
27
  end
28
28
 
29
29
  def self.configure
@@ -31,9 +31,3 @@ module Sidekiq
31
31
  end
32
32
  end
33
33
  end
34
-
35
- Sidekiq.configure_server do |config|
36
- config.server_middleware do |chain|
37
- chain.add Sidekiq::EventBus::TopicMiddleware
38
- end
39
- end
@@ -0,0 +1,53 @@
1
+ require 'concurrent'
2
+
3
+ class Sidekiq::EventBus::Adapters::Buffered
4
+ def initialize adapter: Sidekiq::EventBus::Adapters::Default.new
5
+ @adapter = adapter
6
+ @bufferes = Concurrent::Map.new
7
+ end
8
+
9
+ def push event, payload
10
+ if is_buffered?
11
+ event_buffer << [ event, payload ]
12
+ nil
13
+ else
14
+ @adapter.push(event, payload)
15
+ end
16
+ end
17
+
18
+ def buffered
19
+ buffer!
20
+ begin
21
+ yield
22
+ flush!
23
+ ensure
24
+ clear!
25
+ end
26
+ end
27
+
28
+ def event_buffer
29
+ @bufferes[buffer_key] ||= Array.new
30
+ end
31
+
32
+ def is_buffered?
33
+ @bufferes.key?(buffer_key)
34
+ end
35
+
36
+ def buffer!
37
+ @bufferes[buffer_key] ||= Array.new
38
+ end
39
+
40
+ def flush!
41
+ event_buffer.map do |event, payload|
42
+ @adapter.push(event, payload)
43
+ end
44
+ end
45
+
46
+ def clear!
47
+ @bufferes.delete(buffer_key)
48
+ end
49
+
50
+ def buffer_key
51
+ Thread.current.object_id
52
+ end
53
+ end
@@ -1,9 +1,8 @@
1
1
  class Sidekiq::EventBus::Adapters::Default
2
- def push topic, event, payload
2
+ def push event, payload
3
3
  Sidekiq::Client.push({
4
4
  'class' => Sidekiq::EventBus::EventWorker,
5
- 'args' => [ event, payload ],
6
- 'queue' => topic,
5
+ 'args' => [ event, payload ]
7
6
  })
8
7
  end
9
- end
8
+ end
@@ -1,6 +1,6 @@
1
1
  class Sidekiq::EventBus::Adapters::Inline
2
- def push topic, event, payload
3
- Sidekiq::EventBus.utils.handle_event(topic, event, payload)
2
+ def push event, payload
3
+ Sidekiq::EventBus.utils.handle_event(event, payload)
4
4
  SecureRandom.hex(8)
5
5
  end
6
- end
6
+ end
@@ -1,7 +1,7 @@
1
1
  class Sidekiq::EventBus::Adapters::Log
2
- def push topic, event, payload
2
+ def push event, payload
3
3
  id = SecureRandom.hex(8)
4
- puts "topic=#{topic} event=#{event} id=#{id} payload=#{payload.to_json}"
4
+ puts "event=#{event} id=#{id} payload=#{payload.to_json}"
5
5
  id
6
6
  end
7
- end
7
+ end
@@ -1,14 +1,13 @@
1
1
  class Sidekiq::EventBus::Adapters::Test
2
- attr_accessor :topics
2
+ attr_accessor :events
3
3
 
4
4
  def initialize
5
- self.topics = Hash.new{ |hash, key| hash[key] = [] }
5
+ self.events = []
6
6
  end
7
7
 
8
- def push topic, event, payload
8
+ def push event, payload
9
9
  id = SecureRandom.hex(8)
10
- self.topics[topic].push({
11
- topic: topic,
10
+ self.events.push({
12
11
  event: event,
13
12
  payload: payload,
14
13
  id: id
@@ -18,6 +17,6 @@ class Sidekiq::EventBus::Adapters::Test
18
17
  end
19
18
 
20
19
  def clear!
21
- self.topics.clear
20
+ self.events.clear
22
21
  end
23
- end
22
+ end
@@ -1,13 +1,14 @@
1
1
  class Sidekiq::EventBus::Configuration
2
- attr_accessor :adapter, :consumers, :sidekiq_worker_options
2
+ attr_accessor :adapter, :consumers, :sidekiq_worker_options, :error_handler
3
+
3
4
  def initialize
4
5
  self.adapter = Sidekiq::EventBus::Adapters::Default.new
5
- self.consumers = Hash.new { |hash, key| hash[key] = Set.new }
6
+ self.consumers = Set.new
6
7
  self.sidekiq_worker_options = { retry: 0, dead: true }
7
8
  end
8
9
 
9
- def register_consumer topic, klass
10
+ def register_consumer klass
10
11
  klass = klass.name unless klass.is_a?(String)
11
- consumers[topic] << klass
12
+ consumers << klass
12
13
  end
13
- end
14
+ end
@@ -1,12 +1,8 @@
1
1
  class Sidekiq::EventBus::Consumer
2
- # Register Consumer with the EventBus for a particular topic
3
- def self.topic *topics
4
- Array(topics).each do |topic|
5
- Sidekiq::EventBus.config.register_consumer(topic, self)
6
- end
2
+ def self.register_consumer!
3
+ Sidekiq::EventBus.config.register_consumer(self)
7
4
  end
8
5
 
9
-
10
6
  # Store handlers for this consumer
11
7
  def self.handlers
12
8
  @handlers ||= Hash.new { |hash, key| hash[key] = Array.new }
@@ -22,22 +18,27 @@ class Sidekiq::EventBus::Consumer
22
18
  end
23
19
  end
24
20
 
21
+ PAYLOAD_WITH_INDIFFERENT_ACCESS = defined?(ActiveSupport::HashWithIndifferentAccess)
25
22
 
26
- def consume topic, event, payload
27
- _payload = payload.merge('topic'.freeze => topic, 'event'.freeze => event).freeze
23
+ def consume event, payload
24
+ if self.class.handlers.key? event
25
+ _payload = payload.merge('event'.freeze => event).freeze
26
+
27
+ if PAYLOAD_WITH_INDIFFERENT_ACCESS
28
+ _payload = ActiveSupport::HashWithIndifferentAccess.new(_payload)
29
+ end
28
30
 
29
- self.class.handlers[event].each do |handler|
30
- begin
31
- if handler.is_a? Proc
32
- instance_exec( _payload.dup, &handler )
33
- else
34
- handler.call( _payload.dup )
31
+ self.class.handlers[event].each do |handler|
32
+ begin
33
+ if handler.is_a? Proc
34
+ instance_exec( _payload.dup, &handler )
35
+ else
36
+ handler.call( _payload.dup )
37
+ end
38
+ rescue => e
39
+ Sidekiq::EventBus.utils.handle_error(e)
35
40
  end
36
- rescue => e
37
- puts "OH NO!!!"
38
- puts e.inspect
39
- puts e.backtrace
40
41
  end
41
42
  end
42
43
  end
43
- end
44
+ end
@@ -1,11 +1,9 @@
1
1
  class Sidekiq::EventBus::EventWorker
2
2
  include Sidekiq::Worker
3
3
 
4
- attr_accessor :topic
5
-
6
4
  sidekiq_options Sidekiq::EventBus.config.sidekiq_worker_options
7
5
 
8
6
  def perform(event, payload)
9
- Sidekiq::EventBus.utils.handle_event(topic, event, payload)
7
+ Sidekiq::EventBus.utils.handle_event(event, payload)
10
8
  end
11
- end
9
+ end
@@ -1,14 +1,11 @@
1
1
  class Sidekiq::EventBus::Producer
2
- attr_reader :topics, :adapter
2
+ attr_reader :adapter
3
3
 
4
- def initialize topics: nil, adapter: Sidekiq::EventBus.config.adapter
5
- @topics = Array(topics)
4
+ def initialize adapter: Sidekiq::EventBus.config.adapter
6
5
  @adapter = adapter
7
6
  end
8
7
 
9
8
  def publish event, payload
10
- topics.map do |topic|
11
- adapter.push topic, event, payload
12
- end
9
+ adapter.push event, payload
13
10
  end
14
- end
11
+ end
@@ -1,19 +1,19 @@
1
1
  class Sidekiq::EventBus::Utils
2
- attr_reader :config
3
-
4
- def initialize config
5
- @config = config
2
+ def consumers
3
+ Sidekiq::EventBus.config.consumers.map do |klass_name|
4
+ klass_name.constantize.new
5
+ end
6
6
  end
7
7
 
8
- def consumers_for topic
9
- config.consumers[topic].map do |klass_name|
10
- klass_name.constantize.new
8
+ def handle_event event, payload
9
+ consumers.each do |consumer|
10
+ consumer.consume(event, payload)
11
11
  end
12
12
  end
13
13
 
14
- def handle_event topic, event, payload
15
- consumers_for(topic).each do |consumer|
16
- consumer.consume(topic, event, payload)
14
+ def handle_error exception
15
+ unless Sidekiq::EventBus.config.error_handler.nil?
16
+ Sidekiq::EventBus.config.error_handler.call(exception)
17
17
  end
18
18
  end
19
- end
19
+ end
@@ -0,0 +1,5 @@
1
+ module Sidekiq
2
+ module EventBus
3
+ VERSION = '0.1.1'
4
+ end
5
+ end
metadata CHANGED
@@ -1,16 +1,76 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sidekiq-eventbus
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Phil Monroe
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-01-21 00:00:00.000000000 Z
12
- dependencies: []
13
- description: A simple Producer/Consumer event bus extension for Sidekiq
11
+ date: 2020-10-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: concurrent-ruby
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 1.0.0
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '2.0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 1.0.0
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '2.0'
33
+ - !ruby/object:Gem::Dependency
34
+ name: sidekiq
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: 4.0.0
40
+ - - "<"
41
+ - !ruby/object:Gem::Version
42
+ version: '7.0'
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: 4.0.0
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: '7.0'
53
+ - !ruby/object:Gem::Dependency
54
+ name: rspec
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: 3.5.0
60
+ - - "<"
61
+ - !ruby/object:Gem::Version
62
+ version: '4.0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: 3.5.0
70
+ - - "<"
71
+ - !ruby/object:Gem::Version
72
+ version: '4.0'
73
+ description: A simple asynchronous Producer/Consumer event bus extension for Sidekiq
14
74
  email: phil@rakefire.io
15
75
  executables: []
16
76
  extensions: []
@@ -21,6 +81,7 @@ files:
21
81
  - README.md
22
82
  - lib/sidekiq-eventbus.rb
23
83
  - lib/sidekiq/event_bus.rb
84
+ - lib/sidekiq/event_bus/adapters/buffered.rb
24
85
  - lib/sidekiq/event_bus/adapters/default.rb
25
86
  - lib/sidekiq/event_bus/adapters/inline.rb
26
87
  - lib/sidekiq/event_bus/adapters/log.rb
@@ -29,13 +90,13 @@ files:
29
90
  - lib/sidekiq/event_bus/consumer.rb
30
91
  - lib/sidekiq/event_bus/event_worker.rb
31
92
  - lib/sidekiq/event_bus/producer.rb
32
- - lib/sidekiq/event_bus/topic_middleware.rb
33
93
  - lib/sidekiq/event_bus/utils.rb
94
+ - lib/sidekiq/event_bus/version.rb
34
95
  homepage: https://github.com/Rakefire/sidekiq-eventbus
35
96
  licenses:
36
97
  - MIT
37
98
  metadata: {}
38
- post_install_message:
99
+ post_install_message:
39
100
  rdoc_options: []
40
101
  require_paths:
41
102
  - lib
@@ -50,9 +111,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
50
111
  - !ruby/object:Gem::Version
51
112
  version: '0'
52
113
  requirements: []
53
- rubyforge_project:
54
- rubygems_version: 2.5.1
55
- signing_key:
114
+ rubygems_version: 3.0.3
115
+ signing_key:
56
116
  specification_version: 4
57
- summary: A simple Producer/Consumer event bus extension for Sidekiq
117
+ summary: Producer/Consumer event bus via Sidekiq
58
118
  test_files: []
@@ -1,9 +0,0 @@
1
- class Sidekiq::EventBus::TopicMiddleware
2
- def initialize(options=nil)
3
- end
4
-
5
- def call(worker, msg, queue)
6
- worker.topic = queue if worker.respond_to?("topic=")
7
- yield
8
- end
9
- end