postageapp 1.3.1 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
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