sendgrid_events 0.0.1
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.
- data/.gitignore +6 -0
- data/.rspec +2 -0
- data/.rvmrc +5 -0
- data/.travis.yml +4 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +141 -0
- data/MIT-LICENSE +20 -0
- data/README.md +33 -0
- data/Rakefile +13 -0
- data/app/controllers/sendgrid_events/sendgrid_events_controller.rb +8 -0
- data/app/models/sendgrid_events/sendgrid_email_record.rb +14 -0
- data/lib/generators/sendgrid_events/install/templates/initializer.rb +5 -0
- data/lib/generators/sendgrid_events/install/templates/routes.rb +2 -0
- data/lib/generators/sendgrid_events/install/templates/sendgrid_events_table.rb +16 -0
- data/lib/generators/sendgrid_events/install_generator.rb +34 -0
- data/lib/sendgrid_events.rb +8 -0
- data/lib/sendgrid_events/action_mailer_override.rb +23 -0
- data/lib/sendgrid_events/configure.rb +23 -0
- data/lib/sendgrid_events/engine.rb +12 -0
- data/lib/sendgrid_events/handlers.rb +3 -0
- data/lib/sendgrid_events/handlers/base.rb +50 -0
- data/lib/sendgrid_events/handlers/bounced.rb +7 -0
- data/lib/sendgrid_events/handlers/clicked.rb +7 -0
- data/lib/sendgrid_events/handlers/deferred.rb +7 -0
- data/lib/sendgrid_events/handlers/delivered.rb +10 -0
- data/lib/sendgrid_events/handlers/dispatch.rb +34 -0
- data/lib/sendgrid_events/handlers/dropped.rb +7 -0
- data/lib/sendgrid_events/handlers/opened.rb +7 -0
- data/lib/sendgrid_events/handlers/processed.rb +7 -0
- data/lib/sendgrid_events/handlers/spam_reported.rb +7 -0
- data/lib/sendgrid_events/handlers/unsubscribed.rb +7 -0
- data/lib/sendgrid_events/receiver.rb +18 -0
- data/lib/sendgrid_events/version.rb +3 -0
- data/script/rails +8 -0
- data/sendgrid_events.gemspec +28 -0
- data/spec/sendgrid_events/handlers/base_spec.rb +47 -0
- data/spec/sendgrid_events/handlers/bounced_spec.rb +31 -0
- data/spec/sendgrid_events/handlers/clicked_spec.rb +31 -0
- data/spec/sendgrid_events/handlers/deferred_spec.rb +31 -0
- data/spec/sendgrid_events/handlers/delivered_spec.rb +31 -0
- data/spec/sendgrid_events/handlers/dispatch_spec.rb +8 -0
- data/spec/sendgrid_events/handlers/dropped_spec.rb +31 -0
- data/spec/sendgrid_events/handlers/opened_spec.rb +31 -0
- data/spec/sendgrid_events/handlers/processed_spec.rb +31 -0
- data/spec/sendgrid_events/handlers/spam_reported_spec.rb +31 -0
- data/spec/sendgrid_events/handlers/unsubscribed_spec.rb +31 -0
- data/spec/sendgrid_events/receiver_spec.rb +32 -0
- data/spec/spec_helper.rb +39 -0
- metadata +272 -0
@@ -0,0 +1,34 @@
|
|
1
|
+
module SendgridEvents
|
2
|
+
module Handlers
|
3
|
+
class Dispatch
|
4
|
+
class << self
|
5
|
+
attr_accessor :registered_handlers, :selected_handlers
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.registered_handlers
|
9
|
+
@registered_handlers ||= {}
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.acceptable_handlers
|
13
|
+
@acceptable_handlers ||= begin
|
14
|
+
array = %w[processed
|
15
|
+
deferred
|
16
|
+
delivered
|
17
|
+
open
|
18
|
+
click
|
19
|
+
bounce
|
20
|
+
dropped
|
21
|
+
spamreport
|
22
|
+
unsubscribe
|
23
|
+
]
|
24
|
+
Hash[array.zip([true] * array.size)].symbolize_keys
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.selected_handlers=(handler_list)
|
29
|
+
raise ArgumentError, "Found an unaccetable handler" unless handler_list.all? { |x| acceptable_handlers[x.to_sym] }
|
30
|
+
@selected_handlers = Hash[handler_list.zip([true] * handler_list.size)].symbolize_keys
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module SendgridEvents
|
2
|
+
class Receiver
|
3
|
+
def self.receive(params)
|
4
|
+
if Configure.receive?
|
5
|
+
extract_events_and_clean(params).each do |event|
|
6
|
+
Handlers::Base.choose_and_handle event
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
def self.extract_events_and_clean(params)
|
13
|
+
params.first.first.split("\n").collect do |json_hash|
|
14
|
+
JSON.parse(json_hash).symbolize_keys
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/script/rails
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
|
3
|
+
|
4
|
+
ENGINE_ROOT = File.expand_path('../..', __FILE__)
|
5
|
+
ENGINE_PATH = File.expand_path('../../lib/sendgrid_events/engine', __FILE__)
|
6
|
+
|
7
|
+
require 'rails/all'
|
8
|
+
require 'rails/engine/commands'
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/sendgrid_events/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["Jon Phenow"]
|
6
|
+
gem.email = ["jon.phenow@tstmedia.com"]
|
7
|
+
gem.description = %q{}
|
8
|
+
gem.summary = %q{}
|
9
|
+
gem.homepage = ""
|
10
|
+
|
11
|
+
gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
12
|
+
gem.files = `git ls-files`.split("\n")
|
13
|
+
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
14
|
+
gem.name = "sendgrid_events"
|
15
|
+
gem.version = SendgridEvents::VERSION
|
16
|
+
|
17
|
+
gem.add_development_dependency 'rake'
|
18
|
+
gem.add_development_dependency 'awesome_print'
|
19
|
+
gem.add_development_dependency 'rspec-rails', '~> 2.6'
|
20
|
+
gem.add_development_dependency 'capybara'
|
21
|
+
gem.add_development_dependency 'rails', '~> 3.0.15'
|
22
|
+
gem.add_development_dependency 'factory_girl_rails', '~> 1.7'
|
23
|
+
gem.add_development_dependency 'sqlite3'
|
24
|
+
|
25
|
+
gem.add_dependency 'rails', '~> 3.0.15'
|
26
|
+
gem.add_dependency 'sendgrid'
|
27
|
+
gem.add_dependency 'enumerated_field'
|
28
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module SendgridEvents
|
3
|
+
module Handlers
|
4
|
+
describe Base do
|
5
|
+
subject { Base }
|
6
|
+
it { should respond_to(:handle) }
|
7
|
+
it { should_not respond_to(:handlee) }
|
8
|
+
it { should respond_to(:registered_handlers) }
|
9
|
+
it { should respond_to(:selected_handlers) }
|
10
|
+
it { should respond_to(:choose_and_handle) }
|
11
|
+
it { should respond_to(:register_as_handler_for) }
|
12
|
+
let(:event) { {
|
13
|
+
:email => "foo@bar.com",
|
14
|
+
:timestamp => 1322000095,
|
15
|
+
:sendgrid_events_id => '7',
|
16
|
+
:event => "delivered"
|
17
|
+
} }
|
18
|
+
|
19
|
+
it "returns the list of handlers" do
|
20
|
+
subject.registered_handlers.symbolize_keys.keys.sort.should == Dispatch.acceptable_handlers.keys.sort
|
21
|
+
end
|
22
|
+
|
23
|
+
it "chose a handler if handler is registered" do
|
24
|
+
subject.stub(:selected_handlers).and_return({ "delivered" => true })
|
25
|
+
Delivered.should_receive(:handle).with(event)
|
26
|
+
subject.choose_and_handle(event)
|
27
|
+
end
|
28
|
+
|
29
|
+
it "doesn't handle a non-selected handler" do
|
30
|
+
subject.stub(:selected_handlers).and_return({})
|
31
|
+
Delivered.should_not_receive(:handle).with(event)
|
32
|
+
subject.choose_and_handle(event)
|
33
|
+
end
|
34
|
+
|
35
|
+
it "doesn't handle a non-registered handler" do
|
36
|
+
subject.stub(:selected_handlers).and_return({ "delivered" => true })
|
37
|
+
subject.stub(:registered_handlers).and_return({})
|
38
|
+
Delivered.should_not_receive(:handle).with(event)
|
39
|
+
subject.choose_and_handle(event)
|
40
|
+
end
|
41
|
+
|
42
|
+
it "doesn't regitser a new handle with unacceptable handle" do
|
43
|
+
expect { subject.register_as_handler_for(:winning) }.to raise_error(ArgumentError)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module SendgridEvents
|
3
|
+
module Handlers
|
4
|
+
describe Bounced do
|
5
|
+
subject { Bounced }
|
6
|
+
it { should respond_to(:handle) }
|
7
|
+
it { should respond_to(:handlee) }
|
8
|
+
let(:event) { {
|
9
|
+
:email => "foo@bar.com",
|
10
|
+
:timestamp => 1322000095,
|
11
|
+
:sendgrid_events_id => '7',
|
12
|
+
:event => "bounce"
|
13
|
+
} }
|
14
|
+
|
15
|
+
it "updates event, but doesn't call handler without one set" do
|
16
|
+
subject.should_receive(:find_and_update_event).with(event).once
|
17
|
+
subject.should_receive(:handler).never
|
18
|
+
subject.handle(event)
|
19
|
+
end
|
20
|
+
|
21
|
+
it "updates event, but doesn't call handler without one set" do
|
22
|
+
subject.handler do
|
23
|
+
true
|
24
|
+
end
|
25
|
+
subject.stub(:find_and_update_event => true)
|
26
|
+
subject.should_receive(:handler).once
|
27
|
+
subject.handle(event)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module SendgridEvents
|
3
|
+
module Handlers
|
4
|
+
describe Clicked do
|
5
|
+
subject { Clicked }
|
6
|
+
it { should respond_to(:handle) }
|
7
|
+
it { should respond_to(:handlee) }
|
8
|
+
let(:event) { {
|
9
|
+
:email => "foo@bar.com",
|
10
|
+
:timestamp => 1322000095,
|
11
|
+
:sendgrid_events_id => '7',
|
12
|
+
:event => "click"
|
13
|
+
} }
|
14
|
+
|
15
|
+
it "updates event, but doesn't call handler without one set" do
|
16
|
+
subject.should_receive(:find_and_update_event).with(event).once
|
17
|
+
subject.should_receive(:handler).never
|
18
|
+
subject.handle(event)
|
19
|
+
end
|
20
|
+
|
21
|
+
it "updates event, but doesn't call handler without one set" do
|
22
|
+
subject.handler do
|
23
|
+
true
|
24
|
+
end
|
25
|
+
subject.stub(:find_and_update_event => true)
|
26
|
+
subject.should_receive(:handler).once
|
27
|
+
subject.handle(event)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module SendgridEvents
|
3
|
+
module Handlers
|
4
|
+
describe Deferred do
|
5
|
+
subject { Deferred }
|
6
|
+
it { should respond_to(:handle) }
|
7
|
+
it { should respond_to(:handlee) }
|
8
|
+
let(:event) { {
|
9
|
+
:email => "foo@bar.com",
|
10
|
+
:timestamp => 1322000095,
|
11
|
+
:sendgrid_events_id => '7',
|
12
|
+
:event => "deferred"
|
13
|
+
} }
|
14
|
+
|
15
|
+
it "updates event, but doesn't call handler without one set" do
|
16
|
+
subject.should_receive(:find_and_update_event).with(event).once
|
17
|
+
subject.should_receive(:handler).never
|
18
|
+
subject.handle(event)
|
19
|
+
end
|
20
|
+
|
21
|
+
it "updates event, but doesn't call handler without one set" do
|
22
|
+
subject.handler do
|
23
|
+
true
|
24
|
+
end
|
25
|
+
subject.stub(:find_and_update_event => true)
|
26
|
+
subject.should_receive(:handler).once
|
27
|
+
subject.handle(event)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module SendgridEvents
|
3
|
+
module Handlers
|
4
|
+
describe Delivered do
|
5
|
+
subject { Delivered }
|
6
|
+
it { should respond_to(:handle) }
|
7
|
+
it { should respond_to(:handlee) }
|
8
|
+
let(:event) { {
|
9
|
+
:email => "foo@bar.com",
|
10
|
+
:timestamp => 1322000095,
|
11
|
+
:sendgrid_events_id => '7',
|
12
|
+
:event => "delivered"
|
13
|
+
} }
|
14
|
+
|
15
|
+
it "updates event, but doesn't call handler without one set" do
|
16
|
+
subject.should_receive(:find_and_update_event).with(event).once
|
17
|
+
subject.should_receive(:handler).never
|
18
|
+
subject.handle(event)
|
19
|
+
end
|
20
|
+
|
21
|
+
it "updates event, but doesn't call handler without one set" do
|
22
|
+
subject.handler do
|
23
|
+
true
|
24
|
+
end
|
25
|
+
subject.stub(:find_and_update_event => true)
|
26
|
+
subject.should_receive(:handler).once
|
27
|
+
subject.handle(event)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module SendgridEvents
|
3
|
+
module Handlers
|
4
|
+
describe Dropped do
|
5
|
+
subject { Dropped }
|
6
|
+
it { should respond_to(:handle) }
|
7
|
+
it { should respond_to(:handlee) }
|
8
|
+
let(:event) { {
|
9
|
+
:email => "foo@bar.com",
|
10
|
+
:timestamp => 1322000095,
|
11
|
+
:sendgrid_events_id => '7',
|
12
|
+
:event => "dropped"
|
13
|
+
} }
|
14
|
+
|
15
|
+
it "updates event, but doesn't call handler without one set" do
|
16
|
+
subject.should_receive(:find_and_update_event).with(event).once
|
17
|
+
subject.should_receive(:handler).never
|
18
|
+
subject.handle(event)
|
19
|
+
end
|
20
|
+
|
21
|
+
it "updates event, but doesn't call handler without one set" do
|
22
|
+
subject.handler do
|
23
|
+
true
|
24
|
+
end
|
25
|
+
subject.stub(:find_and_update_event => true)
|
26
|
+
subject.should_receive(:handler).once
|
27
|
+
subject.handle(event)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module SendgridEvents
|
3
|
+
module Handlers
|
4
|
+
describe Opened do
|
5
|
+
subject { Opened }
|
6
|
+
it { should respond_to(:handle) }
|
7
|
+
it { should respond_to(:handlee) }
|
8
|
+
let(:event) { {
|
9
|
+
:email => "foo@bar.com",
|
10
|
+
:timestamp => 1322000095,
|
11
|
+
:sendgrid_events_id => '7',
|
12
|
+
:event => "open"
|
13
|
+
} }
|
14
|
+
|
15
|
+
it "updates event, but doesn't call handler without one set" do
|
16
|
+
subject.should_receive(:find_and_update_event).with(event).once
|
17
|
+
subject.should_receive(:handler).never
|
18
|
+
subject.handle(event)
|
19
|
+
end
|
20
|
+
|
21
|
+
it "updates event, but doesn't call handler without one set" do
|
22
|
+
subject.handler do
|
23
|
+
true
|
24
|
+
end
|
25
|
+
subject.stub(:find_and_update_event => true)
|
26
|
+
subject.should_receive(:handler).once
|
27
|
+
subject.handle(event)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module SendgridEvents
|
3
|
+
module Handlers
|
4
|
+
describe Processed do
|
5
|
+
subject { Processed }
|
6
|
+
it { should respond_to(:handle) }
|
7
|
+
it { should respond_to(:handlee) }
|
8
|
+
let(:event) { {
|
9
|
+
:email => "foo@bar.com",
|
10
|
+
:timestamp => 1322000095,
|
11
|
+
:sendgrid_events_id => '7',
|
12
|
+
:event => "processed"
|
13
|
+
} }
|
14
|
+
|
15
|
+
it "updates event, but doesn't call handler without one set" do
|
16
|
+
subject.should_receive(:find_and_update_event).with(event).once
|
17
|
+
subject.should_receive(:handler).never
|
18
|
+
subject.handle(event)
|
19
|
+
end
|
20
|
+
|
21
|
+
it "updates event, but doesn't call handler without one set" do
|
22
|
+
subject.handler do
|
23
|
+
true
|
24
|
+
end
|
25
|
+
subject.stub(:find_and_update_event => true)
|
26
|
+
subject.should_receive(:handler).once
|
27
|
+
subject.handle(event)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|