reactor 0.11.4 → 0.12.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Changes.md +11 -0
- data/Gemfile.lock +1 -1
- data/lib/reactor/event.rb +10 -10
- data/lib/reactor/version.rb +1 -1
- data/spec/event_spec.rb +39 -4
- data/spec/models/concerns/subscribable_spec.rb +0 -6
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a875645d8c1549921096a747103a1a7af62180c2
|
4
|
+
data.tar.gz: ce40f2f7f17011fe49e54f9a30587ea45c7be874
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f8e4d71a75a7d579950253820e1eb50e41525d10313f446a778e1c09bd39053cb6c97a0e478b1b47c2a4f190979101e5a1a770c96dcea5474d3fa585f14131ed
|
7
|
+
data.tar.gz: 55489b1ddc957731b19060258d2f916e4ddda221558f715dc150db902cde93329f5798acb4085f637d2ef48437cb39c76ddd84f308e45a26754365afadaf43a2
|
data/Changes.md
CHANGED
@@ -1,5 +1,16 @@
|
|
1
1
|
# Reactor Change Log
|
2
2
|
|
3
|
+
0.12.1
|
4
|
+
-----------
|
5
|
+
Fix unicode encoding protection to allow valid multi-byte unicode characters
|
6
|
+
|
7
|
+
0.12.0
|
8
|
+
-----------
|
9
|
+
Use `__data__` as the internal data hash. THIS _MAY BE_ A BREAKING CHANGE.
|
10
|
+
|
11
|
+
If someone wants to use the key `data` for their event attributes, it would get confused with the internal event data. The internal event data is now called `__data__`.
|
12
|
+
Some users of this library access event.data directly. This is a breaking change for them.
|
13
|
+
|
3
14
|
0.11.4
|
4
15
|
-----------
|
5
16
|
Fixes an issue related to class reloading in Rails development and test modes
|
data/Gemfile.lock
CHANGED
data/lib/reactor/event.rb
CHANGED
@@ -2,12 +2,12 @@ class Reactor::Event
|
|
2
2
|
include Reactor::OptionallySubclassable
|
3
3
|
include Sidekiq::Worker
|
4
4
|
|
5
|
-
attr_accessor :
|
5
|
+
attr_accessor :__data__
|
6
6
|
|
7
7
|
def initialize(data = {})
|
8
|
-
self.
|
8
|
+
self.__data__ = {}.with_indifferent_access
|
9
9
|
data.each do |key, value|
|
10
|
-
value = value.encode('UTF-8',
|
10
|
+
value = value.encode('UTF-8', invalid: :replace, undef: :replace, replace: '') if value.is_a?(String)
|
11
11
|
self.send("#{key}=", value)
|
12
12
|
end
|
13
13
|
end
|
@@ -58,9 +58,9 @@ class Reactor::Event
|
|
58
58
|
message = new(data.merge(event: name, uuid: SecureRandom.uuid))
|
59
59
|
|
60
60
|
if message.at
|
61
|
-
perform_at message.at, name, message.
|
61
|
+
perform_at message.at, name, message.__data__
|
62
62
|
else
|
63
|
-
perform_async name, message.
|
63
|
+
perform_async name, message.__data__
|
64
64
|
end
|
65
65
|
end
|
66
66
|
|
@@ -95,24 +95,24 @@ class Reactor::Event
|
|
95
95
|
send("#{method}_id", object.id)
|
96
96
|
send("#{method}_type", object.class.to_s)
|
97
97
|
else
|
98
|
-
|
98
|
+
__data__[method.to_s.gsub('=','')] = object
|
99
99
|
end
|
100
100
|
end
|
101
101
|
|
102
102
|
def try_getter(method)
|
103
103
|
if polymorphic_association? method
|
104
104
|
initialize_polymorphic_association method
|
105
|
-
elsif
|
106
|
-
|
105
|
+
elsif __data__.has_key?(method)
|
106
|
+
__data__[method]
|
107
107
|
end
|
108
108
|
end
|
109
109
|
|
110
110
|
def polymorphic_association?(method)
|
111
|
-
|
111
|
+
__data__.has_key?("#{method}_type")
|
112
112
|
end
|
113
113
|
|
114
114
|
def initialize_polymorphic_association(method)
|
115
|
-
|
115
|
+
__data__["#{method}_type"].constantize.find(__data__["#{method}_id"])
|
116
116
|
end
|
117
117
|
|
118
118
|
def fire_database_driven_subscribers(data, name)
|
data/lib/reactor/version.rb
CHANGED
data/spec/event_spec.rb
CHANGED
@@ -29,6 +29,23 @@ describe Reactor::Event do
|
|
29
29
|
let(:model) { ArbitraryModel.create! }
|
30
30
|
let(:event_name) { :user_did_this }
|
31
31
|
|
32
|
+
describe 'encoding' do
|
33
|
+
let(:event) { Reactor::Event.new(thing_one: "\xAD", thing_two: "\xAB", money: "£900", emoji: "\u{1f4a9}") }
|
34
|
+
|
35
|
+
it 'strips bad characters' do
|
36
|
+
expect(event.thing_one).to eq('')
|
37
|
+
expect(event.thing_two).to eq('')
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'allows valid multibyte UTF8' do
|
41
|
+
expect(event.money).to eq('£900')
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'allows astral plane characters' do
|
45
|
+
expect(event.emoji).to eq("\u{1f4a9}")
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
32
49
|
describe 'publish' do
|
33
50
|
let!(:uuid) { 'uuid' }
|
34
51
|
before { allow(SecureRandom).to receive(:uuid).and_return(uuid) }
|
@@ -140,7 +157,7 @@ describe Reactor::Event do
|
|
140
157
|
let(:event_data) { {random: 'data', pet_id: cat.id, pet_type: cat.class.to_s, arbitrary_model: arbitrary_model } }
|
141
158
|
let(:event) { Reactor::Event.new(event_data) }
|
142
159
|
|
143
|
-
describe 'data key
|
160
|
+
describe 'data key interaction with internals' do
|
144
161
|
subject { event }
|
145
162
|
|
146
163
|
describe 'getters' do
|
@@ -152,12 +169,30 @@ describe Reactor::Event do
|
|
152
169
|
its(:pet) { is_expected.to be_a MyModule::Cat }
|
153
170
|
its('pet.id') { is_expected.to eq(MyModule::Cat.last.id) }
|
154
171
|
end
|
172
|
+
|
173
|
+
context 'accessing the internal __data__' do
|
174
|
+
its(:__data__) do
|
175
|
+
is_expected.to eq ({
|
176
|
+
'random' => 'data',
|
177
|
+
'pet_id' => cat.id,
|
178
|
+
'pet_type' => 'MyModule::Cat',
|
179
|
+
'arbitrary_model_id' => arbitrary_model.id,
|
180
|
+
'arbitrary_model_type' => arbitrary_model.class.name
|
181
|
+
})
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
context 'a key named "data"' do
|
186
|
+
let(:event_data) { {random: 'data', data: 'info' } }
|
187
|
+
its(:random) { is_expected.to eq('data') }
|
188
|
+
its(:data) { is_expected.to eq 'info' }
|
189
|
+
end
|
155
190
|
end
|
156
191
|
|
157
192
|
describe 'setters' do
|
158
193
|
it 'sets simple keys' do
|
159
194
|
event.simple = 'key'
|
160
|
-
expect(event.
|
195
|
+
expect(event.__data__[:simple]).to eq('key')
|
161
196
|
end
|
162
197
|
|
163
198
|
it 'sets active_record polymorphic keys' do
|
@@ -168,8 +203,8 @@ describe Reactor::Event do
|
|
168
203
|
end
|
169
204
|
end
|
170
205
|
|
171
|
-
describe '
|
172
|
-
let(:serialized_event) { event.
|
206
|
+
describe '__data__' do
|
207
|
+
let(:serialized_event) { event.__data__ }
|
173
208
|
specify { expect(serialized_event).to be_a Hash }
|
174
209
|
specify { expect(serialized_event[:random]).to eq('data') }
|
175
210
|
end
|
@@ -51,12 +51,6 @@ describe Reactor::Subscribable do
|
|
51
51
|
Reactor::Event.publish(:bid_made, target: Auction.create!(start_at: 10.minutes.from_now))
|
52
52
|
end
|
53
53
|
|
54
|
-
it 'protects against bad unicode characters in event attributes' do
|
55
|
-
expect {
|
56
|
-
Reactor::Event.publish(:bad_unicode, thing_one: "\xAD", thing_two: "\xAB" )
|
57
|
-
}.to_not raise_error
|
58
|
-
end
|
59
|
-
|
60
54
|
describe 'building uniquely named subscriber handler classes' do
|
61
55
|
it 'adds a static subscriber to the global lookup constant' do
|
62
56
|
expect(Reactor::SUBSCRIBERS['puppy_delivered'][0]).to eq(Reactor::StaticSubscribers::Auction::PuppyDeliveredHandler)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: reactor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.12.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- winfred
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2016-
|
14
|
+
date: 2016-04-12 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: sidekiq
|