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