pheromone 0.4.1 → 0.4.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: 211d951dfbe1c536f52a67b62951a53c5b0a4a16
4
- data.tar.gz: 816acb6f156832ce4a58bb5b2d74b27984a62aa7
3
+ metadata.gz: 63271f5d1308a9f022f2fa76e31ddf0f51e2bbaa
4
+ data.tar.gz: 8637f120bba37d51e1ce5ab52279f92b3f776a13
5
5
  SHA512:
6
- metadata.gz: 9f02b3dd53c379043284c215d7d839dacffd45630512cdddb51bd2b7383b47703b6eee40544dfd9549bd54ea649dd7977ef931e1880beab3341cd36ac0ab2995
7
- data.tar.gz: f70218da3b02dfacb19d6a3f65b6f96bad9eafd443fba65a0a65fdc2dd5d34f1a3e6176621c9d2d3e41eb75f39b91df223d74f79684f509849bac968abf04300
6
+ metadata.gz: 22adbaa1bf556272bf5ec71a10429a2f6e496ea051a2e64e659aa687f1c44706bd42668f4eaf965597e153ef79dfd07dc0c811383d0c46dadd9b30aaeafbed90
7
+ data.tar.gz: 089891f1c6bf466e5f6aa1c1f21697f0fe6fd2276886f8217656762fda2d50d6bc676fe6c232ce67323b2b992e1a3a1d131842217147cd1bdb46e4219376e817
data/README.md CHANGED
@@ -52,6 +52,7 @@ Edit this file to modify the default config. The following configuration options
52
52
  | background_processor.klass | String | Background processor class name that sends messages to kafka |
53
53
  | timezone_format | String | Valid timezone name for timestamps sent to kafka |
54
54
  | message_format | Symbol | Only supports :json format currently |
55
+ | enabled | Boolean | Defaults to true. When this is set to false, no messages will be sent to Kafka |
55
56
 
56
57
  The timezone setting will transform any timestamp attributes in the message to the specified format.
57
58
 
@@ -91,6 +92,7 @@ Create a new class and add the name under `Pheromone.config.background_processor
91
92
  def self.perform(message_object)
92
93
  Pheromone::Messaging::Message.new(
93
94
  topic: message_object['topic'],
95
+ metadata: { source: 'application1' },
94
96
  blob: message_object['blob'],
95
97
  metadata: message_object['metadata'],
96
98
  options: message_object['options']
@@ -126,6 +128,7 @@ class PublishableModel < ActiveRecord::Base
126
128
  {
127
129
  event_types: [:create],
128
130
  topic: :topic1,
131
+ metadata: { source: 'application1' },
129
132
  message: ->(obj) { { name: obj.name } }
130
133
  }
131
134
  ]
@@ -141,6 +144,7 @@ class PublishableModel < ActiveRecord::Base
141
144
  {
142
145
  event_types: [:update],
143
146
  topic: :topic1,
147
+ metadata: { source: 'application1' },
144
148
  message: ->(obj) { { name: obj.name } }
145
149
  }
146
150
  ]
@@ -160,6 +164,7 @@ class PublishableModel < ActiveRecord::Base
160
164
  {
161
165
  event_types: [:create],
162
166
  topic: :topic1,
167
+ metadata: { source: 'application1' },
163
168
  message: ->(obj) { { name: obj.name } }
164
169
  }
165
170
  ]
@@ -175,6 +180,7 @@ class PublishableModel < ActiveRecord::Base
175
180
  {
176
181
  event_types: [:update],
177
182
  topic: :topic1,
183
+ metadata: { source: 'application1' },
178
184
  message: message
179
185
  }
180
186
  ]
@@ -194,6 +200,7 @@ class PublishableModel < ActiveRecord::Base
194
200
  {
195
201
  event_types: [:create],
196
202
  topic: :topic1,
203
+ metadata: { source: 'application1' },
197
204
  serializer: Class.new(BaseSerializer) { attributes :name, :type }
198
205
  }
199
206
  ]
@@ -288,7 +295,30 @@ class PublishableModel < ActiveRecord::Base
288
295
  end
289
296
  ```
290
297
 
291
- ### 7. Sending messages to Kafka directly
298
+ ### 7. Specifying message metadata
299
+
300
+ These can be sent in by specifying `metadata` to the `publish` method:
301
+
302
+ ```
303
+ class PublishableModel < ActiveRecord::Base
304
+ include Pheromone::Publishable
305
+ publish [
306
+ {
307
+ event_types: [:create],
308
+ topic: :topic_test,
309
+ message: ->(obj) { { name: obj.name } },
310
+ metadata: { source: 'application1' },
311
+ producer_options: {
312
+ key: 'key',
313
+ partition: 1,
314
+ partition_key: 'key'
315
+ }
316
+ }
317
+ ]
318
+ end
319
+ ```
320
+
321
+ ### 8. Sending messages to Kafka directly
292
322
 
293
323
  `pheromone` provides a custom message object that sends messages to Kafka in a predefined format, to maintain consistency in the message fields.
294
324
 
@@ -325,6 +355,38 @@ end
325
355
 
326
356
  As seen above `timestamp` will be added automatically to the main attributes along with the message metadata. The actual message will be encapsulated inside a key called `blob`.
327
357
 
358
+ ## Testing
359
+
360
+ #### RSpec
361
+
362
+ `pheromone` makes it easy to control when it is enabled during testing with `pheromone/frameworks/rspec`
363
+
364
+ ```
365
+ # spec/rails_helper.rb
366
+ require 'rspec/rails'
367
+ # ...
368
+ require 'pheromone/frameworks/rspec'
369
+
370
+ ```
371
+
372
+ With this helper, `publishable` is disabled by default. To turn it on, pass `publishable: true` to the spec block like this:
373
+
374
+ ```
375
+ describe 'PublishableModel' do
376
+ before do
377
+ @invocation_count = 0
378
+ allow(WaterDrop::SyncProducer).to receive(:call) do
379
+ @invocation_count += 1
380
+ end
381
+
382
+ it 'sends messages to kafka', publishable: true do
383
+ PublishableModel.create
384
+ expect(@invocation_count).to eq(1)
385
+ end
386
+ end
387
+ ```
388
+
389
+
328
390
  ## Development
329
391
 
330
392
  After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -6,6 +6,7 @@ module Pheromone
6
6
  extend Dry::Configurable
7
7
  # accepts message format. Currently only accepts :json as the permitted value
8
8
  setting :message_format, :json
9
+ setting :enabled, true
9
10
  setting :background_processor do
10
11
  # accepts :sidekiq or :resque as a value
11
12
  setting :name
@@ -0,0 +1,11 @@
1
+ require 'rspec/core'
2
+
3
+ RSpec.configure do |config|
4
+ config.before(:each) do
5
+ Pheromone.config.enabled = false
6
+ end
7
+
8
+ config.before(:each, publishable: true) do
9
+ Pheromone.config.enabled = true
10
+ end
11
+ end
@@ -15,6 +15,7 @@ module Pheromone
15
15
  end
16
16
 
17
17
  def dispatch
18
+ return unless enabled?
18
19
  if @dispatch_method == :sync
19
20
  message.send!
20
21
  elsif @dispatch_method == :async
@@ -39,6 +40,10 @@ module Pheromone
39
40
  Message.new(message_body)
40
41
  end
41
42
 
43
+ def enabled?
44
+ Pheromone.config.enabled
45
+ end
46
+
42
47
  def message_body
43
48
  {
44
49
  topic: @message_parameters[:topic],
@@ -11,6 +11,7 @@
11
11
  # compression_threshold: 10,
12
12
  # required_acks: 1
13
13
  # }
14
+ # metadata: { source: 'application1' }
14
15
  # event_types: [:create, :update],
15
16
  # message: { a: 1, b: 2 }
16
17
  # dispatch_method: :async
@@ -30,6 +31,8 @@ require 'pheromone/validators/options_validator'
30
31
  require 'pheromone/exceptions/invalid_publish_options'
31
32
  require 'pheromone/method_invoker'
32
33
  require 'pheromone/messaging/message_dispatcher'
34
+ require 'pry'
35
+
33
36
  module Pheromone
34
37
  module Publishable
35
38
  # class methods for the model including Publishable
@@ -56,6 +59,7 @@ module Pheromone
56
59
  include Pheromone::MethodInvoker
57
60
 
58
61
  def dispatch_messages(message_options:, current_event:)
62
+ return unless enabled?
59
63
  message_options.each do |options|
60
64
  next unless check_conditions(options, current_event)
61
65
  send_message(options, current_event)
@@ -64,6 +68,10 @@ module Pheromone
64
68
 
65
69
  private
66
70
 
71
+ def enabled?
72
+ Pheromone.config.enabled
73
+ end
74
+
67
75
  def check_conditions(options, current_event)
68
76
  condition_callback = options[:if]
69
77
  result = check_event(options, current_event)
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Pheromone
3
- VERSION = '0.4.1'.freeze
3
+ VERSION = '0.4.2'.freeze
4
4
  end
data/lib/pheromone.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require 'pheromone/publishable'
2
2
  require 'pheromone/config'
3
3
  require 'pheromone/messaging/message'
4
+ require 'pheromone/frameworks/rspec'
4
5
  require 'rails/railtie'
5
6
  require 'waterdrop'
6
7
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pheromone
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ankita Gupta
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-01-25 00:00:00.000000000 Z
11
+ date: 2018-02-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: active_model_serializers
@@ -216,6 +216,7 @@ files:
216
216
  - lib/pheromone/config.rb
217
217
  - lib/pheromone/exceptions/invalid_publish_options.rb
218
218
  - lib/pheromone/exceptions/unsupported_message_format.rb
219
+ - lib/pheromone/frameworks/rspec.rb
219
220
  - lib/pheromone/messaging/message.rb
220
221
  - lib/pheromone/messaging/message_dispatcher.rb
221
222
  - lib/pheromone/messaging/message_formatter.rb