postageapp 1.2.6 → 1.3.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.
- checksums.yaml +4 -4
- data/generators/postageapp/templates/postageapp_tasks.rake +25 -8
- data/lib/postageapp.rb +25 -14
- data/lib/postageapp/configuration.rb +67 -26
- data/lib/postageapp/diagnostics.rb +30 -0
- data/lib/postageapp/failed_request.rb +2 -0
- data/lib/postageapp/http.rb +32 -0
- data/lib/postageapp/logger.rb +2 -0
- data/lib/postageapp/mail.rb +1 -1
- data/lib/postageapp/request.rb +21 -10
- data/lib/postageapp/response.rb +22 -8
- data/lib/postageapp/utils.rb +0 -11
- data/lib/postageapp/version.rb +1 -1
- data/postageapp.gemspec +7 -7
- data/test/configuration_test.rb +19 -12
- data/test/failed_request_test.rb +1 -1
- data/test/helper.rb +2 -15
- data/test/live_test.rb +52 -27
- data/test/mail_delivery_method_test.rb +1 -1
- data/test/mailer/action_mailer_2/notifier.rb +10 -9
- data/test/mailer/action_mailer_3/notifier.rb +9 -9
- data/test/mailer_2_test.rb +1 -1
- data/test/mailer_3_test.rb +1 -1
- data/test/mailer_4_test.rb +1 -1
- data/test/mailer_helper_methods_test.rb +1 -1
- data/test/postageapp_test.rb +4 -1
- data/test/rails_initialization_test.rb +1 -1
- data/test/request_test.rb +7 -7
- data/test/response_test.rb +1 -1
- metadata +21 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 99701f8c8bb6345d893d0e891e4080b574934fd2
|
4
|
+
data.tar.gz: 96c72f588f097c9a04ed8e0d47dc1ca836f96799
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3bfdec8d06ffb5af34bd0e13897f46986fde993d36009c96aa34d0710e2ff5729415d157b1e7af28448592da86566b272fec80d4ea52d1038c254d506c098ac9
|
7
|
+
data.tar.gz: 8da78d92e5d62ca7e5a9e7e77d04dd33dee17977a37f372738cb1c58d278f954132f1ae722f04a5c7b9b76e53b05ac1cada4328517b9c8d74aef631ef09da37f
|
@@ -1,6 +1,6 @@
|
|
1
1
|
namespace :postageapp do
|
2
2
|
desc 'Show the current PostageApp configuration'
|
3
|
-
task :
|
3
|
+
task config: :environment do
|
4
4
|
puts "PostageApp Configuration"
|
5
5
|
puts "------------------------"
|
6
6
|
puts
|
@@ -30,12 +30,29 @@ namespace :postageapp do
|
|
30
30
|
end
|
31
31
|
|
32
32
|
desc 'Verify the PostageApp gem installation by requesting project info from the API'
|
33
|
-
task :
|
34
|
-
|
35
|
-
|
33
|
+
task test: :environment do
|
34
|
+
diag = PostageApp::Diagnostics.new(PostageApp.config)
|
35
|
+
|
36
|
+
puts "Resolving #{PostageApp.config.host.inspect}"
|
37
|
+
if (resolved = diag.host_resolved)
|
38
|
+
puts "\t#{resolved.join(',')}"
|
39
|
+
else
|
40
|
+
puts "\tCouldn't be resolved. [ERROR]"
|
41
|
+
end
|
42
|
+
|
43
|
+
if (PostageApp.config.proxy?)
|
44
|
+
puts "Resolving #{PostageApp.config.proxy_host.inspect}"
|
45
|
+
if (resolved = diag.proxy_host_resolved)
|
46
|
+
puts "\t#{resolved.join(',')}"
|
47
|
+
else
|
48
|
+
puts "\tCouldn't be resolved. [ERROR]"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
puts "Trying to contact #{PostageApp.configuration.url}..."
|
36
53
|
response = PostageApp::Request.new(:get_project_info).send
|
37
54
|
|
38
|
-
if response.ok?
|
55
|
+
if (response.ok?)
|
39
56
|
project_name = response.data['project']['name']
|
40
57
|
project_url = response.data['project']['url']
|
41
58
|
user_emails = response.data['project']['users']
|
@@ -52,7 +69,8 @@ END
|
|
52
69
|
# Most likely a single user if it's a new project
|
53
70
|
puts 'Sending test message to users in the project...'
|
54
71
|
r = send_test_message(user_emails)
|
55
|
-
|
72
|
+
|
73
|
+
if (r.ok?)
|
56
74
|
puts "Message was successfully sent!\n\n"
|
57
75
|
puts 'Your application is ready to use PostageApp!'
|
58
76
|
else
|
@@ -60,7 +78,6 @@ END
|
|
60
78
|
puts 'This was the response:'
|
61
79
|
puts r.to_yaml
|
62
80
|
end
|
63
|
-
|
64
81
|
else
|
65
82
|
puts 'Failed to fetch information about your project. This was the response:'
|
66
83
|
puts response.to_yaml
|
@@ -68,7 +85,7 @@ END
|
|
68
85
|
end
|
69
86
|
|
70
87
|
desc 'Manually trigger resend of all failed emails'
|
71
|
-
task :
|
88
|
+
task resend_failed_emails: :environment do
|
72
89
|
puts 'Attempting to resend failed emails...'
|
73
90
|
PostageApp::FailedRequest.resend_all
|
74
91
|
puts 'Done!'
|
data/lib/postageapp.rb
CHANGED
@@ -2,22 +2,11 @@ require 'net/http'
|
|
2
2
|
require 'net/https'
|
3
3
|
require 'digest'
|
4
4
|
require 'logger'
|
5
|
+
require 'fileutils'
|
5
6
|
|
6
7
|
require 'json'
|
7
8
|
require 'base64'
|
8
9
|
|
9
|
-
require 'postageapp/utils'
|
10
|
-
require 'postageapp/version'
|
11
|
-
require 'postageapp/configuration'
|
12
|
-
require 'postageapp/logger'
|
13
|
-
require 'postageapp/request'
|
14
|
-
require 'postageapp/failed_request'
|
15
|
-
require 'postageapp/response'
|
16
|
-
require 'postageapp/mail'
|
17
|
-
require 'postageapp/mail/delivery_method'
|
18
|
-
|
19
|
-
require 'postageapp/rails/railtie' if (defined?(Rails::Railtie))
|
20
|
-
|
21
10
|
module PostageApp
|
22
11
|
class Error < StandardError ; end
|
23
12
|
|
@@ -31,8 +20,12 @@ module PostageApp
|
|
31
20
|
# If you do not want/need to initialize the gem in this way, you can use the environment
|
32
21
|
# variable POSTAGEAPP_API_KEY to set up your key.
|
33
22
|
|
34
|
-
def self.configure
|
35
|
-
|
23
|
+
def self.configure(reset = false)
|
24
|
+
if (reset)
|
25
|
+
self.configuration_reset!
|
26
|
+
end
|
27
|
+
|
28
|
+
yield(self.configuration)
|
36
29
|
end
|
37
30
|
|
38
31
|
# Accessor for the PostageApp::Configuration object
|
@@ -42,6 +35,10 @@ module PostageApp
|
|
42
35
|
@configuration ||= Configuration.new
|
43
36
|
end
|
44
37
|
|
38
|
+
def self.configuration_reset!
|
39
|
+
@configuration = nil
|
40
|
+
end
|
41
|
+
|
45
42
|
class << self
|
46
43
|
alias :config :configuration
|
47
44
|
end
|
@@ -61,6 +58,20 @@ module PostageApp
|
|
61
58
|
end
|
62
59
|
end
|
63
60
|
|
61
|
+
require 'postageapp/configuration'
|
62
|
+
require 'postageapp/diagnostics'
|
63
|
+
require 'postageapp/failed_request'
|
64
|
+
require 'postageapp/http'
|
65
|
+
require 'postageapp/logger'
|
66
|
+
require 'postageapp/request'
|
67
|
+
require 'postageapp/response'
|
68
|
+
require 'postageapp/mail'
|
69
|
+
require 'postageapp/mail/delivery_method'
|
70
|
+
require 'postageapp/utils'
|
71
|
+
require 'postageapp/version'
|
72
|
+
|
73
|
+
require 'postageapp/rails/railtie' if (defined?(Rails::Railtie))
|
74
|
+
|
64
75
|
require 'postageapp/mail/extensions'
|
65
76
|
|
66
77
|
if (defined?(::Mail))
|
@@ -38,19 +38,41 @@
|
|
38
38
|
# Advanced Options
|
39
39
|
# ----------------
|
40
40
|
# :port - The port to make HTTP/HTTPS requests (default based on secure option)
|
41
|
-
# :
|
41
|
+
# :scheme - Set to either `http` or `https` (default based on secure option)
|
42
42
|
# :requests_to_resend - List of API calls that should be replayed if they fail.
|
43
43
|
# (default: send_message)
|
44
44
|
|
45
45
|
class PostageApp::Configuration
|
46
|
+
# == Constants ============================================================
|
47
|
+
|
48
|
+
HOST_DEFAULT = 'api.postageapp.com'.freeze
|
49
|
+
|
50
|
+
SOCKS5_PORT_DEFAULT = 1080
|
51
|
+
HTTP_PORT_DEFAULT = 80
|
52
|
+
HTTPS_PORT_DEFAULT = 443
|
53
|
+
|
54
|
+
SCHEME_FOR_SECURE = {
|
55
|
+
true => 'https'.freeze,
|
56
|
+
false => 'http'.freeze
|
57
|
+
}.freeze
|
58
|
+
|
59
|
+
PATH_DEFAULT = '/'.freeze
|
60
|
+
|
61
|
+
FRAMEWORK_DEFAULT = 'Ruby'.freeze
|
62
|
+
ENVIRONMENT_DEFAULT = 'production'.freeze
|
63
|
+
|
64
|
+
# == Properties ===========================================================
|
65
|
+
|
46
66
|
attr_accessor :secure
|
47
|
-
attr_writer :
|
67
|
+
attr_writer :scheme
|
48
68
|
attr_accessor :host
|
49
69
|
attr_writer :port
|
50
70
|
attr_accessor :proxy_host
|
51
|
-
|
71
|
+
attr_writer :proxy_port
|
52
72
|
attr_accessor :proxy_user
|
53
73
|
attr_accessor :proxy_pass
|
74
|
+
|
75
|
+
attr_accessor :verify_certificate
|
54
76
|
attr_accessor :http_open_timeout
|
55
77
|
attr_accessor :http_read_timeout
|
56
78
|
attr_accessor :recipient_override
|
@@ -59,23 +81,41 @@ class PostageApp::Configuration
|
|
59
81
|
attr_accessor :framework
|
60
82
|
attr_accessor :environment
|
61
83
|
attr_accessor :logger
|
84
|
+
|
85
|
+
# == Instance Methods =====================================================
|
62
86
|
|
63
87
|
def initialize
|
64
88
|
@secure = true
|
65
|
-
@
|
89
|
+
@verify_certificate = true
|
90
|
+
|
91
|
+
@host = ENV['POSTAGEAPP_HOST'] || HOST_DEFAULT
|
92
|
+
|
93
|
+
@proxy_port = SOCKS5_PORT_DEFAULT
|
66
94
|
|
67
95
|
@http_open_timeout = 5
|
68
96
|
@http_read_timeout = 10
|
69
97
|
|
70
98
|
@requests_to_resend = %w[ send_message ]
|
71
99
|
|
72
|
-
@framework =
|
73
|
-
|
74
|
-
@environment = 'production'
|
100
|
+
@framework = FRAMEWORK_DEFAULT
|
101
|
+
@environment = ENVIRONMENT_DEFAULT
|
75
102
|
end
|
76
103
|
|
77
104
|
alias_method :secure?, :secure
|
78
|
-
|
105
|
+
alias_method :verify_certificate?, :verify_certificate
|
106
|
+
|
107
|
+
def port_default?
|
108
|
+
if (self.secure?)
|
109
|
+
self.port == HTTPS_PORT_DEFAULT
|
110
|
+
else
|
111
|
+
self.port == HTTP_PORT_DEFAULT
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def proxy?
|
116
|
+
self.proxy_host and self.proxy_host.match(/\A\S+\z/)
|
117
|
+
end
|
118
|
+
|
79
119
|
# Assign which API key is used to make API calls. Can also be specified
|
80
120
|
# using the `POSTAGEAPP_API_KEY` environment variable.
|
81
121
|
def api_key=(key)
|
@@ -88,34 +128,35 @@ class PostageApp::Configuration
|
|
88
128
|
@api_key ||= ENV['POSTAGEAPP_API_KEY']
|
89
129
|
end
|
90
130
|
|
91
|
-
# Returns the HTTP
|
92
|
-
def
|
93
|
-
@
|
131
|
+
# Returns the HTTP scheme used to make API calls
|
132
|
+
def scheme
|
133
|
+
@scheme ||= SCHEME_FOR_SECURE[self.secure?]
|
94
134
|
end
|
135
|
+
|
136
|
+
alias_method :protocol=, :scheme=
|
137
|
+
alias_method :protocol, :scheme
|
95
138
|
|
96
139
|
# Returns the port used to make API calls
|
97
140
|
def port
|
98
|
-
@port ||= (secure? ?
|
141
|
+
@port ||= (self.secure? ? HTTPS_PORT_DEFAULT : HTTP_PORT_DEFAULT)
|
142
|
+
end
|
143
|
+
|
144
|
+
# Returns the port used to connect via SOCKS5
|
145
|
+
def proxy_port
|
146
|
+
@proxy_port ||= SOCKS5_PORT_DEFAULT
|
99
147
|
end
|
100
148
|
|
101
149
|
# Returns the endpoint URL to make API calls
|
102
150
|
def url
|
103
|
-
|
151
|
+
'%s://%s%s' % [
|
152
|
+
self.scheme,
|
153
|
+
self.host,
|
154
|
+
self.port_default? ? '' : (':%d' % self.port)
|
155
|
+
]
|
104
156
|
end
|
105
157
|
|
106
|
-
# Returns a
|
158
|
+
# Returns a connection aimed at the API endpoint
|
107
159
|
def http
|
108
|
-
|
109
|
-
self.proxy_host,
|
110
|
-
self.proxy_port,
|
111
|
-
self.proxy_user,
|
112
|
-
self.proxy_pass
|
113
|
-
).new(self.host, self.port)
|
114
|
-
|
115
|
-
http.read_timeout = self.http_read_timeout
|
116
|
-
http.open_timeout = self.http_open_timeout
|
117
|
-
http.use_ssl = self.secure?
|
118
|
-
|
119
|
-
http
|
160
|
+
PostageApp::HTTP.connect(self)
|
120
161
|
end
|
121
162
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'socket'
|
2
|
+
|
3
|
+
class PostageApp::Diagnostics
|
4
|
+
# == Instance Methods =====================================================
|
5
|
+
|
6
|
+
def initialize(config)
|
7
|
+
@config = config
|
8
|
+
end
|
9
|
+
|
10
|
+
def proxy_host_resolved
|
11
|
+
resolve(@config.proxy_host, 'socks5')
|
12
|
+
end
|
13
|
+
|
14
|
+
def host_resolved
|
15
|
+
resolve(@config.host, @config.protocol)
|
16
|
+
end
|
17
|
+
|
18
|
+
protected
|
19
|
+
def resolve(fqdn, service)
|
20
|
+
return unless (fqdn)
|
21
|
+
|
22
|
+
Socket.getaddrinfo(fqdn, service).map do |e|
|
23
|
+
# Result: [ family, port, name, ip, faily, socktype, protocol ]
|
24
|
+
e[3]
|
25
|
+
end.uniq
|
26
|
+
|
27
|
+
rescue SocketError
|
28
|
+
# Couldn't resolve, so nil
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module PostageApp::HTTP
|
2
|
+
# == Moduule Methods ======================================================
|
3
|
+
|
4
|
+
def self.connect(config)
|
5
|
+
connector =
|
6
|
+
if (config.proxy?)
|
7
|
+
Net::HTTP::Proxy(
|
8
|
+
config.proxy_host,
|
9
|
+
config.proxy_port || SOCKS5_PORT_DEFAULT,
|
10
|
+
config.proxy_user,
|
11
|
+
config.proxy_pass
|
12
|
+
)
|
13
|
+
else
|
14
|
+
Net::HTTP
|
15
|
+
end
|
16
|
+
|
17
|
+
http = connector.new(config.host, config.port)
|
18
|
+
|
19
|
+
unless (config.verify_certificate?)
|
20
|
+
context = OpenSSL::SSL::SSLContext.new
|
21
|
+
context.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
22
|
+
|
23
|
+
http.send(:instance_variable_set, :@ssl_context, context)
|
24
|
+
end
|
25
|
+
|
26
|
+
http.read_timeout = config.http_read_timeout
|
27
|
+
http.open_timeout = config.http_open_timeout
|
28
|
+
http.use_ssl = config.secure?
|
29
|
+
|
30
|
+
http
|
31
|
+
end
|
32
|
+
end
|
data/lib/postageapp/logger.rb
CHANGED
data/lib/postageapp/mail.rb
CHANGED
data/lib/postageapp/request.rb
CHANGED
@@ -1,10 +1,16 @@
|
|
1
1
|
class PostageApp::Request
|
2
|
+
# == Constants ============================================================
|
3
|
+
|
2
4
|
API_VERSION = '1.0'
|
3
5
|
|
4
6
|
HEADERS_DEFAULT = {
|
5
7
|
'Content-type' => 'application/json',
|
6
8
|
'Accept' => 'text/json, application/json'
|
7
9
|
}
|
10
|
+
|
11
|
+
TimeoutError = defined?(::Timeout) ? ::Timeout::Error : ::TimeoutError
|
12
|
+
|
13
|
+
# == Properties ===========================================================
|
8
14
|
|
9
15
|
# Unique ID (UID) for the request
|
10
16
|
attr_writer :uid
|
@@ -19,6 +25,8 @@ class PostageApp::Request
|
|
19
25
|
# Assigns the API key to be used for the request
|
20
26
|
attr_accessor :api_key
|
21
27
|
|
28
|
+
# == Class Methods ========================================================
|
29
|
+
|
22
30
|
# Returns a user-agent string used for identification when making API calls.
|
23
31
|
def self.user_agent
|
24
32
|
@user_agent ||=
|
@@ -28,6 +36,8 @@ class PostageApp::Request
|
|
28
36
|
PostageApp.configuration.framework
|
29
37
|
]
|
30
38
|
end
|
39
|
+
|
40
|
+
# == Instance Methods =====================================================
|
31
41
|
|
32
42
|
# Creates a new Request with the given API call method and arguments.
|
33
43
|
def initialize(method, arguments = nil)
|
@@ -45,18 +55,19 @@ class PostageApp::Request
|
|
45
55
|
|
46
56
|
PostageApp.logger.info(self)
|
47
57
|
|
48
|
-
http_response =
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
58
|
+
http_response =
|
59
|
+
begin
|
60
|
+
http.post(
|
61
|
+
url.path,
|
62
|
+
self.arguments_to_send.to_json,
|
63
|
+
HEADERS_DEFAULT.merge(
|
64
|
+
'User-Agent' => self.class.user_agent
|
65
|
+
)
|
54
66
|
)
|
55
|
-
)
|
56
67
|
|
57
|
-
|
58
|
-
|
59
|
-
|
68
|
+
rescue TimeoutError, Errno::ECONNREFUSED => e
|
69
|
+
e
|
70
|
+
end
|
60
71
|
|
61
72
|
response = PostageApp::Response.new(http_response)
|
62
73
|
|
data/lib/postageapp/response.rb
CHANGED
@@ -1,4 +1,11 @@
|
|
1
1
|
class PostageApp::Response
|
2
|
+
# == Constants ============================================================
|
3
|
+
|
4
|
+
STATUS_TIMEOUT = 'timeout'.freeze
|
5
|
+
STATUS_FAIL = 'fail'.freeze
|
6
|
+
|
7
|
+
# == Properties ===========================================================
|
8
|
+
|
2
9
|
# The UID should match the Request's UID. If Request didn't provide with one
|
3
10
|
# PostageApp service should generate it for the Response
|
4
11
|
attr_reader :uid
|
@@ -15,22 +22,29 @@ class PostageApp::Response
|
|
15
22
|
attr_reader :data
|
16
23
|
|
17
24
|
attr_reader :exception
|
25
|
+
|
26
|
+
# == Instance Methods =====================================================
|
18
27
|
|
19
28
|
# Takes in Net::HTTPResponse object as the attribute.
|
20
29
|
# If something goes wrong Response will be thought of as failed
|
21
30
|
def initialize(http_response)
|
22
|
-
|
23
|
-
|
24
|
-
|
31
|
+
case (http_response)
|
32
|
+
when Exception
|
33
|
+
@status = STATUS_TIMEOUT
|
34
|
+
@message = '[%s] %s' % [ http_response.class, http_response.to_s ]
|
35
|
+
else
|
36
|
+
hash = JSON::parse(http_response.body)
|
37
|
+
_response = hash['response']
|
25
38
|
|
26
|
-
|
27
|
-
|
28
|
-
|
39
|
+
@status = _response['status']
|
40
|
+
@uid = _response['uid']
|
41
|
+
@message = _response['message']
|
29
42
|
|
30
|
-
|
43
|
+
@data = hash['data']
|
44
|
+
end
|
31
45
|
|
32
46
|
rescue => e
|
33
|
-
@status =
|
47
|
+
@status = STATUS_FAIL
|
34
48
|
@exception = '[%s] %s' % [ e.class, e ]
|
35
49
|
end
|
36
50
|
|
data/lib/postageapp/utils.rb
CHANGED
@@ -31,14 +31,3 @@ class Hash
|
|
31
31
|
end
|
32
32
|
end
|
33
33
|
end
|
34
|
-
|
35
|
-
class Net::HTTP
|
36
|
-
# Getting rid of the 'warning: peer certificate won't be verified in this SSL session'
|
37
|
-
alias_method :__initialize, :initialize
|
38
|
-
def initialize(*args)
|
39
|
-
__initialize(*args)
|
40
|
-
|
41
|
-
@ssl_context = OpenSSL::SSL::SSLContext.new
|
42
|
-
@ssl_context.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
43
|
-
end
|
44
|
-
end
|
data/lib/postageapp/version.rb
CHANGED
data/postageapp.gemspec
CHANGED
@@ -8,19 +8,19 @@ Gem::Specification.new do |s|
|
|
8
8
|
s.name = 'postageapp'
|
9
9
|
s.version = PostageApp::VERSION
|
10
10
|
s.authors = [
|
11
|
-
'Oleg Khabarov',
|
12
11
|
'Scott Tadman',
|
12
|
+
'Oleg Khabarov',
|
13
13
|
'The Working Group Inc.'
|
14
14
|
]
|
15
15
|
s.email = [
|
16
|
-
'
|
17
|
-
'
|
16
|
+
'tadman@postageapp.com',
|
17
|
+
'oleg@khabarov.ca'
|
18
18
|
]
|
19
19
|
|
20
20
|
s.homepage = 'http://github.com/postageapp/postageapp-ruby'
|
21
21
|
|
22
|
-
s.summary = 'Client for PostageApp Email API'
|
23
|
-
s.description = '
|
22
|
+
s.summary = 'Client library for PostageApp Email API'
|
23
|
+
s.description = 'PostageApp Library for Ruby and Ruby on Rails applications'
|
24
24
|
s.license = 'MIT'
|
25
25
|
|
26
26
|
s.files = `git ls-files`.split("\n")
|
@@ -29,6 +29,6 @@ Gem::Specification.new do |s|
|
|
29
29
|
|
30
30
|
s.required_ruby_version = '>= 1.9.3'
|
31
31
|
|
32
|
-
s.add_dependency 'json'
|
33
|
-
s.add_dependency 'mail'
|
32
|
+
s.add_dependency 'json', '~> 1.8'
|
33
|
+
s.add_dependency 'mail', '~> 2.4'
|
34
34
|
end
|
data/test/configuration_test.rb
CHANGED
@@ -1,18 +1,20 @@
|
|
1
|
-
|
1
|
+
require_relative './helper'
|
2
2
|
|
3
3
|
class ConfigurationTest < MiniTest::Test
|
4
4
|
def test_initialization_defaults
|
5
5
|
config = PostageApp::Configuration.new
|
6
6
|
|
7
7
|
assert_equal true, config.secure
|
8
|
-
assert_equal
|
9
|
-
assert_equal 'https', config.
|
10
|
-
assert_equal 'api.postageapp.com', config.host
|
8
|
+
assert_equal ENV['POSTAGEAPP_API_KEY'], config.api_key
|
9
|
+
assert_equal 'https', config.scheme
|
10
|
+
assert_equal ENV['POSTAGEAPP_API_HOST'] || 'api.postageapp.com', config.host
|
11
11
|
assert_equal 443, config.port
|
12
|
+
|
12
13
|
assert_equal nil, config.proxy_host
|
13
|
-
assert_equal
|
14
|
+
assert_equal 1080, config.proxy_port
|
14
15
|
assert_equal nil, config.proxy_user
|
15
16
|
assert_equal nil, config.proxy_pass
|
17
|
+
|
16
18
|
assert_equal 5, config.http_open_timeout
|
17
19
|
assert_equal 10, config.http_read_timeout
|
18
20
|
assert_equal nil, config.recipient_override
|
@@ -26,10 +28,10 @@ class ConfigurationTest < MiniTest::Test
|
|
26
28
|
def test_initialization_overrides
|
27
29
|
config = PostageApp::Configuration.new
|
28
30
|
|
29
|
-
config.
|
30
|
-
config.port
|
31
|
+
config.scheme = 'http'
|
32
|
+
config.port = 999
|
31
33
|
|
32
|
-
assert_equal 'http', config.
|
34
|
+
assert_equal 'http', config.scheme
|
33
35
|
assert_equal 999, config.port
|
34
36
|
end
|
35
37
|
|
@@ -37,11 +39,13 @@ class ConfigurationTest < MiniTest::Test
|
|
37
39
|
config = PostageApp::Configuration.new
|
38
40
|
|
39
41
|
config.secure = true
|
42
|
+
|
40
43
|
assert_equal true, config.secure
|
41
|
-
assert_equal 'https', config.
|
44
|
+
assert_equal 'https', config.scheme
|
42
45
|
assert_equal 443, config.port
|
43
46
|
|
44
|
-
|
47
|
+
assert_equal true, config.secure?
|
48
|
+
assert_equal true, config.port_default?
|
45
49
|
end
|
46
50
|
|
47
51
|
def test_initialization_for_insecure
|
@@ -49,7 +53,7 @@ class ConfigurationTest < MiniTest::Test
|
|
49
53
|
|
50
54
|
config.secure = false
|
51
55
|
assert_equal false, config.secure
|
52
|
-
assert_equal 'http', config.
|
56
|
+
assert_equal 'http', config.scheme
|
53
57
|
assert_equal 80, config.port
|
54
58
|
|
55
59
|
assert !config.secure?
|
@@ -70,6 +74,9 @@ class ConfigurationTest < MiniTest::Test
|
|
70
74
|
config = PostageApp::Configuration.new
|
71
75
|
|
72
76
|
config.host = 'api.postageapp.com'
|
73
|
-
|
77
|
+
|
78
|
+
assert_equal true, config.port_default?
|
79
|
+
|
80
|
+
assert_equal 'https://api.postageapp.com', config.url
|
74
81
|
end
|
75
82
|
end
|
data/test/failed_request_test.rb
CHANGED
data/test/helper.rb
CHANGED
@@ -45,24 +45,11 @@ class MiniTest::Test
|
|
45
45
|
def setup
|
46
46
|
# Resetting to default configuration
|
47
47
|
|
48
|
-
PostageApp.configure do |config|
|
49
|
-
config.api_key = '1234567890abcdef'
|
50
|
-
config.secure = true
|
51
|
-
config.protocol = 'https'
|
52
|
-
config.host = 'api.postageapp.com'
|
53
|
-
config.port = 443
|
54
|
-
config.proxy_host = nil
|
55
|
-
config.proxy_port = nil
|
56
|
-
config.proxy_user = nil
|
57
|
-
config.proxy_pass = nil
|
58
|
-
config.http_open_timeout = 5
|
59
|
-
config.http_read_timeout = 10
|
60
|
-
config.recipient_override = nil
|
48
|
+
PostageApp.configure(:reset) do |config|
|
61
49
|
config.requests_to_resend = %w( send_message )
|
62
50
|
config.project_root = File.expand_path('../', __FILE__)
|
63
|
-
config.environment = 'production'
|
64
51
|
config.logger = nil
|
65
|
-
config.framework = '
|
52
|
+
config.framework = 'Ruby [Test]'
|
66
53
|
end
|
67
54
|
|
68
55
|
if (defined?(ActionMailer))
|
data/test/live_test.rb
CHANGED
@@ -1,20 +1,17 @@
|
|
1
|
-
|
1
|
+
require_relative './helper'
|
2
2
|
|
3
3
|
class LiveTest < MiniTest::Test
|
4
4
|
# Note: Need access to a live PostageApp.com account
|
5
5
|
# See helper.rb to set host / api key
|
6
6
|
|
7
|
-
if (ENV['
|
8
|
-
def
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
config.host = 'api.postageapp.local'
|
14
|
-
config.api_key = 'PROJECT_API_KEY'
|
15
|
-
end
|
7
|
+
if (ENV['POSTAGEAPP_API_KEY'])
|
8
|
+
def test_configuration
|
9
|
+
config = PostageApp.config
|
10
|
+
|
11
|
+
assert config
|
12
|
+
assert_equal ENV['POSTAGEAPP_API_KEY'], config.api_key
|
16
13
|
end
|
17
|
-
|
14
|
+
|
18
15
|
def test_request_get_method_list
|
19
16
|
request = PostageApp::Request.new(:get_method_list)
|
20
17
|
response = request.send
|
@@ -25,14 +22,34 @@ class LiveTest < MiniTest::Test
|
|
25
22
|
assert_equal nil, response.message
|
26
23
|
assert_equal(
|
27
24
|
{
|
28
|
-
'methods' =>
|
25
|
+
'methods' => %w[
|
26
|
+
get_account_info
|
27
|
+
get_message_receipt
|
28
|
+
get_message_transmissions
|
29
|
+
get_messages
|
30
|
+
get_method_list
|
31
|
+
get_metrics
|
32
|
+
get_project_info
|
33
|
+
get_recipients_list
|
34
|
+
get_suppression_list
|
35
|
+
message_delivery_status
|
36
|
+
message_status
|
37
|
+
messages_history
|
38
|
+
project_create
|
39
|
+
project_destroy
|
40
|
+
project_info
|
41
|
+
send_message
|
42
|
+
test_mail_server
|
43
|
+
test_recipient
|
44
|
+
].join(', ')
|
29
45
|
},
|
30
46
|
response.data
|
31
47
|
)
|
32
48
|
end
|
33
49
|
|
34
50
|
def test_request_send_message
|
35
|
-
request = PostageApp::Request.new(
|
51
|
+
request = PostageApp::Request.new(
|
52
|
+
:send_message,
|
36
53
|
headers: {
|
37
54
|
'from' => 'sender@example.com',
|
38
55
|
'subject' => 'Test Message'
|
@@ -42,7 +59,7 @@ class LiveTest < MiniTest::Test
|
|
42
59
|
'text/plain' => 'text content',
|
43
60
|
'text/html' => 'html content'
|
44
61
|
}
|
45
|
-
|
62
|
+
)
|
46
63
|
|
47
64
|
response = request.send
|
48
65
|
|
@@ -74,35 +91,43 @@ class LiveTest < MiniTest::Test
|
|
74
91
|
response = request.send
|
75
92
|
|
76
93
|
assert_equal 'PostageApp::Response', response.class.name
|
77
|
-
assert_equal '
|
94
|
+
assert_equal 'call_error', response.status
|
95
|
+
|
78
96
|
assert_match(/\A\w{40}$/, response.uid)
|
79
|
-
assert_match(/\
|
97
|
+
assert_match(/\ARequest could not be processed/, response.message)
|
80
98
|
assert_equal nil, response.data
|
81
99
|
end
|
82
100
|
|
83
101
|
# Testable under ruby 1.9.2 Probably OK in production too... Probably
|
84
102
|
# Lunchtime reading: http://ph7spot.com/musings/system-timer
|
85
103
|
def test_request_timeout
|
86
|
-
PostageApp.configuration.host = '127.0.0.
|
104
|
+
PostageApp.configuration.host = '127.0.0.255'
|
87
105
|
|
88
106
|
request = PostageApp::Request.new(:get_method_list)
|
89
107
|
|
90
108
|
response = request.send
|
91
109
|
|
92
110
|
assert_equal 'PostageApp::Response', response.class.name
|
93
|
-
assert_equal '
|
111
|
+
assert_equal 'timeout', response.status
|
94
112
|
end
|
95
113
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
114
|
+
if (defined?(Rails))
|
115
|
+
def test_deliver_with_custom_postage_variables
|
116
|
+
response =
|
117
|
+
if (ActionMailer::VERSION::MAJOR < 3)
|
118
|
+
require File.expand_path('../mailer/action_mailer_2/notifier', __FILE__)
|
119
|
+
|
120
|
+
Notifier.deliver_with_custom_postage_variables
|
121
|
+
else
|
122
|
+
require File.expand_path('../mailer/action_mailer_3/notifier', __FILE__)
|
123
|
+
|
124
|
+
Notifier.with_custom_postage_variables.deliver
|
125
|
+
end
|
126
|
+
|
127
|
+
assert_equal 'ok', response.status
|
128
|
+
assert_equal true, response.ok?
|
103
129
|
end
|
104
|
-
|
105
|
-
end
|
130
|
+
end
|
106
131
|
else
|
107
132
|
puts "\e[0m\e[31mSkipping #{File.basename(__FILE__)}\e[0m"
|
108
133
|
|
@@ -1,4 +1,5 @@
|
|
1
|
-
# Test mailer for ActionMailer 2
|
1
|
+
# Test mailer for ActionMailer 2.x
|
2
|
+
|
2
3
|
class Notifier < PostageApp::Mailer
|
3
4
|
self.template_root = File.dirname(__FILE__)
|
4
5
|
|
@@ -31,14 +32,14 @@ class Notifier < PostageApp::Mailer
|
|
31
32
|
)
|
32
33
|
|
33
34
|
part(
|
34
|
-
:
|
35
|
-
:
|
35
|
+
content_type: 'text/plain',
|
36
|
+
body: 'text content'
|
36
37
|
)
|
37
38
|
|
38
39
|
attachment(
|
39
|
-
:
|
40
|
-
:
|
41
|
-
:
|
40
|
+
content_type: 'image/jpeg',
|
41
|
+
filename: 'foo.jpg',
|
42
|
+
body: '123456789'
|
42
43
|
)
|
43
44
|
end
|
44
45
|
|
@@ -46,9 +47,9 @@ class Notifier < PostageApp::Mailer
|
|
46
47
|
setup_headers
|
47
48
|
|
48
49
|
attachment(
|
49
|
-
:
|
50
|
-
:
|
51
|
-
:
|
50
|
+
content_type: 'image/jpeg',
|
51
|
+
filename: 'foo.jpg',
|
52
|
+
body: '123456789'
|
52
53
|
)
|
53
54
|
end
|
54
55
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Test mailer for ActionMailer 3
|
1
|
+
# Test mailer for ActionMailer 3.x+
|
2
2
|
|
3
3
|
class Notifier < PostageApp::Mailer
|
4
4
|
self.append_view_path(File.dirname(__FILE__))
|
@@ -66,9 +66,9 @@ class Notifier < PostageApp::Mailer
|
|
66
66
|
postageapp_uid 'custom_uid'
|
67
67
|
|
68
68
|
mail(
|
69
|
-
:
|
70
|
-
:
|
71
|
-
:
|
69
|
+
from: 'sender@example.com',
|
70
|
+
subject: 'Test Message',
|
71
|
+
to: {
|
72
72
|
'test1@example.net' => { 'name' => 'Test 1' },
|
73
73
|
'test2@example.net' => { 'name' => 'Test 2' }
|
74
74
|
}
|
@@ -76,11 +76,11 @@ class Notifier < PostageApp::Mailer
|
|
76
76
|
end
|
77
77
|
|
78
78
|
private
|
79
|
-
def headers_hash(options =
|
79
|
+
def headers_hash(options = nil)
|
80
80
|
{
|
81
|
-
:
|
82
|
-
:
|
83
|
-
:
|
84
|
-
}.merge(options)
|
81
|
+
from: 'sender@example.com',
|
82
|
+
to: 'recipient@example.net',
|
83
|
+
subject: 'Test Message'
|
84
|
+
}.merge(options || { })
|
85
85
|
end
|
86
86
|
end
|
data/test/mailer_2_test.rb
CHANGED
data/test/mailer_3_test.rb
CHANGED
data/test/mailer_4_test.rb
CHANGED
data/test/postageapp_test.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
require_relative './helper'
|
2
2
|
|
3
3
|
class PostageAppTest < MiniTest::Test
|
4
4
|
def test_method_configure
|
@@ -9,6 +9,9 @@ class PostageAppTest < MiniTest::Test
|
|
9
9
|
|
10
10
|
assert_equal 'abcdefg12345', PostageApp.configuration.api_key
|
11
11
|
assert_equal 'test.test', PostageApp.configuration.host
|
12
|
+
|
13
|
+
ensure
|
14
|
+
PostageApp.configuration_reset!
|
12
15
|
end
|
13
16
|
|
14
17
|
def test_logger
|
data/test/request_test.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
require_relative './helper'
|
2
2
|
|
3
3
|
class RequestTest < MiniTest::Test
|
4
4
|
def test_method_uid
|
@@ -34,22 +34,22 @@ class RequestTest < MiniTest::Test
|
|
34
34
|
|
35
35
|
args = request.arguments_to_send
|
36
36
|
|
37
|
-
|
37
|
+
assert !args['api_key'].empty?
|
38
38
|
assert_match(/^\w{40}$/, args['uid'])
|
39
39
|
|
40
40
|
payload = args['arguments']
|
41
41
|
|
42
42
|
assert_equal 'sender@test.test', payload['headers']['from']
|
43
|
-
assert_equal 'Test Message',
|
44
|
-
assert_equal 'test@test.test',
|
45
|
-
assert_equal 'text content',
|
46
|
-
assert_equal 'html content',
|
43
|
+
assert_equal 'Test Message', payload['headers']['subject']
|
44
|
+
assert_equal 'test@test.test', payload['recipients']
|
45
|
+
assert_equal 'text content', payload['content']['text/plain']
|
46
|
+
assert_equal 'html content', payload['content']['text/html']
|
47
47
|
|
48
48
|
request.arguments = { 'data' => 'content' }
|
49
49
|
|
50
50
|
args = request.arguments_to_send
|
51
51
|
|
52
|
-
|
52
|
+
assert !args['api_key'].empty?
|
53
53
|
assert_match(/^\w{40}$/, args['uid'])
|
54
54
|
assert_equal 'content', args['arguments']['data']
|
55
55
|
end
|
data/test/response_test.rb
CHANGED
metadata
CHANGED
@@ -1,55 +1,55 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: postageapp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
- Oleg Khabarov
|
8
7
|
- Scott Tadman
|
8
|
+
- Oleg Khabarov
|
9
9
|
- The Working Group Inc.
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2016-
|
13
|
+
date: 2016-09-14 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: json
|
17
17
|
requirement: !ruby/object:Gem::Requirement
|
18
18
|
requirements:
|
19
|
-
- -
|
19
|
+
- - "~>"
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: '
|
21
|
+
version: '1.8'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
requirements:
|
26
|
-
- -
|
26
|
+
- - "~>"
|
27
27
|
- !ruby/object:Gem::Version
|
28
|
-
version: '
|
28
|
+
version: '1.8'
|
29
29
|
- !ruby/object:Gem::Dependency
|
30
30
|
name: mail
|
31
31
|
requirement: !ruby/object:Gem::Requirement
|
32
32
|
requirements:
|
33
|
-
- -
|
33
|
+
- - "~>"
|
34
34
|
- !ruby/object:Gem::Version
|
35
|
-
version: '
|
35
|
+
version: '2.4'
|
36
36
|
type: :runtime
|
37
37
|
prerelease: false
|
38
38
|
version_requirements: !ruby/object:Gem::Requirement
|
39
39
|
requirements:
|
40
|
-
- -
|
40
|
+
- - "~>"
|
41
41
|
- !ruby/object:Gem::Version
|
42
|
-
version: '
|
43
|
-
description:
|
42
|
+
version: '2.4'
|
43
|
+
description: PostageApp Library for Ruby and Ruby on Rails applications
|
44
44
|
email:
|
45
|
-
- oleg@khabarov.ca
|
46
45
|
- tadman@postageapp.com
|
46
|
+
- oleg@khabarov.ca
|
47
47
|
executables: []
|
48
48
|
extensions: []
|
49
49
|
extra_rdoc_files: []
|
50
50
|
files:
|
51
|
-
- .gitignore
|
52
|
-
- .travis.yml
|
51
|
+
- ".gitignore"
|
52
|
+
- ".travis.yml"
|
53
53
|
- Gemfile
|
54
54
|
- LICENSE
|
55
55
|
- README.md
|
@@ -62,7 +62,9 @@ files:
|
|
62
62
|
- lib/generators/postageapp/postageapp_generator.rb
|
63
63
|
- lib/postageapp.rb
|
64
64
|
- lib/postageapp/configuration.rb
|
65
|
+
- lib/postageapp/diagnostics.rb
|
65
66
|
- lib/postageapp/failed_request.rb
|
67
|
+
- lib/postageapp/http.rb
|
66
68
|
- lib/postageapp/logger.rb
|
67
69
|
- lib/postageapp/mail.rb
|
68
70
|
- lib/postageapp/mail/arguments.rb
|
@@ -133,18 +135,18 @@ require_paths:
|
|
133
135
|
- lib
|
134
136
|
required_ruby_version: !ruby/object:Gem::Requirement
|
135
137
|
requirements:
|
136
|
-
- -
|
138
|
+
- - ">="
|
137
139
|
- !ruby/object:Gem::Version
|
138
140
|
version: 1.9.3
|
139
141
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
140
142
|
requirements:
|
141
|
-
- -
|
143
|
+
- - ">="
|
142
144
|
- !ruby/object:Gem::Version
|
143
145
|
version: '0'
|
144
146
|
requirements: []
|
145
147
|
rubyforge_project:
|
146
|
-
rubygems_version: 2.
|
148
|
+
rubygems_version: 2.5.1
|
147
149
|
signing_key:
|
148
150
|
specification_version: 4
|
149
|
-
summary: Client for PostageApp Email API
|
151
|
+
summary: Client library for PostageApp Email API
|
150
152
|
test_files: []
|