sendgrid_events 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. data/.gitignore +6 -0
  2. data/.rspec +2 -0
  3. data/.rvmrc +5 -0
  4. data/.travis.yml +4 -0
  5. data/Gemfile +3 -0
  6. data/Gemfile.lock +141 -0
  7. data/MIT-LICENSE +20 -0
  8. data/README.md +33 -0
  9. data/Rakefile +13 -0
  10. data/app/controllers/sendgrid_events/sendgrid_events_controller.rb +8 -0
  11. data/app/models/sendgrid_events/sendgrid_email_record.rb +14 -0
  12. data/lib/generators/sendgrid_events/install/templates/initializer.rb +5 -0
  13. data/lib/generators/sendgrid_events/install/templates/routes.rb +2 -0
  14. data/lib/generators/sendgrid_events/install/templates/sendgrid_events_table.rb +16 -0
  15. data/lib/generators/sendgrid_events/install_generator.rb +34 -0
  16. data/lib/sendgrid_events.rb +8 -0
  17. data/lib/sendgrid_events/action_mailer_override.rb +23 -0
  18. data/lib/sendgrid_events/configure.rb +23 -0
  19. data/lib/sendgrid_events/engine.rb +12 -0
  20. data/lib/sendgrid_events/handlers.rb +3 -0
  21. data/lib/sendgrid_events/handlers/base.rb +50 -0
  22. data/lib/sendgrid_events/handlers/bounced.rb +7 -0
  23. data/lib/sendgrid_events/handlers/clicked.rb +7 -0
  24. data/lib/sendgrid_events/handlers/deferred.rb +7 -0
  25. data/lib/sendgrid_events/handlers/delivered.rb +10 -0
  26. data/lib/sendgrid_events/handlers/dispatch.rb +34 -0
  27. data/lib/sendgrid_events/handlers/dropped.rb +7 -0
  28. data/lib/sendgrid_events/handlers/opened.rb +7 -0
  29. data/lib/sendgrid_events/handlers/processed.rb +7 -0
  30. data/lib/sendgrid_events/handlers/spam_reported.rb +7 -0
  31. data/lib/sendgrid_events/handlers/unsubscribed.rb +7 -0
  32. data/lib/sendgrid_events/receiver.rb +18 -0
  33. data/lib/sendgrid_events/version.rb +3 -0
  34. data/script/rails +8 -0
  35. data/sendgrid_events.gemspec +28 -0
  36. data/spec/sendgrid_events/handlers/base_spec.rb +47 -0
  37. data/spec/sendgrid_events/handlers/bounced_spec.rb +31 -0
  38. data/spec/sendgrid_events/handlers/clicked_spec.rb +31 -0
  39. data/spec/sendgrid_events/handlers/deferred_spec.rb +31 -0
  40. data/spec/sendgrid_events/handlers/delivered_spec.rb +31 -0
  41. data/spec/sendgrid_events/handlers/dispatch_spec.rb +8 -0
  42. data/spec/sendgrid_events/handlers/dropped_spec.rb +31 -0
  43. data/spec/sendgrid_events/handlers/opened_spec.rb +31 -0
  44. data/spec/sendgrid_events/handlers/processed_spec.rb +31 -0
  45. data/spec/sendgrid_events/handlers/spam_reported_spec.rb +31 -0
  46. data/spec/sendgrid_events/handlers/unsubscribed_spec.rb +31 -0
  47. data/spec/sendgrid_events/receiver_spec.rb +32 -0
  48. data/spec/spec_helper.rb +39 -0
  49. metadata +272 -0
@@ -0,0 +1,7 @@
1
+ module SendgridEvents
2
+ module Handlers
3
+ class Bounced < Base
4
+ register_as_handler_for :bounce
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module SendgridEvents
2
+ module Handlers
3
+ class Clicked < Base
4
+ register_as_handler_for :click
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module SendgridEvents
2
+ module Handlers
3
+ class Deferred < Base
4
+ register_as_handler_for :deferred
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,10 @@
1
+ module SendgridEvents
2
+ module Handlers
3
+ class Delivered < Base
4
+ # Delivered
5
+ # event | email | response | category
6
+ # delivered | Message recipient | Full reponse from MTA | The category you assigned
7
+ register_as_handler_for :delivered
8
+ end
9
+ end
10
+ end
@@ -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,7 @@
1
+ module SendgridEvents
2
+ module Handlers
3
+ class Dropped < Base
4
+ register_as_handler_for :dropped
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module SendgridEvents
2
+ module Handlers
3
+ class Opened < Base
4
+ register_as_handler_for :open
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module SendgridEvents
2
+ module Handlers
3
+ class Processed < Base
4
+ register_as_handler_for :processed
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module SendgridEvents
2
+ module Handlers
3
+ class SpamReported < Base
4
+ register_as_handler_for :spamreport
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module SendgridEvents
2
+ module Handlers
3
+ class Unsubscribed < Base
4
+ register_as_handler_for :unsubscribe
5
+ end
6
+ end
7
+ 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
@@ -0,0 +1,3 @@
1
+ module SendgridEvents
2
+ VERSION = "0.0.1"
3
+ end
@@ -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,8 @@
1
+ require 'spec_helper'
2
+ module SendgridEvents
3
+ module Handlers
4
+ describe Dispatch do
5
+ subject { Dispatch }
6
+ end
7
+ end
8
+ 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