reactor 0.11.4 → 0.12.1
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.
- 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
|