rabbit_feed 2.1.1 → 2.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +6 -6
- data/lib/rabbit_feed/event.rb +11 -2
- data/lib/rabbit_feed/event_definitions.rb +3 -1
- data/lib/rabbit_feed/producer.rb +1 -1
- data/lib/rabbit_feed/version.rb +1 -1
- data/spec/lib/rabbit_feed/event_definitions_spec.rb +3 -2
- data/spec/lib/rabbit_feed/event_spec.rb +59 -0
- data/spec/lib/rabbit_feed/producer_spec.rb +5 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a254021c58185a15c29214a7361fca851d51ae4e
|
4
|
+
data.tar.gz: 63bddce1a50ec017cf59c61d21d77b5b36910242
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b68e75c49e38da3619904f7144509705d659d97627e3f9b57b4e106023e8ed635c60aaab19dd1496e78321379288c4bae9681ae1be68dacf3842ee72e9c72fe7
|
7
|
+
data.tar.gz: 58a49087c1cdda30bff123501fb5c8bb3a12f3bf68b9df3f316feb12bb8d67b1fd508a5a147b08e1d5fc26761c6edc4883974ed0f4911fb9b1a1150d431eb996
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -16,7 +16,7 @@ A gem providing asynchronous event publish and subscribe capabilities with Rabbi
|
|
16
16
|
|
17
17
|
Add this line to your application's Gemfile:
|
18
18
|
|
19
|
-
gem 'rabbit_feed'
|
19
|
+
gem 'rabbit_feed'
|
20
20
|
|
21
21
|
### Configuration
|
22
22
|
|
@@ -289,22 +289,22 @@ Here is an example DSL:
|
|
289
289
|
```ruby
|
290
290
|
EventRouting do
|
291
291
|
accept_from('beavers') do
|
292
|
-
event('
|
292
|
+
event('user_creates_beaver') do |event|
|
293
293
|
puts event.payload
|
294
294
|
end
|
295
|
-
event('
|
295
|
+
event('user_updates_beaver') do |event|
|
296
296
|
puts event.payload
|
297
297
|
end
|
298
298
|
end
|
299
299
|
end
|
300
300
|
```
|
301
301
|
|
302
|
-
This will subscribe to specified events originating from the `beavers` application. We have specified that we would like to subcribe to `
|
302
|
+
This will subscribe to specified events originating from the `beavers` application. We have specified that we would like to subcribe to `user_creates_beaver` and `user_updates_beaver` events. If either event type is received, we have specified that its payload will be printed to the screen.
|
303
303
|
|
304
304
|
When the consumer is started, it will create its queue named using this pattern: `[environment].[consumer application name]`. It will bind the queue to the `amq.topic` exchange on the routing keys as defined in the event routing. In this example, it will bind on:
|
305
305
|
|
306
|
-
environment.beavers.
|
307
|
-
environment.beavers.
|
306
|
+
environment.beavers.user_creates_beaver
|
307
|
+
environment.beavers.user_updates_beaver
|
308
308
|
|
309
309
|
_Note: The consumer queues will automatically expire (delete) after 7 days without any consumer connections. This is to prevent unused queues from hanging around once their associated consumer has been terminated._
|
310
310
|
|
data/lib/rabbit_feed/event.rb
CHANGED
@@ -4,15 +4,16 @@ module RabbitFeed
|
|
4
4
|
|
5
5
|
SCHEMA_VERSION = '2.0.0'
|
6
6
|
|
7
|
-
attr_reader :schema, :payload, :metadata
|
7
|
+
attr_reader :schema, :payload, :metadata, :sensitive_fields
|
8
8
|
validates :metadata, presence: true
|
9
9
|
validates :payload, length: { minimum: 0, allow_nil: false, message: 'can\'t be nil' }
|
10
10
|
validate :required_metadata
|
11
11
|
|
12
|
-
def initialize metadata, payload={}, schema=nil
|
12
|
+
def initialize metadata, payload={}, schema=nil, sensitive_fields=[]
|
13
13
|
@schema = schema
|
14
14
|
@payload = payload.with_indifferent_access if payload
|
15
15
|
@metadata = metadata.with_indifferent_access if metadata
|
16
|
+
@sensitive_fields = Array(sensitive_fields).map(&:to_s).flatten
|
16
17
|
validate!
|
17
18
|
end
|
18
19
|
|
@@ -22,6 +23,8 @@ module RabbitFeed
|
|
22
23
|
writer << { 'metadata' => metadata, 'payload' => payload }
|
23
24
|
writer.close
|
24
25
|
buffer.string
|
26
|
+
rescue Avro::IO::AvroTypeError
|
27
|
+
raise Avro::IO::AvroTypeError.new(schema, sensitive_proof_payload)
|
25
28
|
end
|
26
29
|
|
27
30
|
def application
|
@@ -70,6 +73,12 @@ module RabbitFeed
|
|
70
73
|
|
71
74
|
private
|
72
75
|
|
76
|
+
def sensitive_proof_payload
|
77
|
+
sensitive_fields.each_with_object(payload.dup) do |field, clean_payload|
|
78
|
+
clean_payload[field] = "[REMOVED]" if clean_payload.key?(field)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
73
82
|
def validate!
|
74
83
|
raise Error.new "Invalid event: #{errors.messages}" if invalid?
|
75
84
|
end
|
@@ -28,7 +28,7 @@ module RabbitFeed
|
|
28
28
|
class Event
|
29
29
|
include ActiveModel::Validations
|
30
30
|
|
31
|
-
attr_reader :name, :definition, :version, :fields
|
31
|
+
attr_reader :name, :definition, :version, :fields, :sensitive_fields
|
32
32
|
validates_presence_of :name, :definition, :version
|
33
33
|
validate :schema_parseable
|
34
34
|
validates :version, format: { with: /\A\d+\.\d+\.\d+\z/, message: 'must be in *.*.* format' }
|
@@ -37,6 +37,7 @@ module RabbitFeed
|
|
37
37
|
@name = name
|
38
38
|
@version = version
|
39
39
|
@fields = []
|
40
|
+
@sensitive_fields = []
|
40
41
|
end
|
41
42
|
|
42
43
|
def payload_contains &block
|
@@ -44,6 +45,7 @@ module RabbitFeed
|
|
44
45
|
end
|
45
46
|
|
46
47
|
def field name, options
|
48
|
+
sensitive_fields << name.to_s if options.delete(:sensitive)
|
47
49
|
fields << (Field.new name, options[:type], options[:definition])
|
48
50
|
end
|
49
51
|
|
data/lib/rabbit_feed/producer.rb
CHANGED
@@ -9,7 +9,7 @@ module RabbitFeed
|
|
9
9
|
event_definition = event_definitions[name] or raise (Error.new "definition for event: #{name} not found")
|
10
10
|
timestamp = Time.now.utc
|
11
11
|
metadata = (metadata event_definition.version, name, timestamp)
|
12
|
-
event = Event.new metadata, payload, event_definition.schema
|
12
|
+
event = Event.new metadata, payload, event_definition.schema, event_definition.sensitive_fields
|
13
13
|
ProducerConnection.publish event.serialize, (options name, timestamp)
|
14
14
|
event
|
15
15
|
end
|
data/lib/rabbit_feed/version.rb
CHANGED
@@ -10,8 +10,8 @@ module RabbitFeed
|
|
10
10
|
end
|
11
11
|
payload_contains do
|
12
12
|
field('customer_id', type: 'string', definition: 'The definition of the customer id')
|
13
|
-
field('policy_id', type: 'string', definition: 'The definition of the policy id')
|
14
|
-
field('price', type: 'string', definition: 'The definition of the price')
|
13
|
+
field('policy_id', type: 'string', definition: 'The definition of the policy id', sensitive: true)
|
14
|
+
field('price', type: 'string', definition: 'The definition of the price', sensitive: true)
|
15
15
|
end
|
16
16
|
end
|
17
17
|
end
|
@@ -21,6 +21,7 @@ module RabbitFeed
|
|
21
21
|
it { should_not be_nil }
|
22
22
|
it { should be_valid }
|
23
23
|
its(:name) { should eq 'customer_purchases_policy' }
|
24
|
+
its(:sensitive_fields) { should match_array(['price', 'policy_id']) }
|
24
25
|
|
25
26
|
describe EventDefinitions::Event do
|
26
27
|
let(:name) { 'event_name' }
|
@@ -67,6 +67,65 @@ module RabbitFeed
|
|
67
67
|
end
|
68
68
|
end
|
69
69
|
|
70
|
+
describe '#serialize' do
|
71
|
+
let(:schema) do
|
72
|
+
Avro::Schema.parse(
|
73
|
+
{
|
74
|
+
name: 'example-1.0',
|
75
|
+
type: 'record',
|
76
|
+
fields: [
|
77
|
+
{
|
78
|
+
name: 'payload',
|
79
|
+
type: {
|
80
|
+
name: 'event_payload',
|
81
|
+
type: 'record',
|
82
|
+
fields: [
|
83
|
+
{ name: 'event_integer', type: 'int' },
|
84
|
+
{ name: 'event_string', type: 'string' },
|
85
|
+
],
|
86
|
+
},
|
87
|
+
},
|
88
|
+
{
|
89
|
+
name: 'metadata',
|
90
|
+
type: {
|
91
|
+
name: 'event_metadata',
|
92
|
+
type: 'record',
|
93
|
+
fields: [{ name: 'name', type: 'string' }],
|
94
|
+
},
|
95
|
+
},
|
96
|
+
],
|
97
|
+
}.to_json
|
98
|
+
)
|
99
|
+
end
|
100
|
+
|
101
|
+
context 'with invalid payload' do
|
102
|
+
let(:payload) { {
|
103
|
+
'event_string' => 'HIGHLY SENSITIVE',
|
104
|
+
'event_integer' => 'incorrect',
|
105
|
+
} }
|
106
|
+
|
107
|
+
it 'raises an Exception' do
|
108
|
+
expect {
|
109
|
+
subject.serialize
|
110
|
+
}.to raise_error(Avro::IO::AvroTypeError)
|
111
|
+
end
|
112
|
+
|
113
|
+
it 'can remove values from exception' do
|
114
|
+
event = described_class.new(metadata, payload, schema, ['event_string'])
|
115
|
+
exception_msg = nil
|
116
|
+
begin
|
117
|
+
event.serialize
|
118
|
+
rescue Avro::IO::AvroTypeError => e
|
119
|
+
exception_msg = e.message
|
120
|
+
end
|
121
|
+
expect(exception_msg).to_not be_nil
|
122
|
+
expect(exception_msg).to_not include("HIGHLY SENSITIVE")
|
123
|
+
expect(exception_msg).to include('"event_string"=>"[REMOVED]"')
|
124
|
+
expect(exception_msg).to include('"event_integer"=>"incorrect"')
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
70
129
|
describe '.deserialize' do
|
71
130
|
subject { described_class.deserialize serialized_event }
|
72
131
|
|
@@ -12,7 +12,7 @@ module RabbitFeed
|
|
12
12
|
'The definition of the event'
|
13
13
|
end
|
14
14
|
payload_contains do
|
15
|
-
field('field', type: 'string', definition: 'The definition of the field')
|
15
|
+
field('field', type: 'string', definition: 'The definition of the field', sensitive: true)
|
16
16
|
end
|
17
17
|
end
|
18
18
|
end
|
@@ -39,6 +39,10 @@ module RabbitFeed
|
|
39
39
|
expect(subject).to be_a Event
|
40
40
|
end
|
41
41
|
|
42
|
+
it 'sets the sensitive fields for the event' do
|
43
|
+
expect(subject.sensitive_fields).to match_array(['field'])
|
44
|
+
end
|
45
|
+
|
42
46
|
it 'sets the event metadata' do
|
43
47
|
Timecop.freeze(Time.local(1990)) do
|
44
48
|
expect(subject.metadata).to match({
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rabbit_feed
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.1.
|
4
|
+
version: 2.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Simply Business
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-05-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bunny
|
@@ -312,7 +312,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
312
312
|
version: '0'
|
313
313
|
requirements: []
|
314
314
|
rubyforge_project:
|
315
|
-
rubygems_version: 2.
|
315
|
+
rubygems_version: 2.4.6
|
316
316
|
signing_key:
|
317
317
|
specification_version: 4
|
318
318
|
summary: Enables your Ruby applications to perform centralized event logging with
|