postmark 0.9.12 → 0.9.13

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
@@ -2,3 +2,4 @@
2
2
  .bundle
3
3
  Gemfile.lock
4
4
  pkg/*
5
+ .rvmrc
data/CHANGELOG.rdoc CHANGED
@@ -1,5 +1,10 @@
1
1
  = Changelog
2
2
 
3
+ == 0.9.13
4
+
5
+ * Added error_code to DeliveryError
6
+ * Added retries for Timeout::Error
7
+
3
8
  == 0.9.12
4
9
 
5
10
  * Fixed a problem of attachments processing when using deliver! method on Mail object.
data/README.rdoc CHANGED
@@ -5,7 +5,7 @@ This gem is an official wrapper for Postmark HTTP API (http://postmarkapp.com).
5
5
  == Install
6
6
 
7
7
  gem install postmark
8
-
8
+
9
9
  In addition to the +postmark+ gem you also need to install +tmail+ or +mail+ gem. Pick the one you like most:
10
10
 
11
11
  gem install mail
@@ -19,23 +19,23 @@ In addition to the +postmark+ gem you also need to install +tmail+ or +mail+ gem
19
19
  require 'tmail'
20
20
 
21
21
  Postmark.api_key = "your-api-key"
22
-
22
+
23
23
  # Make sure you have a sender signature for every From email you specify.
24
- # From can also accept array of addresses.
25
-
24
+ # From can also accept array of addresses.
25
+
26
26
  message = TMail::Mail.new
27
27
  message.from = "leonard@bigbangtheory.com"
28
28
  message.to = "Sheldon Cooper <sheldon@bigbangtheory.com>"
29
29
  message.subject = "Hi Sheldon!"
30
30
  message.content_type = "text/html"
31
31
  message.body = "Hello my friend!"
32
-
32
+
33
33
  # You can set customer headers if you like:
34
34
  message["CUSTOM-HEADER"] = "my custom header value"
35
-
35
+
36
36
  # Added a tag:
37
37
  message.tag = "my-tracking-tag"
38
-
38
+
39
39
  # Add attachments:
40
40
  message.postmark_attachments = [File.open("/path"), File.open("/path")]
41
41
 
@@ -45,18 +45,18 @@ In addition to the +postmark+ gem you also need to install +tmail+ or +mail+ gem
45
45
  "Content" => [pdf_content].pack("m"),
46
46
  "ContentType" => "application/pdf"
47
47
  }]
48
-
48
+
49
49
  # Or specify a reply-to address (can also be an array of addresses):
50
50
  message.reply_to = "penny@bigbangtheory.com"
51
51
 
52
52
  Postmark.send_through_postmark(message)
53
-
53
+
54
54
  == Mail Example
55
55
 
56
56
  require 'rubygems'
57
57
  require 'postmark'
58
58
  require 'mail'
59
-
59
+
60
60
  message = Mail.new
61
61
  message.delivery_method(Mail::Postmark, :api_key => "your-api-key")
62
62
  # ...
@@ -70,12 +70,12 @@ You can retrieve various information about your server state using the Public bo
70
70
 
71
71
  # Get delivery stats: (JSON format)
72
72
  Postmark.delivery_stats
73
-
74
- # Get bounces information: (array of bounce objects)
73
+
74
+ # Get bounces information: (array of bounce objects)
75
75
  Postmark::Bounce.all
76
-
77
- # Find specific bounce by id:
78
- bounce = Postmark::Bounce.find(bounce_id)
76
+
77
+ # Find specific bounce by id:
78
+ bounce = Postmark::Bounce.find(bounce_id)
79
79
  bounce.dump # string, containing raw SMTP data
80
80
  bounce.activate # reactivate hard bounce
81
81
 
@@ -118,6 +118,8 @@ You can also explicitly specify which one to be used, using
118
118
  * Yury Batenko
119
119
  * Pavel Maksimenko
120
120
  * Anton Astashov
121
+ * Marcus Brito
122
+ * Tyler Hunt
121
123
 
122
124
  == Copyright
123
125
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.9.12
1
+ 0.9.13
data/lib/postmark.rb CHANGED
@@ -1,27 +1,32 @@
1
- def require_local(file)
2
- require File.join(File.dirname(__FILE__), 'postmark', file)
3
- end
4
-
5
1
  require 'net/http'
6
2
  require 'net/https'
7
3
 
8
- require_local 'bounce'
9
- require_local 'json'
10
- require_local 'http_client'
11
- require_local 'message_extensions/shared'
12
- require_local 'message_extensions/tmail'
13
- require_local 'message_extensions/mail'
14
- require_local 'handlers/mail'
15
- require_local 'attachments_fix_for_mail'
4
+ require 'postmark/bounce'
5
+ require 'postmark/json'
6
+ require 'postmark/http_client'
7
+ require 'postmark/message_extensions/shared'
8
+ require 'postmark/message_extensions/tmail'
9
+ require 'postmark/message_extensions/mail'
10
+ require 'postmark/handlers/mail'
11
+ require 'postmark/attachments_fix_for_mail'
16
12
 
17
13
  module Postmark
18
14
 
19
- class DeliveryError < StandardError; end
15
+ class DeliveryError < StandardError
16
+ attr_accessor :error_code
17
+
18
+ def initialize(message = nil, error_code = nil)
19
+ super(message)
20
+ self.error_code = error_code
21
+ end
22
+ end
23
+
20
24
  class UnknownError < DeliveryError; end
21
25
  class InvalidApiKeyError < DeliveryError; end
22
26
  class InvalidMessageError < DeliveryError; end
23
27
  class InternalServerError < DeliveryError; end
24
28
  class UnknownMessageType < DeliveryError; end
29
+ class TimeoutError < DeliveryError; end
25
30
 
26
31
  module ResponseParsers
27
32
  autoload :Json, 'postmark/response_parsers/json'
@@ -34,8 +39,6 @@ module Postmark
34
39
  'Accept' => 'application/json'
35
40
  }
36
41
 
37
- MAX_RETRIES = 2
38
-
39
42
  extend self
40
43
 
41
44
  attr_accessor :host, :path_prefix, :port, :secure, :api_key, :http_open_timeout, :http_read_timeout,
@@ -86,7 +89,7 @@ module Postmark
86
89
  @retries = 0
87
90
  begin
88
91
  HttpClient.post("email", Postmark::Json.encode(convert_message_to_options_hash(message)))
89
- rescue DeliveryError => e
92
+ rescue DeliveryError, Timeout::Error
90
93
  if @retries < max_retries
91
94
  @retries += 1
92
95
  retry
@@ -94,6 +97,8 @@ module Postmark
94
97
  raise
95
98
  end
96
99
  end
100
+ rescue Timeout::Error
101
+ raise TimeoutError.new($!)
97
102
  end
98
103
 
99
104
  def convert_message_to_options_hash(message)
@@ -35,11 +35,11 @@ module Postmark
35
35
  when 200
36
36
  return Postmark::Json.decode(response.body)
37
37
  when 401
38
- raise InvalidApiKeyError, error_message(response.body)
38
+ raise error(InvalidApiKeyError, response.body)
39
39
  when 422
40
- raise InvalidMessageError, error_message(response.body)
40
+ raise error(InvalidMessageError, response.body)
41
41
  when 500
42
- raise InternalServerError, response.body
42
+ raise error(InternalServerError, response.body)
43
43
  else
44
44
  raise UnknownError, response
45
45
  end
@@ -72,5 +72,14 @@ module Postmark
72
72
  def error_message(response_body)
73
73
  Postmark::Json.decode(response_body)["Message"]
74
74
  end
75
+
76
+ def error_message_and_code(response_body)
77
+ reply = Postmark::Json.decode(response_body)
78
+ [reply["Message"], reply["ErrorCode"]]
79
+ end
80
+
81
+ def error(clazz, response_body)
82
+ clazz.send(:new, *error_message_and_code(response_body))
83
+ end
75
84
  end
76
85
  end
@@ -1,3 +1,3 @@
1
1
  module Postmark
2
- VERSION = "0.9.12"
2
+ VERSION = "0.9.13"
3
3
  end
data/postmark.gemspec CHANGED
@@ -41,9 +41,4 @@ Gem::Specification.new do |s|
41
41
  s.add_development_dependency "fakeweb-matcher"
42
42
  s.add_development_dependency "timecop"
43
43
  s.add_development_dependency "yajl-ruby"
44
- if RUBY_VERSION < '1.9.0'
45
- s.add_development_dependency(%q<ruby-debug>, [">= 0"])
46
- else
47
- s.add_development_dependency(%q<ruby-debug19>, [">= 0"])
48
- end
49
44
  end
data/spec/bounce_spec.rb CHANGED
@@ -18,7 +18,7 @@ describe "Bounce" do
18
18
 
19
19
  it "should retrieve and parce bounce correctly" do
20
20
  bounce.type.should == "HardBounce"
21
- bounce.bounced_at.should == Time.now
21
+ bounce.bounced_at.to_s.should == Time.now.to_s
22
22
  bounce.details.should == "test bounce"
23
23
  bounce.email.should == "jim@test.com"
24
24
  end
@@ -96,6 +96,11 @@ describe Postmark do
96
96
  lambda { Postmark.send_through_postmark(mail_message) }.should raise_error(Postmark::UnknownError)
97
97
  end
98
98
 
99
+ it "should warn when the request times out" do
100
+ Postmark::HttpClient.should_receive(:post).at_least(:once).and_raise(Timeout::Error)
101
+ lambda { Postmark.send_through_postmark(mail_message) }.should raise_error(Postmark::TimeoutError)
102
+ end
103
+
99
104
  it "should retry 3 times" do
100
105
  FakeWeb.register_uri(:post, "http://api.postmarkapp.com/email",
101
106
  [
@@ -105,6 +110,12 @@ describe Postmark do
105
110
  ])
106
111
  lambda { Postmark.send_through_postmark(mail_message) }.should_not raise_error
107
112
  end
113
+
114
+ it "should retry on timeout" do
115
+ Postmark::HttpClient.should_receive(:post).and_raise(Timeout::Error)
116
+ Postmark::HttpClient.should_receive(:post).and_return('{}')
117
+ lambda { Postmark.send_through_postmark(mail_message) }.should_not raise_error
118
+ end
108
119
  end
109
120
 
110
121
  context "delivery stats" do
data/spec/spec_helper.rb CHANGED
@@ -8,7 +8,6 @@ require 'mail'
8
8
  require 'postmark'
9
9
  require 'active_support'
10
10
  require 'json'
11
- require 'ruby-debug'
12
11
  require 'fakeweb'
13
12
  require 'fakeweb_matcher'
14
13
  require 'timecop'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: postmark
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.12
4
+ version: 0.9.13
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -11,11 +11,11 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2012-01-31 00:00:00.000000000Z
14
+ date: 2012-01-31 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: rake
18
- requirement: &70174637538220 !ruby/object:Gem::Requirement
18
+ requirement: !ruby/object:Gem::Requirement
19
19
  none: false
20
20
  requirements:
21
21
  - - ! '>='
@@ -23,10 +23,15 @@ dependencies:
23
23
  version: '0'
24
24
  type: :runtime
25
25
  prerelease: false
26
- version_requirements: *70174637538220
26
+ version_requirements: !ruby/object:Gem::Requirement
27
+ none: false
28
+ requirements:
29
+ - - ! '>='
30
+ - !ruby/object:Gem::Version
31
+ version: '0'
27
32
  - !ruby/object:Gem::Dependency
28
33
  name: json
29
- requirement: &70174637537320 !ruby/object:Gem::Requirement
34
+ requirement: !ruby/object:Gem::Requirement
30
35
  none: false
31
36
  requirements:
32
37
  - - ! '>='
@@ -34,10 +39,15 @@ dependencies:
34
39
  version: '0'
35
40
  type: :runtime
36
41
  prerelease: false
37
- version_requirements: *70174637537320
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ none: false
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
38
48
  - !ruby/object:Gem::Dependency
39
49
  name: tmail
40
- requirement: &70174637536120 !ruby/object:Gem::Requirement
50
+ requirement: !ruby/object:Gem::Requirement
41
51
  none: false
42
52
  requirements:
43
53
  - - ! '>='
@@ -45,10 +55,15 @@ dependencies:
45
55
  version: '0'
46
56
  type: :development
47
57
  prerelease: false
48
- version_requirements: *70174637536120
58
+ version_requirements: !ruby/object:Gem::Requirement
59
+ none: false
60
+ requirements:
61
+ - - ! '>='
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
49
64
  - !ruby/object:Gem::Dependency
50
65
  name: mail
51
- requirement: &70174637534700 !ruby/object:Gem::Requirement
66
+ requirement: !ruby/object:Gem::Requirement
52
67
  none: false
53
68
  requirements:
54
69
  - - ! '>='
@@ -56,10 +71,15 @@ dependencies:
56
71
  version: '0'
57
72
  type: :development
58
73
  prerelease: false
59
- version_requirements: *70174637534700
74
+ version_requirements: !ruby/object:Gem::Requirement
75
+ none: false
76
+ requirements:
77
+ - - ! '>='
78
+ - !ruby/object:Gem::Version
79
+ version: '0'
60
80
  - !ruby/object:Gem::Dependency
61
81
  name: rspec-core
62
- requirement: &70174637533620 !ruby/object:Gem::Requirement
82
+ requirement: !ruby/object:Gem::Requirement
63
83
  none: false
64
84
  requirements:
65
85
  - - ~>
@@ -67,10 +87,15 @@ dependencies:
67
87
  version: '2.0'
68
88
  type: :development
69
89
  prerelease: false
70
- version_requirements: *70174637533620
90
+ version_requirements: !ruby/object:Gem::Requirement
91
+ none: false
92
+ requirements:
93
+ - - ~>
94
+ - !ruby/object:Gem::Version
95
+ version: '2.0'
71
96
  - !ruby/object:Gem::Dependency
72
97
  name: activesupport
73
- requirement: &70174637532520 !ruby/object:Gem::Requirement
98
+ requirement: !ruby/object:Gem::Requirement
74
99
  none: false
75
100
  requirements:
76
101
  - - ~>
@@ -78,10 +103,15 @@ dependencies:
78
103
  version: '3.0'
79
104
  type: :development
80
105
  prerelease: false
81
- version_requirements: *70174637532520
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ none: false
108
+ requirements:
109
+ - - ~>
110
+ - !ruby/object:Gem::Version
111
+ version: '3.0'
82
112
  - !ruby/object:Gem::Dependency
83
113
  name: fakeweb
84
- requirement: &70174637531520 !ruby/object:Gem::Requirement
114
+ requirement: !ruby/object:Gem::Requirement
85
115
  none: false
86
116
  requirements:
87
117
  - - ! '>='
@@ -89,10 +119,15 @@ dependencies:
89
119
  version: '0'
90
120
  type: :development
91
121
  prerelease: false
92
- version_requirements: *70174637531520
122
+ version_requirements: !ruby/object:Gem::Requirement
123
+ none: false
124
+ requirements:
125
+ - - ! '>='
126
+ - !ruby/object:Gem::Version
127
+ version: '0'
93
128
  - !ruby/object:Gem::Dependency
94
129
  name: fakeweb-matcher
95
- requirement: &70174637530680 !ruby/object:Gem::Requirement
130
+ requirement: !ruby/object:Gem::Requirement
96
131
  none: false
97
132
  requirements:
98
133
  - - ! '>='
@@ -100,10 +135,15 @@ dependencies:
100
135
  version: '0'
101
136
  type: :development
102
137
  prerelease: false
103
- version_requirements: *70174637530680
138
+ version_requirements: !ruby/object:Gem::Requirement
139
+ none: false
140
+ requirements:
141
+ - - ! '>='
142
+ - !ruby/object:Gem::Version
143
+ version: '0'
104
144
  - !ruby/object:Gem::Dependency
105
145
  name: timecop
106
- requirement: &70174637529940 !ruby/object:Gem::Requirement
146
+ requirement: !ruby/object:Gem::Requirement
107
147
  none: false
108
148
  requirements:
109
149
  - - ! '>='
@@ -111,10 +151,15 @@ dependencies:
111
151
  version: '0'
112
152
  type: :development
113
153
  prerelease: false
114
- version_requirements: *70174637529940
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ none: false
156
+ requirements:
157
+ - - ! '>='
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
115
160
  - !ruby/object:Gem::Dependency
116
161
  name: yajl-ruby
117
- requirement: &70174637529260 !ruby/object:Gem::Requirement
162
+ requirement: !ruby/object:Gem::Requirement
118
163
  none: false
119
164
  requirements:
120
165
  - - ! '>='
@@ -122,18 +167,12 @@ dependencies:
122
167
  version: '0'
123
168
  type: :development
124
169
  prerelease: false
125
- version_requirements: *70174637529260
126
- - !ruby/object:Gem::Dependency
127
- name: ruby-debug19
128
- requirement: &70174637528420 !ruby/object:Gem::Requirement
170
+ version_requirements: !ruby/object:Gem::Requirement
129
171
  none: false
130
172
  requirements:
131
173
  - - ! '>='
132
174
  - !ruby/object:Gem::Version
133
175
  version: '0'
134
- type: :development
135
- prerelease: false
136
- version_requirements: *70174637528420
137
176
  description: Use this gem to send emails through Postmark HTTP API and retrieve info
138
177
  about bounces.
139
178
  email: ilya@wildbit.com
@@ -143,7 +182,6 @@ extra_rdoc_files:
143
182
  - LICENSE
144
183
  - README.rdoc
145
184
  files:
146
- - .bundle/config
147
185
  - .document
148
186
  - .gitignore
149
187
  - .rake_tasks
@@ -190,7 +228,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
190
228
  version: '0'
191
229
  segments:
192
230
  - 0
193
- hash: 2238284457988379279
231
+ hash: -3519863047660442665
194
232
  required_rubygems_version: !ruby/object:Gem::Requirement
195
233
  none: false
196
234
  requirements:
@@ -199,7 +237,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
199
237
  version: 1.3.7
200
238
  requirements: []
201
239
  rubyforge_project:
202
- rubygems_version: 1.7.2
240
+ rubygems_version: 1.8.24
203
241
  signing_key:
204
242
  specification_version: 3
205
243
  summary: Official Postmark API wrapper.