postmark 0.4.5 → 0.5.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/VERSION +1 -1
- data/lib/postmark.rb +28 -5
- data/postmark.gemspec +3 -3
- data/spec/postmark_spec.rb +20 -49
- data/spec/spec_helper.rb +2 -0
- metadata +30 -17
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.5.0
|
data/lib/postmark.rb
CHANGED
@@ -22,9 +22,11 @@ module Postmark
|
|
22
22
|
'Accept' => 'application/json'
|
23
23
|
}
|
24
24
|
|
25
|
+
MAX_RETRIES = 2
|
26
|
+
|
25
27
|
class << self
|
26
28
|
attr_accessor :host, :host_path, :port, :secure, :api_key, :http_open_timeout, :http_read_timeout,
|
27
|
-
:proxy_host, :proxy_port, :proxy_user, :proxy_pass
|
29
|
+
:proxy_host, :proxy_port, :proxy_user, :proxy_pass, :max_retries, :sleep_between_retries
|
28
30
|
|
29
31
|
attr_writer :response_parser_class
|
30
32
|
|
@@ -47,16 +49,22 @@ module Postmark
|
|
47
49
|
@host_path ||= 'email'
|
48
50
|
end
|
49
51
|
|
50
|
-
# The HTTP open timeout (defaults to 2 seconds).
|
51
52
|
def http_open_timeout
|
52
53
|
@http_open_timeout ||= 5
|
53
54
|
end
|
54
55
|
|
55
|
-
# The HTTP read timeout (defaults to 15 seconds).
|
56
56
|
def http_read_timeout
|
57
57
|
@http_read_timeout ||= 15
|
58
58
|
end
|
59
59
|
|
60
|
+
def max_retries
|
61
|
+
@max_retries ||= 3
|
62
|
+
end
|
63
|
+
|
64
|
+
def sleep_between_retries
|
65
|
+
@sleep_between_retries ||= 10
|
66
|
+
end
|
67
|
+
|
60
68
|
def configure
|
61
69
|
yield self
|
62
70
|
end
|
@@ -70,6 +78,20 @@ module Postmark
|
|
70
78
|
end
|
71
79
|
|
72
80
|
def send_through_postmark(message) #:nodoc:
|
81
|
+
@retries = 0
|
82
|
+
begin
|
83
|
+
attempt_sending(message)
|
84
|
+
rescue Exception => e
|
85
|
+
if @retries < max_retries
|
86
|
+
@retries += 1
|
87
|
+
retry
|
88
|
+
else
|
89
|
+
raise
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def attempt_sending(message)
|
73
95
|
ResponseParsers.const_get(response_parser_class) # loads JSON lib, defining #to_json
|
74
96
|
http = Net::HTTP::Proxy(proxy_host,
|
75
97
|
proxy_port,
|
@@ -80,7 +102,7 @@ module Postmark
|
|
80
102
|
http.open_timeout = http_open_timeout
|
81
103
|
http.use_ssl = !!secure
|
82
104
|
|
83
|
-
headers = HEADERS.merge({ "X-Postmark-Server-Token" => api_key })
|
105
|
+
headers = HEADERS.merge({ "X-Postmark-Server-Token" => api_key.to_s })
|
84
106
|
|
85
107
|
response = http.post(url.path, convert_tmail(message).to_json, headers)
|
86
108
|
|
@@ -134,7 +156,8 @@ module Postmark
|
|
134
156
|
headers = []
|
135
157
|
message.each_header do |key, value|
|
136
158
|
next if bogus_headers.include? key.dup.downcase
|
137
|
-
|
159
|
+
name = key.split(/-/).map {|i| i.capitalize }.join('-')
|
160
|
+
headers << { "Name" => name, "Value" => value.body }
|
138
161
|
end
|
139
162
|
headers
|
140
163
|
end
|
data/postmark.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{postmark}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.5.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Petyo Ivanov"]
|
12
|
-
s.date = %q{2010-
|
12
|
+
s.date = %q{2010-02-26}
|
13
13
|
s.description = %q{Ruby gem for sending emails through http://postmarkapp.com HTTP API. It relieas on TMail::Mail for message construction.}
|
14
14
|
s.email = %q{underlog@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -46,7 +46,7 @@ Gem::Specification.new do |s|
|
|
46
46
|
}
|
47
47
|
s.rdoc_options = ["--charset=UTF-8"]
|
48
48
|
s.require_paths = ["lib"]
|
49
|
-
s.rubygems_version = %q{1.3.
|
49
|
+
s.rubygems_version = %q{1.3.6}
|
50
50
|
s.summary = %q{Ruby gem for sending emails through http://postmarkapp.com HTTP API}
|
51
51
|
s.test_files = [
|
52
52
|
"spec/postmark_spec.rb",
|
data/spec/postmark_spec.rb
CHANGED
@@ -1,12 +1,6 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
2
|
|
3
3
|
describe "Postmark" do
|
4
|
-
context "configuration" do
|
5
|
-
it "should allow configuration of host" do
|
6
|
-
Postmark.configure { |config| config.host = "test" }
|
7
|
-
Postmark.host.should == "test"
|
8
|
-
end
|
9
|
-
end
|
10
4
|
|
11
5
|
let :message do
|
12
6
|
TMail::Mail.new.tap do |mail|
|
@@ -27,69 +21,46 @@ describe "Postmark" do
|
|
27
21
|
end
|
28
22
|
end
|
29
23
|
|
30
|
-
|
31
|
-
stub(:new => http_request)
|
32
|
-
end
|
24
|
+
context "service call" do
|
33
25
|
|
34
|
-
|
35
|
-
|
36
|
-
resp.stub! :body => '{ "Message": "OK" }'
|
26
|
+
before do
|
27
|
+
Postmark.sleep_between_retries = 0
|
37
28
|
end
|
38
|
-
end
|
39
|
-
|
40
|
-
let :http_response_ok do
|
41
|
-
http_response(200)
|
42
|
-
end
|
43
|
-
|
44
|
-
let :http_response_unauthorized do
|
45
|
-
http_response(401)
|
46
|
-
end
|
47
|
-
|
48
|
-
let :http_response_invalid do
|
49
|
-
http_response(422)
|
50
|
-
end
|
51
|
-
|
52
|
-
let :http_response_server_error do
|
53
|
-
http_response(500)
|
54
|
-
end
|
55
|
-
|
56
|
-
let :http_response_unknown do
|
57
|
-
http_response(503)
|
58
|
-
end
|
59
|
-
|
60
|
-
let :http_request do
|
61
|
-
stub(:read_timeout= => nil, :open_timeout= => nil, :use_ssl= => nil)
|
62
|
-
end
|
63
|
-
|
64
|
-
before do
|
65
|
-
Net::HTTP.stub!(:Proxy).and_return(net_http_proxy)
|
66
|
-
end
|
67
29
|
|
68
|
-
context "service call" do
|
69
30
|
it "should send email successfully" do
|
70
|
-
|
71
|
-
|
31
|
+
FakeWeb.register_uri(:post, "http://api.postmarkapp.com/email/", {})
|
32
|
+
Postmark.send_through_postmark(message)
|
33
|
+
FakeWeb.should have_requested(:post, "http://api.postmarkapp.com/email/")
|
72
34
|
end
|
73
35
|
|
74
36
|
it "should warn when header is invalid" do
|
75
|
-
|
37
|
+
FakeWeb.register_uri(:post, "http://api.postmarkapp.com/email/", {:status => [ "401", "Unauthorized" ], :body => "Missing API token"})
|
76
38
|
lambda { Postmark.send_through_postmark(message) }.should raise_error(Postmark::InvalidApiKeyError)
|
77
39
|
end
|
78
40
|
|
79
41
|
it "should warn when json is not ok" do
|
80
|
-
|
42
|
+
FakeWeb.register_uri(:post, "http://api.postmarkapp.com/email/", {:status => [ "422", "Invalid" ], :body => "Invalid JSON"})
|
81
43
|
lambda { Postmark.send_through_postmark(message) }.should raise_error(Postmark::InvalidMessageError)
|
82
44
|
end
|
83
45
|
|
84
46
|
it "should warn when server fails" do
|
85
|
-
|
47
|
+
FakeWeb.register_uri(:post, "http://api.postmarkapp.com/email/", {:status => [ "500", "Internal Server Error" ]})
|
86
48
|
lambda { Postmark.send_through_postmark(message) }.should raise_error(Postmark::InternalServerError)
|
87
49
|
end
|
88
50
|
|
89
51
|
it "should warn when unknown stuff fails" do
|
90
|
-
|
52
|
+
FakeWeb.register_uri(:post, "http://api.postmarkapp.com/email/", {:status => [ "485", "Custom HTTP response status" ]})
|
91
53
|
lambda { Postmark.send_through_postmark(message) }.should raise_error(Postmark::UnknownError)
|
92
54
|
end
|
55
|
+
|
56
|
+
it "should retry 3 times" do
|
57
|
+
FakeWeb.register_uri(:post, "http://api.postmarkapp.com/email/",
|
58
|
+
[ { :status => [ 500, "Internal Server Error" ] },
|
59
|
+
{ :status => [ 500, "Internal Server Error" ] },
|
60
|
+
{ } ]
|
61
|
+
)
|
62
|
+
lambda { Postmark.send_through_postmark(message) }.should_not raise_error
|
63
|
+
end
|
93
64
|
end
|
94
65
|
|
95
66
|
context "tmail parse" do
|
@@ -116,7 +87,7 @@ describe "Postmark" do
|
|
116
87
|
end
|
117
88
|
|
118
89
|
it "should encode headers properly" do
|
119
|
-
json = %q[{"Subject":"Hello!", "From":"sheldon@bigbangtheory.com", "ReplyTo":"a@a.com, b@b.com", "To":"lenard@bigbangtheory.com", "TextBody":"Hello Sheldon!", "Headers":[{"Name":"
|
90
|
+
json = %q[{"Subject":"Hello!", "From":"sheldon@bigbangtheory.com", "ReplyTo":"a@a.com, b@b.com", "To":"lenard@bigbangtheory.com", "TextBody":"Hello Sheldon!", "Headers":[{"Name":"Custom-Header", "Value":"header"}]}]
|
120
91
|
result = Postmark.convert_tmail(message_with_headers)
|
121
92
|
result.should == JSON.parse(json)
|
122
93
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: postmark
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 5
|
8
|
+
- 0
|
9
|
+
version: 0.5.0
|
5
10
|
platform: ruby
|
6
11
|
authors:
|
7
12
|
- Petyo Ivanov
|
@@ -9,39 +14,45 @@ autorequire:
|
|
9
14
|
bindir: bin
|
10
15
|
cert_chain: []
|
11
16
|
|
12
|
-
date: 2010-
|
17
|
+
date: 2010-02-26 00:00:00 +02:00
|
13
18
|
default_executable:
|
14
19
|
dependencies:
|
15
20
|
- !ruby/object:Gem::Dependency
|
16
21
|
name: rspec
|
17
|
-
|
18
|
-
|
19
|
-
version_requirements: !ruby/object:Gem::Requirement
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
20
24
|
requirements:
|
21
25
|
- - ">="
|
22
26
|
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 0
|
23
29
|
version: "0"
|
24
|
-
|
30
|
+
type: :development
|
31
|
+
version_requirements: *id001
|
25
32
|
- !ruby/object:Gem::Dependency
|
26
33
|
name: cucumber
|
27
|
-
|
28
|
-
|
29
|
-
version_requirements: !ruby/object:Gem::Requirement
|
34
|
+
prerelease: false
|
35
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
30
36
|
requirements:
|
31
37
|
- - ">="
|
32
38
|
- !ruby/object:Gem::Version
|
39
|
+
segments:
|
40
|
+
- 0
|
33
41
|
version: "0"
|
34
|
-
|
42
|
+
type: :development
|
43
|
+
version_requirements: *id002
|
35
44
|
- !ruby/object:Gem::Dependency
|
36
45
|
name: tmail
|
37
|
-
|
38
|
-
|
39
|
-
version_requirements: !ruby/object:Gem::Requirement
|
46
|
+
prerelease: false
|
47
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
40
48
|
requirements:
|
41
49
|
- - ">="
|
42
50
|
- !ruby/object:Gem::Version
|
51
|
+
segments:
|
52
|
+
- 0
|
43
53
|
version: "0"
|
44
|
-
|
54
|
+
type: :runtime
|
55
|
+
version_requirements: *id003
|
45
56
|
description: Ruby gem for sending emails through http://postmarkapp.com HTTP API. It relieas on TMail::Mail for message construction.
|
46
57
|
email: underlog@gmail.com
|
47
58
|
executables: []
|
@@ -84,18 +95,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
84
95
|
requirements:
|
85
96
|
- - ">="
|
86
97
|
- !ruby/object:Gem::Version
|
98
|
+
segments:
|
99
|
+
- 0
|
87
100
|
version: "0"
|
88
|
-
version:
|
89
101
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
90
102
|
requirements:
|
91
103
|
- - ">="
|
92
104
|
- !ruby/object:Gem::Version
|
105
|
+
segments:
|
106
|
+
- 0
|
93
107
|
version: "0"
|
94
|
-
version:
|
95
108
|
requirements: []
|
96
109
|
|
97
110
|
rubyforge_project:
|
98
|
-
rubygems_version: 1.3.
|
111
|
+
rubygems_version: 1.3.6
|
99
112
|
signing_key:
|
100
113
|
specification_version: 3
|
101
114
|
summary: Ruby gem for sending emails through http://postmarkapp.com HTTP API
|