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.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/README.md +60 -39
  4. data/Vagrantfile +15 -0
  5. data/lib/chasqui.rb +28 -55
  6. data/lib/chasqui/broker.rb +3 -3
  7. data/lib/chasqui/{multi_broker.rb → brokers/redis_broker.rb} +11 -11
  8. data/lib/chasqui/config.rb +26 -6
  9. data/lib/chasqui/queue_adapter.rb +14 -0
  10. data/lib/chasqui/queue_adapters/redis_queue_adapter.rb +51 -0
  11. data/lib/chasqui/subscriber.rb +56 -49
  12. data/lib/chasqui/subscriptions.rb +67 -0
  13. data/lib/chasqui/version.rb +1 -1
  14. data/lib/chasqui/worker.rb +81 -0
  15. data/spec/integration/pubsub_examples.rb +20 -20
  16. data/spec/integration/resque_spec.rb +1 -1
  17. data/spec/integration/setup/subscribers.rb +25 -9
  18. data/spec/integration/sidekiq_spec.rb +1 -1
  19. data/spec/lib/chasqui/{multi_broker_spec.rb → brokers/redis_broker_spec.rb} +54 -26
  20. data/spec/lib/chasqui/cli_spec.rb +1 -1
  21. data/spec/lib/chasqui/config_spec.rb +121 -0
  22. data/spec/lib/chasqui/fake_queue_adapter_spec.rb +5 -0
  23. data/spec/lib/chasqui/queue_adapters/redis_queue_adapter_spec.rb +73 -0
  24. data/spec/lib/chasqui/subscriber_spec.rb +95 -43
  25. data/spec/lib/chasqui/subscriptions_spec.rb +60 -0
  26. data/spec/lib/chasqui/worker_spec.rb +96 -0
  27. data/spec/lib/chasqui_spec.rb +32 -191
  28. data/spec/spec_helper.rb +1 -1
  29. data/spec/support/chasqui_spec_helpers.rb +28 -0
  30. data/spec/support/fake_queue_adapter.rb +3 -0
  31. data/spec/support/fake_subscriber.rb +2 -1
  32. data/spec/support/shared_examples/queue_adapter_examples.rb +13 -0
  33. metadata +25 -18
  34. data/lib/chasqui/subscription.rb +0 -53
  35. data/lib/chasqui/workers/resque_worker.rb +0 -25
  36. data/lib/chasqui/workers/sidekiq_worker.rb +0 -45
  37. data/lib/chasqui/workers/worker.rb +0 -34
  38. data/spec/lib/chasqui/subscription_spec.rb +0 -35
  39. data/spec/lib/chasqui/workers/resque_worker_spec.rb +0 -27
  40. data/spec/lib/chasqui/workers/sidekiq_worker_spec.rb +0 -34
@@ -0,0 +1,3 @@
1
+ class FakeQueueAdapter
2
+ include Chasqui::QueueAdapter
3
+ end
@@ -1,4 +1,5 @@
1
- class FakeSubscriber < Chasqui::Subscriber
1
+ class FakeSubscriber
2
+ include Chasqui::Subscriber
2
3
  attr_reader :events
3
4
 
4
5
  def initialize(queue, channel)
@@ -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.9.3
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-16 00:00:00.000000000 Z
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/multi_broker.rb
166
+ - lib/chasqui/queue_adapter.rb
167
+ - lib/chasqui/queue_adapters/redis_queue_adapter.rb
165
168
  - lib/chasqui/subscriber.rb
166
- - lib/chasqui/subscription.rb
169
+ - lib/chasqui/subscriptions.rb
167
170
  - lib/chasqui/version.rb
168
- - lib/chasqui/workers/resque_worker.rb
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/multi_broker_spec.rb
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/subscription_spec.rb
183
- - spec/lib/chasqui/workers/resque_worker_spec.rb
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: '0'
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/multi_broker_spec.rb
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/subscription_spec.rb
230
- - spec/lib/chasqui/workers/resque_worker_spec.rb
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
@@ -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