ar_mailer 1.4.0 → 1.5.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.
data.tar.gz.sig CHANGED
Binary file
@@ -0,0 +1,6 @@
1
+ require 'autotest/restart'
2
+
3
+ Autotest.add_hook :initialize do |at|
4
+ at.testlib = 'minitest/autorun'
5
+ end
6
+
@@ -1,3 +1,8 @@
1
+ === 1.5.0
2
+
3
+ * Added --pid-file option. See --help for details.
4
+ * Minor improvements to --help, argument error output
5
+
1
6
  === 1.4.0
2
7
 
3
8
  * 1.8.7 and 1.9 STARTTLS compatibility, now uses smtp_tls gem for STARTTLS on
@@ -1,3 +1,4 @@
1
+ .autotest
1
2
  History.txt
2
3
  LICENSE.txt
3
4
  Manifest.txt
@@ -54,7 +54,7 @@ class ActionMailer::ARSendmail
54
54
  ##
55
55
  # The version of ActionMailer::ARSendmail you are running.
56
56
 
57
- VERSION = '1.4.0'
57
+ VERSION = '1.5.0'
58
58
 
59
59
  ##
60
60
  # Maximum number of times authentication will be consecutively retried
@@ -96,6 +96,26 @@ class ActionMailer::ARSendmail
96
96
 
97
97
  attr_accessor :failed_auth_count
98
98
 
99
+ ##
100
+ # Checks and writes +pid_file+, aborting if it already exists or this
101
+ # process loses the pid-writing race.
102
+
103
+ def self.check_pid(pid_file)
104
+ if File.exist? pid_file then
105
+ abort "pid file exists at #{pid_file}, exiting"
106
+ else
107
+ open pid_file, 'w', 0644 do |io|
108
+ io.write $$
109
+ end
110
+
111
+ written_pid = File.read pid_file
112
+
113
+ if written_pid.to_i != $$ then
114
+ abort "pid #{written_pid} from #{pid_file} doesn't match $$ #{$$}, exiting"
115
+ end
116
+ end
117
+ end
118
+
99
119
  ##
100
120
  # Creates a new migration using +table_name+ and prints it on stdout.
101
121
 
@@ -193,13 +213,21 @@ end
193
213
  options[:TableName] = 'Email'
194
214
 
195
215
  op = OptionParser.new do |opts|
196
- opts.banner = "Usage: #{name} [options]"
197
- opts.separator ''
216
+ opts.program_name = name
217
+ opts.version = VERSION
198
218
 
199
- opts.separator "#{name} scans the email table for new messages and sends them to the"
200
- opts.separator "website's configured SMTP host."
201
- opts.separator ''
202
- opts.separator "#{name} must be run from a Rails application's root."
219
+ opts.banner = <<-BANNER
220
+ Usage: #{name} [options]
221
+
222
+ #{name} scans the email table for new messages and sends them to the
223
+ website's configured SMTP host.
224
+
225
+ #{name} must be run from a Rails application's root or have it specified
226
+ with --chdir.
227
+
228
+ If #{name} is started with --pid-file, it will fail to start if the PID
229
+ file already exists or the contents don't match it's PID.
230
+ BANNER
203
231
 
204
232
  opts.separator ''
205
233
  opts.separator 'Sendmail options:'
@@ -231,6 +259,20 @@ end
231
259
  options[:Once] = once
232
260
  end
233
261
 
262
+ opts.on("-p", "--pid-file [PATH]",
263
+ "File to store the pid in.",
264
+ "Defaults to /var/run/ar_sendmail.pid",
265
+ "when no path is given") do |pid_file|
266
+ pid_file ||= '/var/run/ar_sendmail/ar_sendmail.pid'
267
+
268
+ pid_dir = File.dirname pid_file
269
+ raise OptionParser::InvalidArgument,
270
+ "directory #{pid_dir} does not exist" unless
271
+ File.directory? pid_dir
272
+
273
+ options[:PidFile] = pid_file
274
+ end
275
+
234
276
  opts.on("-d", "--daemonize",
235
277
  "Run as a daemon process",
236
278
  "Default: #{options[:Daemon]}") do |daemon|
@@ -308,6 +350,7 @@ end
308
350
  rescue LoadError
309
351
  usage op, <<-EOF
310
352
  #{name} must be run from a Rails application's root to deliver email.
353
+
311
354
  #{Dir.pwd} does not appear to be a Rails application root.
312
355
  EOF
313
356
  end
@@ -338,7 +381,16 @@ end
338
381
  WEBrick::Daemon.start
339
382
  end
340
383
 
341
- new(options).run
384
+ sendmail = new options
385
+
386
+ check_pid options[:PidFile] if options.key? :PidFile
387
+
388
+ begin
389
+ sendmail.run
390
+ ensure
391
+ File.unlink options[:PidFile] if
392
+ options.key? :PidFile and $PID == File.read(options[:PidFile]).to_i
393
+ end
342
394
 
343
395
  rescue SystemExit
344
396
  raise
@@ -354,12 +406,13 @@ end
354
406
  # Prints a usage message to $stderr using +opts+ and exits
355
407
 
356
408
  def self.usage(opts, message = nil)
409
+ $stderr.puts opts
410
+
357
411
  if message then
358
- $stderr.puts message
359
412
  $stderr.puts
413
+ $stderr.puts message
360
414
  end
361
415
 
362
- $stderr.puts opts
363
416
  exit 1
364
417
  end
365
418
 
@@ -1,3 +1,4 @@
1
+ require 'tmpdir'
1
2
  require 'action_mailer'
2
3
  require 'action_mailer/ar_sendmail'
3
4
  require 'rubygems'
@@ -23,10 +24,64 @@ class TestARSendmail < MiniTest::Unit::TestCase
23
24
 
24
25
  @include_c_e = ! $".grep(/config\/environment.rb/).empty?
25
26
  $" << 'config/environment.rb' unless @include_c_e
27
+
28
+ @pid_file = File.join Dir.tmpdir, "test_#{$$}_ar_sendmail.pid"
26
29
  end
27
30
 
28
31
  def teardown
29
32
  $".delete 'config/environment.rb' unless @include_c_e
33
+
34
+ File.unlink @pid_file if File.exist? @pid_file
35
+ end
36
+
37
+ def test_class_check_pid
38
+ ActionMailer::ARSendmail.check_pid @pid_file
39
+
40
+ assert File.exist?(@pid_file)
41
+
42
+ assert_equal $$, File.read(@pid_file).to_i
43
+ rescue SystemExit
44
+ flunk 'pid file teardown failed'
45
+ end
46
+
47
+ def test_class_check_pid_exists
48
+ ActionMailer::ARSendmail.check_pid @pid_file
49
+
50
+ out, err = capture_io do
51
+ assert_raises SystemExit do
52
+ ActionMailer::ARSendmail.check_pid @pid_file
53
+ end
54
+ end
55
+
56
+ assert_equal '', out
57
+ assert_equal "pid file exists at #{@pid_file}, exiting\n", err
58
+ end
59
+
60
+ def test_class_check_pid_no_match
61
+ def (ActionMailer::ARSendmail).open(path, mode, perm)
62
+ fake_io = Object.new
63
+ def fake_io.write(data) end
64
+
65
+ File.open path, mode, perm do |io|
66
+ yield fake_io
67
+
68
+ io.write 0
69
+ end
70
+ end
71
+
72
+ out, err = capture_io do
73
+ assert_raises SystemExit do
74
+ ActionMailer::ARSendmail.check_pid @pid_file
75
+ end
76
+ end
77
+
78
+ assert_equal '', out
79
+ assert_equal "pid 0 from #{@pid_file} doesn't match $$ #{$$}, exiting\n",
80
+ err
81
+ ensure
82
+ class << ActionMailer::ARSendmail
83
+ send :remove_method, :open
84
+ end
30
85
  end
31
86
 
32
87
  def test_class_create_migration
@@ -300,6 +355,37 @@ Last send attempt: Thu Aug 10 11:40:05 2006
300
355
  assert_equal true, options[:Once]
301
356
  end
302
357
 
358
+ def test_class_parse_args_pid_file
359
+ argv = %w[]
360
+
361
+ options = ActionMailer::ARSendmail.process_args argv
362
+
363
+ refute options.key?(:PidFile), 'no --pid-file option'
364
+
365
+ argv = %w[--pid-file]
366
+
367
+ options = ActionMailer::ARSendmail.process_args argv
368
+
369
+ assert_equal '/var/run/ar_sendmail/ar_sendmail.pid', options[:PidFile]
370
+
371
+ argv = %w[--pid-file=/tmp/ar_sendmail.pid]
372
+
373
+ options = ActionMailer::ARSendmail.process_args argv
374
+
375
+ assert_equal '/tmp/ar_sendmail.pid', options[:PidFile]
376
+ end
377
+
378
+ def test_class_parse_args_pid_file_nonexistent
379
+ argv = %w[--pid-file /nonexistent/ar_sendmail.pid]
380
+
381
+ e = assert_raises OptionParser::InvalidArgument do
382
+ ActionMailer::ARSendmail.process_args argv
383
+ end
384
+
385
+ assert_equal 'invalid argument: --pid-file directory /nonexistent does not exist',
386
+ e.message
387
+ end
388
+
303
389
  def test_class_parse_args_table_name
304
390
  argv = %w[-t Email]
305
391
 
@@ -331,7 +417,7 @@ Last send attempt: Thu Aug 10 11:40:05 2006
331
417
  end
332
418
 
333
419
  assert_equal '', out
334
- assert_equal "hi\n\nopts\n", err
420
+ assert_equal "opts\n\nhi\n", err
335
421
  end
336
422
 
337
423
  def test_cleanup
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ar_mailer
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eric Hodel
@@ -30,7 +30,7 @@ cert_chain:
30
30
  x52qPcexcYZR7w==
31
31
  -----END CERTIFICATE-----
32
32
 
33
- date: 2009-06-24 00:00:00 -07:00
33
+ date: 2009-10-15 00:00:00 -07:00
34
34
  default_executable:
35
35
  dependencies:
36
36
  - !ruby/object:Gem::Dependency
@@ -51,7 +51,7 @@ dependencies:
51
51
  requirements:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: 2.3.0
54
+ version: 2.3.3
55
55
  version:
56
56
  description: |-
57
57
  ar_mailer is a two-phase delivery agent for ActionMailer. Even delivering
@@ -70,6 +70,7 @@ extra_rdoc_files:
70
70
  - Manifest.txt
71
71
  - README.txt
72
72
  files:
73
+ - .autotest
73
74
  - History.txt
74
75
  - LICENSE.txt
75
76
  - Manifest.txt
@@ -108,7 +109,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
108
109
  requirements: []
109
110
 
110
111
  rubyforge_project: seattlerb
111
- rubygems_version: 1.3.4
112
+ rubygems_version: 1.3.5
112
113
  signing_key:
113
114
  specification_version: 3
114
115
  summary: ar_mailer is a two-phase delivery agent for ActionMailer
metadata.gz.sig CHANGED
Binary file