sendgrid_toolkit 0.1.1 → 1.0.0

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/.gitignore CHANGED
@@ -1,2 +1,3 @@
1
1
  pkg/
2
- doc/
2
+ doc/
3
+ .idea/*
data/README.md ADDED
@@ -0,0 +1,278 @@
1
+ SendgridToolkit
2
+ ===============
3
+
4
+ SendgridToolkit is a Ruby wrapper for the Sendgrid Web API
5
+
6
+ Supported Modules
7
+ -----------------
8
+
9
+ SendgridToolkit provides a class for interacting with each of the following Sendgrid API modules:
10
+
11
+ - Bounces
12
+ - InvalidEmails
13
+ - SpamReports
14
+ - Statistics
15
+ - Unsubscribes
16
+
17
+ Consuming the Sendgrid API is as simple as instantiating a class and making the call:
18
+
19
+ unsubscribes = SendgridToolkit::Unsubscribes.new("username", "api_key")
20
+ unsubscribes.add :email => "email@to.unsubscribe"
21
+
22
+ Two lines, and voila!
23
+
24
+ Common actions are documented below under each module. For more details, visit the [Sendgrid Web API Documentation][2]
25
+
26
+ Contributing
27
+ ------------
28
+
29
+ When submitting patches, please be sure you include rspec tests!
30
+
31
+ Big thanks to [James Brennan][1] for refactoring old code and writing the Bounces, InvalidEmails and SpamReports modules.
32
+
33
+ Bounces Module
34
+ --------------
35
+ The bounces module provides access to all of your bounces.
36
+
37
+ - - -
38
+
39
+ Instantiate the Bounces object:
40
+
41
+ bounces = SendgridToolkit::Bounces.new(api_user, api_key)
42
+
43
+ - - -
44
+
45
+ Retrieve bounces:
46
+
47
+ all_bounces = bounces.retrieve
48
+
49
+ `all_bounces` will be an array of hashes, each of which contains the following keys:
50
+
51
+ - `email`: the recipient's email address
52
+ - `status`: the status of email
53
+ - `reason`: the reason for the bounce, as specified by the recipient's email server
54
+
55
+ - - -
56
+
57
+ Get the timestamp of each bounce:
58
+
59
+ all_bounces = bounces.retrieve_with_timestamps
60
+
61
+ Each hash in `all_bounces` will now contain a `created` key, which holds a Ruby Time object.
62
+
63
+ - - -
64
+
65
+ If you believe an email address will no longer bounce and would like Sendgrid to deliver future emails to that address, you may delete the Bounce entry:
66
+
67
+ bounces.delete :email => "email@address.of.bounce.to.delete"
68
+
69
+ InvalidEmails Module
70
+ --------------------
71
+
72
+ The InvalidEmails module provides access to all of your email addresses.
73
+
74
+ - - -
75
+
76
+ Instantiate the InvalidEmails object:
77
+
78
+ invalid_emails_obj = SendgridToolkit::InvalidEmails.new(api_user, api_key)
79
+
80
+ - - -
81
+
82
+ Retrieve invalid emails:
83
+
84
+ invalid_emails = invalid_emails_obj.retrieve
85
+
86
+ `invalid_emails` will be an array of hashes, each of which contains the following keys:
87
+
88
+ - `email`: the recipient's email address
89
+ - `reason`: the reason the email address is believed to be invalid
90
+
91
+ - - -
92
+
93
+ Get the timestamp that each email was determined to be invalid:
94
+
95
+ invalid_emails = invalid_emails_obj.retrieve_with_timestamps
96
+
97
+ Each hash in `invalid_emails` will now contain a `created` key, which holds a Ruby Time object.
98
+
99
+ - - -
100
+
101
+ If you believe a once-invalid email address is now valid and would like Sendgrid to deliver future emails to that address, you may delete the InvalidEmail entry:
102
+
103
+ invalid_emails.delete :email => "email@address.of.invalid.to.delete"
104
+
105
+ SpamReports Module
106
+ ------------------
107
+
108
+ The SpamReports module provides access to all email addresses that have reported you for spam.
109
+
110
+ - - -
111
+
112
+ Instantiate the SpamReports object:
113
+
114
+ spam_reports_obj = SendgridToolkit::SpamReports.new(api_user, api_key)
115
+
116
+ - - -
117
+
118
+ Retrieve spam reports:
119
+
120
+ spam_reports = spam_reports_obj.retrieve
121
+
122
+ `spam_reports` will be an array of hashes, each of which contains an `email` key, indicating the email address that reported you for spam.
123
+
124
+ - - -
125
+
126
+ Get the timestamp of each spam report:
127
+
128
+ spam_reports = spam_reports_obj.retrieve_with_timestamps
129
+
130
+ Each hash in `spam_reports` will now contain a `created` key, which holds a Ruby Time object.
131
+
132
+ - - -
133
+
134
+ If you believe a user will no longer consider your content to be spam, you may delete the SpamReport entry:
135
+
136
+ spam_reports.delete :email => "email@address.that.called.you.a.spammer"
137
+
138
+ Statistics Module
139
+ -----------------
140
+ The statistics module provides access to all of your email statistics.
141
+
142
+ - - -
143
+
144
+ Instantiate the Statistics object:
145
+
146
+ statistics = SendgridToolkit::Statistics.new(api_user, api_key)
147
+
148
+ - - -
149
+
150
+ Retrieve statistics:
151
+
152
+ stats = statistics.retrieve
153
+
154
+ `stats` will be an array of hashes, each of which contains the following keys:
155
+
156
+ - `date`: The date to which the statistics in this hash refer to
157
+ - `requests`: The number of emails you sent
158
+ - `bounces`: The number of users who opened your email but did not click on your links
159
+ - `clicks`: The number of users who clicked on a link in your email
160
+ - `opens`: The number of users who opened your email
161
+ - `spamreports`: The number of users who have reported your emails as spam
162
+
163
+ `stats` may also contain some keys that Sendgrid does not officially document, such as: `delivered`, `invalid_email`, `repeat_bounces`,`+repeat_spamreports`, `repeat_unsubscribes` and `unsubscribes`
164
+
165
+ - - -
166
+
167
+ To narrow your retrieval to the past 5 days:
168
+
169
+ stats = statistics.retrieve :days => 5
170
+
171
+ To narrow your retrieval to emails within the last month but before one week ago:
172
+
173
+ stats = statistics.retrieve :start_date => 1.month.ago, :end_date => 1.week.ago
174
+
175
+ To narrow your search to a particular category (applicable only if you use this Sendgrid feature):
176
+
177
+ stats = statistics.retrieve :category => "NameOfYourCategory"
178
+
179
+ Note: You may combine a category query with other options, i.e.:
180
+
181
+ stats = statistics.retrieve :category => "NameOfYourCategory", :days => 5
182
+
183
+ - - -
184
+
185
+ Receive your all-time statistics:
186
+
187
+ stats = statistics.retrieve_aggregate
188
+
189
+ `stats` will be a single hash containing all of the aforementioned keys except `date`.
190
+
191
+ - - -
192
+
193
+ If you use Sendgrid's category feature, you can list your categories:
194
+
195
+ cats = statistics.list_categories
196
+
197
+ `cats` is an array of hashes, each of which has a `category` key that holds the name of a category.
198
+
199
+ Unsubscribes Module
200
+ -------------------
201
+ The unsubscribes module manages your list of unsubscribed email addresses.
202
+
203
+ - - -
204
+
205
+ Instantiate the Unsubscribes object:
206
+
207
+ unsubscribes = SendgridToolkit::Unsubscribes.new(api_user, api_key)
208
+
209
+ - - -
210
+
211
+ List everybody who has unsubscribed from your emails with:
212
+
213
+ listing = unsubscribes.retrieve
214
+ `listing` will be an array of hashes, each of which has an `email` key.
215
+
216
+ - - -
217
+
218
+ Get the timestamp when each user unsubscribed:
219
+
220
+ listing = unsubscribes.retrieve_with_timestamps
221
+
222
+ Each hash in `listing` will now contain a `created` key, which holds a Ruby Time object.
223
+
224
+ - - -
225
+
226
+ Unsubscribe a user from your sendgrid email:
227
+
228
+ unsubscribes.add :email => "email@to.unsubscribe"
229
+
230
+ SendgridToolkit will throw `UnsubscribeEmailAlreadyExists` if the email you specified is already on the list
231
+
232
+ - - -
233
+
234
+ Remove a user from your unsubscribe list:
235
+
236
+ unsubscribes.delete :email => "email@that_is.unsubscribed"
237
+
238
+ SendgridToolkit will throw `UnsubscribeEmailDoesNotExist` if the email you specified is not on the list
239
+
240
+
241
+ A note about authentication
242
+ ---------------------------
243
+
244
+ Each class is initialized with `api_user` and `api_key` parameters. `api_user` is your sendgrid account email address, and `api_key` is your sendgrid password.
245
+
246
+ If you don't supply `api_user` or `api_key`, SendgridToolkit will look for the `SMTP_USERNAME` or `SMTP_PASSWORD` environment variables. If they are not found, SendgridToolkit will throw `NoAPIKeySpecified` or `NoAPIUserSpecified`, depending on what you omitted.
247
+
248
+ If authentication fails during an API request, SendgridToolkit throws `AuthenticationFailed`.
249
+
250
+
251
+ In Case You're Curious...
252
+ -------------------------
253
+
254
+ API requests are made and responses are received in JSON. All requests are made as POSTs unless noted otherwise (Sendgrid's examples are via GET, but they support POST)
255
+
256
+ Each class takes a final options parameter in the form of a hash. You may use this parameter to pass additional options to the Sendgrid API. For example, let's say you are using the unsubscribes function:
257
+
258
+ unsubscribes = SendgridToolkit::Unsubscribes.new(api_user, api_key)
259
+ listing = unsubscribes.retrieve
260
+
261
+ If Sendgrid were to add a `only_verified` option to this API call, you could call:
262
+
263
+ listing = unsubscribes.retrieve :only_verified => true
264
+
265
+ to make use of it.
266
+
267
+ Testing
268
+ -------
269
+
270
+ In addition to unit tests, SendgridToolkit comes with a limited suite of "webconnect" tests that will actually hit Sendgrid's servers and perform various actions for purposes of real-world testing. In order to use these tests, you must:
271
+
272
+ 1. Create a test account with sendgrid and store the credentials in `TEST_SMTP_USERNAME` and `TEST_SMTP_PASSWORD` environment variables. This is so that actions are performed on a test account and not your real Sendgrid account. If you forget, don't worry -- the tests will fail but they will **not** fall back on the account that uses `SMTP_USERNAME` and `SMTP_PASSWORD`.
273
+ 2. Change "xit" it "it" on the tests you wish to run.
274
+
275
+ Running "spec spec" out of the box will run the standard suite of tests (all network access is stubbed out).
276
+
277
+ [1]: http://github.com/jamesBrennan
278
+ [2]: http://wiki.sendgrid.com/doku.php?id=web_api
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.1
1
+ 1.0.0
@@ -1,9 +1,13 @@
1
1
  require 'httparty'
2
2
 
3
3
  require 'sendgrid_toolkit/abstract_sendgrid_client'
4
+ require 'sendgrid_toolkit/common'
4
5
  require 'sendgrid_toolkit/sendgrid_error'
5
6
  require 'sendgrid_toolkit/statistics'
6
7
  require 'sendgrid_toolkit/unsubscribes'
8
+ require 'sendgrid_toolkit/spam_reports'
9
+ require 'sendgrid_toolkit/bounces'
10
+ require 'sendgrid_toolkit/invalid_emails'
7
11
 
8
12
  module SendgridToolkit
9
13
  BASE_URI = "sendgrid.com/api"
@@ -0,0 +1,7 @@
1
+ module SendgridToolkit
2
+
3
+ class Bounces < AbstractSendgridClient
4
+ include SendgridToolkit::Common
5
+ end
6
+
7
+ end
@@ -0,0 +1,31 @@
1
+ module SendgridToolkit
2
+
3
+ module Common
4
+
5
+ def retrieve(options = {})
6
+ response = api_post(module_name, 'get', options)
7
+ response
8
+ end
9
+
10
+ def retrieve_with_timestamps(options = {})
11
+ options.merge! :date => 1
12
+ response = retrieve options
13
+ response.each do |unsubscribe|
14
+ unsubscribe['created'] = Time.parse(unsubscribe['created']) if unsubscribe.has_key?('created')
15
+ end
16
+ response
17
+ end
18
+
19
+ def delete(options = {})
20
+ response = api_post(module_name, 'delete', options)
21
+ raise EmailDoesNotExist if response['message'].include?('does not exist')
22
+ response
23
+ end
24
+
25
+ def module_name
26
+ self.class.to_s.split("::").last.downcase
27
+ end
28
+
29
+ end
30
+
31
+ end
@@ -0,0 +1,7 @@
1
+ module SendgridToolkit
2
+
3
+ class InvalidEmails < AbstractSendgridClient
4
+ include SendgridToolkit::Common
5
+ end
6
+
7
+ end
@@ -4,4 +4,5 @@ module SendgridToolkit
4
4
  class NoAPIUserSpecified < StandardError; end
5
5
  class UnsubscribeEmailAlreadyExists < StandardError; end
6
6
  class UnsubscribeEmailDoesNotExist < StandardError; end
7
+ class EmailDoesNotExist < StandardError; end
7
8
  end
@@ -0,0 +1,7 @@
1
+ module SendgridToolkit
2
+
3
+ class SpamReports < AbstractSendgridClient
4
+ include SendgridToolkit::Common
5
+ end
6
+
7
+ end
@@ -5,29 +5,37 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{sendgrid_toolkit}
8
- s.version = "0.1.1"
8
+ s.version = "1.0.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Robby Grossman"]
12
- s.date = %q{2010-03-07}
12
+ s.date = %q{2010-09-10}
13
13
  s.description = %q{A Ruby wrapper and utility library for communicating with the Sendgrid API}
14
14
  s.email = %q{robby@freerobby.com}
15
15
  s.extra_rdoc_files = [
16
- "README.rdoc"
16
+ "README.md"
17
17
  ]
18
18
  s.files = [
19
19
  ".gitignore",
20
- "README.rdoc",
20
+ "README.md",
21
21
  "Rakefile",
22
22
  "VERSION",
23
23
  "lib/sendgrid_toolkit.rb",
24
24
  "lib/sendgrid_toolkit/abstract_sendgrid_client.rb",
25
+ "lib/sendgrid_toolkit/bounces.rb",
26
+ "lib/sendgrid_toolkit/common.rb",
27
+ "lib/sendgrid_toolkit/invalid_emails.rb",
25
28
  "lib/sendgrid_toolkit/sendgrid_error.rb",
29
+ "lib/sendgrid_toolkit/spam_reports.rb",
26
30
  "lib/sendgrid_toolkit/statistics.rb",
27
31
  "lib/sendgrid_toolkit/unsubscribes.rb",
28
32
  "sendgrid_toolkit.gemspec",
29
33
  "spec/helper.rb",
30
34
  "spec/lib/sendgrid_toolkit/abstract_sendgrid_client_spec.rb",
35
+ "spec/lib/sendgrid_toolkit/bounces_spec.rb",
36
+ "spec/lib/sendgrid_toolkit/common_spec.rb",
37
+ "spec/lib/sendgrid_toolkit/invalid_emails_spec.rb",
38
+ "spec/lib/sendgrid_toolkit/spam_reports_spec.rb",
31
39
  "spec/lib/sendgrid_toolkit/statistics_spec.rb",
32
40
  "spec/lib/sendgrid_toolkit/unsubscribes_spec.rb",
33
41
  "spec/lib/sendgrid_toolkit_spec.rb",
@@ -36,11 +44,15 @@ Gem::Specification.new do |s|
36
44
  s.homepage = %q{http://github.com/freerobby/sendgrid_toolkit}
37
45
  s.rdoc_options = ["--charset=UTF-8"]
38
46
  s.require_paths = ["lib"]
39
- s.rubygems_version = %q{1.3.6}
47
+ s.rubygems_version = %q{1.3.7}
40
48
  s.summary = %q{A Ruby wrapper and utility library for communicating with the Sendgrid API}
41
49
  s.test_files = [
42
50
  "spec/helper.rb",
43
51
  "spec/lib/sendgrid_toolkit/abstract_sendgrid_client_spec.rb",
52
+ "spec/lib/sendgrid_toolkit/bounces_spec.rb",
53
+ "spec/lib/sendgrid_toolkit/common_spec.rb",
54
+ "spec/lib/sendgrid_toolkit/invalid_emails_spec.rb",
55
+ "spec/lib/sendgrid_toolkit/spam_reports_spec.rb",
44
56
  "spec/lib/sendgrid_toolkit/statistics_spec.rb",
45
57
  "spec/lib/sendgrid_toolkit/unsubscribes_spec.rb",
46
58
  "spec/lib/sendgrid_toolkit_spec.rb",
@@ -51,7 +63,7 @@ Gem::Specification.new do |s|
51
63
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
52
64
  s.specification_version = 3
53
65
 
54
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
66
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
55
67
  else
56
68
  end
57
69
  else
@@ -0,0 +1,46 @@
1
+ require File.expand_path("#{File.dirname(__FILE__)}/../../helper")
2
+
3
+ describe SendgridToolkit::Bounces do
4
+ before do
5
+ FakeWeb.clean_registry
6
+ @obj = SendgridToolkit::Bounces.new("fakeuser", "fakepass")
7
+ end
8
+
9
+ describe "#retrieve" do
10
+ it "returns array of bounced emails" do
11
+ FakeWeb.register_uri(:post, %r|https://sendgrid\.com/api/bounces\.get\.json\?|, :body => '[{"email":"email1@domain.com","status":"5.1.1","reason":"host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: email1@domain.com"},{"email":"email2@domain2.com","status":"5.1.1","reason":"host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: email2@domain2.com"}]')
12
+ bounces = @obj.retrieve
13
+ bounces[0]['email'].should == "email1@domain.com"
14
+ bounces[0]['status'].should == "5.1.1"
15
+ bounces[0]['reason'].should == "host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: email1@domain.com"
16
+ end
17
+ end
18
+
19
+ describe "#retrieve_with_timestamps" do
20
+ it "parses timestamps" do
21
+ FakeWeb.register_uri(:post, %r|https://sendgrid\.com/api/bounces\.get\.json\?.*date=1|, :body => '[{"email":"email1@domain.com","status":"5.1.1","reason":"host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: email1@domain.com","created":"2009-06-01 19:41:39"},{"email":"email2@domain2.com","status":"5.1.1","reason":"host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: email2@domain2.com","created":"2009-06-12 19:41:39"}]')
22
+ bounces = @obj.retrieve_with_timestamps
23
+ 0.upto(1) do |index|
24
+ bounces[index]['created'].kind_of?(Time).should == true
25
+ end
26
+ bounces[0]['created'].asctime.should == "Mon Jun 1 19:41:39 2009"
27
+ bounces[1]['created'].asctime.should == "Fri Jun 12 19:41:39 2009"
28
+ end
29
+ end
30
+
31
+ describe "#delete" do
32
+ it "raises no errors on success" do
33
+ FakeWeb.register_uri(:post, %r|https://sendgrid\.com/api/bounces\.delete\.json\?.*email=.+|, :body => '{"message":"success"}')
34
+ lambda {
35
+ @obj.delete :email => "user@domain.com"
36
+ }.should_not raise_error
37
+ end
38
+ it "raises error when email address does not exist" do
39
+ FakeWeb.register_uri(:post, %r|https://sendgrid\.com/api/bounces\.delete\.json\?.*email=.+|, :body => '{"message":"Email does not exist"}')
40
+ lambda {
41
+ @obj.delete :email => "user@domain.com"
42
+ }.should raise_error SendgridToolkit::EmailDoesNotExist
43
+ end
44
+ end
45
+
46
+ end
@@ -0,0 +1,16 @@
1
+ require File.expand_path("#{File.dirname(__FILE__)}/../../helper")
2
+
3
+ describe SendgridToolkit::Common do
4
+
5
+ before do
6
+ class FakeClass
7
+ include SendgridToolkit::Common
8
+ end
9
+ @fake_class = FakeClass.new
10
+ end
11
+
12
+ it "creates a module_name method that returns the class name downcased" do
13
+ @fake_class.module_name.should == "fakeclass"
14
+ end
15
+
16
+ end
@@ -0,0 +1,50 @@
1
+ require File.expand_path("#{File.dirname(__FILE__)}/../../helper")
2
+
3
+ describe SendgridToolkit::InvalidEmails do
4
+ before do
5
+ FakeWeb.clean_registry
6
+ @obj = SendgridToolkit::InvalidEmails.new("fakeuser", "fakepass")
7
+ end
8
+
9
+ describe "#retrieve" do
10
+ it "returns array of invalid emails" do
11
+ FakeWeb.register_uri(:post, %r|https://sendgrid\.com/api/invalidemails\.get\.json\?|, :body => '[{"email":"isaac@hotmail.comm","reason":"Mail domain mentioned in email address is unknown"},{"email":"isaac@hotmail","reason":"Bad Syntax"},{"email":"isaac@example.com","reason":"Known bad domain"}]')
12
+ invalid_emails = @obj.retrieve
13
+ invalid_emails[0]['email'].should == "isaac@hotmail.comm"
14
+ invalid_emails[0]['reason'].should == "Mail domain mentioned in email address is unknown"
15
+ invalid_emails[1]['email'].should == "isaac@hotmail"
16
+ invalid_emails[1]['reason'].should == "Bad Syntax"
17
+ invalid_emails[2]['email'].should == "isaac@example.com"
18
+ invalid_emails[2]['reason'].should == "Known bad domain"
19
+ end
20
+ end
21
+
22
+ describe "#retrieve_with_timestamps" do
23
+ it "parses timestamps" do
24
+ FakeWeb.register_uri(:post, %r|https://sendgrid\.com/api/invalidemails\.get\.json\?.*date=1|, :body => '[{"email":"isaac@hotmail.comm","reason":"Mail domain mentioned in email address is unknown","created":"2009-06-01 19:41:39"},{"email":"isaac@hotmail","reason":"Bad Syntax","created":"2009-06-12 19:41:39"},{"email":"isaac@example.com","reason":"Known bad domain","created":"2009-06-13 09:40:01"}]')
25
+ invalid_emails = @obj.retrieve_with_timestamps
26
+ 0.upto(2) do |index|
27
+ invalid_emails[index]['created'].kind_of?(Time).should == true
28
+ end
29
+ invalid_emails[0]['created'].asctime.should == "Mon Jun 1 19:41:39 2009"
30
+ invalid_emails[1]['created'].asctime.should == "Fri Jun 12 19:41:39 2009"
31
+ invalid_emails[2]['created'].asctime.should == "Sat Jun 13 09:40:01 2009"
32
+ end
33
+ end
34
+
35
+ describe "#delete" do
36
+ it "raises no errors on success" do
37
+ FakeWeb.register_uri(:post, %r|https://sendgrid\.com/api/invalidemails\.delete\.json\?.*email=.+|, :body => '{"message":"success"}')
38
+ lambda {
39
+ @obj.delete :email => "user@domain.com"
40
+ }.should_not raise_error
41
+ end
42
+ it "raises error when email address does not exist" do
43
+ FakeWeb.register_uri(:post, %r|https://sendgrid\.com/api/invalidemails\.delete\.json\?.*email=.+|, :body => '{"message":"Email does not exist"}')
44
+ lambda {
45
+ @obj.delete :email => "user@domain.com"
46
+ }.should raise_error SendgridToolkit::EmailDoesNotExist
47
+ end
48
+ end
49
+
50
+ end
@@ -0,0 +1,45 @@
1
+ require File.expand_path("#{File.dirname(__FILE__)}/../../helper")
2
+
3
+ describe SendgridToolkit::SpamReports do
4
+ before do
5
+ FakeWeb.clean_registry
6
+ @obj = SendgridToolkit::SpamReports.new("fakeuser", "fakepass")
7
+ end
8
+
9
+ describe "#retrieve" do
10
+ it "returns array of bounced emails" do
11
+ FakeWeb.register_uri(:post, %r|https://sendgrid\.com/api/spamreports\.get\.json\?|, :body => '[{"email":"email1@domain.com"},{"email":"email2@domain2.com"}]')
12
+ bounces = @obj.retrieve
13
+ bounces[0]['email'].should == "email1@domain.com"
14
+ bounces[1]['email'].should == "email2@domain2.com"
15
+ end
16
+ end
17
+
18
+ describe "#retrieve_with_timestamps" do
19
+ it "parses timestamps" do
20
+ FakeWeb.register_uri(:post, %r|https://sendgrid\.com/api/spamreports\.get\.json\?.*date=1|, :body => '[{"email":"email1@domain.com","created":"2009-06-01 19:41:39"},{"email":"email2@domain2.com","created":"2009-06-12 19:41:39"}]')
21
+ bounces = @obj.retrieve_with_timestamps
22
+ 0.upto(1) do |index|
23
+ bounces[index]['created'].kind_of?(Time).should == true
24
+ end
25
+ bounces[0]['created'].asctime.should == "Mon Jun 1 19:41:39 2009"
26
+ bounces[1]['created'].asctime.should == "Fri Jun 12 19:41:39 2009"
27
+ end
28
+ end
29
+
30
+ describe "#delete" do
31
+ it "raises no errors on success" do
32
+ FakeWeb.register_uri(:post, %r|https://sendgrid\.com/api/spamreports\.delete\.json\?.*email=.+|, :body => '{"message":"success"}')
33
+ lambda {
34
+ @obj.delete :email => "user@domain.com"
35
+ }.should_not raise_error
36
+ end
37
+ it "raises error when email address does not exist" do
38
+ FakeWeb.register_uri(:post, %r|https://sendgrid\.com/api/spamreports\.delete\.json\?.*email=.+|, :body => '{"message":"Email does not exist"}')
39
+ lambda {
40
+ @obj.delete :email => "user@domain.com"
41
+ }.should raise_error SendgridToolkit::EmailDoesNotExist
42
+ end
43
+ end
44
+
45
+ end
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sendgrid_toolkit
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 23
4
5
  prerelease: false
5
6
  segments:
6
- - 0
7
- - 1
8
7
  - 1
9
- version: 0.1.1
8
+ - 0
9
+ - 0
10
+ version: 1.0.0
10
11
  platform: ruby
11
12
  authors:
12
13
  - Robby Grossman
@@ -14,7 +15,7 @@ autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2010-03-07 00:00:00 -05:00
18
+ date: 2010-09-10 00:00:00 -04:00
18
19
  default_executable:
19
20
  dependencies: []
20
21
 
@@ -25,20 +26,28 @@ executables: []
25
26
  extensions: []
26
27
 
27
28
  extra_rdoc_files:
28
- - README.rdoc
29
+ - README.md
29
30
  files:
30
31
  - .gitignore
31
- - README.rdoc
32
+ - README.md
32
33
  - Rakefile
33
34
  - VERSION
34
35
  - lib/sendgrid_toolkit.rb
35
36
  - lib/sendgrid_toolkit/abstract_sendgrid_client.rb
37
+ - lib/sendgrid_toolkit/bounces.rb
38
+ - lib/sendgrid_toolkit/common.rb
39
+ - lib/sendgrid_toolkit/invalid_emails.rb
36
40
  - lib/sendgrid_toolkit/sendgrid_error.rb
41
+ - lib/sendgrid_toolkit/spam_reports.rb
37
42
  - lib/sendgrid_toolkit/statistics.rb
38
43
  - lib/sendgrid_toolkit/unsubscribes.rb
39
44
  - sendgrid_toolkit.gemspec
40
45
  - spec/helper.rb
41
46
  - spec/lib/sendgrid_toolkit/abstract_sendgrid_client_spec.rb
47
+ - spec/lib/sendgrid_toolkit/bounces_spec.rb
48
+ - spec/lib/sendgrid_toolkit/common_spec.rb
49
+ - spec/lib/sendgrid_toolkit/invalid_emails_spec.rb
50
+ - spec/lib/sendgrid_toolkit/spam_reports_spec.rb
42
51
  - spec/lib/sendgrid_toolkit/statistics_spec.rb
43
52
  - spec/lib/sendgrid_toolkit/unsubscribes_spec.rb
44
53
  - spec/lib/sendgrid_toolkit_spec.rb
@@ -53,29 +62,37 @@ rdoc_options:
53
62
  require_paths:
54
63
  - lib
55
64
  required_ruby_version: !ruby/object:Gem::Requirement
65
+ none: false
56
66
  requirements:
57
67
  - - ">="
58
68
  - !ruby/object:Gem::Version
69
+ hash: 3
59
70
  segments:
60
71
  - 0
61
72
  version: "0"
62
73
  required_rubygems_version: !ruby/object:Gem::Requirement
74
+ none: false
63
75
  requirements:
64
76
  - - ">="
65
77
  - !ruby/object:Gem::Version
78
+ hash: 3
66
79
  segments:
67
80
  - 0
68
81
  version: "0"
69
82
  requirements: []
70
83
 
71
84
  rubyforge_project:
72
- rubygems_version: 1.3.6
85
+ rubygems_version: 1.3.7
73
86
  signing_key:
74
87
  specification_version: 3
75
88
  summary: A Ruby wrapper and utility library for communicating with the Sendgrid API
76
89
  test_files:
77
90
  - spec/helper.rb
78
91
  - spec/lib/sendgrid_toolkit/abstract_sendgrid_client_spec.rb
92
+ - spec/lib/sendgrid_toolkit/bounces_spec.rb
93
+ - spec/lib/sendgrid_toolkit/common_spec.rb
94
+ - spec/lib/sendgrid_toolkit/invalid_emails_spec.rb
95
+ - spec/lib/sendgrid_toolkit/spam_reports_spec.rb
79
96
  - spec/lib/sendgrid_toolkit/statistics_spec.rb
80
97
  - spec/lib/sendgrid_toolkit/unsubscribes_spec.rb
81
98
  - spec/lib/sendgrid_toolkit_spec.rb
data/README.rdoc DELETED
@@ -1,103 +0,0 @@
1
- = SendgridToolkit - a Ruby wrapper for the Sendgrid Web API
2
-
3
- The Statistics and Unsubscribe APIs are fully supported.
4
-
5
- This allows you to:
6
- * manage your unsubscribed users
7
- * view API-supported email statistics.
8
-
9
- Support for Sendgrid's other Web APIs is coming soon.
10
-
11
- SendgridToolkit provides one class for each Web API module.
12
-
13
- === A note about authentication
14
- Each class is initialized with +api_user+ and +api_key+ parameters. +api_user+ is your sendgrid account email address, and +api_key+ is your sendgrid password.
15
-
16
- If you don't supply +api_user+ or +api_key+, SendgridToolkit will look for the SMTP_USERNAME or SMTP_PASSWORD environment variables. If they are not found, SendgridToolkit will throw +NoAPIKeySpecified+ or +NoAPIUserSpecified+, depending on what you omitted.
17
-
18
- If authentication fails during an API request, SendgridToolkit throws AuthenticationFailed.
19
-
20
- == Unsubscribes Class
21
-
22
- Instantiate the Unsubscribes object:
23
- unsubscribes = SendgridToolkit::Unsubscribes.new(api_user, api_key)
24
-
25
- === Listing Unsubscribes
26
- You can see everybody who has unsubscribed from your emails with:
27
- listing = unsubscribes.retrieve
28
- +listing+ will be an array of hashes, each of which has an +email+ key.
29
-
30
- If you want the timestamp for when each user unsubscribed, use:
31
- listing = unsubscribes.retrieve_with_timestamps
32
- Each hash in +listing+ will now contain a +created+ key, which holds a Ruby Time object.
33
-
34
- === Adding Unsubscribes
35
- To manually unsubscribe a user from your sendgrid emails, use:
36
- unsubscribes.add :email => "email@to.unsubscribe"
37
-
38
- SendgridToolkit will throw +UnsubscribeEmailAlreadyExists+ if the email you specified is already on the list
39
-
40
- === Deleting Unsubscribes
41
- To remove a user from your unsubscribe list, use:
42
- unsubscribes.delete :email => "email@that_is.unsubscribed"
43
-
44
- SendgridToolkit will throw +UnsubscribeEmailDoesNotExist+ if the email you specified is not on the list
45
-
46
- == Statistics Class
47
-
48
- Instantiate the Statistics object:
49
- statistics = SendgridToolkit::Statistics.new(api_user, api_key)
50
-
51
- === Retrieve statistics
52
- To retrieve statistics, use:
53
- stats = statistics.retrieve
54
- +stats+ will be an array of hashes, each of which contains the following keys:
55
- * +date+: The date to which the statistics in this hash refer to
56
- * +requests+: The number of emails you sent
57
- * +bounces+: The number of users who opened your email but did not click on your links
58
- * +clicks+: The number of users who clicked on a link in your email
59
- * +opens+: The number of users who opened your email
60
- * +spamreports+: The number of users who have reported your emails as spam
61
- +stats+ may also contain some keys that Sendgrid does not officially document, such as: +delivered+, +invalid_email+, +repeat_bounces+, +repeat_spamreports+, +repeat_unsubscribes+ and +unsubscribes+
62
-
63
- To narrow your retrieval to the past 5 days, you would use:
64
- stats = statistics.retrieve :days => 5
65
-
66
- To narrow your retrieval to emails within the last month but before one week ago, you would use:
67
- stats = statistics.retrieve :start_date => 1.month.ago, :end_date => 1.week.ago
68
-
69
- To narrow your search to a particular category (applicable only if you use this Sendgrid feature), you would use:
70
- stats = statistics.retrieve :category => "NameOfYourCategory"
71
- Note: You may combine a category query with other options, i.e.:
72
- stats = statistics.retrieve :category => "NameOfYourCategory", :days => 5
73
-
74
- === Retrieve aggregate (all-time) statistics
75
- To receive your all-time statistics, use:
76
- stats = statistics.retrieve_aggregate
77
- +stats+ will be a single hash containing all of the aforementioned keys except +date+.
78
-
79
- === List your categories
80
- If you use Sendgrid's category feature, you can get a listing of your categories with:
81
- cats = statistics.list_categories
82
- +cats+ is an array of hashes, each of which has a +category+ key that holds the name of a category.
83
-
84
- = Behind the Scenes
85
- Things you may want to know:
86
-
87
- 1. API requests are made and responses are received in JSON.
88
-
89
- 2. All requests are made as POSTs unless noted otherwise (Sendgrid's examples are via GET, but they support POST)
90
-
91
- 3. Each class takes a final options parameter in the form of a hash. You may use this parameter to pass additional options to the Sendgrid API. For example, let's say you are using the unsubscribes function:
92
- unsubscribes = SendgridToolkit::Unsubscribes.new(api_user, api_key)
93
- listing = unsubscribes.retrieve
94
- If Sendgrid were to add a +only_verified+ option to this API call, you could call:
95
- listing = unsubscribes.retrieve :only_verified => true
96
- to make use of it.
97
-
98
- = Testing
99
- In addition to unit tests, SendgridToolkit comes with a suite of "webconnect" tests that will actually hit Sendgrid's servers and perform various actions for purposes of real-world testing. In order to use these tests, you must:
100
- 1. Create a test account with sendgrid and store the credentials in TEST_SMTP_USERNAME and TEST_SMTP_PASSWORD environment variables. This is so that actions are performed on a test account and not your real sendgrid account. If you forget, don't worry -- the tests will fail but they will not fall back on the account that uses SMTP_USERNAME and SMTP_PASSWORD.
101
- 2. Change "xit" it "it" on the tests you wish to run.
102
-
103
- Running "spec spec" out of the box will run the standard suite of tests (all network access is stubbed out).