multiple_man 0.3.2 → 0.4.0

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
2
  SHA1:
3
- metadata.gz: e9fe7925c120cc5b704a13b62378b3b459da3b31
4
- data.tar.gz: 21d3d6b079125195a0e85b398b5f106e21836a65
3
+ metadata.gz: 9b69cb35c812dfa3b4814a81a6cdca0aaa495afc
4
+ data.tar.gz: ea18e5f3984487b6f7278febc96269612b7038b3
5
5
  SHA512:
6
- metadata.gz: 0bfec446ad1b8f131216f4493a2a63b61febbcefd1a5974ae7d8a1a9e91f22401f4bd20ab080a560e48e728afdfc0bee8b094fa696e8c7b6636eab856c644d48
7
- data.tar.gz: adf476aed9b285617450d42cb823febeda32864bc1ebe9e844abd15dd21c30c22abc5b5d661ca87cc601bff75f8c01f35492b24f9fb1d855081da61b1f0c9fd8
6
+ metadata.gz: 8c1b1b58da01c48d575aea0ce54eac633e9996fed67a3f8860396596c721f122cdb92175823b2bb528d403fb7fb05e7748c55c14f1ead348fd32e2f6ce79a19c
7
+ data.tar.gz: 93b9be1ffd2e8a8427c35791ad87c76ef4e3a3b4f401cf8150b4a048797af2e0a8c4758826c8aa24b1d3fe120c0c34cc12d3e2b5e04b4ed019fdae1f23e3b3f3
data/lib/multiple_man.rb CHANGED
@@ -14,6 +14,7 @@ module MultipleMan
14
14
  require 'multiple_man/connection'
15
15
  require 'multiple_man/routing_key'
16
16
  require 'multiple_man/listener'
17
+ require 'multiple_man/seeder_listener'
17
18
  require 'multiple_man/model_populator'
18
19
  require 'multiple_man/identity'
19
20
 
@@ -36,4 +37,4 @@ module MultipleMan
36
37
  raise ex
37
38
  end
38
39
  end
39
- end
40
+ end
@@ -25,8 +25,8 @@ module MultipleMan
25
25
  attr_accessor :subscription
26
26
 
27
27
  def listen
28
- MultipleMan.logger.info "Listening for #{subscription.klass} with routing key #{subscription.routing_key}."
29
- queue.bind(connection.topic, routing_key: subscription.routing_key).subscribe do |delivery_info, meta_data, payload|
28
+ MultipleMan.logger.info "Listening for #{subscription.klass} with routing key #{routing_key}."
29
+ queue.bind(connection.topic, routing_key: routing_key).subscribe do |delivery_info, meta_data, payload|
30
30
  process_message(delivery_info, payload)
31
31
  end
32
32
  end
@@ -34,8 +34,7 @@ module MultipleMan
34
34
  def process_message(delivery_info, payload)
35
35
  MultipleMan.logger.info "Processing message for #{delivery_info.routing_key}."
36
36
  begin
37
- operation = delivery_info.routing_key.split(".").last
38
- subscription.send(operation, JSON.parse(payload).with_indifferent_access)
37
+ subscription.send(operation(delivery_info), JSON.parse(payload).with_indifferent_access)
39
38
  rescue Exception => ex
40
39
  MultipleMan.logger.error " Error - #{ex.message}\n\n#{ex.backtrace}"
41
40
  MultipleMan.error(ex)
@@ -44,10 +43,18 @@ module MultipleMan
44
43
  end
45
44
  end
46
45
 
46
+ def operation(delivery_info)
47
+ delivery_info.routing_key.split(".").last
48
+ end
49
+
47
50
  def queue
48
51
  connection.queue(subscription.queue_name, durable: true, auto_delete: false)
49
52
  end
50
53
 
54
+ def routing_key
55
+ subscription.routing_key
56
+ end
57
+
51
58
  private
52
59
 
53
60
  def connection
@@ -55,4 +62,4 @@ module MultipleMan
55
62
  end
56
63
 
57
64
  end
58
- end
65
+ end
@@ -2,13 +2,25 @@ module MultipleMan
2
2
  module Publisher
3
3
  def Publisher.included(base)
4
4
  base.extend(ClassMethods)
5
+ base.after_commit(on: :create) { |r| r.multiple_man_publish(:create) }
6
+ base.after_commit(on: :update) { |r| r.multiple_man_publish(:update) }
7
+ base.after_commit(on: :destroy) { |r| r.multiple_man_publish(:destroy) }
8
+ end
9
+
10
+ def multiple_man_publish(operation=:create)
11
+ self.class.multiple_man_publisher.publish(self, operation)
5
12
  end
6
13
 
7
14
  module ClassMethods
15
+
16
+ def multiple_man_publish(operation=:create)
17
+ multiple_man_publisher.publish(self, operation)
18
+ end
19
+
20
+ attr_accessor :multiple_man_publisher
21
+
8
22
  def publish(options = {})
9
- after_commit ModelPublisher.new(:create, options), on: :create
10
- after_commit ModelPublisher.new(:update, options), on: :update
11
- after_commit ModelPublisher.new(:destroy, options), on: :destroy
23
+ self.multiple_man_publisher = ModelPublisher.new(options)
12
24
  end
13
25
  end
14
26
  end
@@ -1,25 +1,25 @@
1
1
  module MultipleMan
2
2
  class ModelPublisher
3
3
 
4
- def initialize(operation, options = {})
5
- self.operation = operation
4
+ def initialize(options = {})
6
5
  self.options = options
7
6
  end
8
7
 
9
- def after_commit(record)
8
+ def publish(records, operation=:create)
10
9
  return unless MultipleMan.configuration.enabled
11
10
 
12
- MultipleMan.logger.info("Publishing #{record}")
13
11
  Connection.connect do |connection|
14
- push_record(connection, record)
12
+ all_records(records) do |record|
13
+ push_record(connection, record, operation)
14
+ end
15
15
  end
16
16
  end
17
17
 
18
18
  private
19
19
 
20
- attr_accessor :operation, :options
20
+ attr_accessor :options
21
21
 
22
- def push_record(connection, record)
22
+ def push_record(connection, record, operation)
23
23
  data = record_data(record)
24
24
  routing_key = RoutingKey.new(record_type(record), operation).to_s
25
25
  MultipleMan.logger.debug(" Record Data: #{data} | Routing Key: #{routing_key}")
@@ -28,12 +28,23 @@ module MultipleMan
28
28
  MultipleMan.error(ex)
29
29
  end
30
30
 
31
+ def all_records(records, &block)
32
+ if records.respond_to?(:find_each)
33
+ records.find_each(&block)
34
+ elsif records.respond_to?(:each)
35
+ records.each(&block)
36
+ else
37
+ yield records
38
+ end
39
+ end
40
+
41
+
31
42
  def record_type(record)
32
43
  options[:as] || record.class.name
33
44
  end
34
45
 
35
46
  def record_data(record)
36
- {
47
+ {
37
48
  id: Identity.new(record, identifier).value,
38
49
  data: serializer(record).as_json
39
50
  }.to_json
@@ -56,6 +67,6 @@ module MultipleMan
56
67
  def identifier
57
68
  options[:identifier]
58
69
  end
59
-
70
+
60
71
  end
61
- end
72
+ end
@@ -1,6 +1,6 @@
1
1
  module MultipleMan
2
2
  class RoutingKey
3
- ALLOWED_OPERATIONS = [:create, :update, :destroy, :"#"]
3
+ ALLOWED_OPERATIONS = [:create, :update, :destroy, :seed, :"#"]
4
4
 
5
5
  def initialize(klass, operation = :"#")
6
6
  self.klass = klass
@@ -8,7 +8,11 @@ module MultipleMan
8
8
  end
9
9
 
10
10
  def to_s
11
- "#{topic_name}.#{klass}.#{operation}"
11
+ if operation == :seed
12
+ "#{topic_name}.#{operation}.#{klass}"
13
+ else
14
+ "#{topic_name}.#{klass}.#{operation}"
15
+ end
12
16
  end
13
17
 
14
18
  attr_reader :operation
@@ -25,4 +29,4 @@ module MultipleMan
25
29
  end
26
30
 
27
31
  end
28
- end
32
+ end
@@ -0,0 +1,12 @@
1
+ module MultipleMan
2
+ class SeederListener < Listener
3
+ def routing_key
4
+ subscription.routing_key(:seed)
5
+ end
6
+
7
+ # seeds should only ever be a create
8
+ def operation(delivery_info)
9
+ "create"
10
+ end
11
+ end
12
+ end
@@ -19,8 +19,12 @@ module MultipleMan::Subscribers
19
19
  # noop
20
20
  end
21
21
 
22
- def routing_key
23
- MultipleMan::RoutingKey.new(klass).to_s
22
+ def seed
23
+ # noop
24
+ end
25
+
26
+ def routing_key(operation = :'#')
27
+ MultipleMan::RoutingKey.new(klass, operation).to_s
24
28
  end
25
29
 
26
30
  def queue_name
@@ -31,4 +35,4 @@ module MultipleMan::Subscribers
31
35
 
32
36
  attr_writer :klass
33
37
  end
34
- end
38
+ end
@@ -1,4 +1,4 @@
1
- module MultipleMan::Subscribers
1
+ module MultipleMan::Subscribers
2
2
  class ModelSubscriber < Base
3
3
 
4
4
  def initialize(klass, options)
@@ -15,6 +15,7 @@ module MultipleMan::Subscribers
15
15
  end
16
16
 
17
17
  alias_method :update, :create
18
+ alias_method :seed, :create
18
19
 
19
20
  def destroy(payload)
20
21
  model = find_model(payload[:id])
@@ -30,4 +31,4 @@ module MultipleMan::Subscribers
30
31
  attr_writer :klass
31
32
 
32
33
  end
33
- end
34
+ end
@@ -1,14 +1,23 @@
1
1
  namespace :multiple_man do
2
2
  desc "Run multiple man listeners"
3
3
  task :worker => :environment do
4
+ run_listener(MultipleMan::Listener)
5
+ end
6
+
7
+ desc 'Run a seeding listener'
8
+ task seed: :environment do
9
+ run_listener(MultipleMan::SeederListener)
10
+ end
11
+
12
+ def run_listener(listener)
4
13
  Rails.application.eager_load!
5
14
 
6
15
  MultipleMan::Connection.connect do |connection|
7
- MultipleMan::Listener.start(connection)
16
+ listener.start(connection)
8
17
 
9
18
  while(true)
10
19
  sleep 10
11
20
  end
12
21
  end
13
22
  end
14
- end
23
+ end
@@ -1,3 +1,3 @@
1
1
  module MultipleMan
2
- VERSION = "0.3.2"
2
+ VERSION = "0.4.0"
3
3
  end
@@ -9,7 +9,7 @@ describe MultipleMan::Connection do
9
9
  it "should open a connection and a channel" do
10
10
  mock_bunny.should_receive(:start)
11
11
  Bunny.should_receive(:new).and_return(mock_bunny)
12
- mock_bunny.should_receive(:create_channel).exactly(25).times
12
+ mock_bunny.should_receive(:create_channel)
13
13
 
14
14
  described_class.connect
15
15
  end
@@ -19,4 +19,4 @@ describe MultipleMan::Connection do
19
19
 
20
20
  its(:topic_name) { should == MultipleMan.configuration.topic_name }
21
21
 
22
- end
22
+ end
@@ -25,20 +25,20 @@ describe MultipleMan::ModelPublisher do
25
25
  end
26
26
  end
27
27
 
28
- subject { described_class.new(:create, fields: [:foo]) }
28
+ subject { described_class.new(fields: [:foo]) }
29
29
 
30
- describe "after_commit" do
30
+ describe "publish" do
31
31
  it "should send the jsonified version of the model to the correct routing key" do
32
32
  MultipleMan::AttributeExtractor.any_instance.should_receive(:as_json).and_return({foo: "bar"})
33
33
  topic_stub.should_receive(:publish).with('{"id":"10","data":{"foo":"bar"}}', routing_key: "app.MockObject.create")
34
- described_class.new(:create, fields: [:foo]).after_commit(MockObject.new)
34
+ described_class.new(fields: [:foo]).publish(MockObject.new)
35
35
  end
36
36
 
37
37
  it "should call the error handler on error" do
38
38
  ex = Exception.new("Bad stuff happened")
39
39
  topic_stub.stub(:publish) { raise ex }
40
40
  MultipleMan.should_receive(:error).with(ex)
41
- described_class.new(:create, fields: [:foo]).after_commit(MockObject.new)
41
+ described_class.new(fields: [:foo]).publish(MockObject.new)
42
42
  end
43
43
  end
44
44
 
@@ -51,12 +51,12 @@ describe MultipleMan::ModelPublisher do
51
51
  end
52
52
  end
53
53
 
54
- subject { described_class.new(:create, with: MySerializer) }
54
+ subject { described_class.new(with: MySerializer) }
55
55
 
56
56
  it "should get its data from the serializer" do
57
57
  obj = MockObject.new
58
58
  topic_stub.should_receive(:publish).with('{"id":"10","data":{"a":"yes"}}', routing_key: "app.MockObject.create")
59
- subject.after_commit(obj)
59
+ subject.publish(obj)
60
60
  end
61
61
  end
62
62
 
@@ -5,7 +5,7 @@ describe MultipleMan::Publisher do
5
5
  class << self
6
6
  attr_accessor :subscriber
7
7
 
8
- def after_commit(subscriber, operation)
8
+ def after_commit(subscriber)
9
9
  self.subscriber = subscriber
10
10
  end
11
11
  end
@@ -13,15 +13,15 @@ describe MultipleMan::Publisher do
13
13
  include MultipleMan::Publisher
14
14
 
15
15
  def save
16
- self.class.subscriber.after_commit(self)
16
+ self.multiple_man_publish
17
17
  end
18
18
  end
19
19
 
20
20
  describe "including" do
21
21
  it "should add an after commit hook" do
22
22
  # once for each operation
23
- MockClass.should_receive(:after_commit).exactly(3).times
24
23
  MockClass.publish
24
+ MockClass.multiple_man_publisher.should be_kind_of MultipleMan::ModelPublisher
25
25
  end
26
26
  end
27
27
 
@@ -30,7 +30,7 @@ describe MultipleMan::Publisher do
30
30
  it "should tell ModelPublisher to publish" do
31
31
  my_mock = MockClass.new
32
32
  mock_publisher = double(MultipleMan::ModelPublisher)
33
- MultipleMan::ModelPublisher.any_instance.should_receive(:after_commit).with(my_mock)
33
+ MultipleMan::ModelPublisher.any_instance.should_receive(:publish).with(my_mock, :create)
34
34
  my_mock.save
35
35
  end
36
36
  end
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe MultipleMan::RoutingKey do
3
+ describe MultipleMan::RoutingKey do
4
4
  class MockObject
5
5
  end
6
6
 
@@ -28,6 +28,11 @@ describe MultipleMan::RoutingKey do
28
28
  it { should == "app.MockObject.destroy" }
29
29
  end
30
30
 
31
+ context "seeding" do
32
+ let(:operation) { :seed }
33
+ it { should == "app.seed.MockObject" }
34
+ end
35
+
31
36
  context "not specified" do
32
37
  subject { described_class.new("MockObject").to_s }
33
38
  it { should == "app.MockObject.#" }
@@ -51,4 +56,4 @@ describe MultipleMan::RoutingKey do
51
56
  end
52
57
 
53
58
  end
54
- end
59
+ end
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+
3
+ describe MultipleMan::SeederListener do
4
+ class MockClass1; end
5
+
6
+ let(:connection_stub) { double(MultipleMan::Connection, queue: queue_stub, topic: 'app') }
7
+ let(:queue_stub) { double(Bunny::Queue, bind: bind_stub) }
8
+ let(:bind_stub) { double(:bind, subscribe: nil)}
9
+
10
+ before { MultipleMan::Listener.stub(:connection).and_return(connection_stub) }
11
+
12
+ it 'listens to seed events' do
13
+ listener = described_class.new(double(MultipleMan::Subscribers::ModelSubscriber,
14
+ klass: MockClass1,
15
+ routing_key: "seed.MockClass1",
16
+ queue_name: "MockClass1"))
17
+
18
+ queue_stub.should_receive(:bind).with('app', routing_key: "seed.MockClass1")
19
+ listener.listen
20
+ end
21
+ end
@@ -14,4 +14,4 @@ describe MultipleMan::Subscribers::Base do
14
14
  end
15
15
  described_class.new(MockClass).queue_name.should == "app.test.MockClass"
16
16
  end
17
- end
17
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: multiple_man
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Brunner
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-24 00:00:00.000000000 Z
11
+ date: 2014-03-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -119,6 +119,7 @@ files:
119
119
  - lib/multiple_man/model_publisher.rb
120
120
  - lib/multiple_man/railtie.rb
121
121
  - lib/multiple_man/routing_key.rb
122
+ - lib/multiple_man/seeder_listener.rb
122
123
  - lib/multiple_man/subscribers/base.rb
123
124
  - lib/multiple_man/subscribers/model_subscriber.rb
124
125
  - lib/multiple_man/subscribers/registry.rb
@@ -134,6 +135,7 @@ files:
134
135
  - spec/model_publisher_spec.rb
135
136
  - spec/publisher_spec.rb
136
137
  - spec/routing_key_spec.rb
138
+ - spec/seeder_listener_spec.rb
137
139
  - spec/spec_helper.rb
138
140
  - spec/subscriber_spec.rb
139
141
  - spec/subscribers/base_spec.rb
@@ -173,6 +175,7 @@ test_files:
173
175
  - spec/model_publisher_spec.rb
174
176
  - spec/publisher_spec.rb
175
177
  - spec/routing_key_spec.rb
178
+ - spec/seeder_listener_spec.rb
176
179
  - spec/spec_helper.rb
177
180
  - spec/subscriber_spec.rb
178
181
  - spec/subscribers/base_spec.rb