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 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