mailgun-tracking 0.1.0 → 0.2.0

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: 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