postageapp 1.3.1 → 1.4.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.
Files changed (72) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +6 -0
  3. data/.travis.yml +9 -40
  4. data/LICENSE.md +1 -1
  5. data/README.md +117 -13
  6. data/Rakefile +15 -4
  7. data/VERSION +1 -0
  8. data/app/ingresses/action_mailbox/ingresses/postage_app.rb +2 -0
  9. data/app/ingresses/action_mailbox/ingresses/postage_app/inbound_emails_controller.rb +50 -0
  10. data/config/routes.rb +6 -0
  11. data/exe/postageapp +37 -0
  12. data/lib/generators/postageapp/postageapp_generator.rb +9 -6
  13. data/lib/postageapp.rb +53 -35
  14. data/lib/postageapp/cli.rb +14 -0
  15. data/lib/postageapp/cli/command.rb +110 -0
  16. data/lib/postageapp/cli/command/config.rb +74 -0
  17. data/lib/postageapp/cli/command/create_mailbox.rb +21 -0
  18. data/lib/postageapp/cli/command/env.rb +58 -0
  19. data/lib/postageapp/cli/command/get_project_info.rb +3 -0
  20. data/lib/postageapp/configuration.rb +237 -74
  21. data/lib/postageapp/engine.rb +9 -0
  22. data/lib/postageapp/env.rb +9 -0
  23. data/lib/postageapp/mailer.rb +1 -11
  24. data/lib/postageapp/mailer/mailer_4.rb +30 -14
  25. data/lib/postageapp/rails/railtie.rb +1 -3
  26. data/lib/postageapp/request.rb +6 -1
  27. data/log/.gitignore +1 -0
  28. data/postageapp.gemspec +8 -10
  29. data/script/with +2 -2
  30. data/test/gemfiles/Gemfile.rails-2.3.x +1 -1
  31. data/test/gemfiles/Gemfile.rails-3.0.x +1 -1
  32. data/test/gemfiles/Gemfile.rails-3.1.x +1 -1
  33. data/test/gemfiles/Gemfile.rails-3.2.x +1 -1
  34. data/test/gemfiles/Gemfile.rails-4.0.x +1 -1
  35. data/test/gemfiles/Gemfile.rails-4.1.x +1 -1
  36. data/test/gemfiles/Gemfile.rails-4.2.x +1 -2
  37. data/test/gemfiles/Gemfile.rails-5.0.x +2 -3
  38. data/test/gemfiles/Gemfile.rails-5.2.x +12 -0
  39. data/test/gemfiles/Gemfile.rails-6.0.x +12 -0
  40. data/test/gemfiles/Gemfile.rails-6.1.x +12 -0
  41. data/test/gemfiles/Gemfile.ruby +2 -3
  42. data/test/helper.rb +3 -3
  43. data/test/log/.gitignore +1 -0
  44. data/test/mailer/action_mailer_3/notifier.rb +1 -1
  45. data/test/tmp/.gitignore +1 -0
  46. data/test/travis_test.rb +58 -40
  47. data/test/{configuration_test.rb → unit/configuration_test.rb} +5 -3
  48. data/test/{failed_request_test.rb → unit/failed_request_test.rb} +6 -6
  49. data/test/{live_test.rb → unit/live_test.rb} +1 -36
  50. data/test/{mail_delivery_method_test.rb → unit/mail_delivery_method_test.rb} +1 -1
  51. data/test/{mailer_4_test.rb → unit/mailer_4_test.rb} +2 -2
  52. data/test/{mailer_helper_methods_test.rb → unit/mailer_helper_methods_test.rb} +4 -4
  53. data/test/{postageapp_test.rb → unit/postageapp_test.rb} +7 -1
  54. data/test/{rails_initialization_test.rb → unit/rails_initialization_test.rb} +2 -2
  55. data/test/{request_test.rb → unit/request_test.rb} +15 -15
  56. data/test/{response_test.rb → unit/response_test.rb} +4 -4
  57. data/test/unit/tmp/.gitignore +1 -0
  58. data/tmp/.gitignore +1 -0
  59. metadata +40 -46
  60. data/lib/postageapp/mailer/mailer_2.rb +0 -140
  61. data/lib/postageapp/mailer/mailer_3.rb +0 -190
  62. data/lib/postageapp/version.rb +0 -3
  63. data/test/mailer/action_mailer_2/notifier.rb +0 -77
  64. data/test/mailer/action_mailer_2/notifier/with_body_and_attachment.erb +0 -1
  65. data/test/mailer/action_mailer_2/notifier/with_custom_postage_variables.text.html.erb +0 -1
  66. data/test/mailer/action_mailer_2/notifier/with_custom_postage_variables.text.plain.erb +0 -1
  67. data/test/mailer/action_mailer_2/notifier/with_html_and_text_views.text.html.erb +0 -1
  68. data/test/mailer/action_mailer_2/notifier/with_html_and_text_views.text.plain.erb +0 -1
  69. data/test/mailer/action_mailer_2/notifier/with_simple_view.erb +0 -1
  70. data/test/mailer/action_mailer_2/notifier/with_text_only_view.text.plain.erb +0 -1
  71. data/test/mailer_2_test.rb +0 -95
  72. data/test/mailer_3_test.rb +0 -118
@@ -0,0 +1,9 @@
1
+ module PostageApp
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace PostageApp
4
+
5
+ initializer 'postageapp' do |app|
6
+ app.config.action_mailbox.ingress = :postage_app
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module PostageApp::Env
2
+ def self.rails?
3
+ defined?(Rails)
4
+ end
5
+
6
+ def self.rails_with_encrypted_credentials?
7
+ defined?(Rails) and Rails.respond_to?(:application) and Rails.application.respond_to?(:credentials)
8
+ end
9
+ end
@@ -8,15 +8,5 @@ rescue LoadError
8
8
  end
9
9
 
10
10
  if (defined?(ActionMailer))
11
- # Loading PostageApp::Mailer class depending on what action_mailer is
12
- # currently installed on the system. Assuming we're dealing only with
13
- # ones that come with Rails 2 and 3
14
- case (ActionMailer::VERSION::MAJOR)
15
- when 3
16
- require File.expand_path('mailer/mailer_3', File.dirname(__FILE__))
17
- when 2
18
- require File.expand_path('mailer/mailer_2', File.dirname(__FILE__))
19
- else
20
- require File.expand_path('mailer/mailer_4', File.dirname(__FILE__))
21
- end
11
+ require_relative './mailer/mailer_4'
22
12
  end
@@ -24,7 +24,7 @@
24
24
  # Sending email
25
25
  #
26
26
  # # Create a PostageApp::Request object
27
- # request = Notifier.signup_notification(user)
27
+ # request = Notifier.signup_notification(user)
28
28
  # # Deliver the message and return a PostageApp::Response
29
29
  # response = request.deliver_now
30
30
 
@@ -156,7 +156,7 @@ class PostageApp::Mailer < ActionMailer::Base
156
156
  :template_name,
157
157
  :template_path
158
158
  )
159
-
159
+
160
160
  m.headers.merge!(assignable)
161
161
 
162
162
  # Render the templates and blocks
@@ -166,13 +166,29 @@ class PostageApp::Mailer < ActionMailer::Base
166
166
  m
167
167
  end
168
168
 
169
- protected
170
- def each_template(paths, name, &block) #:nodoc:
171
- (lookup_context.find_all(name, paths) || [ ]).uniq do |t|
172
- t.formats
173
- end.each(&block)
169
+ def find_first_mime_type(mt)
170
+ part = arguments['content'].detect{ |mime_type, body| mime_type == mt }
171
+
172
+ OpenStruct.new(mime_type: part[0], decoded: part[1]) if part
173
+ end
174
+
175
+ def header
176
+ @_message.arguments['headers']
177
+ end
178
+
179
+ def reply_to
180
+ @_message.arguments.dig('headers', 'reply_to')
181
+ end
182
+
183
+ def cc
184
+ @_message.arguments.dig('headers', 'cc')
185
+ end
186
+
187
+ def multipart?
188
+ %w[ text/plain text/html ].all? { |mt| arguments['content'].key?(mt) }
174
189
  end
175
190
 
191
+ protected
176
192
  def create_parts_from_responses(m, responses) #:nodoc:
177
193
  content = m.arguments['content'] ||= { }
178
194
 
@@ -198,17 +214,17 @@ class PostageApp::Request
198
214
  def deliver_now
199
215
  inform_interceptors
200
216
 
201
- if (perform_deliveries)
202
- if (@delivery_method == Mail::TestMailer)
203
- @delivery_method.deliveries << self
204
- else
205
- self.send
206
- end
217
+ return unless (perform_deliveries)
218
+
219
+ if (@delivery_method == Mail::TestMailer)
220
+ @delivery_method.deliveries << self
221
+ else
222
+ self.send
207
223
  end
208
224
  end
209
225
  alias_method :deliver, :deliver_now
210
226
 
211
- # Not 100% on this, but I need to assign this so I can properly handle deliver method
227
+ # Allows overriding the delivery method setting
212
228
  def delivery_method(method = nil, settings = nil)
213
229
  @delivery_method = method
214
230
  end
@@ -1,7 +1,5 @@
1
- require 'postageapp'
2
-
3
1
  if (defined?(ActionMailer))
4
- require 'postageapp/mailer'
2
+ require_relative '../mailer'
5
3
 
6
4
  # Register as a delivery method with ActionMailer
7
5
  ActionMailer::Base.add_delivery_method(
@@ -1,7 +1,7 @@
1
1
  class PostageApp::Request
2
2
  # == Constants ============================================================
3
3
 
4
- API_VERSION = '1.0'
4
+ API_VERSION = '1.1'
5
5
 
6
6
  HEADERS_DEFAULT = {
7
7
  'Content-type' => 'application/json',
@@ -54,6 +54,11 @@ class PostageApp::Request
54
54
  http = PostageApp.configuration.http
55
55
 
56
56
  PostageApp.logger.info(self)
57
+
58
+ if (ENV['DEBUG'])
59
+ puts "// #{url}"
60
+ puts JSON.pretty_generate(self.arguments_to_send)
61
+ end
57
62
 
58
63
  http_response =
59
64
  begin
data/log/.gitignore ADDED
@@ -0,0 +1 @@
1
+ *
data/postageapp.gemspec CHANGED
@@ -1,20 +1,19 @@
1
1
  # encoding: utf-8
2
2
 
3
- $LOAD_PATH.unshift(File.expand_path('../lib', __FILE__))
4
-
5
- require 'postageapp/version'
3
+ $LOAD_PATH.unshift(File.expand_path('./lib', __dir__))
6
4
 
7
5
  Gem::Specification.new do |s|
8
6
  s.name = 'postageapp'
9
- s.version = PostageApp::VERSION
7
+ s.version = File.read(File.expand_path('VERSION', __dir__)).gsub(/\s/, '')
10
8
  s.authors = [
11
9
  'Scott Tadman',
12
10
  'Oleg Khabarov',
13
- 'The Working Group Inc.'
11
+ 'PostageApp Ltd.'
14
12
  ]
15
13
  s.email = [
16
14
  'tadman@postageapp.com',
17
- 'oleg@khabarov.ca'
15
+ 'oleg@khabarov.ca',
16
+ 'info@postageapp.com'
18
17
  ]
19
18
 
20
19
  s.homepage = 'http://github.com/postageapp/postageapp-ruby'
@@ -22,13 +21,12 @@ Gem::Specification.new do |s|
22
21
  s.summary = 'Client library for PostageApp Email API'
23
22
  s.description = 'PostageApp Library for Ruby and Ruby on Rails applications'
24
23
  s.license = 'MIT'
25
-
24
+
26
25
  s.files = `git ls-files`.split("\n")
27
26
  s.platform = Gem::Platform::RUBY
28
27
  s.require_paths = [ 'lib' ]
29
28
 
30
- s.required_ruby_version = '>= 1.9.3'
31
-
32
- s.add_dependency 'json', '>= 1.8'
29
+ s.required_ruby_version = '>= 2.5.0'
30
+
33
31
  s.add_dependency 'mail', '~> 2.4'
34
32
  end
data/script/with CHANGED
@@ -20,8 +20,8 @@
20
20
 
21
21
  # == Constants ==============================================================
22
22
 
23
- GEMFILE_DIR = File.expand_path('../test/gemfiles', File.dirname(__FILE__))
24
- GEMFILE_ROOT = File.expand_path('../Gemfile', File.dirname(__FILE__))
23
+ GEMFILE_DIR = File.expand_path('../test/gemfiles', __dir__)
24
+ GEMFILE_ROOT = File.expand_path('../Gemfile', __dir__)
25
25
 
26
26
  # == Support Methods ========================================================
27
27
 
@@ -1,4 +1,4 @@
1
- source 'http://rubygems.org'
1
+ source 'https://rubygems.org'
2
2
 
3
3
  # rubygems 1.8.30
4
4
 
@@ -1,4 +1,4 @@
1
- source 'http://rubygems.org'
1
+ source 'https://rubygems.org'
2
2
 
3
3
  # rubygems 1.8.30
4
4
 
@@ -1,4 +1,4 @@
1
- source 'http://rubygems.org'
1
+ source 'https://rubygems.org'
2
2
 
3
3
  gem 'rails', '~> 3.1.0'
4
4
  gem 'json'
@@ -1,4 +1,4 @@
1
- source 'http://rubygems.org'
1
+ source 'https://rubygems.org'
2
2
 
3
3
  gem 'rails', '~> 3.2.0'
4
4
 
@@ -1,4 +1,4 @@
1
- source 'http://rubygems.org'
1
+ source 'https://rubygems.org'
2
2
 
3
3
  gem 'rails', '~> 4.0.0'
4
4
 
@@ -1,4 +1,4 @@
1
- source 'http://rubygems.org'
1
+ source 'https://rubygems.org'
2
2
 
3
3
  gem 'rails', '~> 4.1.0'
4
4
 
@@ -1,8 +1,7 @@
1
- source 'http://rubygems.org'
1
+ source 'https://rubygems.org'
2
2
 
3
3
  gem 'rails', '~> 4.2.0'
4
4
 
5
- gem 'json'
6
5
  gem 'mail'
7
6
 
8
7
  group :test do
@@ -1,8 +1,7 @@
1
- source 'http://rubygems.org'
1
+ source 'https://rubygems.org'
2
2
 
3
- gem 'rails', '~> 5.0'
3
+ gem 'rails', '~> 5.0.7.2'
4
4
 
5
- gem 'json'
6
5
  gem 'mail'
7
6
 
8
7
  group :test do
@@ -0,0 +1,12 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'rails', '~> 5.2'
4
+
5
+ gem 'mail'
6
+
7
+ group :test do
8
+ gem 'rake'
9
+ gem 'minitest'
10
+ gem 'minitest-reporters'
11
+ gem 'mocha'
12
+ end
@@ -0,0 +1,12 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'rails', '~> 6.0.3.6'
4
+
5
+ gem 'mail'
6
+
7
+ group :test do
8
+ gem 'rake'
9
+ gem 'minitest'
10
+ gem 'minitest-reporters'
11
+ gem 'mocha'
12
+ end
@@ -0,0 +1,12 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'rails', '~> 6.1'
4
+
5
+ gem 'mail'
6
+
7
+ group :test do
8
+ gem 'rake'
9
+ gem 'minitest'
10
+ gem 'minitest-reporters'
11
+ gem 'mocha'
12
+ end
@@ -1,8 +1,7 @@
1
- source 'http://rubygems.org'
1
+ source 'https://rubygems.org'
2
2
 
3
- gem 'json', '~> 1.8.3'
4
3
  gem 'mail'
5
- gem 'mime-types', '2.99.1' # Locked for 1.9 compatibility
4
+ gem 'mime-types'
6
5
 
7
6
  group :test do
8
7
  gem 'rake'
data/test/helper.rb CHANGED
@@ -10,8 +10,8 @@ Minitest::Reporters.use!(Minitest::Reporters::SpecReporter.new)
10
10
 
11
11
  require 'fileutils'
12
12
 
13
- $LOAD_PATH.unshift(File.dirname(__FILE__))
14
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
13
+ $LOAD_PATH.unshift(__dir__)
14
+ $LOAD_PATH.unshift(File.join(__dir__, '..', 'lib'))
15
15
 
16
16
  ENV['POSTAGEAPP_API_KEY'] ||= '__TEST_API_KEY__'
17
17
 
@@ -47,7 +47,7 @@ class MiniTest::Test
47
47
  def setup
48
48
  # Resetting to default configuration
49
49
 
50
- PostageApp.configure(:reset) do |config|
50
+ PostageApp.configure(reset: true) do |config|
51
51
  config.requests_to_resend = %w( send_message )
52
52
  config.project_root = File.expand_path('../', __FILE__)
53
53
  config.logger = nil
@@ -0,0 +1 @@
1
+ *
@@ -1,7 +1,7 @@
1
1
  # Test mailer for ActionMailer 3.x+
2
2
 
3
3
  class Notifier < PostageApp::Mailer
4
- self.append_view_path(File.dirname(__FILE__))
4
+ self.append_view_path(__dir__)
5
5
 
6
6
  def blank
7
7
  # ... nothing to see here
@@ -0,0 +1 @@
1
+ *
data/test/travis_test.rb CHANGED
@@ -1,15 +1,18 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require 'yaml'
4
+ require 'open3'
5
+ require 'shellwords'
4
6
 
5
- require File.expand_path('with_environment', File.dirname(__FILE__))
7
+ require_relative './with_environment'
6
8
 
7
9
  class TravisTest
8
10
  extend WithEnvironment
9
11
 
10
12
  ENV_VARIABLE = {
11
- :rvm => "RBENV_VERSION",
12
- :gemfile => "BUNDLE_GEMFILE"
13
+ rvm: 'RBENV_VERSION',
14
+ version: 'RBENV_VERSION',
15
+ gemfile: 'BUNDLE_GEMFILE'
13
16
  }
14
17
 
15
18
  def self.bash_env(env)
@@ -20,30 +23,44 @@ class TravisTest
20
23
  end.compact.join(' ')
21
24
  end
22
25
 
23
- def self.env_expanded(env)
24
- Hash[
25
- env.collect do |key, value|
26
- [ ENV_VARIABLE[key], value ]
27
- end
28
- ]
26
+ def self.environment(env)
27
+ env.map do |key, value|
28
+ [ ENV_VARIABLE[key], value ]
29
+ end.to_h
29
30
  end
30
31
 
31
- def self.shell_command!(args, env)
32
- commands = args.collect do |s|
32
+ def self.shell!(commands, env)
33
+ commands = commands.collect do |s|
33
34
  s % env
34
35
  end
35
36
 
36
- env_expanded(env).each do |key, value|
37
- puts 'export %s=%s' % [ key, value ]
38
- end
39
- puts(commands.join(' && '))
40
-
41
- with_environment(env_expanded(env)) do
42
- result = system(commands.join(' && '))
37
+ shell_cmds = [
38
+ 'eval "$(rbenv init -)"',
39
+ 'set -e',
40
+ *commands
41
+ ].join('; ')
42
+
43
+ # p environment(env)
44
+ # puts shell_cmds
45
+
46
+ Open3.popen3(
47
+ environment(env),
48
+ shell_cmds
49
+ ) do |_sin, sout, serr, proc|
50
+ status = proc.value.exitstatus
43
51
 
44
- yield(result) if (block_given?)
52
+ yield(status) if (block_given?)
45
53
 
46
- result
54
+ status.tap do |status|
55
+ if (status != 0)
56
+ $stderr.puts 'Error code: %d' % status
57
+ end
58
+
59
+ if (status != 0 or ENV['VERBOSE'])
60
+ puts sout.read
61
+ puts serr.read
62
+ end
63
+ end
47
64
  end
48
65
  end
49
66
 
@@ -52,15 +69,15 @@ class TravisTest
52
69
 
53
70
  travis_test.matrix.collect do |entry|
54
71
  {
55
- :rvm => entry[:rvm]
72
+ rvm: entry[:rvm]
56
73
  }
57
74
  end.uniq.each do |entry|
58
- puts "Ruby %{rvm}" % entry
75
+ puts 'Ruby %{rvm}' % entry
59
76
 
60
- shell_command!(
77
+ shell!(
61
78
  [
62
- "rbenv install %{version}",
63
- "gem install bundler"
79
+ 'rbenv install %{version}',
80
+ 'gem install bundler'
64
81
  ],
65
82
  entry
66
83
  )
@@ -77,9 +94,9 @@ class TravisTest
77
94
 
78
95
  versions[entry[:rvm]] = true
79
96
 
80
- shell_command!(
97
+ shell!(
81
98
  [
82
- "ruby -e 'puts RUBY_VERSION'"
99
+ %q[ruby -e 'puts RUBY_VERSION']
83
100
  ],
84
101
  entry
85
102
  )
@@ -103,14 +120,15 @@ class TravisTest
103
120
  results = { }
104
121
 
105
122
  travis_test.matrix.each do |entry|
106
- puts "RBENV_VERSION=%{rvm} BUNDLE_GEMFILE=%{gemfile}" % entry
123
+ puts 'RBENV_VERSION=%{rvm} BUNDLE_GEMFILE=%{gemfile}' % entry
107
124
 
108
125
  gemfile_lock_remove!(entry[:gemfile])
109
126
 
110
- shell_command!(
127
+ shell!(
111
128
  [
112
- "bundle install --quiet",
113
- "rake test"
129
+ 'gem install bundler --no-doc',
130
+ 'bundle install --quiet',
131
+ 'bundle exec rake test'
114
132
  ],
115
133
  entry
116
134
  ) do |code|
@@ -125,13 +143,13 @@ class TravisTest
125
143
  puts '%-20s %-24s %-6s' % [
126
144
  entry[:rvm],
127
145
  File.basename(entry[:gemfile]).sub(/\AGemfile\./,''),
128
- code
146
+ code ? 'Pass' : 'Fail'
129
147
  ]
130
148
  end
131
149
  end
132
150
 
133
151
  def travis_config_path
134
- @travis_config_path ||= File.expand_path('../.travis.yml', File.dirname(__FILE__))
152
+ @travis_config_path ||= File.expand_path('../.travis.yml', __dir__)
135
153
  end
136
154
 
137
155
  def travis_config
@@ -143,24 +161,24 @@ class TravisTest
143
161
  end
144
162
 
145
163
  def ruby_versions
146
- travis_config['rvm']
164
+ travis_config['rvm'].sort
147
165
  end
148
166
 
149
167
  def matrix_exclusions
150
- travis_config['matrix']['exclude'].collect do |entry|
168
+ travis_config.dig('matrix', 'exclude')&.collect do |entry|
151
169
  {
152
- :rvm => entry['rvm'],
153
- :gemfile => entry['gemfile']
170
+ rvm: entry['rvm'],
171
+ gemfile: entry['gemfile']
154
172
  }
155
- end
173
+ end or [ ]
156
174
  end
157
175
 
158
176
  def matrix
159
177
  ruby_versions.flat_map do |version|
160
178
  gemfiles.collect do |gemfile|
161
179
  {
162
- :rvm => version,
163
- :gemfile => gemfile
180
+ rvm: version,
181
+ gemfile: gemfile
164
182
  }
165
183
  end
166
184
  end - matrix_exclusions