multiple_man 0.1.4 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/multiple_man.rb +1 -1
- data/lib/multiple_man/attribute_extractor.rb +20 -5
- data/lib/multiple_man/configuration.rb +2 -1
- data/lib/multiple_man/model_publisher.rb +4 -1
- data/lib/multiple_man/model_subscriber.rb +7 -8
- data/lib/multiple_man/version.rb +1 -1
- data/spec/attribute_extractor_spec.rb +21 -5
- data/spec/model_publisher_spec.rb +6 -2
- data/spec/model_subscriber_spec.rb +4 -18
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9e1c4aa897f1db298c404d9f6d9a511d497f8ca1
|
4
|
+
data.tar.gz: 68d3af66452856d5683f3dd9893aa77216347bad
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fa34e065547d1e52973f77dd36d907054177a36a858311a91b576fed1405a4dc0d3173cf0384a0c600a190ada4a73b11bdd085bc5e487345b8a3ad799c19c621
|
7
|
+
data.tar.gz: 776d1610bdce6abdcc08af4dd730802ba5b34722ce07d9866acab98a50dcaa357987175d96f7c1b76c6a27a24df13aa2064c61e9a90e4277abda0fd7d541ceb9
|
data/lib/multiple_man.rb
CHANGED
@@ -3,17 +3,32 @@ require 'json'
|
|
3
3
|
module MultipleMan
|
4
4
|
class AttributeExtractor
|
5
5
|
|
6
|
-
def initialize(record, fields)
|
6
|
+
def initialize(record, fields, identifier)
|
7
7
|
raise "Fields must be specified" unless fields
|
8
8
|
|
9
9
|
self.record = record
|
10
10
|
self.fields = fields
|
11
|
+
self.identifier = identifier
|
11
12
|
end
|
12
13
|
|
13
14
|
def data
|
14
|
-
|
15
|
-
|
16
|
-
|
15
|
+
{
|
16
|
+
id: identifier_for_record,
|
17
|
+
data: Hash[fields.map do |field|
|
18
|
+
[field, record.send(field)]
|
19
|
+
end]
|
20
|
+
}
|
21
|
+
end
|
22
|
+
|
23
|
+
def identifier_for_record
|
24
|
+
puts identifier.class
|
25
|
+
if identifier.class == Symbol
|
26
|
+
record.send(identifier)
|
27
|
+
elsif identifier.class == Proc
|
28
|
+
identifier.call(record)
|
29
|
+
else
|
30
|
+
record.id
|
31
|
+
end
|
17
32
|
end
|
18
33
|
|
19
34
|
def to_json
|
@@ -22,7 +37,7 @@ module MultipleMan
|
|
22
37
|
|
23
38
|
private
|
24
39
|
|
25
|
-
attr_accessor :record, :fields
|
40
|
+
attr_accessor :record, :fields, :identifier
|
26
41
|
|
27
42
|
end
|
28
43
|
end
|
@@ -11,7 +11,8 @@ module MultipleMan
|
|
11
11
|
@logger ||= defined?(Rails) ? Rails.logger : Logger.new(STDOUT)
|
12
12
|
end
|
13
13
|
|
14
|
-
attr_accessor :topic_name, :app_name, :connection, :
|
14
|
+
attr_accessor :topic_name, :app_name, :connection, :enabled
|
15
|
+
attr_writer :logger
|
15
16
|
end
|
16
17
|
|
17
18
|
def self.configuration
|
@@ -27,13 +27,16 @@ module MultipleMan
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def record_data(record)
|
30
|
-
AttributeExtractor.new(record, fields).to_json
|
30
|
+
AttributeExtractor.new(record, fields, identifier).to_json
|
31
31
|
end
|
32
32
|
|
33
33
|
def fields
|
34
34
|
options[:fields]
|
35
35
|
end
|
36
36
|
|
37
|
+
def identifier
|
38
|
+
options[:identifier]
|
39
|
+
end
|
37
40
|
|
38
41
|
end
|
39
42
|
end
|
@@ -16,17 +16,16 @@ module MultipleMan
|
|
16
16
|
|
17
17
|
attr_reader :klass
|
18
18
|
|
19
|
-
def create(
|
20
|
-
model = find_model(
|
21
|
-
model.
|
22
|
-
model.attributes = data
|
19
|
+
def create(payload)
|
20
|
+
model = find_model(payload[:id])
|
21
|
+
model.attributes = payload[:data]
|
23
22
|
model.save!
|
24
23
|
end
|
25
24
|
|
26
25
|
alias_method :update, :create
|
27
26
|
|
28
|
-
def destroy(
|
29
|
-
model = find_model(
|
27
|
+
def destroy(payload)
|
28
|
+
model = find_model(payload[:id])
|
30
29
|
model.destroy!
|
31
30
|
end
|
32
31
|
|
@@ -40,8 +39,8 @@ module MultipleMan
|
|
40
39
|
|
41
40
|
private
|
42
41
|
|
43
|
-
def find_model(
|
44
|
-
klass.
|
42
|
+
def find_model(id)
|
43
|
+
klass.find_or_initialize_by(multiple_man_identifier: id)
|
45
44
|
end
|
46
45
|
|
47
46
|
attr_writer :klass
|
data/lib/multiple_man/version.rb
CHANGED
@@ -2,9 +2,11 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe MultipleMan::AttributeExtractor do
|
4
4
|
|
5
|
-
MockClass = Struct.new(:a, :b, :c)
|
6
|
-
let(:object) { MockClass.new(1,2,3) }
|
7
|
-
subject { described_class.new(object, fields) }
|
5
|
+
MockClass = Struct.new(:a, :b, :c, :id)
|
6
|
+
let(:object) { MockClass.new(1,2,3,10) }
|
7
|
+
subject { described_class.new(object, fields, identifier) }
|
8
|
+
let(:fields) { nil }
|
9
|
+
let(:identifier) { nil }
|
8
10
|
|
9
11
|
context "without fields" do
|
10
12
|
it "should not be allowed" do
|
@@ -14,8 +16,22 @@ describe MultipleMan::AttributeExtractor do
|
|
14
16
|
|
15
17
|
context "with fields" do
|
16
18
|
let(:fields) { [:a, :c] }
|
17
|
-
its(:data) { should == {a: 1, c: 3}}
|
18
|
-
its(:to_json) { should == '{"a":1,"c":3}'}
|
19
|
+
its(:data) { should == {id:10, data:{a: 1, c: 3}}}
|
20
|
+
its(:to_json) { should == '{"id":10,"data":{"a":1,"c":3}}'}
|
21
|
+
end
|
22
|
+
|
23
|
+
context "with an identifier" do
|
24
|
+
let(:fields) { [:a] }
|
25
|
+
context "symbol" do
|
26
|
+
let(:identifier) { :a }
|
27
|
+
its(:data) { should == {id:1, data:{a: 1}}}
|
28
|
+
its(:to_json) { should == '{"id":1,"data":{"a":1}}'}
|
29
|
+
end
|
30
|
+
context "proc" do
|
31
|
+
let(:identifier) { lambda{|record| record.b } }
|
32
|
+
its(:data) { should == {id:2, data:{a: 1}}}
|
33
|
+
its(:to_json) { should == '{"id":2,"data":{"a":1}}'}
|
34
|
+
end
|
19
35
|
end
|
20
36
|
|
21
37
|
end
|
@@ -17,6 +17,10 @@ describe MultipleMan::ModelPublisher do
|
|
17
17
|
"bar"
|
18
18
|
end
|
19
19
|
|
20
|
+
def id
|
21
|
+
10
|
22
|
+
end
|
23
|
+
|
20
24
|
def model_name
|
21
25
|
OpenStruct.new(singular: "mock_object")
|
22
26
|
end
|
@@ -30,8 +34,8 @@ describe MultipleMan::ModelPublisher do
|
|
30
34
|
described_class.new(:create, fields: [:foo]).after_commit(MockObject.new)
|
31
35
|
end
|
32
36
|
it "should send the jsonified version of the model to the correct routing key" do
|
33
|
-
MultipleMan::AttributeExtractor.any_instance.should_receive(:to_json).and_return('{"foo": "bar"}')
|
34
|
-
topic_stub.should_receive(:publish).with('{"foo": "bar"}', routing_key: "MockObject.create")
|
37
|
+
MultipleMan::AttributeExtractor.any_instance.should_receive(:to_json).and_return('{"id":10,"data":{"foo": "bar"}}')
|
38
|
+
topic_stub.should_receive(:publish).with('{"id":10,"data":{"foo": "bar"}}', routing_key: "MockObject.create")
|
35
39
|
described_class.new(:create, fields: [:foo]).after_commit(MockObject.new)
|
36
40
|
end
|
37
41
|
end
|
@@ -2,8 +2,7 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe MultipleMan::ModelSubscriber do
|
4
4
|
class MockClass
|
5
|
-
|
6
|
-
end
|
5
|
+
|
7
6
|
end
|
8
7
|
|
9
8
|
describe "register" do
|
@@ -16,31 +15,18 @@ describe MultipleMan::ModelSubscriber do
|
|
16
15
|
describe "create" do
|
17
16
|
it "should create a new model" do
|
18
17
|
mock_object = MockClass.new
|
19
|
-
MockClass.stub(:
|
20
|
-
mock_object.should_receive(:attributes=)
|
21
|
-
mock_object.should_receive(:remote_id=)
|
22
|
-
MockClass.should_receive(:new).and_return(mock_object)
|
23
|
-
mock_object.should_receive(:save!)
|
24
|
-
|
25
|
-
MultipleMan::ModelSubscriber.new(MockClass).create({a: 1, b: 2})
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
describe "update" do
|
30
|
-
it "should find an existing model and update it" do
|
31
|
-
mock_object = MockClass.new
|
32
|
-
MockClass.should_receive(:find_by_remote_id).and_return(mock_object)
|
18
|
+
MockClass.stub(:find_or_initialize_by).with(multiple_man_identifier: 5).and_return(mock_object)
|
33
19
|
mock_object.should_receive(:attributes=)
|
34
20
|
mock_object.should_receive(:save!)
|
35
21
|
|
36
|
-
MultipleMan::ModelSubscriber.new(MockClass).
|
22
|
+
MultipleMan::ModelSubscriber.new(MockClass).create({id: 5, data:{a: 1, b: 2}})
|
37
23
|
end
|
38
24
|
end
|
39
25
|
|
40
26
|
describe "destroy" do
|
41
27
|
it "should destroy the model" do
|
42
28
|
mock_object = MockClass.new
|
43
|
-
MockClass.should_receive(:
|
29
|
+
MockClass.should_receive(:find_or_initialize_by).and_return(mock_object)
|
44
30
|
mock_object.should_receive(:destroy!)
|
45
31
|
|
46
32
|
MultipleMan::ModelSubscriber.new(MockClass).destroy({id: 1})
|