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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4628837f151f999235f99e08ec94cfb7d3de228c
4
- data.tar.gz: 5d6b69d02e1026fc83ab2cce50125d5700dc8689
3
+ metadata.gz: a254021c58185a15c29214a7361fca851d51ae4e
4
+ data.tar.gz: 63bddce1a50ec017cf59c61d21d77b5b36910242
5
5
  SHA512:
6
- metadata.gz: 96611f7a62e4d4c0a64f6fc3fb578676889f906ec90830a68c6e304d40ece011b9625e2956469b2923896d7090515c166199efbce70bce1e8e3cbeb1df70225a
7
- data.tar.gz: 9f4b31d15ba80d3c9c00abb564cec0b12a95b44be668f138ade602eaf8e63b8bafd1356db2e2875d77713fbb77c46c090576d0c8d5fedcf2e0b7b81babf5e609
6
+ metadata.gz: b68e75c49e38da3619904f7144509705d659d97627e3f9b57b4e106023e8ed635c60aaab19dd1496e78321379288c4bae9681ae1be68dacf3842ee72e9c72fe7
7
+ data.tar.gz: 58a49087c1cdda30bff123501fb5c8bb3a12f3bf68b9df3f316feb12bb8d67b1fd508a5a147b08e1d5fc26761c6edc4883974ed0f4911fb9b1a1150d431eb996
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rabbit_feed (2.1.1)
4
+ rabbit_feed (2.1.2)
5
5
  activemodel (>= 3.2.0, < 5.0.0)
6
6
  activesupport (>= 3.2.0, < 5.0.0)
7
7
  avro (>= 1.5.4, < 1.8.0)
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', git: 'git@github.com:simplybusiness/rabbit_feed.git'
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('user_created_beaver') do |event|
292
+ event('user_creates_beaver') do |event|
293
293
  puts event.payload
294
294
  end
295
- event('user_updated_beaver') do |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 `user_created_beaver` and `user_updated_beaver` events. If either event type is received, we have specified that its payload will be printed to the screen.
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.user_created_beaver
307
- environment.beavers.user_updated_beaver
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
 
@@ -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
 
@@ -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
@@ -1,3 +1,3 @@
1
1
  module RabbitFeed
2
- VERSION = '2.1.1'
2
+ VERSION = '2.1.2'
3
3
  end
@@ -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.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-03-23 00:00:00.000000000 Z
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.0.14
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