rabbit_feed 2.1.1 → 2.1.2
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/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
|