postageapp 1.2.0 → 1.2.5
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 +1 -0
- data/.travis.yml +14 -1
- data/README.md +1 -1
- data/generators/postageapp/postageapp_generator.rb +3 -3
- data/generators/postageapp/templates/postageapp_tasks.rake +57 -24
- data/lib/generators/postageapp/postageapp_generator.rb +6 -6
- data/lib/postageapp.rb +3 -1
- data/lib/postageapp/configuration.rb +52 -40
- data/lib/postageapp/failed_request.rb +4 -4
- data/lib/postageapp/mailer.rb +3 -86
- data/lib/postageapp/mailer/mailer_4.rb +7 -10
- data/lib/postageapp/request.rb +124 -11
- data/lib/postageapp/response.rb +4 -1
- data/lib/postageapp/utils.rb +27 -22
- data/lib/postageapp/version.rb +1 -1
- data/postageapp.gemspec +15 -5
- data/script/with +116 -0
- data/test/configuration_test.rb +1 -1
- data/test/failed_request_test.rb +32 -17
- data/test/gemfiles/Gemfile.rails-2.3.x +5 -1
- data/test/gemfiles/Gemfile.rails-3.0.x +6 -1
- data/test/gemfiles/Gemfile.rails-3.1.x +1 -1
- data/test/gemfiles/Gemfile.rails-3.2.x +2 -1
- data/test/gemfiles/Gemfile.rails-4.0.x +2 -1
- data/test/gemfiles/Gemfile.rails-4.1.x +2 -1
- data/test/gemfiles/Gemfile.rails-4.2.x +2 -1
- data/test/gemfiles/Gemfile.ruby +1 -0
- data/test/helper.rb +12 -5
- data/test/live_test.rb +36 -17
- data/test/mailer_2_test.rb +4 -5
- data/test/mailer_3_test.rb +8 -6
- data/test/mailer_4_test.rb +14 -6
- data/test/request_test.rb +8 -6
- data/test/response_test.rb +2 -1
- metadata +35 -14
- checksums.yaml +0 -7
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
@@ -1,10 +1,13 @@
|
|
1
1
|
language: ruby
|
2
|
-
before_install:
|
2
|
+
before_install: "WITH_VERBOSE=1 script/with current bootstrap"
|
3
|
+
install: "WITH_VERBOSE=1 script/with current bundle install"
|
4
|
+
script: "WITH_VERBOSE=1 script/with current bundle exec rake test"
|
3
5
|
rvm:
|
4
6
|
- 1.9.3-p551
|
5
7
|
- 2.0.0-p598
|
6
8
|
- 2.1.5
|
7
9
|
- 2.2.0
|
10
|
+
- 2.3.0
|
8
11
|
gemfile:
|
9
12
|
- test/gemfiles/Gemfile.ruby
|
10
13
|
- test/gemfiles/Gemfile.rails-2.3.x
|
@@ -22,3 +25,13 @@ matrix:
|
|
22
25
|
gemfile: test/gemfiles/Gemfile.rails-2.3.x
|
23
26
|
- rvm: 2.2.0
|
24
27
|
gemfile: test/gemfiles/Gemfile.rails-2.3.x
|
28
|
+
- rvm: 2.3.0
|
29
|
+
gemfile: test/gemfiles/Gemfile.rails-2.3.x
|
30
|
+
- rvm: 1.9.3-p551
|
31
|
+
gemfile: test/gemfiles/Gemfile.rails-2.3.x
|
32
|
+
- rvm: 1.9.3-p551
|
33
|
+
gemfile: test/gemfiles/Gemfile.rails-4.0.x
|
34
|
+
- rvm: 1.9.3-p551
|
35
|
+
gemfile: test/gemfiles/Gemfile.rails-4.1.x
|
36
|
+
- rvm: 1.9.3-p551
|
37
|
+
gemfile: test/gemfiles/Gemfile.rails-4.2.x
|
data/README.md
CHANGED
@@ -21,11 +21,11 @@ class PostageappGenerator < Rails::Generator::Base
|
|
21
21
|
|
22
22
|
record do |m|
|
23
23
|
m.template 'initializer.rb', 'config/initializers/postageapp.rb',
|
24
|
-
:
|
25
|
-
:
|
24
|
+
assigns: { api_key: options[:api_key] },
|
25
|
+
collision: :force
|
26
26
|
m.directory 'lib/tasks'
|
27
27
|
m.file 'postageapp_tasks.rake', 'lib/tasks/postageapp_tasks.rake',
|
28
|
-
:
|
28
|
+
collision: :force
|
29
29
|
m.rake 'postageapp:test'
|
30
30
|
end
|
31
31
|
end
|
@@ -1,23 +1,52 @@
|
|
1
1
|
namespace :postageapp do
|
2
|
-
|
3
|
-
|
2
|
+
desc 'Show the current PostageApp configuration'
|
3
|
+
task :config => :environment do
|
4
|
+
puts "PostageApp Configuration"
|
5
|
+
puts "------------------------"
|
6
|
+
puts
|
7
|
+
|
8
|
+
config = PostageApp.config
|
9
|
+
|
10
|
+
puts "API Key: %s" % config.api_key
|
11
|
+
puts "API Endpoint: %s" % config.url
|
12
|
+
puts "Secure: %s" % [ config.secure? ? 'Yes' : 'No' ]
|
13
|
+
|
14
|
+
if (config.proxy_host)
|
15
|
+
puts "SOCKS5 Proxy: %s:%d" % [ config.proxy_host, config.proxy_port ]
|
16
|
+
|
17
|
+
if (config.proxy_user)
|
18
|
+
puts "SOCKS5 Auth: %s / %s" % [ config.proxy_user, config.proxy_pass ]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
puts "Open Timeout: %d seconds" % [ config.http_open_timeout ]
|
23
|
+
puts "Read Timeout: %d seconds" % [ config.http_read_timeout ]
|
24
|
+
|
25
|
+
if (config.recipient_override)
|
26
|
+
puts "Recipient Override: %s" % [ config.recipient_override ]
|
27
|
+
end
|
28
|
+
|
29
|
+
puts "Environment: %s" % [ config.environment ]
|
30
|
+
end
|
31
|
+
|
32
|
+
desc 'Verify the PostageApp gem installation by requesting project info from the API'
|
4
33
|
task :test => :environment do
|
5
34
|
|
6
35
|
puts "Attempting to contact #{PostageApp.configuration.host} ..."
|
7
36
|
response = PostageApp::Request.new(:get_project_info).send
|
8
37
|
|
9
38
|
if response.ok?
|
10
|
-
project_name
|
11
|
-
project_url
|
12
|
-
user_emails
|
39
|
+
project_name = response.data['project']['name']
|
40
|
+
project_url = response.data['project']['url']
|
41
|
+
user_emails = response.data['project']['users']
|
13
42
|
|
14
|
-
puts
|
43
|
+
puts <<END
|
15
44
|
Found Project:
|
16
45
|
----------------------------
|
17
46
|
Name: #{ project_name }
|
18
47
|
URL: #{ project_url }
|
19
48
|
Users: #{ user_emails.keys.join(', ') }
|
20
|
-
|
49
|
+
END
|
21
50
|
|
22
51
|
# Sending test email to all users in the project
|
23
52
|
# Most likely a single user if it's a new project
|
@@ -47,15 +76,15 @@ namespace :postageapp do
|
|
47
76
|
|
48
77
|
end
|
49
78
|
|
50
|
-
HTML_MESSAGE =
|
79
|
+
HTML_MESSAGE = <<END
|
51
80
|
<h3> Hello {{name}}, </h3>
|
52
|
-
<p>
|
53
|
-
<p>
|
54
|
-
<p>
|
55
|
-
<p>
|
56
|
-
|
81
|
+
<p>This is a html message generated by Postage plugin.</p>
|
82
|
+
<p>If you received this message it means that your application is properly configured and is ready to use PostageApp service.</p>
|
83
|
+
<p>Thank you,</p>
|
84
|
+
<p>The PostageApp Team</p>
|
85
|
+
END
|
57
86
|
|
58
|
-
TEXT_MESSAGE =
|
87
|
+
TEXT_MESSAGE = <<END
|
59
88
|
Hello {{name}}
|
60
89
|
|
61
90
|
This is a plain text message generated by Postage plugin.
|
@@ -63,23 +92,27 @@ If you received this message it means that your application is properly configur
|
|
63
92
|
|
64
93
|
Thank you,
|
65
94
|
The PostageApp Team
|
66
|
-
|
95
|
+
END
|
67
96
|
|
68
97
|
def send_test_message(recipients)
|
69
|
-
recipients_with_variables = {}
|
98
|
+
recipients_with_variables = { }
|
99
|
+
|
70
100
|
recipients.each do |email, name|
|
71
|
-
recipients_with_variables[email] = {
|
101
|
+
recipients_with_variables[email] = {
|
102
|
+
'name' => name
|
103
|
+
}
|
72
104
|
end
|
73
105
|
|
74
|
-
PostageApp::Request.new(
|
75
|
-
:
|
76
|
-
|
106
|
+
PostageApp::Request.new(
|
107
|
+
:send_message,
|
108
|
+
message: {
|
109
|
+
'text/html' => HTML_MESSAGE,
|
77
110
|
'text/plain' => TEXT_MESSAGE
|
78
111
|
},
|
79
|
-
:
|
80
|
-
:
|
112
|
+
recipients: recipients_with_variables,
|
113
|
+
headers: {
|
81
114
|
'Subject' => '[PostageApp] Test Message',
|
82
|
-
'From'
|
115
|
+
'From' => 'no-return@postageapp.com'
|
83
116
|
}
|
84
117
|
).send
|
85
|
-
end
|
118
|
+
end
|
@@ -3,14 +3,14 @@ require 'rails/generators'
|
|
3
3
|
# Rails 3 Generator
|
4
4
|
class PostageappGenerator < Rails::Generators::Base
|
5
5
|
class_option :api_key,
|
6
|
-
:
|
7
|
-
:
|
8
|
-
:
|
6
|
+
aliases: [ '-k=value', '--api-key=value' ],
|
7
|
+
type: :string,
|
8
|
+
desc: 'Your PostageApp API key'
|
9
9
|
|
10
10
|
def self.source_root
|
11
|
-
@
|
12
|
-
'
|
13
|
-
__FILE__
|
11
|
+
@__source_root ||= File.expand_path(
|
12
|
+
'../../../generators/postageapp/templates',
|
13
|
+
File.dirname(__FILE__)
|
14
14
|
)
|
15
15
|
end
|
16
16
|
|
data/lib/postageapp.rb
CHANGED
@@ -1,64 +1,76 @@
|
|
1
|
+
# PostageApp::Configuration is used to retrieve and manipulate the options
|
2
|
+
# used to connect to the API. There are a number of options which can be set.
|
3
|
+
# The recommended method for doing this is via the initializer file that's
|
4
|
+
# generated upon installation: config/initializers/postageapp.rb
|
5
|
+
|
6
|
+
# Basic Options
|
7
|
+
# -------------
|
8
|
+
# :api_key - The API key used to send requests, can also be set via the
|
9
|
+
# POSTAGEAPP_API_KEY environment variable. (required)
|
10
|
+
# :secure - true for HTTPS, false for HTTP connections (default: true)
|
11
|
+
# :recipient_override - Email address to send all email to regardless of
|
12
|
+
# specified recipients. Used for testing.
|
13
|
+
|
14
|
+
# Non-Rails Options
|
15
|
+
# -----------------
|
16
|
+
# :project_root - The base path of the project, used to determine where to
|
17
|
+
# save log files and failed API calls.
|
18
|
+
# :framework - A string identifier for the framework being used. Shows up in
|
19
|
+
# the User-Agent identifier of requests.
|
20
|
+
# :environment - The operational mode of the application, typically either
|
21
|
+
# 'production' or 'development' but any string value is allowed.
|
22
|
+
# (default: 'production')
|
23
|
+
# :logger - Used to assign a specific logger.
|
24
|
+
|
25
|
+
# Network Options
|
26
|
+
# ---------------
|
27
|
+
# :host - The API host to connect to (default: 'api.postageapp.com')
|
28
|
+
# :http_open_timeout - HTTP open timeout in seconds (default: 2)
|
29
|
+
# :http_read_timeout - Read timeout in seconds (default: 5)
|
30
|
+
|
31
|
+
# Proxy Options
|
32
|
+
# -------------
|
33
|
+
# :proxy_host - Proxy server hostname
|
34
|
+
# :proxy_port - Proxy server port
|
35
|
+
# :proxy_user - Proxy server username
|
36
|
+
# :proxy_pass - Proxy server password
|
37
|
+
|
38
|
+
# Advanced Options
|
39
|
+
# ----------------
|
40
|
+
# :port - The port to make HTTP/HTTPS requests (default based on secure option)
|
41
|
+
# :protocol - Set to either `http` or `https` (default based on secure option)
|
42
|
+
# :requests_to_resend - List of API calls that should be replayed if they fail.
|
43
|
+
# (default: send_message)
|
44
|
+
|
1
45
|
class PostageApp::Configuration
|
2
|
-
# +true+ for https, +false+ for http connections (default: is +true+)
|
3
46
|
attr_accessor :secure
|
4
|
-
|
5
|
-
# The protocol used to connect to the service (default: 'https' for secure
|
6
|
-
# and 'http' for insecure connections)
|
7
|
-
attr_accessor :protocol
|
8
|
-
|
9
|
-
# The host to connect to (default: 'api.postageapp.com')
|
47
|
+
attr_writer :protocol
|
10
48
|
attr_accessor :host
|
11
|
-
|
12
|
-
# The port on which PostageApp service runs (default: 443 for secure, 80 for
|
13
|
-
# insecure connections)
|
14
49
|
attr_writer :port
|
15
|
-
|
16
|
-
# The hostname of the proxy server (if using a proxy)
|
17
50
|
attr_accessor :proxy_host
|
18
|
-
|
19
|
-
# The port of the proxy server (if using proxy)
|
20
51
|
attr_accessor :proxy_port
|
21
|
-
|
22
|
-
# The username for the proxy server (if using proxy)
|
23
52
|
attr_accessor :proxy_user
|
24
|
-
|
25
|
-
# The password for the proxy server (if using proxy)
|
26
53
|
attr_accessor :proxy_pass
|
27
|
-
|
28
|
-
# The HTTP open timeout in seconds (defaults to 2).
|
29
54
|
attr_accessor :http_open_timeout
|
30
|
-
|
31
|
-
# The HTTP read timeout in seconds (defaults to 5).
|
32
55
|
attr_accessor :http_read_timeout
|
33
|
-
|
34
|
-
# The email address that all send_message method should address
|
35
|
-
# all messages while overriding original addresses
|
36
56
|
attr_accessor :recipient_override
|
37
|
-
|
38
|
-
# A list of API method names payloads of which are captured and resent
|
39
|
-
# in case of service unavailability
|
40
57
|
attr_accessor :requests_to_resend
|
41
|
-
|
42
|
-
# The file path of the project. This is where logs and failed requests
|
43
|
-
# can be stored
|
44
58
|
attr_accessor :project_root
|
45
|
-
|
46
|
-
# The framework PostageApp gem runs in
|
47
59
|
attr_accessor :framework
|
48
|
-
|
49
|
-
# Environment gem is running in
|
50
60
|
attr_accessor :environment
|
51
|
-
|
52
|
-
# The logger used by this gem
|
53
61
|
attr_accessor :logger
|
54
62
|
|
55
63
|
def initialize
|
56
64
|
@secure = true
|
57
65
|
@host = 'api.postageapp.com'
|
66
|
+
|
58
67
|
@http_open_timeout = 5
|
59
68
|
@http_read_timeout = 10
|
60
|
-
|
61
|
-
@
|
69
|
+
|
70
|
+
@requests_to_resend = %w[ send_message ]
|
71
|
+
|
72
|
+
@framework = 'Ruby'
|
73
|
+
|
62
74
|
@environment = 'production'
|
63
75
|
end
|
64
76
|
|
@@ -91,7 +103,7 @@ class PostageApp::Configuration
|
|
91
103
|
"#{self.protocol}://#{self.host}:#{self.port}"
|
92
104
|
end
|
93
105
|
|
94
|
-
# Returns a properly
|
106
|
+
# Returns a properly configured Net::HTTP connection
|
95
107
|
def http
|
96
108
|
http = Net::HTTP::Proxy(
|
97
109
|
self.proxy_host,
|
@@ -5,7 +5,7 @@ module PostageApp::FailedRequest
|
|
5
5
|
return false unless (self.store_path)
|
6
6
|
return false unless (PostageApp.configuration.requests_to_resend.member?(request.method.to_s))
|
7
7
|
|
8
|
-
unless (File.
|
8
|
+
unless (File.exist?(file_path(request.uid)))
|
9
9
|
open(file_path(request.uid), 'wb') do |f|
|
10
10
|
f.write(Marshal.dump(request))
|
11
11
|
end
|
@@ -34,7 +34,7 @@ module PostageApp::FailedRequest
|
|
34
34
|
|
35
35
|
receipt_response = PostageApp::Request.new(
|
36
36
|
:get_message_receipt,
|
37
|
-
:
|
37
|
+
uid: filename
|
38
38
|
).send(true)
|
39
39
|
|
40
40
|
if (receipt_response.fail?)
|
@@ -67,7 +67,7 @@ module PostageApp::FailedRequest
|
|
67
67
|
# Initializing PostageApp::Request object from the file
|
68
68
|
def self.initialize_request(uid)
|
69
69
|
return false unless (self.store_path)
|
70
|
-
return false unless (File.
|
70
|
+
return false unless (File.exist?(file_path(uid)))
|
71
71
|
|
72
72
|
Marshal.load(File.read(file_path(uid)))
|
73
73
|
|
@@ -86,7 +86,7 @@ protected
|
|
86
86
|
'tmp/postageapp_failed_requests'
|
87
87
|
)
|
88
88
|
|
89
|
-
unless (File.
|
89
|
+
unless (File.exist?(dir))
|
90
90
|
FileUtils.mkdir_p(dir)
|
91
91
|
end
|
92
92
|
|
data/lib/postageapp/mailer.rb
CHANGED
@@ -11,94 +11,11 @@ if (defined?(ActionMailer))
|
|
11
11
|
# currently installed on the system. Assuming we're dealing only with
|
12
12
|
# ones that come with Rails 2 and 3
|
13
13
|
case (ActionMailer::VERSION::MAJOR)
|
14
|
-
when 4
|
15
|
-
require File.expand_path('mailer/mailer_4', File.dirname(__FILE__))
|
16
14
|
when 3
|
17
15
|
require File.expand_path('mailer/mailer_3', File.dirname(__FILE__))
|
18
|
-
|
16
|
+
when 2
|
19
17
|
require File.expand_path('mailer/mailer_2', File.dirname(__FILE__))
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
# General helper methods for Request object to act more like TMail::Mail
|
24
|
-
# of Mail for testing
|
25
|
-
class PostageApp::Request
|
26
|
-
# Getter and setter for headers. You can specify headers in the following
|
27
|
-
# formats:
|
28
|
-
# headers['Custom-Header'] = 'Custom Value'
|
29
|
-
# headers 'Custom-Header-1' => 'Custom Value 1',
|
30
|
-
# 'Custom-Header-2' => 'Custom Value 2'
|
31
|
-
def headers(value = nil)
|
32
|
-
_headers = self.arguments['headers'] ||= { }
|
33
|
-
|
34
|
-
case (value)
|
35
|
-
when Hash
|
36
|
-
value.each do |k, v|
|
37
|
-
_headers[k.to_s] = v.to_s
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
_headers
|
42
|
-
end
|
43
|
-
|
44
|
-
def [](key)
|
45
|
-
case (key)
|
46
|
-
when :to, 'to'
|
47
|
-
self.to
|
48
|
-
when :from, 'from'
|
49
|
-
self.from
|
50
|
-
when :bcc, 'bcc'
|
51
|
-
# Not supported via API at this time
|
52
|
-
[ ]
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
def to
|
57
|
-
out = self.arguments_to_send.dig('arguments', 'recipients')
|
58
|
-
|
59
|
-
case (out)
|
60
|
-
when Hash
|
61
|
-
out
|
62
|
-
else
|
63
|
-
[ out ].flatten
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
def to=(list)
|
68
|
-
self.arguments['recipients'] = list
|
69
|
-
end
|
70
|
-
|
71
|
-
def from
|
72
|
-
[ self.arguments_to_send.dig('arguments', 'headers', 'from') ].flatten
|
73
|
-
end
|
74
|
-
|
75
|
-
def from=(address)
|
76
|
-
_headers = self.arguments['headers'] ||= { }
|
77
|
-
|
78
|
-
_headers['from'] = address.to_s
|
79
|
-
end
|
80
|
-
|
81
|
-
def bcc
|
82
|
-
# Not supported natively via API at this time
|
83
|
-
[ ]
|
84
|
-
end
|
85
|
-
|
86
|
-
def bcc=(list)
|
87
|
-
# Not supported natively via API at this time
|
88
|
-
end
|
89
|
-
|
90
|
-
def subject
|
91
|
-
self.arguments_to_send.dig('arguments', 'headers', 'subject')
|
92
|
-
end
|
93
|
-
|
94
|
-
def subject=(subject)
|
95
|
-
_headers = self.arguments['headers'] ||= { }
|
96
|
-
|
97
|
-
_headers['subject'] = subject.to_s
|
98
|
-
end
|
99
|
-
|
100
|
-
def body
|
101
|
-
out = self.arguments_to_send.dig('arguments', 'content')
|
102
|
-
out.is_a?(Hash) ? out.values.join("\n\n") : out.to_s
|
18
|
+
else
|
19
|
+
require File.expand_path('mailer/mailer_4', File.dirname(__FILE__))
|
103
20
|
end
|
104
21
|
end
|