chasqui 0.9.3 → 1.0.0.pre.rc1
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 +4 -4
- data/.gitignore +1 -0
- data/README.md +60 -39
- data/Vagrantfile +15 -0
- data/lib/chasqui.rb +28 -55
- data/lib/chasqui/broker.rb +3 -3
- data/lib/chasqui/{multi_broker.rb → brokers/redis_broker.rb} +11 -11
- data/lib/chasqui/config.rb +26 -6
- data/lib/chasqui/queue_adapter.rb +14 -0
- data/lib/chasqui/queue_adapters/redis_queue_adapter.rb +51 -0
- data/lib/chasqui/subscriber.rb +56 -49
- data/lib/chasqui/subscriptions.rb +67 -0
- data/lib/chasqui/version.rb +1 -1
- data/lib/chasqui/worker.rb +81 -0
- data/spec/integration/pubsub_examples.rb +20 -20
- data/spec/integration/resque_spec.rb +1 -1
- data/spec/integration/setup/subscribers.rb +25 -9
- data/spec/integration/sidekiq_spec.rb +1 -1
- data/spec/lib/chasqui/{multi_broker_spec.rb → brokers/redis_broker_spec.rb} +54 -26
- data/spec/lib/chasqui/cli_spec.rb +1 -1
- data/spec/lib/chasqui/config_spec.rb +121 -0
- data/spec/lib/chasqui/fake_queue_adapter_spec.rb +5 -0
- data/spec/lib/chasqui/queue_adapters/redis_queue_adapter_spec.rb +73 -0
- data/spec/lib/chasqui/subscriber_spec.rb +95 -43
- data/spec/lib/chasqui/subscriptions_spec.rb +60 -0
- data/spec/lib/chasqui/worker_spec.rb +96 -0
- data/spec/lib/chasqui_spec.rb +32 -191
- data/spec/spec_helper.rb +1 -1
- data/spec/support/chasqui_spec_helpers.rb +28 -0
- data/spec/support/fake_queue_adapter.rb +3 -0
- data/spec/support/fake_subscriber.rb +2 -1
- data/spec/support/shared_examples/queue_adapter_examples.rb +13 -0
- metadata +25 -18
- data/lib/chasqui/subscription.rb +0 -53
- data/lib/chasqui/workers/resque_worker.rb +0 -25
- data/lib/chasqui/workers/sidekiq_worker.rb +0 -45
- data/lib/chasqui/workers/worker.rb +0 -34
- data/spec/lib/chasqui/subscription_spec.rb +0 -35
- data/spec/lib/chasqui/workers/resque_worker_spec.rb +0 -27
- data/spec/lib/chasqui/workers/sidekiq_worker_spec.rb +0 -34
@@ -0,0 +1,13 @@
|
|
1
|
+
shared_examples 'a queue adapter' do
|
2
|
+
it 'implements bind' do
|
3
|
+
method = described_class.instance_method :bind
|
4
|
+
expect(method).not_to be_nil
|
5
|
+
expect(method.arity).to eq(1)
|
6
|
+
end
|
7
|
+
|
8
|
+
it 'implements unbind' do
|
9
|
+
method = described_class.instance_method :unbind
|
10
|
+
expect(method).not_to be_nil
|
11
|
+
expect(method.arity).to eq(1)
|
12
|
+
end
|
13
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chasqui
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0.pre.rc1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jordan Bach
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-12-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis
|
@@ -152,6 +152,7 @@ files:
|
|
152
152
|
- LICENSE.txt
|
153
153
|
- README.md
|
154
154
|
- Rakefile
|
155
|
+
- Vagrantfile
|
155
156
|
- bin/chasqui
|
156
157
|
- bin/console
|
157
158
|
- chasqui.gemspec
|
@@ -159,15 +160,15 @@ files:
|
|
159
160
|
- examples/upstart.conf
|
160
161
|
- lib/chasqui.rb
|
161
162
|
- lib/chasqui/broker.rb
|
163
|
+
- lib/chasqui/brokers/redis_broker.rb
|
162
164
|
- lib/chasqui/cli.rb
|
163
165
|
- lib/chasqui/config.rb
|
164
|
-
- lib/chasqui/
|
166
|
+
- lib/chasqui/queue_adapter.rb
|
167
|
+
- lib/chasqui/queue_adapters/redis_queue_adapter.rb
|
165
168
|
- lib/chasqui/subscriber.rb
|
166
|
-
- lib/chasqui/
|
169
|
+
- lib/chasqui/subscriptions.rb
|
167
170
|
- lib/chasqui/version.rb
|
168
|
-
- lib/chasqui/
|
169
|
-
- lib/chasqui/workers/sidekiq_worker.rb
|
170
|
-
- lib/chasqui/workers/worker.rb
|
171
|
+
- lib/chasqui/worker.rb
|
171
172
|
- spec/integration/pubsub_examples.rb
|
172
173
|
- spec/integration/resque_spec.rb
|
173
174
|
- spec/integration/setup/resque.rb
|
@@ -175,18 +176,21 @@ files:
|
|
175
176
|
- spec/integration/setup/subscribers.rb
|
176
177
|
- spec/integration/sidekiq_spec.rb
|
177
178
|
- spec/lib/chasqui/broker_spec.rb
|
179
|
+
- spec/lib/chasqui/brokers/redis_broker_spec.rb
|
178
180
|
- spec/lib/chasqui/cli_spec.rb
|
179
181
|
- spec/lib/chasqui/config_spec.rb
|
180
|
-
- spec/lib/chasqui/
|
182
|
+
- spec/lib/chasqui/fake_queue_adapter_spec.rb
|
183
|
+
- spec/lib/chasqui/queue_adapters/redis_queue_adapter_spec.rb
|
181
184
|
- spec/lib/chasqui/subscriber_spec.rb
|
182
|
-
- spec/lib/chasqui/
|
183
|
-
- spec/lib/chasqui/
|
184
|
-
- spec/lib/chasqui/workers/sidekiq_worker_spec.rb
|
185
|
+
- spec/lib/chasqui/subscriptions_spec.rb
|
186
|
+
- spec/lib/chasqui/worker_spec.rb
|
185
187
|
- spec/lib/chasqui_spec.rb
|
186
188
|
- spec/spec_helper.rb
|
187
189
|
- spec/support/chasqui_spec_helpers.rb
|
188
190
|
- spec/support/fake_logger.rb
|
191
|
+
- spec/support/fake_queue_adapter.rb
|
189
192
|
- spec/support/fake_subscriber.rb
|
193
|
+
- spec/support/shared_examples/queue_adapter_examples.rb
|
190
194
|
- spec/support/sidekiq_compatibility_check.rb
|
191
195
|
- tmp/.keep
|
192
196
|
homepage: https://github.com/jbgo/chasqui
|
@@ -204,12 +208,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
204
208
|
version: '0'
|
205
209
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
206
210
|
requirements:
|
207
|
-
- - "
|
211
|
+
- - ">"
|
208
212
|
- !ruby/object:Gem::Version
|
209
|
-
version:
|
213
|
+
version: 1.3.1
|
210
214
|
requirements: []
|
211
215
|
rubyforge_project:
|
212
|
-
rubygems_version: 2.4.5
|
216
|
+
rubygems_version: 2.4.5.1
|
213
217
|
signing_key:
|
214
218
|
specification_version: 4
|
215
219
|
summary: Chasqui is a simple, lightweight, persistent implementation of the publish-subscribe
|
@@ -222,16 +226,19 @@ test_files:
|
|
222
226
|
- spec/integration/setup/subscribers.rb
|
223
227
|
- spec/integration/sidekiq_spec.rb
|
224
228
|
- spec/lib/chasqui/broker_spec.rb
|
229
|
+
- spec/lib/chasqui/brokers/redis_broker_spec.rb
|
225
230
|
- spec/lib/chasqui/cli_spec.rb
|
226
231
|
- spec/lib/chasqui/config_spec.rb
|
227
|
-
- spec/lib/chasqui/
|
232
|
+
- spec/lib/chasqui/fake_queue_adapter_spec.rb
|
233
|
+
- spec/lib/chasqui/queue_adapters/redis_queue_adapter_spec.rb
|
228
234
|
- spec/lib/chasqui/subscriber_spec.rb
|
229
|
-
- spec/lib/chasqui/
|
230
|
-
- spec/lib/chasqui/
|
231
|
-
- spec/lib/chasqui/workers/sidekiq_worker_spec.rb
|
235
|
+
- spec/lib/chasqui/subscriptions_spec.rb
|
236
|
+
- spec/lib/chasqui/worker_spec.rb
|
232
237
|
- spec/lib/chasqui_spec.rb
|
233
238
|
- spec/spec_helper.rb
|
234
239
|
- spec/support/chasqui_spec_helpers.rb
|
235
240
|
- spec/support/fake_logger.rb
|
241
|
+
- spec/support/fake_queue_adapter.rb
|
236
242
|
- spec/support/fake_subscriber.rb
|
243
|
+
- spec/support/shared_examples/queue_adapter_examples.rb
|
237
244
|
- spec/support/sidekiq_compatibility_check.rb
|
data/lib/chasqui/subscription.rb
DELETED
@@ -1,53 +0,0 @@
|
|
1
|
-
module Chasqui
|
2
|
-
class Subscription
|
3
|
-
attr_reader :queue, :channel, :subscriber_type
|
4
|
-
|
5
|
-
def initialize(queue, channel, subscriber_type=Chasqui::Subscriber)
|
6
|
-
@queue = queue
|
7
|
-
@channel = channel
|
8
|
-
@subscriber_type = subscriber_type
|
9
|
-
end
|
10
|
-
|
11
|
-
def subscription_id
|
12
|
-
queue_name = [worker.namespace, 'queue', queue].compact.join(':')
|
13
|
-
"#{worker_backend}/#{queue_name}"
|
14
|
-
end
|
15
|
-
|
16
|
-
def subscriber
|
17
|
-
@subscriber ||= subscriber_type.new queue, channel
|
18
|
-
end
|
19
|
-
|
20
|
-
def worker
|
21
|
-
case worker_backend
|
22
|
-
when :resque
|
23
|
-
Chasqui::ResqueWorker.create subscriber
|
24
|
-
when :sidekiq
|
25
|
-
Chasqui::SidekiqWorker.create subscriber
|
26
|
-
else
|
27
|
-
raise ConfigurationError.new(
|
28
|
-
"Please choose a supported worker_backend. Choices: #{supported_worker_backends}")
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
private
|
33
|
-
|
34
|
-
def worker_backend
|
35
|
-
Chasqui.config.worker_backend || find_first_available_worker_backend
|
36
|
-
end
|
37
|
-
|
38
|
-
def find_first_available_worker_backend
|
39
|
-
if Object.const_defined? :Sidekiq
|
40
|
-
:sidekiq
|
41
|
-
elsif Object.const_defined? :Resque
|
42
|
-
:resque
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
SUPPORTED_WORKER_BACKENDS = [:resque, :sidekiq].freeze
|
47
|
-
|
48
|
-
def supported_worker_backends
|
49
|
-
SUPPORTED_WORKER_BACKENDS.join(', ')
|
50
|
-
end
|
51
|
-
|
52
|
-
end
|
53
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
module Chasqui
|
2
|
-
class ResqueWorker < Worker
|
3
|
-
class << self
|
4
|
-
|
5
|
-
def namespace
|
6
|
-
Resque.redis.namespace
|
7
|
-
end
|
8
|
-
|
9
|
-
# Factory method to create a Resque worker class for a Chasqui::Subscriber instance.
|
10
|
-
def create(subscriber)
|
11
|
-
find_or_build_worker(subscriber, Chasqui::ResqueWorker).tap do |worker|
|
12
|
-
worker.class_eval do
|
13
|
-
@queue = subscriber.queue
|
14
|
-
@subscriber = subscriber
|
15
|
-
|
16
|
-
def self.perform(event)
|
17
|
-
@subscriber.perform Resque.redis, event
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
@@ -1,45 +0,0 @@
|
|
1
|
-
module Chasqui
|
2
|
-
class SidekiqWorker < Worker
|
3
|
-
class << self
|
4
|
-
|
5
|
-
def namespace
|
6
|
-
Sidekiq.redis { |r| r.respond_to?(:namespace) ? r.namespace : nil }
|
7
|
-
end
|
8
|
-
|
9
|
-
def create(subscriber)
|
10
|
-
register_sidekiq_queue subscriber.queue
|
11
|
-
|
12
|
-
find_or_build_worker(subscriber, Chasqui::SidekiqWorker).tap do |worker|
|
13
|
-
define_worker_class worker, subscriber
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
private
|
18
|
-
|
19
|
-
def define_worker_class(worker, subscriber)
|
20
|
-
worker.class_eval do
|
21
|
-
include Sidekiq::Worker
|
22
|
-
sidekiq_options queue: subscriber.queue
|
23
|
-
@subscriber = subscriber
|
24
|
-
|
25
|
-
def perform(event)
|
26
|
-
Sidekiq.redis do |r|
|
27
|
-
self.class.subscriber.perform r, event
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
private
|
32
|
-
|
33
|
-
def self.subscriber
|
34
|
-
@subscriber
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def register_sidekiq_queue(queue_name)
|
40
|
-
Sidekiq.redis { |r| r.sadd 'queues', queue_name }
|
41
|
-
end
|
42
|
-
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
@@ -1,34 +0,0 @@
|
|
1
|
-
module Chasqui
|
2
|
-
class Worker
|
3
|
-
class << self
|
4
|
-
|
5
|
-
def namespace
|
6
|
-
raise NotImplementedError
|
7
|
-
end
|
8
|
-
|
9
|
-
def create(subscriber)
|
10
|
-
raise NotImplementedError
|
11
|
-
end
|
12
|
-
|
13
|
-
def subscriber=(subscriber)
|
14
|
-
raise NotImplementedError
|
15
|
-
end
|
16
|
-
|
17
|
-
protected
|
18
|
-
|
19
|
-
def find_or_build_worker(subscriber, superclass)
|
20
|
-
class_name = Chasqui.subscriber_class_name(subscriber.queue)
|
21
|
-
|
22
|
-
if Chasqui.const_defined? class_name
|
23
|
-
Chasqui.logger.warn "redefining subscriber class Chasqui::#{class_name}"
|
24
|
-
Chasqui.send :remove_const, class_name
|
25
|
-
end
|
26
|
-
|
27
|
-
Class.new(superclass).tap do |worker|
|
28
|
-
Chasqui.const_set class_name, worker
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
@@ -1,35 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Chasqui::Subscription do
|
4
|
-
|
5
|
-
def new_subscription(queue='default')
|
6
|
-
Chasqui::Subscription.new queue, 'fake-channel', FakeSubscriber
|
7
|
-
end
|
8
|
-
|
9
|
-
describe '#worker' do
|
10
|
-
it 'raises when no worker backend configured' do
|
11
|
-
Chasqui.config.worker_backend = nil
|
12
|
-
allow_any_instance_of(Chasqui::Subscription).to receive(
|
13
|
-
:worker_backend).and_return(nil)
|
14
|
-
|
15
|
-
expect(-> {
|
16
|
-
new_subscription.worker
|
17
|
-
}).to raise_error(Chasqui::ConfigurationError)
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'creates a resque worker' do
|
21
|
-
Chasqui.config.worker_backend = :resque
|
22
|
-
worker = new_subscription('resque-queue').worker
|
23
|
-
expect(worker.new).to be_kind_of(Chasqui::ResqueWorker)
|
24
|
-
end
|
25
|
-
|
26
|
-
if sidekiq_supported_ruby_version?
|
27
|
-
it 'creates a sidekiq worker' do
|
28
|
-
Chasqui.config.worker_backend = :sidekiq
|
29
|
-
worker = new_subscription('sidekiq-queue').worker
|
30
|
-
expect(worker.new).to be_kind_of(Chasqui::SidekiqWorker)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'resque'
|
3
|
-
|
4
|
-
describe Chasqui::ResqueWorker do
|
5
|
-
let(:subscriber) { FakeSubscriber.new 'my-queue', 'my.channel'}
|
6
|
-
|
7
|
-
describe '.create' do
|
8
|
-
it 'configures a new worker' do
|
9
|
-
worker_class = Chasqui::ResqueWorker.create(subscriber)
|
10
|
-
expect(worker_class.name).to eq('Chasqui::Subscriber__my_queue')
|
11
|
-
expect(worker_class.ancestors).to include(Chasqui::ResqueWorker)
|
12
|
-
expect(worker_class.instance_variable_get(:@queue)).to eq('my-queue')
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
describe '.perform' do
|
17
|
-
let(:worker) { Chasqui::ResqueWorker.create(subscriber) }
|
18
|
-
|
19
|
-
it 'delegates to the subscriber' do
|
20
|
-
event = { 'event' => 'foo', 'data' => ['bar'] }
|
21
|
-
worker.perform event
|
22
|
-
received_event = subscriber.events.shift
|
23
|
-
expect(received_event).to eq(event)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
end
|
@@ -1,34 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
if sidekiq_supported_ruby_version?
|
4
|
-
|
5
|
-
describe Chasqui::SidekiqWorker do
|
6
|
-
let(:subscriber) { FakeSubscriber.new 'my-queue', 'my.channel'}
|
7
|
-
|
8
|
-
describe '.create' do
|
9
|
-
before { flush_redis }
|
10
|
-
|
11
|
-
it 'configures a new worker' do
|
12
|
-
worker_class = Chasqui::SidekiqWorker.create(subscriber)
|
13
|
-
expect(worker_class.name).to eq('Chasqui::Subscriber__my_queue')
|
14
|
-
expect(worker_class.sidekiq_options).to include('queue' => 'my-queue')
|
15
|
-
expect(worker_class.included_modules).to include(Sidekiq::Worker)
|
16
|
-
expect(worker_class.new).to be_kind_of(Chasqui::SidekiqWorker)
|
17
|
-
expect(redis_no_namespace.smembers 'queues').to eq(['my-queue'])
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
describe '#perform' do
|
22
|
-
let(:worker_class) { Chasqui::SidekiqWorker.create(subscriber) }
|
23
|
-
|
24
|
-
it 'delegates to the subscriber' do
|
25
|
-
event = { 'event' => 'foo', 'data' => ['bar'] }
|
26
|
-
worker = worker_class.new
|
27
|
-
worker.perform event
|
28
|
-
received_event = subscriber.events.shift
|
29
|
-
expect(received_event).to eq(event)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
end
|