sendgrid_events 0.0.2 → 0.0.3
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/Gemfile.lock +1 -1
- data/lib/generators/sendgrid_events/install/templates/initializer.rb +2 -2
- data/lib/generators/sendgrid_events/install/templates/routes.rb +1 -1
- data/lib/generators/sendgrid_events/install_generator.rb +25 -4
- data/lib/sendgrid_events.rb +1 -0
- data/lib/sendgrid_events/handlers/dispatch.rb +3 -3
- data/lib/sendgrid_events/middleware.rb +22 -0
- data/lib/sendgrid_events/receiver.rb +6 -10
- data/lib/sendgrid_events/version.rb +1 -1
- data/spec/sendgrid_events/handlers/base_spec.rb +1 -1
- data/spec/sendgrid_events/receiver_spec.rb +4 -17
- metadata +5 -4
data/Gemfile.lock
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
|
2
|
-
match
|
2
|
+
match SendgridEvents::Configure.mount_at => "sendgrid_events/sendgrid_events#receiver", :via => :post
|
@@ -14,21 +14,42 @@ module SendgridEvents
|
|
14
14
|
@prev_migration_nr.to_s
|
15
15
|
end
|
16
16
|
|
17
|
-
def
|
17
|
+
def install
|
18
|
+
migrations
|
19
|
+
initializer
|
20
|
+
routes
|
21
|
+
middleware
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def migrations
|
18
27
|
puts "Copying Sengrid Events migrations..."
|
19
|
-
|
28
|
+
begin
|
29
|
+
migration_template "sendgrid_events_table.rb", "db/migrate/sendgrid_events_table.rb"
|
30
|
+
rescue
|
31
|
+
puts "Already have that migration"
|
32
|
+
end
|
20
33
|
end
|
21
34
|
|
22
|
-
def
|
35
|
+
def initializer
|
23
36
|
puts "Copying initializer..."
|
24
37
|
copy_file "initializer.rb", "config/initializers/sendgrid_events.rb"
|
25
38
|
end
|
26
39
|
|
27
|
-
def
|
40
|
+
def routes
|
41
|
+
puts "Copying routes..."
|
28
42
|
insert_into_file Rails.root.join('config', 'routes.rb'),
|
29
43
|
File.open(File.join(File.expand_path("../install/templates", __FILE__), 'routes.rb')).read,
|
30
44
|
:after => /Application\.routes\.draw do$/
|
31
45
|
end
|
46
|
+
|
47
|
+
def middleware
|
48
|
+
puts "Copying config..."
|
49
|
+
insert_into_file Rails.root.join('config', 'application.rb'), :after => /class Application.*$/ do
|
50
|
+
"\n\t\tconfig.middleware.insert_after ActiveRecord::ParamsParser, SendgridEvents::Middleware"
|
51
|
+
end
|
52
|
+
end
|
32
53
|
end
|
33
54
|
end
|
34
55
|
end
|
data/lib/sendgrid_events.rb
CHANGED
@@ -6,7 +6,7 @@ module SendgridEvents
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def self.registered_handlers
|
9
|
-
@registered_handlers ||= {}
|
9
|
+
@registered_handlers ||= {}.with_indifferent_access
|
10
10
|
end
|
11
11
|
|
12
12
|
def self.acceptable_handlers
|
@@ -21,13 +21,13 @@ module SendgridEvents
|
|
21
21
|
spamreport
|
22
22
|
unsubscribe
|
23
23
|
]
|
24
|
-
Hash[array.zip([true] * array.size)].
|
24
|
+
Hash[array.zip([true] * array.size)].with_indifferent_access
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
28
|
def self.selected_handlers=(handler_list)
|
29
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)].
|
30
|
+
@selected_handlers = Hash[handler_list.zip([true] * handler_list.size)].with_indifferent_access
|
31
31
|
end
|
32
32
|
end
|
33
33
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module SendgridEvents
|
2
|
+
class Middleware
|
3
|
+
def initialize(app)
|
4
|
+
@app = app
|
5
|
+
end
|
6
|
+
|
7
|
+
def call(env)
|
8
|
+
scrub(env) if env["REQUEST_URI"].include? Configure.mount_at
|
9
|
+
@app.call(env)
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
def scrub(env)
|
14
|
+
rack_input = env["rack.input"].read
|
15
|
+
rack_input ="[#{rack_input.split("\r\n").join(",")}]"
|
16
|
+
env["rack.input"] = StringIO.new(rack_input)
|
17
|
+
rescue
|
18
|
+
ensure
|
19
|
+
env["rack.input"].rewind
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -1,18 +1,14 @@
|
|
1
1
|
module SendgridEvents
|
2
2
|
class Receiver
|
3
3
|
def self.receive(params)
|
4
|
-
if Configure.receive?
|
5
|
-
|
6
|
-
|
4
|
+
if Configure.receive? and params['_json'] and params['_json'].is_a? Array
|
5
|
+
params['_json'].each do |event|
|
6
|
+
if event.is_a? Hash and event.has_key? "sendgrid_events_id"
|
7
|
+
event = event.with_indifferent_access
|
8
|
+
Handlers::Base.choose_and_handle(event)
|
9
|
+
end
|
7
10
|
end
|
8
11
|
end
|
9
12
|
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
13
|
end
|
18
14
|
end
|
@@ -17,7 +17,7 @@ module SendgridEvents
|
|
17
17
|
} }
|
18
18
|
|
19
19
|
it "returns the list of handlers" do
|
20
|
-
subject.registered_handlers.
|
20
|
+
subject.registered_handlers.keys.sort.should == Dispatch.acceptable_handlers.keys.sort
|
21
21
|
end
|
22
22
|
|
23
23
|
it "chose a handler if handler is registered" do
|
@@ -3,30 +3,17 @@ module SendgridEvents
|
|
3
3
|
describe Receiver do
|
4
4
|
subject { Receiver }
|
5
5
|
it { should respond_to(:receive) }
|
6
|
-
it { should respond_to(:extract_events_and_clean) }
|
7
6
|
|
8
7
|
let(:params) {
|
9
|
-
{"
|
8
|
+
{ "_json" => [
|
9
|
+
{"email" => "foo@bar.com", "timestamp" => 1322000095,"sendgrid_events_id" => "7", "event" => "delivered"},
|
10
|
+
{"email" => "foo@bar.com", "timestamp" => 1322000096, "sendgrid_events_id" => "4", "event" => "delivered"}
|
11
|
+
] }
|
10
12
|
}
|
11
13
|
|
12
14
|
it "sends the poorly composed params to be cleaned then handles" do
|
13
15
|
Handlers::Base.should_receive(:choose_and_handle).exactly(2).times
|
14
16
|
subject.receive params
|
15
17
|
end
|
16
|
-
|
17
|
-
it "extracts JSON objects" do
|
18
|
-
subject.extract_events_and_clean(params).should == [{
|
19
|
-
:email => "foo@bar.com",
|
20
|
-
:timestamp => 1322000095,
|
21
|
-
:sendgrid_events_id => '7',
|
22
|
-
:event => "delivered"
|
23
|
-
},
|
24
|
-
{
|
25
|
-
:email => "foo@bar.com",
|
26
|
-
:timestamp => 1322000096,
|
27
|
-
:sendgrid_events_id => "4",
|
28
|
-
:event => "delivered"
|
29
|
-
}]
|
30
|
-
end
|
31
18
|
end
|
32
19
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sendgrid_events
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-07-
|
12
|
+
date: 2012-07-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
@@ -209,6 +209,7 @@ files:
|
|
209
209
|
- lib/sendgrid_events/handlers/processed.rb
|
210
210
|
- lib/sendgrid_events/handlers/spam_reported.rb
|
211
211
|
- lib/sendgrid_events/handlers/unsubscribed.rb
|
212
|
+
- lib/sendgrid_events/middleware.rb
|
212
213
|
- lib/sendgrid_events/receiver.rb
|
213
214
|
- lib/sendgrid_events/version.rb
|
214
215
|
- script/rails
|
@@ -240,7 +241,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
240
241
|
version: '0'
|
241
242
|
segments:
|
242
243
|
- 0
|
243
|
-
hash:
|
244
|
+
hash: 143610152345397580
|
244
245
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
245
246
|
none: false
|
246
247
|
requirements:
|
@@ -249,7 +250,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
249
250
|
version: '0'
|
250
251
|
segments:
|
251
252
|
- 0
|
252
|
-
hash:
|
253
|
+
hash: 143610152345397580
|
253
254
|
requirements: []
|
254
255
|
rubyforge_project:
|
255
256
|
rubygems_version: 1.8.24
|