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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6f2967da3845ee85524fe9c738839f0e6fdb29c7
4
- data.tar.gz: c0ed7956ea7c152528db44ec1c898c47415d1cb5
3
+ metadata.gz: a875645d8c1549921096a747103a1a7af62180c2
4
+ data.tar.gz: ce40f2f7f17011fe49e54f9a30587ea45c7be874
5
5
  SHA512:
6
- metadata.gz: a155ca4b6daf0250992a8e3a9a15f8b5a56ccab20a5e8c04ee80e26e19b234a4a9e486e5f6932bbb76226a7d3d3570235402a9eb9873175b0f4c398dc6788be7
7
- data.tar.gz: 106ba452f9d9a2b2623157738f271f20afee7a6df280e4f9971a071ff572361e60fae79e414329076a0d4233bce55b8a9e9f2c77b21057f916be4f473ed9ab60
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
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- reactor (0.11.2)
4
+ reactor (0.12.1)
5
5
  activerecord (< 5.0)
6
6
  sidekiq
7
7
 
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 :data
5
+ attr_accessor :__data__
6
6
 
7
7
  def initialize(data = {})
8
- self.data = {}.with_indifferent_access
8
+ self.__data__ = {}.with_indifferent_access
9
9
  data.each do |key, value|
10
- value = value.encode('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: '') if value.is_a?(String)
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.data
61
+ perform_at message.at, name, message.__data__
62
62
  else
63
- perform_async name, message.data
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
- data[method.to_s.gsub('=','')] = object
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 data.has_key?(method)
106
- data[method]
105
+ elsif __data__.has_key?(method)
106
+ __data__[method]
107
107
  end
108
108
  end
109
109
 
110
110
  def polymorphic_association?(method)
111
- data.has_key?("#{method}_type")
111
+ __data__.has_key?("#{method}_type")
112
112
  end
113
113
 
114
114
  def initialize_polymorphic_association(method)
115
- data["#{method}_type"].constantize.find(data["#{method}_id"])
115
+ __data__["#{method}_type"].constantize.find(__data__["#{method}_id"])
116
116
  end
117
117
 
118
118
  def fire_database_driven_subscribers(data, name)
@@ -1,3 +1,3 @@
1
1
  module Reactor
2
- VERSION = "0.11.4"
2
+ VERSION = "0.12.1"
3
3
  end
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 fallthrough' do
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.data[:simple]).to eq('key')
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 'data' do
172
- let(:serialized_event) { event.data }
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.11.4
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-03-28 00:00:00.000000000 Z
14
+ date: 2016-04-12 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: sidekiq