philotic 1.0.2 → 1.0.3

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: 9801556e2c18c1147b0de999eeef96c1b3b00cf4
4
- data.tar.gz: d43caf8f1c8aa98e67aec1b0ed11edee9aea22e2
3
+ metadata.gz: 839559e1f390f9d5630b32dc07f3ed01c36156c5
4
+ data.tar.gz: 3e096414cf3ae1a59b30eeb9620a3832858dd44f
5
5
  SHA512:
6
- metadata.gz: 3acc57d92689ff4dd1de133e968c26d7321391aab11ff532a1cd3d997f483302ae7920f387cbb7dd351a10516ccee67c596375e485d3188f5feccdf4bf8ae0e0
7
- data.tar.gz: 2101fd35dceb87a98ef72e9327bec7497d271428bda282f8c7e58fc61dc2644362f5ebf293f847dd4b649bf58f7f340d94b2f2672bb45af6d5f85642c7e0680c
6
+ metadata.gz: fc124cc549906ae789b422d0fc65b6eb2575e0e349b420da051db9f6e387d534fa3450d36429871d41f6e88512e00e9563404b933f01dbc3818fd1688edeccc0
7
+ data.tar.gz: 69108c3e0b3d30839f61ffdd2c8bf6bf32ef8878e6781605b73eba9c0fc359dd990d3caca074ad7a59400bb8af52b54e502075d1f51361d68af6300445a476e3
@@ -3,6 +3,7 @@ require 'philotic/singleton'
3
3
 
4
4
  module Philotic
5
5
  class Message
6
+ NotInstantiableError = Class.new(RuntimeError)
6
7
 
7
8
  attr_accessor :connection, :publish_error, :delivery_info
8
9
  attr_writer :published
@@ -28,6 +29,7 @@ module Philotic
28
29
  end
29
30
 
30
31
  def initialize(routables={}, payloads={}, connection=nil)
32
+ raise NotInstantiableError if self.class == Philotic::Message
31
33
  self.timestamp = Time.now.to_i
32
34
  self.philotic_firehose = true
33
35
  self.connection = connection
@@ -71,7 +73,8 @@ module Philotic
71
73
  end
72
74
 
73
75
  def self.publish(*args)
74
- self.new(*args).publish
76
+ message_class = self == Philotic::Message ? Class.new(self) : self
77
+ message_class.new(*args).publish
75
78
  end
76
79
 
77
80
  def delivery_tag
@@ -101,6 +104,10 @@ module Philotic
101
104
 
102
105
  private
103
106
 
107
+ def _is_anonymous_message?
108
+ self.is_a?(Philotic::Message) && self.class.name.nil?
109
+ end
110
+
104
111
  def _payload_or_headers(payload_or_headers)
105
112
  attribute_hash = {}
106
113
  self.class.send("attr_#{payload_or_headers}_accessors").each do |attr|
@@ -114,7 +121,7 @@ module Philotic
114
121
  attrs.each do |key, value|
115
122
  if self.respond_to?(:"#{key}=")
116
123
  send(:"#{key}=", value)
117
- elsif self.class == Philotic::Message
124
+ elsif _is_anonymous_message?
118
125
  _set_message_attribute(type, key, value)
119
126
  end
120
127
  end
@@ -1,3 +1,3 @@
1
1
  module Philotic
2
- VERSION = '1.0.2'
2
+ VERSION = '1.0.3'
3
3
  end
@@ -11,6 +11,11 @@ class TestEvent < TestEventParent
11
11
  end
12
12
 
13
13
  describe Philotic::Message do
14
+
15
+ it 'is not instantiable' do
16
+ expect { Philotic::Message.new }.to raise_error(Philotic::Message::NotInstantiableError)
17
+ end
18
+
14
19
  let(:message) { TestEvent.new }
15
20
  subject { message }
16
21
 
@@ -39,15 +44,6 @@ describe Philotic::Message do
39
44
  expect(subject.metadata.keys).to eq([:timestamp])
40
45
  end
41
46
 
42
- context 'overriding a value with metadata=' do
43
- before do
44
- subject.metadata = {mandatory: false}
45
- end
46
- it 'should work' do
47
- expect(subject.metadata).to include({mandatory: false})
48
- end
49
- end
50
-
51
47
  Philotic::Message.methods.sort.each do |method_name|
52
48
  specify { expect(subject.class.methods).to include method_name.to_sym }
53
49
  end
@@ -63,6 +59,16 @@ describe Philotic::Message do
63
59
  end
64
60
 
65
61
  describe 'metadata' do
62
+
63
+ context 'overriding a value with metadata=' do
64
+ before do
65
+ subject.metadata = {mandatory: false}
66
+ end
67
+ it 'should work' do
68
+ expect(subject.metadata).to include({mandatory: false})
69
+ end
70
+ end
71
+
66
72
  it 'should have a timestamp' do
67
73
  Timecop.freeze
68
74
  expect(subject.metadata).to eq(timestamp: Time.now.to_i)
@@ -80,7 +86,7 @@ describe Philotic::Message do
80
86
  end
81
87
  end
82
88
 
83
- context 'generic message' do
89
+ describe 'generic messages' do
84
90
  let(:headers) do
85
91
  {
86
92
  header1: 'h1',
@@ -96,23 +102,105 @@ describe Philotic::Message do
96
102
  payload3: 'h3',
97
103
  }
98
104
  end
99
- it 'builds an message with dynamic headers and payloads' do
100
- message = Philotic::Message.new(headers, payloads)
101
105
 
102
- expect(message.headers).to include(headers)
103
- expect(message.payload).to eq payloads
106
+ describe 'publishing messages' do
107
+ let(:message_1_headers) { {message_1_header_1: 1, message_1_header_2: 2} }
108
+ let(:message_1_payload) { {message_1_payload_1: 1, message_1_payload_2: 2} }
109
+
110
+ let(:message_2_headers) { {message_2_header_1: 1, message_2_header_2: 2} }
111
+ let(:message_2_payload) { {message_2_payload_1: 1, message_2_payload_2: 2} }
112
+
113
+ it 'builds the proper routable accessors' do
114
+ expect(Philotic.connection).to receive(:publish) do |message|
115
+ expect(message.class.attr_routable_accessors).to include(*message_1_headers.keys)
116
+ end
117
+ Philotic::Message.publish message_1_headers, message_1_payload
118
+ end
119
+
120
+ it 'builds the proper payload accessors' do
121
+ expect(Philotic.connection).to receive(:publish) do |message|
122
+ expect(message.class.attr_payload_accessors).to include(*message_1_payload.keys)
123
+ end
124
+ Philotic::Message.publish message_1_headers, message_1_payload
125
+ end
126
+
127
+ it 'builds the proper headers' do
128
+ expect(Philotic.connection).to receive(:publish) do |message|
129
+ expect(message.headers).to include(message_1_headers)
130
+ end
131
+ Philotic::Message.publish message_1_headers, message_1_payload
132
+ end
133
+
134
+ it 'builds the proper payload' do
135
+ expect(Philotic.connection).to receive(:publish) do |message|
136
+ expect(message.payload).to include(message_1_payload)
137
+ end
138
+ Philotic::Message.publish message_1_headers, message_1_payload
139
+ end
140
+
141
+ describe 'in succession' do
142
+ it 'builds the proper routable accessors on succesive calls' do
143
+ allow(Philotic.connection).to receive(:publish)
144
+ Philotic::Message.publish message_1_headers, message_1_payload
145
+
146
+ expect(Philotic.connection).to receive(:publish) do |message|
147
+ expect(message.class.attr_routable_accessors).not_to include(*message_1_headers.keys)
148
+ expect(message.class.attr_routable_accessors).to include(*message_2_headers.keys)
149
+ end
150
+
151
+ Philotic::Message.publish message_2_headers, message_2_payload
152
+
153
+ end
154
+
155
+ it 'builds the proper payload accessors on succesive calls' do
156
+ allow(Philotic.connection).to receive(:publish)
157
+ Philotic::Message.publish message_1_headers, message_1_payload
158
+
159
+ expect(Philotic.connection).to receive(:publish) do |message|
160
+ expect(message.class.attr_payload_accessors).not_to include(*message_1_payload.keys)
161
+ expect(message.class.attr_payload_accessors).to include(*message_2_payload.keys)
162
+ end
163
+
164
+ Philotic::Message.publish message_2_headers, message_2_payload
165
+
166
+ end
104
167
 
168
+ it 'builds the proper headers on succesive calls' do
169
+ allow(Philotic.connection).to receive(:publish)
170
+ Philotic::Message.publish message_1_headers, message_1_payload
171
+
172
+ expect(Philotic.connection).to receive(:publish) do |message|
173
+ expect(message.headers).not_to include(message_1_headers)
174
+ expect(message.headers).to include(message_2_headers)
175
+ end
176
+
177
+ Philotic::Message.publish message_2_headers, message_2_payload
178
+
179
+ end
180
+
181
+ it 'builds the proper payload on succesive calls' do
182
+ allow(Philotic.connection).to receive(:publish)
183
+ Philotic::Message.publish message_1_headers, message_1_payload
184
+
185
+ expect(Philotic.connection).to receive(:publish) do |message|
186
+ expect(message.payload).not_to include(message_1_payload)
187
+ expect(message.payload).to include(message_2_payload)
188
+ end
189
+
190
+ Philotic::Message.publish message_2_headers, message_2_payload
191
+
192
+ end
193
+ end
105
194
  end
106
195
  end
107
196
 
108
197
  describe '#publish' do
109
- subject { Philotic::Message.new }
198
+ subject { Class.new(Philotic::Message).new }
110
199
  specify do
111
200
  expect(subject.connection).to receive(:publish).with(subject)
112
201
 
113
202
  subject.publish
114
203
  end
115
-
116
204
  end
117
205
 
118
206
  describe '.publish' do
@@ -92,7 +92,7 @@ describe Philotic::Subscriber do
92
92
  let(:channel) { double }
93
93
  let(:delivery_tag) { double }
94
94
  let(:delivery_info) { double }
95
- let(:message) { Philotic::Message.new }
95
+ let(:message) { Class.new(Philotic::Message).new }
96
96
  subject { Philotic::Connection.new.subscriber }
97
97
 
98
98
  specify do
@@ -108,7 +108,7 @@ describe Philotic::Subscriber do
108
108
  let(:channel) { double }
109
109
  let(:delivery_tag) { double }
110
110
  let(:delivery_info) { double }
111
- let(:message) { Philotic::Message.new }
111
+ let(:message) { Class.new(Philotic::Message).new }
112
112
  subject { Philotic::Connection.new.subscriber }
113
113
 
114
114
  specify do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: philotic
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nathan Keyes
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-06 00:00:00.000000000 Z
11
+ date: 2015-09-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: codeclimate-test-reporter
@@ -252,7 +252,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
252
252
  version: '0'
253
253
  requirements: []
254
254
  rubyforge_project:
255
- rubygems_version: 2.4.7
255
+ rubygems_version: 2.4.8
256
256
  signing_key:
257
257
  specification_version: 4
258
258
  summary: Lightweight, opinionated wrapper for using RabbitMQ headers exchanges