mailgun-tracking 0.1.0 → 0.2.0

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: 9dca3bb2ecebb3b77835850e80c913df78b24c03
4
- data.tar.gz: 3b468bcfc59e17b6bbad6d92dbc5f7b57d7d2be9
3
+ metadata.gz: 87dcc660603620c0e746e9ed5cf5cc1584149ece
4
+ data.tar.gz: aad18416dca8c386cb96104c67a07512f847e84c
5
5
  SHA512:
6
- metadata.gz: eb8b9b8227712aea6e298118aa98a39d9b82590b611056aa56f914072183b55c98cf53e2f14ceec8215247a690bed332f0a2fbd2eda670cf462c13b75098fd6e
7
- data.tar.gz: 10652711a22a8d7c8fcee8404cc3dc4524e189cf0ea208211d7e43429bda35d831fb62a58349364d47d8afa8d97ce6c5506a012cb780cd1b0eeddd6fff9fb666
6
+ metadata.gz: d858782b928aa9b6e4ef1025c9614001f64ada0ac7a9fd42e37ddbe24b9f08ff2d1a94428a80f67dbb08bca0d853dfbb1d06fa06f5c6784a47df75335a09844e
7
+ data.tar.gz: 3fb5f7a36243749311a452ea220df5dcc1fea92ac9671f54febdb9d818f64f7ebdc47c812d7c75acbc930c336b790c236f1eb1de5b810f5025d5d0e805592d8b
@@ -1,8 +1,11 @@
1
1
  require 'mailgun/tracking/exceptions'
2
2
  require 'mailgun/tracking/listener'
3
- require 'mailgun/tracking/rack'
3
+ require 'mailgun/tracking/middleware'
4
+ require 'mailgun/tracking/notifier'
4
5
  require 'mailgun/tracking/signature'
6
+ require 'mailgun/tracking/subscriber'
5
7
  require 'mailgun/tracking/version'
8
+ require 'mailgun/tracking/railtie' if defined?(Rails)
6
9
 
7
10
  module Mailgun
8
11
  module Tracking
@@ -21,25 +24,8 @@ module Mailgun
21
24
 
22
25
  module_function
23
26
 
24
- def subscribe(event, &block)
25
- listener.add_subscriber(event, &block)
26
- end
27
-
28
- def broadcast(event, payload)
29
- Signature.verify!(payload)
30
- listener.broadcast(event, payload)
31
- end
32
-
33
- def clear_cached_variables
34
- @listener = nil
35
- end
36
-
37
- private
38
-
39
- module_function
40
-
41
- def listener
42
- @listener ||= Listener.new
27
+ def notifier
28
+ @notifier ||= Notifier.new
43
29
  end
44
30
  end
45
31
  end
@@ -4,15 +4,21 @@ module Mailgun
4
4
  attr_reader :subscribers
5
5
 
6
6
  def initialize
7
- @subscribers = Hash.new { |h, k| h[k] = [] }
7
+ @subscribers = []
8
8
  end
9
9
 
10
- def add_subscriber(event, &block)
11
- @subscribers[event.to_sym] << block
10
+ def add_subscriber(event, callable)
11
+ @subscribers << Subscriber.for(event, callable)
12
12
  end
13
13
 
14
14
  def broadcast(event, payload)
15
- @subscribers[event.to_sym].each { |subscriber| subscriber.call(payload) }
15
+ subscribers_for(event).each { |subscriber| subscriber.call(payload) }
16
+ end
17
+
18
+ private
19
+
20
+ def subscribers_for(event)
21
+ @subscribers.select { |subscriber| subscriber.subscribed_to?(event) }
16
22
  end
17
23
  end
18
24
  end
@@ -1,6 +1,6 @@
1
1
  module Mailgun
2
2
  module Tracking
3
- class Rack
3
+ class Middleware
4
4
  def initialize(app)
5
5
  @app = app
6
6
  end
@@ -9,7 +9,7 @@ module Mailgun
9
9
  @env = env
10
10
 
11
11
  if mailgun_tracking_request?
12
- Mailgun::Tracking.broadcast(request.params.fetch('event'), request.params)
12
+ Mailgun::Tracking.notifier.broadcast(request.params.fetch('event'), request.params)
13
13
  [200, {}, []]
14
14
  else
15
15
  @app.call(env)
@@ -0,0 +1,26 @@
1
+ module Mailgun
2
+ module Tracking
3
+ class Notifier
4
+ def initialize(listener = Listener.new)
5
+ @listener ||= listener
6
+ end
7
+
8
+ def subscribe(event, callable = Proc.new)
9
+ listener.add_subscriber(event, callable)
10
+ end
11
+
12
+ def all(callable = Proc.new)
13
+ listener.add_subscriber(nil, callable)
14
+ end
15
+
16
+ def broadcast(event, payload)
17
+ Signature.verify!(payload)
18
+ listener.broadcast(event, payload)
19
+ end
20
+
21
+ private
22
+
23
+ attr_reader :listener
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,9 @@
1
+ module Mailgun
2
+ module Tracking
3
+ class Railtie < Rails::Railtie
4
+ initializer 'mailgun-tracking.insert_middleware' do |app|
5
+ app.config.middleware.use(Mailgun::Tracking::Middleware)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,16 @@
1
+ require 'mailgun/tracking/subscriber/all_messages'
2
+ require 'mailgun/tracking/subscriber/evented'
3
+
4
+ module Mailgun
5
+ module Tracking
6
+ module Subscriber
7
+ def self.for(name, callable)
8
+ if name
9
+ Evented.new(name, callable)
10
+ else
11
+ AllMessages.new(callable)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,19 @@
1
+ module Mailgun
2
+ module Tracking
3
+ module Subscriber
4
+ class AllMessages
5
+ def initialize(callable)
6
+ @callable = callable
7
+ end
8
+
9
+ def call(payload)
10
+ @callable.call(payload)
11
+ end
12
+
13
+ def subscribed_to?(*)
14
+ true
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,20 @@
1
+ module Mailgun
2
+ module Tracking
3
+ module Subscriber
4
+ class Evented
5
+ def initialize(name, callable)
6
+ @name = name.to_sym
7
+ @callable = callable
8
+ end
9
+
10
+ def call(payload)
11
+ @callable.call(payload)
12
+ end
13
+
14
+ def subscribed_to?(name)
15
+ @name == name.to_sym
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -1,5 +1,5 @@
1
1
  module Mailgun
2
2
  module Tracking
3
- VERSION = '0.1.0'.freeze
3
+ VERSION = '0.2.0'.freeze
4
4
  end
5
5
  end
@@ -3,20 +3,23 @@ require 'spec_helper'
3
3
  RSpec.describe Mailgun::Tracking::Listener do
4
4
  subject(:listener) { described_class.new }
5
5
 
6
- let(:block) { proc {} }
6
+ let(:callable) { proc {} }
7
+ let(:subscriber) { instance_double(Mailgun::Tracking::Subscriber::Evented) }
7
8
 
8
9
  describe '#add_subscriber' do
10
+ before { allow(Mailgun::Tracking::Subscriber).to receive(:for).with(/delivered/, callable) { subscriber } }
11
+
9
12
  it 'adds subscriber' do
10
- expect { listener.add_subscriber(:delivered, &block) }.to change(listener, :subscribers)
11
- .from({})
12
- .to(delivered: [block])
13
+ expect { listener.add_subscriber(:delivered, callable) }.to change(listener, :subscribers)
14
+ .from([])
15
+ .to([subscriber])
13
16
  end
14
17
 
15
18
  it 'adds multiple subscribers with the same name' do
16
19
  expect do
17
- listener.add_subscriber(:delivered, &block)
18
- listener.add_subscriber('delivered', &block)
19
- end.to change(listener, :subscribers).from({}).to(delivered: [block, block])
20
+ listener.add_subscriber(:delivered, callable)
21
+ listener.add_subscriber('delivered', callable)
22
+ end.to change(listener, :subscribers).from([]).to([subscriber, subscriber])
20
23
  end
21
24
  end
22
25
 
@@ -24,19 +27,22 @@ RSpec.describe Mailgun::Tracking::Listener do
24
27
  let(:payload) { fixture('delivered.json') }
25
28
 
26
29
  before do
27
- allow(block).to receive(:call)
28
- listener.add_subscriber(:delivered, &block)
30
+ allow(subscriber).to receive(:call)
31
+ allow(subscriber).to receive(:subscribed_to?).with(/delivered/) { true }
32
+ allow(Mailgun::Tracking::Subscriber).to receive(:for).with(:delivered, callable) { subscriber }
33
+
34
+ listener.add_subscriber(:delivered, callable)
29
35
  end
30
36
 
31
- it 'executes block' do
37
+ it 'executes subscriber' do
32
38
  listener.broadcast(:delivered, payload)
33
- expect(block).to have_received(:call).with(payload)
39
+ expect(subscriber).to have_received(:call).with(payload)
34
40
  end
35
41
 
36
- it 'executes multiple blocks' do
37
- listener.add_subscriber(:delivered, &block)
42
+ it 'executes multiple subscribers' do
43
+ listener.add_subscriber(:delivered, callable)
38
44
  listener.broadcast('delivered', payload)
39
- expect(block).to have_received(:call).with(payload).twice
45
+ expect(subscriber).to have_received(:call).with(payload).twice
40
46
  end
41
47
  end
42
48
  end
@@ -1,14 +1,18 @@
1
1
  require 'spec_helper'
2
2
 
3
- RSpec.describe Mailgun::Tracking::Rack do
3
+ RSpec.describe Mailgun::Tracking::Middleware do
4
4
  subject(:rack) { described_class.new(app) }
5
5
 
6
6
  describe '#call' do
7
7
  let(:app) { proc { [200, {}, []] } }
8
8
  let(:payload) { fixture('delivered.json') }
9
9
  let(:code) { rack.call(env)[0] }
10
+ let(:notifier) { instance_double(Mailgun::Tracking::Notifier) }
10
11
 
11
- before { allow(Mailgun::Tracking).to receive(:broadcast) }
12
+ before do
13
+ allow(notifier).to receive(:broadcast)
14
+ allow(Mailgun::Tracking).to receive(:notifier) { notifier }
15
+ end
12
16
 
13
17
  context 'when a request to a endpoint with a POST method' do
14
18
  let(:env) { env_for('http://localhost:3000/mailgun', method: :post, params: payload) }
@@ -16,7 +20,7 @@ RSpec.describe Mailgun::Tracking::Rack do
16
20
  it { expect(code).to eq(200) }
17
21
  it do
18
22
  code
19
- expect(Mailgun::Tracking).to have_received(:broadcast).with('delivered', payload)
23
+ expect(notifier).to have_received(:broadcast).with('delivered', payload)
20
24
  end
21
25
  end
22
26
 
@@ -26,7 +30,7 @@ RSpec.describe Mailgun::Tracking::Rack do
26
30
  it { expect(code).to eq(200) }
27
31
  it do
28
32
  code
29
- expect(Mailgun::Tracking).not_to have_received(:broadcast)
33
+ expect(Mailgun::Tracking).not_to have_received(:notifier)
30
34
  end
31
35
  end
32
36
 
@@ -37,7 +41,7 @@ RSpec.describe Mailgun::Tracking::Rack do
37
41
  it { expect(code).to eq(200) }
38
42
  it do
39
43
  code
40
- expect(Mailgun::Tracking).not_to have_received(:broadcast)
44
+ expect(Mailgun::Tracking).not_to have_received(:notifier)
41
45
  end
42
46
  end
43
47
  end
@@ -0,0 +1,50 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Mailgun::Tracking::Notifier do
4
+ subject(:notifier) { described_class.new(listener) }
5
+
6
+ let(:listener) { instance_double(Mailgun::Tracking::Listener) }
7
+
8
+ describe '#subscribe' do
9
+ let(:callable) { proc {} }
10
+
11
+ before { allow(listener).to receive(:add_subscriber) }
12
+
13
+ it 'subscribes on event' do
14
+ notifier.subscribe(:delivered, callable)
15
+
16
+ expect(listener).to have_received(:add_subscriber)
17
+ .with(:delivered, callable)
18
+ end
19
+ end
20
+
21
+ describe '#all' do
22
+ let(:callable) { proc {} }
23
+
24
+ before { allow(listener).to receive(:add_subscriber) }
25
+
26
+ it 'subscribes on all events' do
27
+ notifier.all(callable)
28
+
29
+ expect(listener).to have_received(:add_subscriber).with(nil, callable)
30
+ end
31
+ end
32
+
33
+ describe '#broadcast' do
34
+ let(:payload) { fixture('delivered.json') }
35
+
36
+ before do
37
+ allow(Mailgun::Tracking::Signature).to receive(:verify!)
38
+ allow(listener).to receive(:broadcast)
39
+ notifier.broadcast(:delivered, payload)
40
+ end
41
+
42
+ it 'verify signature' do
43
+ expect(Mailgun::Tracking::Signature).to have_received(:verify!).with(payload)
44
+ end
45
+
46
+ it 'broadcasts an event' do
47
+ expect(listener).to have_received(:broadcast).with(:delivered, payload)
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Mailgun::Tracking::Subscriber::AllMessages do
4
+ subject(:subscriber) { described_class.new(callable) }
5
+
6
+ it_behaves_like :subscriber
7
+
8
+ describe '#subscribed_to?' do
9
+ let(:callable) { proc {} }
10
+
11
+ it { is_expected.to be_subscribed_to(:any_event) }
12
+ end
13
+ end
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Mailgun::Tracking::Subscriber::Evented do
4
+ subject(:subscriber) { described_class.new('delivered', callable) }
5
+
6
+ it_behaves_like :subscriber
7
+
8
+ describe '#subscribed_to?' do
9
+ let(:callable) { proc {} }
10
+
11
+ it { is_expected.to be_subscribed_to(:delivered) }
12
+ it { is_expected.not_to be_subscribed_to(:any_event) }
13
+ end
14
+ end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Mailgun::Tracking::Subscriber do
4
+ describe '.for' do
5
+ let(:callable) { proc {} }
6
+
7
+ it 'returns an instance of Mailgun::Tracking::Subscriber::AllMessages' do
8
+ expect(described_class.for(nil, callable)).to be_instance_of(Mailgun::Tracking::Subscriber::AllMessages)
9
+ end
10
+
11
+ it 'returns an instance of Mailgun::Tracking::Subscriber::Evented' do
12
+ expect(described_class.for('delivered', callable)).to be_instance_of(Mailgun::Tracking::Subscriber::Evented)
13
+ end
14
+ end
15
+ end
@@ -9,41 +9,9 @@ RSpec.describe Mailgun::Tracking do
9
9
  end
10
10
  end
11
11
 
12
- describe '.subscribe' do
13
- let(:listener) { instance_double(Mailgun::Tracking::Listener) }
14
-
15
- before do
16
- described_class.clear_cached_variables
17
- allow(listener).to receive(:add_subscriber)
18
- allow(Mailgun::Tracking::Listener).to receive(:new) { listener }
19
- end
20
-
21
- it 'subscribes on event' do
22
- described_class.subscribe(:delivered) {}
23
-
24
- expect(listener).to have_received(:add_subscriber)
25
- .with(:delivered)
26
- end
27
- end
28
-
29
- describe '.broadcast' do
30
- let(:payload) { fixture('delivered.json') }
31
- let(:listener) { instance_double(Mailgun::Tracking::Listener) }
32
-
33
- before do
34
- described_class.clear_cached_variables
35
- allow(Mailgun::Tracking::Signature).to receive(:verify!)
36
- allow(listener).to receive(:broadcast)
37
- allow(Mailgun::Tracking::Listener).to receive(:new) { listener }
38
- described_class.broadcast(:delivered, payload)
39
- end
40
-
41
- it 'verify signature' do
42
- expect(Mailgun::Tracking::Signature).to have_received(:verify!).with(payload)
43
- end
44
-
45
- it 'broadcasts an event' do
46
- expect(listener).to have_received(:broadcast).with(:delivered, payload)
12
+ describe '.notifier' do
13
+ it 'returns an instance of Mailgun::Tracking::Notifier' do
14
+ expect(described_class.notifier).to be_instance_of(Mailgun::Tracking::Notifier)
47
15
  end
48
16
  end
49
17
  end
@@ -5,6 +5,7 @@ require 'mailgun/tracking'
5
5
 
6
6
  require_relative 'support/fixture'
7
7
  require_relative 'support/rack_helpers'
8
+ require_relative 'support/shared_examples/subscriber'
8
9
 
9
10
  SimpleCov.start
10
11
 
@@ -1,14 +1,19 @@
1
1
  require 'json'
2
2
 
3
3
  class FixtureFinder
4
- FIXTURE_PATH = File.expand_path('../fixtures', __dir__)
5
-
6
4
  def initialize(file)
7
5
  @file = file
6
+ @fixture_path = File.expand_path('../fixtures', dir)
8
7
  end
9
8
 
10
9
  def find
11
- File.read(FIXTURE_PATH + '/' + @file)
10
+ File.read(@fixture_path + '/' + @file)
11
+ end
12
+
13
+ private
14
+
15
+ def dir
16
+ File.dirname(__FILE__)
12
17
  end
13
18
  end
14
19
 
@@ -0,0 +1,14 @@
1
+ RSpec.shared_examples :subscriber do
2
+ describe '#call' do
3
+ let(:callable) { proc {} }
4
+ let(:payload) { fixture('delivered.json') }
5
+
6
+ before { allow(callable).to receive(:call).with(payload) }
7
+
8
+ it 'calls the callable' do
9
+ subscriber.call(payload)
10
+
11
+ expect(callable).to have_received(:call).with(payload)
12
+ end
13
+ end
14
+ end
metadata CHANGED
@@ -1,16 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mailgun-tracking
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Artem Chubchenko
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-07-14 00:00:00.000000000 Z
11
+ date: 2017-07-16 00:00:00.000000000 Z
12
12
  dependencies: []
13
- description: Integration for Mailgun Webhooks
13
+ description: Integration with Mailgun Webhooks
14
14
  email:
15
15
  - artem.chubchenko@gmail.com
16
16
  executables: []
@@ -20,17 +20,27 @@ files:
20
20
  - lib/mailgun/tracking.rb
21
21
  - lib/mailgun/tracking/exceptions.rb
22
22
  - lib/mailgun/tracking/listener.rb
23
- - lib/mailgun/tracking/rack.rb
23
+ - lib/mailgun/tracking/middleware.rb
24
+ - lib/mailgun/tracking/notifier.rb
25
+ - lib/mailgun/tracking/railtie.rb
24
26
  - lib/mailgun/tracking/signature.rb
27
+ - lib/mailgun/tracking/subscriber.rb
28
+ - lib/mailgun/tracking/subscriber/all_messages.rb
29
+ - lib/mailgun/tracking/subscriber/evented.rb
25
30
  - lib/mailgun/tracking/version.rb
26
31
  - spec/fixtures/delivered.json
27
32
  - spec/mailgun/tracking/listener_spec.rb
28
- - spec/mailgun/tracking/rack_spec.rb
33
+ - spec/mailgun/tracking/middleware_spec.rb
34
+ - spec/mailgun/tracking/notifier_spec.rb
29
35
  - spec/mailgun/tracking/signature_spec.rb
36
+ - spec/mailgun/tracking/subscriber/all_messages_spec.rb
37
+ - spec/mailgun/tracking/subscriber/evented_spec.rb
38
+ - spec/mailgun/tracking/subscriber_spec.rb
30
39
  - spec/mailgun/tracking_spec.rb
31
40
  - spec/spec_helper.rb
32
41
  - spec/support/fixture.rb
33
42
  - spec/support/rack_helpers.rb
43
+ - spec/support/shared_examples/subscriber.rb
34
44
  homepage: https://github.com/chubchenko/mailgun-tracking
35
45
  licenses:
36
46
  - MIT
@@ -43,7 +53,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
43
53
  requirements:
44
54
  - - ">="
45
55
  - !ruby/object:Gem::Version
46
- version: 2.0.0
56
+ version: 1.9.3
47
57
  required_rubygems_version: !ruby/object:Gem::Requirement
48
58
  requirements:
49
59
  - - ">="
@@ -54,13 +64,18 @@ rubyforge_project:
54
64
  rubygems_version: 2.5.1
55
65
  signing_key:
56
66
  specification_version: 4
57
- summary: Integration for Mailgun Webhooks
67
+ summary: Integration with Mailgun Webhooks
58
68
  test_files:
59
69
  - spec/fixtures/delivered.json
60
70
  - spec/spec_helper.rb
61
71
  - spec/mailgun/tracking_spec.rb
62
72
  - spec/mailgun/tracking/listener_spec.rb
63
- - spec/mailgun/tracking/rack_spec.rb
73
+ - spec/mailgun/tracking/middleware_spec.rb
74
+ - spec/mailgun/tracking/notifier_spec.rb
75
+ - spec/mailgun/tracking/subscriber_spec.rb
64
76
  - spec/mailgun/tracking/signature_spec.rb
77
+ - spec/mailgun/tracking/subscriber/evented_spec.rb
78
+ - spec/mailgun/tracking/subscriber/all_messages_spec.rb
65
79
  - spec/support/fixture.rb
66
80
  - spec/support/rack_helpers.rb
81
+ - spec/support/shared_examples/subscriber.rb