sendgrid_events 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|