mandrill-rails 0.0.1 → 0.0.2

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.
@@ -9,7 +9,7 @@ FYI, {Mandrill}[http://mandrill.com/] is the transactional email service by the
9
9
 
10
10
  == Requirements and Known Limitations
11
11
 
12
- * Tested with MRI 1.9.3
12
+ * Tested with MRI 1.8.7, 1.9.2, 1.9.3, Rubinius (1.8 and 1.9 mode), JRuby (1.8 and 1.9 mode)
13
13
  * Requires Rails >= 3.0.3 (including 3.1 and 3.2)
14
14
  * Includes {Mandrill}[https://github.com/tatemae-consultancy/mandrill] ~> 0.0.2 as a dependency
15
15
 
@@ -1,5 +1,5 @@
1
1
  module Mandrill
2
2
  module Rails
3
- VERSION = "0.0.1"
3
+ VERSION = "0.0.2"
4
4
  end
5
5
  end
@@ -10,59 +10,85 @@
10
10
  #
11
11
  class Mandrill::WebHook::EventDecorator < Hash
12
12
 
13
- # Returns the event type
13
+ # Returns the event type.
14
+ # Applicable events: all
14
15
  def event_type
15
16
  self['event']
16
17
  end
17
18
 
18
- # Returns the subject
19
+ # Returns the message subject.
20
+ # Applicable events: all
19
21
  def subject
20
22
  self['subject'] || msg['subject']
21
23
  end
22
24
 
23
- # Returns the msg Hash (as used for inbound messages )
25
+ # Returns the msg Hash.
26
+ # Applicable events: all
24
27
  def msg
25
28
  self['msg']||{}
26
29
  end
27
30
 
28
- # Returns the message_id (as used for inbound messages )
31
+ # Returns the message_id.
32
+ # Inbound events: references 'Message-Id' header.
33
+ # Send/Open/Click events: references '_id' message attribute.
29
34
  def message_id
30
- headers['Message-Id']
35
+ headers['Message-Id'] || msg['_id']
31
36
  end
32
37
 
33
- # Returns the reply-to ID (as used for inbound messages )
38
+ # Returns the Mandrill message version.
39
+ # Send/Click events: references '_version' message attribute.
40
+ # Inbound/Open events: n/a.
41
+ def message_version
42
+ msg['_version']
43
+ end
44
+
45
+ # Returns the reply-to ID.
46
+ # Applicable events: inbound
34
47
  def in_reply_to
35
48
  headers['In-Reply-To']
36
49
  end
37
50
 
38
- # Returns an array of reference IDs (as used for inbound messages )
51
+ # Returns an array of reference IDs.
52
+ # Applicable events: inbound
39
53
  def references
40
54
  (headers['References']||'').scan(/(<[^<]+?>)/).flatten
41
55
  end
42
56
 
43
- # Returns the headers Hash (as used for inbound messages )
57
+ # Returns the headers Hash.
58
+ # Applicable events: inbound
44
59
  def headers
45
60
  msg['headers']||{}
46
61
  end
47
62
 
48
- # Returns the email (String) of the sender
63
+ # Returns the email (String) of the sender.
64
+ # Applicable events: inbound
49
65
  def sender_email
50
66
  msg['from_email']
51
67
  end
52
68
 
69
+ # Returns the subject user email address.
70
+ # Inbound messages: references 'email' message attribute (represents the sender).
71
+ # Send/Open/Click messages: references 'email' message attribute (represents the recipient).
72
+ def user_email
73
+ msg['email']
74
+ end
75
+
53
76
  # Returns an array of all unique recipient emails (to/cc)
54
77
  # [ email, email, .. ]
78
+ # Applicable events: inbound
55
79
  def recipients
56
80
  (Array(msg['to']) | Array(msg['cc'])).compact
57
81
  end
58
82
 
59
83
  # Returns an array of all unique recipients (to/cc)
60
84
  # [ [email,name], [email,name], .. ]
85
+ # Applicable events: inbound
61
86
  def recipient_emails
62
87
  recipients.map(&:first)
63
88
  end
64
89
 
65
- # Returns the +format+ (:text,:html,:raw) message body
90
+ # Returns the +format+ (:text,:html,:raw) message body.
91
+ # Applicable events: inbound
66
92
  def message_body(format=:text)
67
93
  case format
68
94
  when :text
@@ -74,4 +100,23 @@ class Mandrill::WebHook::EventDecorator < Hash
74
100
  end
75
101
  end
76
102
 
103
+ # Returns the primary click payload or nil if n/a.
104
+ # Applicable events: click, open
105
+ def click
106
+ { 'ts' => self['ts'], 'url' => self['url'] } if self['ts'] && self['url']
107
+ end
108
+
109
+ # Returns an array of all the clicks.
110
+ # Applicable events: click, open
111
+ def all_clicks
112
+ clicks = msg['clicks'] || []
113
+ clicks << click if click and clicks.empty?
114
+ clicks
115
+ end
116
+
117
+ # Returns an array of all the urls marked as clicked in this message.
118
+ # Applicable events: click, open
119
+ def all_clicked_links
120
+ all_clicks.collect{|c| c['url'] }.uniq
121
+ end
77
122
  end
@@ -4,8 +4,8 @@ require File.expand_path('../lib/mandrill-rails/version', __FILE__)
4
4
  Gem::Specification.new do |gem|
5
5
  gem.authors = ["Paul Gallagher"]
6
6
  gem.email = ["gallagher.paul@gmail.com"]
7
- gem.description = %q{Rails integration for working with Mandrill}
8
- gem.summary = %q{Rails integration for working with Mandrill}
7
+ gem.description = %q{Rails integration for Mandrill}
8
+ gem.summary = %q{Provides webhook processing and event decoration to make using Mandrill with Rails just that much easier}
9
9
  gem.homepage = "https://github.com/evendis/mandrill-rails"
10
10
 
11
11
  gem.files = `git ls-files`.split($\)
@@ -0,0 +1,24 @@
1
+ [
2
+ {
3
+ "event": "click",
4
+ "msg": {
5
+ "_id": "8606637.6692f6cac28e45a9b371e182d5ca0a35",
6
+ "_version": 5,
7
+ "clicks": [
8
+ { "ts": 1350347773, "url": "http://feedproxy.google.com/~r/readwriteweb/~3/rqUHtsdBCzc/saturday-night-live-sketch-skewers-iphone-5-and-the-tech-press-video.php" },
9
+ { "ts": 1350377171, "url": "http://feedproxy.google.com/~r/readwriteweb/~3/MMUCngEPdSU/now-you-can-search-your-email-docs-spreadsheets-from-the-main-google-box.php" },
10
+ { "ts": 1350377231, "url": "http://feedproxy.google.com/~r/readwriteweb/~3/KemlM1hZvdI/how-evil-is-your-smartphone.php" },
11
+ { "ts": 1350377135, "url": "http://feedproxy.google.com/~r/readwriteweb/~3/op1uGAwjnFo/fix-your-iphones-maps-reminders-with-localscope-3.php" }
12
+ ],
13
+ "email": "to@example.com",
14
+ "opens": [ { "ts": 1350347773 } ],
15
+ "sender": "from@example.com",
16
+ "state": "sent",
17
+ "subject": "[click] Sample Subject",
18
+ "tags": [],
19
+ "ts": 1350345672
20
+ },
21
+ "ts": 1350377135,
22
+ "url": "http://feedproxy.google.com/~r/readwriteweb/~3/op1uGAwjnFo/fix-your-iphones-maps-reminders-with-localscope-3.php"
23
+ }
24
+ ]
@@ -0,0 +1,29 @@
1
+ [
2
+ {
3
+ "event": "inbound",
4
+ "msg": {
5
+ "email": "from@example.com",
6
+ "from_email": "from@example.com",
7
+ "from_name": "From Name ",
8
+ "headers": {
9
+ "Content-Type": "multipart/alternative; boundary=e0cb4efe2faee9b97304c6d0647b",
10
+ "Date": "Thu, 9 Aug 2012 15:44:15 +0800",
11
+ "Dkim-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type; bh=9/e4o7vsyI5eIM2MUze13ZWWdxyhC7cxjHwrHXPSEJQ=; b=HOb83u8i6ai3HuT61C+NfQcUHqATH+/ivAjZ2pD/MXcCFboOyN9LGeMHm+RhwnL+Ap mC0R9+eqlWaoxqd6ugrvtNOQ1Kvb9LunPnnMwY06KZKpoXCVwFrzT3e2f8JgLwyAxpUv G0srziHwpuCh/y42dJ83tKhctHc6w6GKC79H1WBAcexnjvk0LgrkOnNJ/iBCOznjs35o V4jfjlJBeZLvxcnEJ5Xxade2kWbLZ9TWiuVfTS6xUyVb/gfn5x9D1KjCUb1Gwq9wYJ4m UxH6oC5f3mkM+NZ6oDBmJFDdVxg23rRaMrF4YBpVGj+6+pjF36N8CrmtaDOJNVqCS5FN koSw==",
12
+ "From": "From Name <from@example.com>",
13
+ "Message-Id": "<CAGBx7GhULS7d6ZsdLREHnKQ68V6w2fbGmD85dPn63s6RtpsZeQ@mail.gmail.com>",
14
+ "Mime-Version": "1.0",
15
+ "Received": [ "from mail-lpp01m010-f51.google.com (mail-lpp01m010-f51.google.com [209.85.215.51]) by app01.transact (Postfix) with ESMTPS id F01841E0010A for <to@example.com>; Thu, 9 Aug 2012 03:44:16 -0400 (EDT)", "by lahe6 with SMTP id e6so79326lah.24 for <to@example.com>; Thu, 09 Aug 2012 00:44:15 -0700 (PDT)", "by 10.112.43.67 with SMTP id u3mr382471lbl.16.1344498255378; Thu, 09 Aug 2012 00:44:15 -0700 (PDT)", "by 10.114.69.44 with HTTP; Thu, 9 Aug 2012 00:44:15 -0700 (PDT)" ],
16
+ "Subject": "[inbound] Sample Subject",
17
+ "To": "to@example.com"
18
+ },
19
+ "html": "multi-line content<br><br><b>multi-line content<br></b>\n<br><i>with some formatting</i><br><br>\nmulti-line content<br>\n<br>\n<br>\n\n",
20
+ "raw_msg": "Received: from mail-lpp01m010-f51.google.com (mail-lpp01m010-f51.google.com [209.85.215.51])\n\tby app01.transact (Postfix) with ESMTPS id F01841E0010A\n\tfor <to@example.com>; Thu, 9 Aug 2012 03:44:16 -0400 (EDT)\nReceived: by lahe6 with SMTP id e6so79326lah.24\n for <to@example.com>; Thu, 09 Aug 2012 00:44:15 -0700 (PDT)\nDKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=gmail.com; s=20120113;\n h=mime-version:date:message-id:subject:from:to:content-type;\n bh=9/e4o7vsyI5eIM2MUze13ZWWdxyhC7cxjHwrHXPSEJQ=;\n b=HOb83u8i6ai3HuT61C+NfQcUHqATH+/ivAjZ2pD/MXcCFboOyN9LGeMHm+RhwnL+Ap\n mC0R9+eqlWaoxqd6ugrvtNOQ1Kvb9LunPnnMwY06KZKpoXCVwFrzT3e2f8JgLwyAxpUv\n G0srziHwpuCh/y42dJ83tKhctHc6w6GKC79H1WBAcexnjvk0LgrkOnNJ/iBCOznjs35o\n V4jfjlJBeZLvxcnEJ5Xxade2kWbLZ9TWiuVfTS6xUyVb/gfn5x9D1KjCUb1Gwq9wYJ4m\n UxH6oC5f3mkM+NZ6oDBmJFDdVxg23rRaMrF4YBpVGj+6+pjF36N8CrmtaDOJNVqCS5FN\n koSw==\nMIME-Version: 1.0\nReceived: by 10.112.43.67 with SMTP id u3mr382471lbl.16.1344498255378; Thu, 09\n Aug 2012 00:44:15 -0700 (PDT)\nReceived: by 10.114.69.44 with HTTP; Thu, 9 Aug 2012 00:44:15 -0700 (PDT)\nDate: Thu, 9 Aug 2012 15:44:15 +0800\nMessage-ID: <CAGBx7GhULS7d6ZsdLREHnKQ68V6w2fbGmD85dPn63s6RtpsZeQ@mail.gmail.com>\nSubject: [inbound] Sample Subject\nFrom: From Name <from@example.com>\nTo: to@example.com\nContent-Type: multipart/alternative; boundary=e0cb4efe2faee9b97304c6d0647b\n\n--e0cb4efe2faee9b97304c6d0647b\nContent-Type: text/plain; charset=UTF-8\n\nmulti-line content\n\n*multi-line content\n*\n*with some formatting*\n\nmulti-line content\n\n--e0cb4efe2faee9b97304c6d0647b\nContent-Type: text/html; charset=UTF-8\n\nmulti-line content<br><br><b>multi-line content<br></b>\n<br><i>with some formatting</i><br><br>\nmulti-line content<br>\n<br>\n<br>\n\n--e0cb4efe2faee9b97304c6d0647b--\n",
21
+ "sender": null,
22
+ "subject": "[inbound] Sample Subject",
23
+ "tags": [],
24
+ "text": "multi-line content\n\n*multi-line content\n*\n*with some formatting*\n\nmulti-line content\n\n",
25
+ "to": [ [ "to@example.com", null ] ]
26
+ },
27
+ "ts": 1344498257
28
+ }
29
+ ]
@@ -0,0 +1,36 @@
1
+ [
2
+ {
3
+ "event": "inbound",
4
+ "msg": {
5
+ "cc": [ [ "cc@example.com", null ] ],
6
+ "email": "from@example.com",
7
+ "from_email": "from@example.com",
8
+ "from_name": "From Name ",
9
+ "headers": {
10
+ "Cc": "cc@example.com",
11
+ "Content-Type": "multipart/alternative; boundary=f46d040838d398472904c6d067c6",
12
+ "Date": "Thu, 9 Aug 2012 15:45:00 +0800",
13
+ "Dkim-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:cc:content-type; bh=hZurAGSA3OJIqtMOebHDdMvqss5GY1RDg7kV68+nvN8=; b=g9eCMb+rDV2RIp8stEri4PjLRHqxPECKEJcP/uMEcWZcWqDOlV9QBlOUAptAHMDv1F tIbDJBx+59t5q1hMr2sfn8CUl4T1oaXZq9Gu3SvGxlLX4HFGEQZBAUq+kfW+M8mNWHs9 SkNxsO1gmgjuht1hGOP4rxkEj/tRM+NXBiqB8UOzaF3BBI/NtjjKjbLu+VshGadTDoeQ ayQ6d6r5Sl+BE0PNLF65H8WJF0VyzTsTOSKAynRGGoLCaO+gzgxSwQe5+w9spw0SMSRY +it9DSZm1en+BsfMNlcbkUqN5a9ova+q4whSjdq4NoTrCaZS/6ZTVbBjc/HK2IQYQI4/ CTDw==",
14
+ "From": "From Name <from@example.com>",
15
+ "Message-Id": "<CAGBx7GhsVk7Q-aO-FQ-m+Oix7GQyEVHyL60qv0__G8EpH8pA4w@mail.gmail.com>",
16
+ "In-Reply-To": "<CAGBx7GhULS7d6ZsdLREHnKQ68V6w2fbGmD85dPn63s6RtpsZeQ@mail.gmail.com>",
17
+ "References": "<CAGBx7GhULS7d6ZsdLREHnKQ68V6w2fbGmD85dPn63s6RtpsZeQ@mail.gmail.com> <9999999999999@mail.gmail.com>",
18
+ "Mime-Version": "1.0",
19
+ "Received": [ "from mail-lb0-f179.google.com (mail-lb0-f179.google.com [209.85.217.179]) by app01.transact (Postfix) with ESMTPS id E94801E000B8 for <to@example.com>; Thu, 9 Aug 2012 03:45:01 -0400 (EDT)",
20
+ "by lbao2 with SMTP id o2so118681lba.24 for <to@example.com>; Thu, 09 Aug 2012 00:45:00 -0700 (PDT)",
21
+ "by 10.152.112.233 with SMTP id it9mr20848692lab.40.1344498300372; Thu, 09 Aug 2012 00:45:00 -0700 (PDT)",
22
+ "by 10.114.69.44 with HTTP; Thu, 9 Aug 2012 00:45:00 -0700 (PDT)" ],
23
+ "Subject": "[inbound] Sample Subject 2",
24
+ "To": "to@example.com, Other To <other.to@example.com>"
25
+ },
26
+ "html": "asfasdf<br>asdf<br>asdf<br>asdf<br>asdf<br>\n\n",
27
+ "raw_msg": "Received: from mail-lb0-f179.google.com (mail-lb0-f179.google.com [209.85.217.179])\n\tby app01.transact (Postfix) with ESMTPS id E94801E000B8\n\tfor <to@example.com>; Thu, 9 Aug 2012 03:45:01 -0400 (EDT)\nReceived: by lbao2 with SMTP id o2so118681lba.24\n for <to@example.com>; Thu, 09 Aug 2012 00:45:00 -0700 (PDT)\nDKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=gmail.com; s=20120113;\n h=mime-version:date:message-id:subject:from:to:cc:content-type;\n bh=hZurAGSA3OJIqtMOebHDdMvqss5GY1RDg7kV68+nvN8=;\n b=g9eCMb+rDV2RIp8stEri4PjLRHqxPECKEJcP/uMEcWZcWqDOlV9QBlOUAptAHMDv1F\n tIbDJBx+59t5q1hMr2sfn8CUl4T1oaXZq9Gu3SvGxlLX4HFGEQZBAUq+kfW+M8mNWHs9\n SkNxsO1gmgjuht1hGOP4rxkEj/tRM+NXBiqB8UOzaF3BBI/NtjjKjbLu+VshGadTDoeQ\n ayQ6d6r5Sl+BE0PNLF65H8WJF0VyzTsTOSKAynRGGoLCaO+gzgxSwQe5+w9spw0SMSRY\n +it9DSZm1en+BsfMNlcbkUqN5a9ova+q4whSjdq4NoTrCaZS/6ZTVbBjc/HK2IQYQI4/\n CTDw==\nMIME-Version: 1.0\nReceived: by 10.152.112.233 with SMTP id it9mr20848692lab.40.1344498300372;\n Thu, 09 Aug 2012 00:45:00 -0700 (PDT)\nReceived: by 10.114.69.44 with HTTP; Thu, 9 Aug 2012 00:45:00 -0700 (PDT)\nDate: Thu, 9 Aug 2012 15:45:00 +0800\nMessage-ID: <CAGBx7GhsVk7Q-aO-FQ-m+Oix7GQyEVHyL60qv0__G8EpH8pA4w@mail.gmail.com>\nSubject: [inbound] Sample Subject 2\nFrom: From Name <from@example.com>\nTo: to@example.com, Other To <other.to@example.com>\nCc: cc@example.com\nContent-Type: multipart/alternative; boundary=f46d040838d398472904c6d067c6\n\n--f46d040838d398472904c6d067c6\nContent-Type: text/plain; charset=UTF-8\n\nasfasdf\nasdf\nasdf\nasdf\nasdf\n\n--f46d040838d398472904c6d067c6\nContent-Type: text/html; charset=UTF-8\n\nasfasdf<br>asdf<br>asdf<br>asdf<br>asdf<br>\n\n--f46d040838d398472904c6d067c6--\n",
28
+ "sender": null,
29
+ "subject": "[inbound] Sample Subject 2",
30
+ "tags": [],
31
+ "text": "asfasdf\nasdf\nasdf\nasdf\nasdf\n\n",
32
+ "to": [ [ "to@example.com,", null ], [ "other.to@example.com", " Other To " ] ]
33
+ },
34
+ "ts": 1344498302
35
+ }
36
+ ]
@@ -0,0 +1,20 @@
1
+ [
2
+ {
3
+ "event": "open",
4
+ "msg": {
5
+ "_id": "12847763.9a32184309ad4d5e9bfd20368d9d7981",
6
+ "_version": 3,
7
+ "clicks": [
8
+ { "ts": 1350693098, "url": "http://feedproxy.google.com/~r/AccidentalTechnologist/~3/Jc7hYTVjcmM/" }
9
+ ],
10
+ "email": "to@example.com",
11
+ "opens": [ { "ts": 1350693098 }, { "ts": 1350693075 } ],
12
+ "sender": "from@example.com",
13
+ "state": "sent",
14
+ "subject": "[open] Sample Subject",
15
+ "tags": [],
16
+ "ts": 1350691301
17
+ },
18
+ "ts": 1350693075
19
+ }
20
+ ]
@@ -0,0 +1,17 @@
1
+ [
2
+ {
3
+ "event": "send",
4
+ "msg": {
5
+ "_id": "9a32184309ad4d5e9bfd20368d9d7981",
6
+ "clicks": [],
7
+ "email": "to@example.com",
8
+ "opens": [],
9
+ "sender": "from@example.com",
10
+ "state": "sent",
11
+ "subject": "[send] Sample Subject",
12
+ "tags": [],
13
+ "ts": 1350691301
14
+ },
15
+ "ts": 1350691301
16
+ }
17
+ ]
@@ -1,105 +1,178 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Mandrill::WebHook::EventDecorator do
4
-
5
-
6
- let(:event_payload) { Mandrill::WebHook::EventDecorator[raw_event] }
7
- subject { event_payload }
8
3
 
9
- context "with 'inbound' event_type" do
4
+ describe Mandrill::WebHook::EventDecorator do
10
5
 
11
- let(:event_type) { 'inbound' }
12
- let(:subject_line) { 'a subject line' }
13
- let(:sender_email) { 'test@example.com' }
14
- let(:message_text) { "raw message text\n\n" }
15
- let(:message_html) { "<div>some content</div>" }
16
- let(:message_raw) { "the raw message text" }
17
- let(:message_id) { "<111111>" }
18
- let(:in_reply_to) { "<222222>" }
19
- let(:references) { "<222222> <333333>" }
20
- let(:references_array) { ["<222222>","<333333>"] }
6
+ # Test decorator behaviour given the range of example Mandrill event types:
7
+ #
8
+ # * inbound - inbound mail receipt
9
+ # * send - message has been sent
10
+ # * click - recipient clicked a link in a message; will only occur when click tracking is enabled
11
+ # * open - recipient opened a message; will only occur when open tracking is enabled
12
+ #
13
+ # TODO: need to collect some real examples for the following event types:
14
+ # * hard_bounce - message has hard bounced
15
+ # * reject - message was rejected
16
+ # * soft_bounce - message has soft bounced
17
+ # * spam - recipient marked a message as spam
18
+ # * unsub - recipient unsubscribed
19
+ #
20
+ {
21
+ 'inbound' => {
22
+ :event_type => 'inbound',
23
+ :subject => '[inbound] Sample Subject',
24
+ :message_id => '<CAGBx7GhULS7d6ZsdLREHnKQ68V6w2fbGmD85dPn63s6RtpsZeQ@mail.gmail.com>',
25
+ :message_version => nil,
26
+ :in_reply_to => nil,
27
+ :references => [],
28
+ :headers => {
29
+ "Content-Type" => "multipart/alternative; boundary=e0cb4efe2faee9b97304c6d0647b",
30
+ "Date" => "Thu, 9 Aug 2012 15:44:15 +0800",
31
+ "Dkim-Signature" => "v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type; bh=9/e4o7vsyI5eIM2MUze13ZWWdxyhC7cxjHwrHXPSEJQ=; b=HOb83u8i6ai3HuT61C+NfQcUHqATH+/ivAjZ2pD/MXcCFboOyN9LGeMHm+RhwnL+Ap mC0R9+eqlWaoxqd6ugrvtNOQ1Kvb9LunPnnMwY06KZKpoXCVwFrzT3e2f8JgLwyAxpUv G0srziHwpuCh/y42dJ83tKhctHc6w6GKC79H1WBAcexnjvk0LgrkOnNJ/iBCOznjs35o V4jfjlJBeZLvxcnEJ5Xxade2kWbLZ9TWiuVfTS6xUyVb/gfn5x9D1KjCUb1Gwq9wYJ4m UxH6oC5f3mkM+NZ6oDBmJFDdVxg23rRaMrF4YBpVGj+6+pjF36N8CrmtaDOJNVqCS5FN koSw==",
32
+ "From" => "From Name <from@example.com>",
33
+ "Message-Id" => "<CAGBx7GhULS7d6ZsdLREHnKQ68V6w2fbGmD85dPn63s6RtpsZeQ@mail.gmail.com>",
34
+ "Mime-Version" => "1.0",
35
+ "Received" => [ "from mail-lpp01m010-f51.google.com (mail-lpp01m010-f51.google.com [209.85.215.51]) by app01.transact (Postfix) with ESMTPS id F01841E0010A for <to@example.com>; Thu, 9 Aug 2012 03:44:16 -0400 (EDT)", "by lahe6 with SMTP id e6so79326lah.24 for <to@example.com>; Thu, 09 Aug 2012 00:44:15 -0700 (PDT)", "by 10.112.43.67 with SMTP id u3mr382471lbl.16.1344498255378; Thu, 09 Aug 2012 00:44:15 -0700 (PDT)", "by 10.114.69.44 with HTTP; Thu, 9 Aug 2012 00:44:15 -0700 (PDT)" ],
36
+ "Subject" => "[inbound] Sample Subject",
37
+ "To" => "to@example.com"
38
+ },
39
+ :sender_email => 'from@example.com',
40
+ :user_email => 'from@example.com',
41
+ :recipients => [["to@example.com", nil]],
42
+ :recipient_emails => ["to@example.com"],
43
+ :message_body => "multi-line content\n\n*multi-line content\n*\n*with some formatting*\n\nmulti-line content\n\n",
44
+ :click => nil,
45
+ :all_clicks => [],
46
+ :all_clicked_links => []
47
+ },
48
+ 'inbound_reply' => {
49
+ :event_type => 'inbound',
50
+ :subject => '[inbound] Sample Subject 2',
51
+ :message_id => '<CAGBx7GhsVk7Q-aO-FQ-m+Oix7GQyEVHyL60qv0__G8EpH8pA4w@mail.gmail.com>',
52
+ :message_version => nil,
53
+ :in_reply_to => "<CAGBx7GhULS7d6ZsdLREHnKQ68V6w2fbGmD85dPn63s6RtpsZeQ@mail.gmail.com>",
54
+ :references => ["<CAGBx7GhULS7d6ZsdLREHnKQ68V6w2fbGmD85dPn63s6RtpsZeQ@mail.gmail.com>", "<9999999999999@mail.gmail.com>"],
55
+ :headers => {
56
+ "Cc" => "cc@example.com",
57
+ "Content-Type" => "multipart/alternative; boundary=f46d040838d398472904c6d067c6",
58
+ "Date" => "Thu, 9 Aug 2012 15:45:00 +0800",
59
+ "Dkim-Signature" => "v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:cc:content-type; bh=hZurAGSA3OJIqtMOebHDdMvqss5GY1RDg7kV68+nvN8=; b=g9eCMb+rDV2RIp8stEri4PjLRHqxPECKEJcP/uMEcWZcWqDOlV9QBlOUAptAHMDv1F tIbDJBx+59t5q1hMr2sfn8CUl4T1oaXZq9Gu3SvGxlLX4HFGEQZBAUq+kfW+M8mNWHs9 SkNxsO1gmgjuht1hGOP4rxkEj/tRM+NXBiqB8UOzaF3BBI/NtjjKjbLu+VshGadTDoeQ ayQ6d6r5Sl+BE0PNLF65H8WJF0VyzTsTOSKAynRGGoLCaO+gzgxSwQe5+w9spw0SMSRY +it9DSZm1en+BsfMNlcbkUqN5a9ova+q4whSjdq4NoTrCaZS/6ZTVbBjc/HK2IQYQI4/ CTDw==",
60
+ "From" => "From Name <from@example.com>",
61
+ "Message-Id" => "<CAGBx7GhsVk7Q-aO-FQ-m+Oix7GQyEVHyL60qv0__G8EpH8pA4w@mail.gmail.com>",
62
+ "In-Reply-To" => "<CAGBx7GhULS7d6ZsdLREHnKQ68V6w2fbGmD85dPn63s6RtpsZeQ@mail.gmail.com>",
63
+ "References" => "<CAGBx7GhULS7d6ZsdLREHnKQ68V6w2fbGmD85dPn63s6RtpsZeQ@mail.gmail.com> <9999999999999@mail.gmail.com>",
64
+ "Mime-Version" => "1.0",
65
+ "Received" => [ "from mail-lb0-f179.google.com (mail-lb0-f179.google.com [209.85.217.179]) by app01.transact (Postfix) with ESMTPS id E94801E000B8 for <to@example.com>; Thu, 9 Aug 2012 03:45:01 -0400 (EDT)",
66
+ "by lbao2 with SMTP id o2so118681lba.24 for <to@example.com>; Thu, 09 Aug 2012 00:45:00 -0700 (PDT)",
67
+ "by 10.152.112.233 with SMTP id it9mr20848692lab.40.1344498300372; Thu, 09 Aug 2012 00:45:00 -0700 (PDT)",
68
+ "by 10.114.69.44 with HTTP; Thu, 9 Aug 2012 00:45:00 -0700 (PDT)" ],
69
+ "Subject" => "[inbound] Sample Subject 2",
70
+ "To" => "to@example.com, Other To <other.to@example.com>"
71
+ },
72
+ :sender_email => 'from@example.com',
73
+ :user_email => 'from@example.com',
74
+ :recipients => [["to@example.com,", nil], ["other.to@example.com", " Other To "], ["cc@example.com", nil]],
75
+ :recipient_emails => ["to@example.com,", "other.to@example.com", "cc@example.com"],
76
+ :message_body => "asfasdf\nasdf\nasdf\nasdf\nasdf\n\n",
77
+ :click => nil,
78
+ :all_clicks => [],
79
+ :all_clicked_links => []
80
+ },
81
+ 'click' => {
82
+ :event_type => 'click',
83
+ :subject => '[click] Sample Subject',
84
+ :message_id => '8606637.6692f6cac28e45a9b371e182d5ca0a35',
85
+ :message_version => 5,
86
+ :in_reply_to => nil,
87
+ :references => [],
88
+ :headers => {},
89
+ :sender_email => nil,
90
+ :user_email => 'to@example.com',
91
+ :recipients => [],
92
+ :recipient_emails => [],
93
+ :message_body => nil,
94
+ :click => {"ts"=>1350377135, "url"=>"http://feedproxy.google.com/~r/readwriteweb/~3/op1uGAwjnFo/fix-your-iphones-maps-reminders-with-localscope-3.php"},
95
+ :all_clicks => [
96
+ {"ts"=>1350347773, "url"=>"http://feedproxy.google.com/~r/readwriteweb/~3/rqUHtsdBCzc/saturday-night-live-sketch-skewers-iphone-5-and-the-tech-press-video.php"},
97
+ {"ts"=>1350377171, "url"=>"http://feedproxy.google.com/~r/readwriteweb/~3/MMUCngEPdSU/now-you-can-search-your-email-docs-spreadsheets-from-the-main-google-box.php"},
98
+ {"ts"=>1350377231, "url"=>"http://feedproxy.google.com/~r/readwriteweb/~3/KemlM1hZvdI/how-evil-is-your-smartphone.php"},
99
+ {"ts"=>1350377135, "url"=>"http://feedproxy.google.com/~r/readwriteweb/~3/op1uGAwjnFo/fix-your-iphones-maps-reminders-with-localscope-3.php"}
100
+ ],
101
+ :all_clicked_links => [
102
+ "http://feedproxy.google.com/~r/readwriteweb/~3/rqUHtsdBCzc/saturday-night-live-sketch-skewers-iphone-5-and-the-tech-press-video.php",
103
+ "http://feedproxy.google.com/~r/readwriteweb/~3/MMUCngEPdSU/now-you-can-search-your-email-docs-spreadsheets-from-the-main-google-box.php",
104
+ "http://feedproxy.google.com/~r/readwriteweb/~3/KemlM1hZvdI/how-evil-is-your-smartphone.php",
105
+ "http://feedproxy.google.com/~r/readwriteweb/~3/op1uGAwjnFo/fix-your-iphones-maps-reminders-with-localscope-3.php"
106
+ ]
107
+ },
108
+ 'send' => {
109
+ :event_type => 'send',
110
+ :subject => '[send] Sample Subject',
111
+ :message_id => '9a32184309ad4d5e9bfd20368d9d7981',
112
+ :message_version => nil,
113
+ :in_reply_to => nil,
114
+ :references => [],
115
+ :headers => {},
116
+ :sender_email => nil,
117
+ :user_email => 'to@example.com',
118
+ :recipients => [],
119
+ :recipient_emails => [],
120
+ :message_body => nil,
121
+ :click => nil,
122
+ :all_clicks => [],
123
+ :all_clicked_links => []
124
+ },
125
+ 'open' => {
126
+ :event_type => 'open',
127
+ :subject => '[open] Sample Subject',
128
+ :message_id => '12847763.9a32184309ad4d5e9bfd20368d9d7981',
129
+ :message_version => 3,
130
+ :in_reply_to => nil,
131
+ :references => [],
132
+ :headers => {},
133
+ :sender_email => nil,
134
+ :user_email => 'to@example.com',
135
+ :recipients => [],
136
+ :recipient_emails => [],
137
+ :message_body => nil,
138
+ :click => nil,
139
+ :all_clicks => [{"ts"=>1350693098, "url"=>"http://feedproxy.google.com/~r/AccidentalTechnologist/~3/Jc7hYTVjcmM/"}],
140
+ :all_clicked_links => ["http://feedproxy.google.com/~r/AccidentalTechnologist/~3/Jc7hYTVjcmM/"]
141
+ },
142
+ }.each do |event_type,expectations|
143
+ context "with #{event_type} event_type" do
144
+ let(:raw_event) { webhook_example_event(event_type) }
145
+ let(:event_payload) { Mandrill::WebHook::EventDecorator[raw_event] }
146
+ subject { event_payload }
147
+ expectations.each do |attribute,expected_value|
148
+ its(attribute) { should eql(expected_value) }
149
+ end
150
+ end
151
+ end
21
152
 
22
- let(:raw_event) { {
23
- 'event' => event_type,
24
- 'msg' => {
25
- 'from_email' => sender_email,
26
- 'subject' => subject_line,
27
- 'headers' => {
28
- 'Cc' => "c@example.com,b@example.com",
29
- 'Message-Id' => message_id,
30
- 'In-Reply-To' => in_reply_to,
31
- 'References' => references
32
- },
33
- 'html' => message_html,
34
- 'raw_msg' => message_raw,
35
- 'text' => message_text,
36
- 'cc' => [ [ "c@example.com", "C"],[ "b@example.com", nil] ],
37
- 'to' => [ [ "a@example.com", "A"],[ "b@example.com", nil] ]
38
- }
39
- } }
40
153
 
41
- its(:event_type) { should eql(event_type) }
42
- its(:subject) { should eql(subject_line) }
43
- its(:sender_email) { should eql(sender_email) }
44
- its(:recipients) { should eql([["a@example.com", "A"], ["b@example.com", nil], ["c@example.com", "C"]]) }
45
- its(:message_id) { should eql(message_id) }
46
- its(:in_reply_to) { should eql(in_reply_to) }
154
+ describe "#message_body" do
155
+ let(:raw_event) { webhook_example_event('inbound') }
156
+ let(:event_payload) { Mandrill::WebHook::EventDecorator[raw_event] }
47
157
 
48
- describe "#references" do
49
- its(:references) { should eql(references_array) }
50
- context "when no references element" do
51
- let(:raw_event) { {} }
52
- its(:references) { should eql([]) }
53
- end
158
+ subject { event_payload.message_body(format) }
159
+ describe ":text" do
160
+ let(:expected) { "multi-line content\n\n*multi-line content\n*\n*with some formatting*\n\nmulti-line content\n\n" }
161
+ let(:format) { :text }
162
+ it { should eql(expected) }
54
163
  end
55
-
56
- describe "#recipient_emails" do
57
- its(:recipient_emails) { should eql(["a@example.com", "b@example.com", "c@example.com"]) }
58
- context "when no to or Cc elements" do
59
- let(:raw_event) { {} }
60
- its(:recipient_emails) { should eql([]) }
61
- end
164
+ describe ":html" do
165
+ let(:expected) { "multi-line content<br><br><b>multi-line content<br></b>\n<br><i>with some formatting</i><br><br>\nmulti-line content<br>\n<br>\n<br>\n\n" }
166
+ let(:format) { :html }
167
+ it { should eql(expected) }
62
168
  end
63
-
64
- describe "#message_body" do
65
- subject { event_payload.message_body(format) }
66
- describe ":text" do
67
- let(:format) { :text }
68
- it { should eql(message_text) }
69
- end
70
- describe ":html" do
71
- let(:format) { :html }
72
- it { should eql(message_html) }
73
- end
74
- describe ":raw" do
75
- let(:format) { :raw }
76
- it { should eql(message_raw) }
77
- end
169
+ describe ":raw" do
170
+ let(:expected) { "Received: from mail-lpp01m010-f51.google.com (mail-lpp01m010-f51.google.com [209.85.215.51])\n\tby app01.transact (Postfix) with ESMTPS id F01841E0010A\n\tfor <to@example.com>; Thu, 9 Aug 2012 03:44:16 -0400 (EDT)\nReceived: by lahe6 with SMTP id e6so79326lah.24\n for <to@example.com>; Thu, 09 Aug 2012 00:44:15 -0700 (PDT)\nDKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=gmail.com; s=20120113;\n h=mime-version:date:message-id:subject:from:to:content-type;\n bh=9/e4o7vsyI5eIM2MUze13ZWWdxyhC7cxjHwrHXPSEJQ=;\n b=HOb83u8i6ai3HuT61C+NfQcUHqATH+/ivAjZ2pD/MXcCFboOyN9LGeMHm+RhwnL+Ap\n mC0R9+eqlWaoxqd6ugrvtNOQ1Kvb9LunPnnMwY06KZKpoXCVwFrzT3e2f8JgLwyAxpUv\n G0srziHwpuCh/y42dJ83tKhctHc6w6GKC79H1WBAcexnjvk0LgrkOnNJ/iBCOznjs35o\n V4jfjlJBeZLvxcnEJ5Xxade2kWbLZ9TWiuVfTS6xUyVb/gfn5x9D1KjCUb1Gwq9wYJ4m\n UxH6oC5f3mkM+NZ6oDBmJFDdVxg23rRaMrF4YBpVGj+6+pjF36N8CrmtaDOJNVqCS5FN\n koSw==\nMIME-Version: 1.0\nReceived: by 10.112.43.67 with SMTP id u3mr382471lbl.16.1344498255378; Thu, 09\n Aug 2012 00:44:15 -0700 (PDT)\nReceived: by 10.114.69.44 with HTTP; Thu, 9 Aug 2012 00:44:15 -0700 (PDT)\nDate: Thu, 9 Aug 2012 15:44:15 +0800\nMessage-ID: <CAGBx7GhULS7d6ZsdLREHnKQ68V6w2fbGmD85dPn63s6RtpsZeQ@mail.gmail.com>\nSubject: [inbound] Sample Subject\nFrom: From Name <from@example.com>\nTo: to@example.com\nContent-Type: multipart/alternative; boundary=e0cb4efe2faee9b97304c6d0647b\n\n--e0cb4efe2faee9b97304c6d0647b\nContent-Type: text/plain; charset=UTF-8\n\nmulti-line content\n\n*multi-line content\n*\n*with some formatting*\n\nmulti-line content\n\n--e0cb4efe2faee9b97304c6d0647b\nContent-Type: text/html; charset=UTF-8\n\nmulti-line content<br><br><b>multi-line content<br></b>\n<br><i>with some formatting</i><br><br>\nmulti-line content<br>\n<br>\n<br>\n\n--e0cb4efe2faee9b97304c6d0647b--\n" }
171
+ let(:format) { :raw }
172
+ it { should eql(expected) }
78
173
  end
79
-
80
174
  end
81
175
 
82
176
 
83
- # TODO: elaborate specs for send web hook (need some real payload examples)
84
- context "with 'send' event_type" do
85
- let(:event_type) { 'send' }
86
- let(:subject_line) { 'a subject line' }
87
- let(:raw_event) { {
88
- 'event' => event_type,
89
- 'subject' => subject_line
90
- } }
91
-
92
- its(:event_type) { should eql(event_type) }
93
- its(:subject) { should eql(subject_line) }
94
- end
177
+ end
95
178
 
96
- # TODO: other web hook types
97
- # send - message has been sent
98
- # hard_bounce - message has hard bounced
99
- # soft_bounce - message has soft bounced
100
- # open - recipient opened a message; will only occur when open tracking is enabled
101
- # click - recipient clicked a link in a message; will only occur when click tracking is enabled
102
- # spam - recipient marked a message as spam
103
- # unsub - recipient unsubscribed
104
- # reject - message was rejected
105
- end
@@ -0,0 +1,25 @@
1
+ require 'pathname'
2
+ require 'json'
3
+
4
+ module FixturesHelper
5
+
6
+ def webhook_examples_path
7
+ Pathname.new(File.dirname(__FILE__)).join('..','fixtures','webhook_examples')
8
+ end
9
+
10
+ # Returns the JSON representation of an array of +sample_name+ events
11
+ def webhook_example_events(sample_name)
12
+ sample_path = webhook_examples_path.join("#{sample_name}.json")
13
+ JSON.parse(sample_path.read)
14
+ end
15
+
16
+ # Returns the JSON representation of an +sample_name+ event
17
+ def webhook_example_event(sample_name)
18
+ webhook_example_events(sample_name).first
19
+ end
20
+ end
21
+
22
+
23
+ RSpec.configure do |conf|
24
+ conf.include FixturesHelper
25
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mandrill-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-09-11 00:00:00.000000000 Z
12
+ date: 2012-10-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: mandrill
16
- requirement: !ruby/object:Gem::Requirement
16
+ requirement: &70116641865300 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,15 +21,10 @@ dependencies:
21
21
  version: 0.0.2
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
27
- - - ~>
28
- - !ruby/object:Gem::Version
29
- version: 0.0.2
24
+ version_requirements: *70116641865300
30
25
  - !ruby/object:Gem::Dependency
31
26
  name: activesupport
32
- requirement: !ruby/object:Gem::Requirement
27
+ requirement: &70116641864660 !ruby/object:Gem::Requirement
33
28
  none: false
34
29
  requirements:
35
30
  - - ! '>='
@@ -37,15 +32,10 @@ dependencies:
37
32
  version: 3.0.3
38
33
  type: :runtime
39
34
  prerelease: false
40
- version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
- requirements:
43
- - - ! '>='
44
- - !ruby/object:Gem::Version
45
- version: 3.0.3
35
+ version_requirements: *70116641864660
46
36
  - !ruby/object:Gem::Dependency
47
37
  name: bundler
48
- requirement: !ruby/object:Gem::Requirement
38
+ requirement: &70116641864160 !ruby/object:Gem::Requirement
49
39
  none: false
50
40
  requirements:
51
41
  - - ~>
@@ -53,15 +43,10 @@ dependencies:
53
43
  version: 1.1.0
54
44
  type: :development
55
45
  prerelease: false
56
- version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
- requirements:
59
- - - ~>
60
- - !ruby/object:Gem::Version
61
- version: 1.1.0
46
+ version_requirements: *70116641864160
62
47
  - !ruby/object:Gem::Dependency
63
48
  name: rake
64
- requirement: !ruby/object:Gem::Requirement
49
+ requirement: &70116641863640 !ruby/object:Gem::Requirement
65
50
  none: false
66
51
  requirements:
67
52
  - - ~>
@@ -69,15 +54,10 @@ dependencies:
69
54
  version: 0.9.2.2
70
55
  type: :development
71
56
  prerelease: false
72
- version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
- requirements:
75
- - - ~>
76
- - !ruby/object:Gem::Version
77
- version: 0.9.2.2
57
+ version_requirements: *70116641863640
78
58
  - !ruby/object:Gem::Dependency
79
59
  name: rspec
80
- requirement: !ruby/object:Gem::Requirement
60
+ requirement: &70116641863140 !ruby/object:Gem::Requirement
81
61
  none: false
82
62
  requirements:
83
63
  - - ~>
@@ -85,15 +65,10 @@ dependencies:
85
65
  version: 2.8.0
86
66
  type: :development
87
67
  prerelease: false
88
- version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
- requirements:
91
- - - ~>
92
- - !ruby/object:Gem::Version
93
- version: 2.8.0
68
+ version_requirements: *70116641863140
94
69
  - !ruby/object:Gem::Dependency
95
70
  name: rdoc
96
- requirement: !ruby/object:Gem::Requirement
71
+ requirement: &70116641862560 !ruby/object:Gem::Requirement
97
72
  none: false
98
73
  requirements:
99
74
  - - ~>
@@ -101,15 +76,10 @@ dependencies:
101
76
  version: '3.11'
102
77
  type: :development
103
78
  prerelease: false
104
- version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
- requirements:
107
- - - ~>
108
- - !ruby/object:Gem::Version
109
- version: '3.11'
79
+ version_requirements: *70116641862560
110
80
  - !ruby/object:Gem::Dependency
111
81
  name: guard-rspec
112
- requirement: !ruby/object:Gem::Requirement
82
+ requirement: &70116641862000 !ruby/object:Gem::Requirement
113
83
  none: false
114
84
  requirements:
115
85
  - - ~>
@@ -117,13 +87,8 @@ dependencies:
117
87
  version: 1.2.0
118
88
  type: :development
119
89
  prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
- requirements:
123
- - - ~>
124
- - !ruby/object:Gem::Version
125
- version: 1.2.0
126
- description: Rails integration for working with Mandrill
90
+ version_requirements: *70116641862000
91
+ description: Rails integration for Mandrill
127
92
  email:
128
93
  - gallagher.paul@gmail.com
129
94
  executables: []
@@ -145,10 +110,16 @@ files:
145
110
  - lib/mandrill/web_hook/event_decorator.rb
146
111
  - lib/mandrill/web_hook/processor.rb
147
112
  - mandrill-rails.gemspec
113
+ - spec/fixtures/webhook_examples/click.json
114
+ - spec/fixtures/webhook_examples/inbound.json
115
+ - spec/fixtures/webhook_examples/inbound_reply.json
116
+ - spec/fixtures/webhook_examples/open.json
117
+ - spec/fixtures/webhook_examples/send.json
148
118
  - spec/mandrill-rails/web_hook_processor_spec.rb
149
119
  - spec/mandrill/web_hook/event_decorator_spec.rb
150
120
  - spec/mandrill/web_hook/processor_spec.rb
151
121
  - spec/spec_helper.rb
122
+ - spec/support/fixtures_helper.rb
152
123
  homepage: https://github.com/evendis/mandrill-rails
153
124
  licenses: []
154
125
  post_install_message:
@@ -161,26 +132,27 @@ required_ruby_version: !ruby/object:Gem::Requirement
161
132
  - - ! '>='
162
133
  - !ruby/object:Gem::Version
163
134
  version: '0'
164
- segments:
165
- - 0
166
- hash: 1652128042679890864
167
135
  required_rubygems_version: !ruby/object:Gem::Requirement
168
136
  none: false
169
137
  requirements:
170
138
  - - ! '>='
171
139
  - !ruby/object:Gem::Version
172
140
  version: '0'
173
- segments:
174
- - 0
175
- hash: 1652128042679890864
176
141
  requirements: []
177
142
  rubyforge_project:
178
- rubygems_version: 1.8.24
143
+ rubygems_version: 1.8.15
179
144
  signing_key:
180
145
  specification_version: 3
181
- summary: Rails integration for working with Mandrill
146
+ summary: Provides webhook processing and event decoration to make using Mandrill with
147
+ Rails just that much easier
182
148
  test_files:
149
+ - spec/fixtures/webhook_examples/click.json
150
+ - spec/fixtures/webhook_examples/inbound.json
151
+ - spec/fixtures/webhook_examples/inbound_reply.json
152
+ - spec/fixtures/webhook_examples/open.json
153
+ - spec/fixtures/webhook_examples/send.json
183
154
  - spec/mandrill-rails/web_hook_processor_spec.rb
184
155
  - spec/mandrill/web_hook/event_decorator_spec.rb
185
156
  - spec/mandrill/web_hook/processor_spec.rb
186
157
  - spec/spec_helper.rb
158
+ - spec/support/fixtures_helper.rb