rmail 0.17 → 1.0.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/NEWS +10 -0
- data/Rakefile +186 -0
- data/TODO +3 -0
- data/lib/rmail/header.rb +3 -9
- data/{tests → test}/addrgrammar.txt +0 -0
- data/{tests → test}/data/mbox.odd +0 -0
- data/{tests → test}/data/mbox.simple +0 -0
- data/{tests → test}/data/multipart/data.1 +0 -0
- data/{tests → test}/data/multipart/data.10 +0 -0
- data/{tests → test}/data/multipart/data.11 +0 -0
- data/{tests → test}/data/multipart/data.12 +0 -0
- data/{tests → test}/data/multipart/data.13 +0 -0
- data/{tests → test}/data/multipart/data.14 +0 -0
- data/{tests → test}/data/multipart/data.15 +0 -0
- data/{tests → test}/data/multipart/data.16 +0 -0
- data/{tests → test}/data/multipart/data.17 +0 -0
- data/{tests → test}/data/multipart/data.2 +0 -0
- data/{tests → test}/data/multipart/data.3 +0 -0
- data/{tests → test}/data/multipart/data.4 +0 -0
- data/{tests → test}/data/multipart/data.5 +0 -0
- data/{tests → test}/data/multipart/data.6 +0 -0
- data/{tests → test}/data/multipart/data.7 +0 -0
- data/{tests → test}/data/multipart/data.8 +0 -0
- data/{tests → test}/data/multipart/data.9 +0 -0
- data/{tests → test}/data/parser.badmime1 +0 -0
- data/{tests → test}/data/parser.badmime2 +0 -0
- data/{tests → test}/data/parser.nested-multipart +0 -0
- data/{tests → test}/data/parser.nested-simple +0 -0
- data/{tests → test}/data/parser.nested-simple2 +0 -0
- data/{tests → test}/data/parser.nested-simple3 +0 -0
- data/{tests → test}/data/parser.rfc822 +0 -0
- data/{tests → test}/data/parser.simple-mime +0 -0
- data/{tests → test}/data/parser/multipart.1 +0 -0
- data/{tests → test}/data/parser/multipart.10 +0 -0
- data/{tests → test}/data/parser/multipart.11 +0 -0
- data/{tests → test}/data/parser/multipart.12 +0 -0
- data/{tests → test}/data/parser/multipart.13 +0 -0
- data/{tests → test}/data/parser/multipart.14 +0 -0
- data/{tests → test}/data/parser/multipart.15 +0 -0
- data/{tests → test}/data/parser/multipart.16 +0 -0
- data/{tests → test}/data/parser/multipart.2 +0 -0
- data/{tests → test}/data/parser/multipart.3 +0 -0
- data/{tests → test}/data/parser/multipart.4 +0 -0
- data/{tests → test}/data/parser/multipart.5 +0 -0
- data/{tests → test}/data/parser/multipart.6 +0 -0
- data/{tests → test}/data/parser/multipart.7 +0 -0
- data/{tests → test}/data/parser/multipart.8 +0 -0
- data/{tests → test}/data/parser/multipart.9 +0 -0
- data/{tests → test}/data/transparency/absolute.1 +0 -0
- data/{tests → test}/data/transparency/absolute.2 +0 -0
- data/{tests → test}/data/transparency/absolute.3 +0 -0
- data/{tests → test}/data/transparency/absolute.4 +0 -0
- data/{tests → test}/data/transparency/absolute.5 +0 -0
- data/{tests → test}/data/transparency/absolute.6 +0 -0
- data/{tests → test}/data/transparency/message.1 +0 -0
- data/{tests → test}/data/transparency/message.2 +0 -0
- data/{tests → test}/data/transparency/message.3 +0 -0
- data/{tests → test}/data/transparency/message.4 +0 -0
- data/{tests → test}/data/transparency/message.5 +0 -0
- data/{tests → test}/data/transparency/message.6 +0 -0
- data/{tests → test}/runtests.rb +1 -1
- data/{tests → test}/testaddress.rb +9 -9
- data/{tests → test}/testbase.rb +9 -12
- data/{tests → test}/testheader.rb +70 -52
- data/{tests → test}/testmailbox.rb +1 -1
- data/{tests → test}/testmboxreader.rb +1 -1
- data/{tests → test}/testmessage.rb +3 -3
- data/{tests → test}/testparser.rb +3 -3
- data/{tests → test}/testparsermultipart.rb +1 -1
- data/{tests → test}/testpushbackreader.rb +2 -2
- data/{tests → test}/testserialize.rb +1 -1
- data/{tests → test}/testtestbase.rb +8 -4
- data/{tests → test}/testtranspparency.rb +3 -3
- data/version +1 -0
- metadata +153 -135
- data/rmail.gemspec +0 -17
@@ -1,6 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
#--
|
3
|
-
# Copyright (C) 2001, 2002, 2003, 2004 Matt Armstrong. All rights reserved.
|
3
|
+
# Copyright (C) 2001, 2002, 2003, 2004, 2007 Matt Armstrong. All rights reserved.
|
4
4
|
#
|
5
5
|
# Redistribution and use in source and binary forms, with or without
|
6
6
|
# modification, are permitted provided that the following conditions are met:
|
@@ -25,7 +25,7 @@
|
|
25
25
|
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
26
26
|
#
|
27
27
|
|
28
|
-
require '
|
28
|
+
require 'test/testbase'
|
29
29
|
require 'rmail/header'
|
30
30
|
|
31
31
|
class TestRMailHeader < TestBase
|
@@ -84,7 +84,7 @@ class TestRMailHeader < TestBase
|
|
84
84
|
# Test that passing in symbols will not get converted into strings
|
85
85
|
# strings
|
86
86
|
h = RMail::Header.new
|
87
|
-
|
87
|
+
assert_raise(NoMethodError) {
|
88
88
|
h[:Kelly] = :the_value
|
89
89
|
}
|
90
90
|
|
@@ -140,6 +140,13 @@ class TestRMailHeader < TestBase
|
|
140
140
|
assert(! (h1 == Array.new))
|
141
141
|
end
|
142
142
|
|
143
|
+
def test_address_list_fetch
|
144
|
+
h = RMail::Header.new
|
145
|
+
assert_equal([], h.address_list_fetch("From"))
|
146
|
+
h.add("From", "bob@example.com")
|
147
|
+
assert_equal(["bob@example.com"], h.address_list_fetch("From"))
|
148
|
+
end
|
149
|
+
|
143
150
|
def test_add
|
144
151
|
#
|
145
152
|
# Test that the object stores the exact objects we pass it in (at
|
@@ -173,7 +180,7 @@ class TestRMailHeader < TestBase
|
|
173
180
|
|
174
181
|
# Test that passing in symbol values raises an exception
|
175
182
|
h = RMail::Header.new
|
176
|
-
|
183
|
+
assert_raise(NoMethodError) {
|
177
184
|
assert_same(h, h.add("bob", :the_value))
|
178
185
|
}
|
179
186
|
|
@@ -277,7 +284,7 @@ class TestRMailHeader < TestBase
|
|
277
284
|
# Make sure singleton methods are not carried over through a dup
|
278
285
|
def h1.my_singleton_method
|
279
286
|
end
|
280
|
-
assert_respond_to(:my_singleton_method
|
287
|
+
assert_respond_to(h1, :my_singleton_method)
|
281
288
|
h2 = h1.dup
|
282
289
|
assert(! h2.respond_to?(:my_singleton_method))
|
283
290
|
end
|
@@ -315,10 +322,10 @@ class TestRMailHeader < TestBase
|
|
315
322
|
h1 = RMail::Header.new
|
316
323
|
def h1.my_singleton_method
|
317
324
|
end
|
318
|
-
assert_respond_to(:my_singleton_method
|
325
|
+
assert_respond_to(h1, :my_singleton_method)
|
319
326
|
h2 = h1.clone
|
320
327
|
assert(!h1.equal?(h2))
|
321
|
-
assert_respond_to(:my_singleton_method
|
328
|
+
assert_respond_to(h2, :my_singleton_method)
|
322
329
|
end
|
323
330
|
|
324
331
|
def test_replace
|
@@ -337,7 +344,7 @@ class TestRMailHeader < TestBase
|
|
337
344
|
assert_same(h1['To'], h2['To'])
|
338
345
|
assert_same(h1.mbox_from, h2.mbox_from)
|
339
346
|
|
340
|
-
e =
|
347
|
+
e = assert_raise(TypeError) {
|
341
348
|
h2.replace("hi mom")
|
342
349
|
}
|
343
350
|
assert_equal('String is not of type RMail::Header', e.message)
|
@@ -357,15 +364,15 @@ class TestRMailHeader < TestBase
|
|
357
364
|
def test_delete_at
|
358
365
|
h = RMail::Header.new
|
359
366
|
h['Foo'] = 'bar'
|
360
|
-
h['
|
367
|
+
h['Baz'] = 'bingo'
|
361
368
|
h['Foo'] = 'yo'
|
362
369
|
assert_same(h, h.delete_at(1))
|
363
|
-
|
370
|
+
assert_equal(2, h.length)
|
371
|
+
assert_nil(h['Baz'])
|
364
372
|
assert_equal('bar', h[0])
|
365
373
|
assert_equal('yo', h[1])
|
366
|
-
assert_equal(2, h.length)
|
367
374
|
|
368
|
-
|
375
|
+
assert_raise(TypeError) {
|
369
376
|
h.delete_at("1")
|
370
377
|
}
|
371
378
|
end
|
@@ -373,14 +380,14 @@ class TestRMailHeader < TestBase
|
|
373
380
|
def test_delete_if
|
374
381
|
h = RMail::Header.new
|
375
382
|
h['Foo'] = 'bar'
|
376
|
-
h['
|
383
|
+
h['Baz'] = 'bingo'
|
377
384
|
h['Foo'] = 'yo'
|
378
385
|
assert_same(h, h.delete_if { |n, v| v =~ /^b/ })
|
379
|
-
assert_nil(h['
|
386
|
+
assert_nil(h['Baz'])
|
380
387
|
assert_equal('yo', h['Foo'])
|
381
388
|
assert_equal(1, h.length)
|
382
389
|
|
383
|
-
|
390
|
+
assert_raise(LocalJumpError) {
|
384
391
|
h.delete_if
|
385
392
|
}
|
386
393
|
end
|
@@ -397,7 +404,7 @@ class TestRMailHeader < TestBase
|
|
397
404
|
i += 1
|
398
405
|
}
|
399
406
|
|
400
|
-
|
407
|
+
assert_raise(LocalJumpError) {
|
401
408
|
h.send(method)
|
402
409
|
}
|
403
410
|
end
|
@@ -421,7 +428,7 @@ class TestRMailHeader < TestBase
|
|
421
428
|
i += 1
|
422
429
|
}
|
423
430
|
|
424
|
-
|
431
|
+
assert_raise(LocalJumpError) {
|
425
432
|
h.send(method)
|
426
433
|
}
|
427
434
|
end
|
@@ -445,7 +452,7 @@ class TestRMailHeader < TestBase
|
|
445
452
|
i += 1
|
446
453
|
}
|
447
454
|
|
448
|
-
|
455
|
+
assert_raise(LocalJumpError) {
|
449
456
|
h.each_value
|
450
457
|
}
|
451
458
|
end
|
@@ -466,7 +473,7 @@ class TestRMailHeader < TestBase
|
|
466
473
|
assert_equal(1, h.fetch('notthere', 1))
|
467
474
|
assert_equal(2, h.fetch('notthere', 1) { 2 })
|
468
475
|
|
469
|
-
e =
|
476
|
+
e = assert_raise(ArgumentError) {
|
470
477
|
h.fetch(1,2,3)
|
471
478
|
}
|
472
479
|
assert_equal('wrong # of arguments(3 for 2)', e.message)
|
@@ -482,7 +489,7 @@ class TestRMailHeader < TestBase
|
|
482
489
|
assert_equal(1, h.fetch('notthere', 1))
|
483
490
|
assert_equal(2, h.fetch('notthere', 1) { 2 })
|
484
491
|
|
485
|
-
e =
|
492
|
+
e = assert_raise(ArgumentError) {
|
486
493
|
h.fetch_all(1,2,3)
|
487
494
|
}
|
488
495
|
assert_equal('wrong # of arguments(3 for 2)', e.message)
|
@@ -515,12 +522,18 @@ class TestRMailHeader < TestBase
|
|
515
522
|
field_helper(:key?)
|
516
523
|
end
|
517
524
|
|
525
|
+
def test_select_on_empty_header_returns_empty_array
|
526
|
+
h = RMail::Header.new
|
527
|
+
assert_equal([], h.select("From"))
|
528
|
+
end
|
529
|
+
|
518
530
|
def test_select
|
519
531
|
h = RMail::Header.new
|
520
532
|
h['To'] = 'matt@example.net'
|
521
533
|
h['From'] = 'bob@example.net'
|
522
534
|
h['Subject'] = 'test_select'
|
523
|
-
|
535
|
+
assert_equal([ [ 'To', 'matt@example.net' ] ],
|
536
|
+
h.select('To'))
|
524
537
|
assert_equal([ [ 'To', 'matt@example.net' ],
|
525
538
|
[ 'From', 'bob@example.net' ] ],
|
526
539
|
h.select('To', 'From'))
|
@@ -620,33 +633,38 @@ EOF
|
|
620
633
|
# Compare header contents against an expected result. 'result'
|
621
634
|
# should be an array of arrays, with the first element being the
|
622
635
|
# required key name and the second element being the whole line.
|
623
|
-
def compare_header(header,
|
624
|
-
|
636
|
+
def compare_header(header, expected)
|
637
|
+
testcase_desc = "TestCase header: #{header.inspect} " +
|
638
|
+
"expected result: #{expected.inspect}"
|
639
|
+
count = 0
|
625
640
|
header.each_with_index { |value, index|
|
626
|
-
|
627
|
-
|
628
|
-
|
629
|
-
|
630
|
-
|
641
|
+
count = count.succ
|
642
|
+
assert_operator(index, '<', expected.length,
|
643
|
+
"result has too few elements. #{testcase_desc}")
|
644
|
+
assert_operator(2, '<=', expected[index].length,
|
645
|
+
"Expected result item must have at last two elements. " +
|
646
|
+
testcase_desc)
|
647
|
+
assert_operator(3, '>=', expected[index].length,
|
631
648
|
"Expected result item must have no more than three " +
|
632
|
-
"elements.")
|
633
|
-
assert_equal(2, value.length)
|
649
|
+
"elements. " + testcase_desc)
|
650
|
+
assert_equal(2, value.length, testcase_desc)
|
634
651
|
|
635
|
-
expected_tag, expected_header =
|
652
|
+
expected_tag, expected_header = expected[index]
|
636
653
|
got_tag, got_header = value
|
637
654
|
|
638
|
-
assert_equal(header[index], got_header)
|
655
|
+
assert_equal(header[index], got_header, testcase_desc)
|
639
656
|
|
640
657
|
assert_equal(expected_tag, got_tag,
|
641
|
-
"field #{index} has incorrect name")
|
658
|
+
"field #{index} has incorrect name. " + testcase_desc)
|
642
659
|
assert_equal(expected_header, got_header,
|
643
660
|
"field #{index} has incorrect line, " +
|
644
661
|
"expected #{expected_header.inspect} got " +
|
645
|
-
"#{got_header.inspect}")
|
646
|
-
assert_equal(header[expected_tag], expected_header)
|
662
|
+
"#{got_header.inspect}. " + testcase_desc)
|
663
|
+
assert_equal(header[expected_tag], expected_header, testcase_desc)
|
647
664
|
}
|
648
|
-
assert_equal(
|
649
|
-
|
665
|
+
assert_equal(count, expected.length,
|
666
|
+
"result has too few elements " +
|
667
|
+
"(#{count} < #{expected.length}). " + testcase_desc)
|
650
668
|
end
|
651
669
|
|
652
670
|
def verify_match(header, name, value, expected_result)
|
@@ -668,24 +686,24 @@ EOF
|
|
668
686
|
h['Subject'] = 'yoda lives!'
|
669
687
|
|
670
688
|
# First verify argument type checking
|
671
|
-
e =
|
689
|
+
e = assert_raise(ArgumentError) {
|
672
690
|
h.match(12, "foo")
|
673
691
|
}
|
674
692
|
assert_match(/name not a Regexp or String/, e.message)
|
675
|
-
|
693
|
+
assert_nothing_raised {
|
676
694
|
h.match(/not_case_insensitive/, "foo")
|
677
695
|
}
|
678
|
-
e =
|
696
|
+
e = assert_raise(ArgumentError) {
|
679
697
|
h.match(/this is okay/i, 12)
|
680
698
|
}
|
681
699
|
assert_match(/value not a Regexp or String/, e.message)
|
682
|
-
|
700
|
+
assert_nothing_raised {
|
683
701
|
h.match(/this is okay/i, /this_not_multiline_or_insensitive/)
|
684
702
|
}
|
685
|
-
|
703
|
+
assert_nothing_raised {
|
686
704
|
h.match(/this is okay/i, /this_not_multiline/i)
|
687
705
|
}
|
688
|
-
|
706
|
+
assert_nothing_raised {
|
689
707
|
h.match(/this is okay/i, /this_not_inesnsitive/m)
|
690
708
|
}
|
691
709
|
|
@@ -716,24 +734,24 @@ EOF
|
|
716
734
|
h['Subject'] = "yoda\n lives! [bob]\\s"
|
717
735
|
|
718
736
|
# First verify argument type checking
|
719
|
-
e =
|
737
|
+
e = assert_raise(ArgumentError) {
|
720
738
|
h.match?(12, "foo")
|
721
739
|
}
|
722
740
|
assert_match(/name not a Regexp or String/, e.message)
|
723
|
-
|
741
|
+
assert_nothing_raised {
|
724
742
|
h.match?(/not_case_insensitive/, "foo")
|
725
743
|
}
|
726
|
-
e =
|
744
|
+
e = assert_raise(ArgumentError) {
|
727
745
|
h.match?(/this is okay/i, 12)
|
728
746
|
}
|
729
747
|
assert_match(/value not a Regexp or String/, e.message)
|
730
|
-
|
748
|
+
assert_nothing_raised {
|
731
749
|
h.match?(/this is okay/i, /this_not_multiline_or_insensitive/)
|
732
750
|
}
|
733
|
-
|
751
|
+
assert_nothing_raised {
|
734
752
|
h.match?(/this is okay/i, /this_not_multiline/i)
|
735
753
|
}
|
736
|
-
|
754
|
+
assert_nothing_raised {
|
737
755
|
h.match?(/this is okay/i, /this_not_inesnsitive/m)
|
738
756
|
}
|
739
757
|
|
@@ -913,7 +931,7 @@ EOF
|
|
913
931
|
end
|
914
932
|
}.to_s ]
|
915
933
|
strings.each {|string|
|
916
|
-
|
934
|
+
assert_nothing_raised("failed for string #{string.inspect}") {
|
917
935
|
h = RMail::Header.new
|
918
936
|
h['header'] = string
|
919
937
|
params = h.params('header')
|
@@ -999,7 +1017,7 @@ EOF
|
|
999
1017
|
h = RMail::Header.new
|
1000
1018
|
# This one is bogus and can't even be parsed.
|
1001
1019
|
h.add_raw("Date: 21/01/2002 09:29:33 Pacific Daylight Time")
|
1002
|
-
t =
|
1020
|
+
t = assert_nothing_raised {
|
1003
1021
|
h.date
|
1004
1022
|
}
|
1005
1023
|
assert_nil(t)
|
@@ -1010,7 +1028,7 @@ EOF
|
|
1010
1028
|
# This time is out of the range that can be represented by a
|
1011
1029
|
# Time object.
|
1012
1030
|
h.add_raw("Date: Sun, 14 Jun 2065 05:51:55 +0200")
|
1013
|
-
t =
|
1031
|
+
t = assert_nothing_raised {
|
1014
1032
|
h.date
|
1015
1033
|
}
|
1016
1034
|
assert_nil(t)
|
@@ -26,7 +26,7 @@
|
|
26
26
|
#
|
27
27
|
|
28
28
|
require 'rmail/message'
|
29
|
-
require '
|
29
|
+
require 'test/testbase'
|
30
30
|
|
31
31
|
class TestRMailMessage < TestBase
|
32
32
|
|
@@ -162,7 +162,7 @@ Second body line
|
|
162
162
|
qp_message.body = qp_data
|
163
163
|
message.add_part(qp_message)
|
164
164
|
|
165
|
-
e =
|
165
|
+
e = assert_raise(TypeError) {
|
166
166
|
message.decode
|
167
167
|
}
|
168
168
|
assert_equal('Can not decode a multipart message.', e.message)
|
@@ -180,7 +180,7 @@ Second body line
|
|
180
180
|
def test_part
|
181
181
|
message = RMail::Message.new
|
182
182
|
|
183
|
-
e =
|
183
|
+
e = assert_raise(TypeError) {
|
184
184
|
message.part(0)
|
185
185
|
}
|
186
186
|
assert_equal('Can not get part on a single part message.', e.message)
|
@@ -25,7 +25,7 @@
|
|
25
25
|
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
26
26
|
#
|
27
27
|
|
28
|
-
require '
|
28
|
+
require 'test/testbase'
|
29
29
|
require 'rmail/parser'
|
30
30
|
|
31
31
|
class TestRMailStreamParser < TestBase
|
@@ -333,7 +333,7 @@ It DOES end with a linebreak.
|
|
333
333
|
m = nil
|
334
334
|
data_as_file('parser.badmime1') do |f|
|
335
335
|
p.chunk_size = size
|
336
|
-
|
336
|
+
assert_nothing_raised("failed for chunk size #{size.to_s}") {
|
337
337
|
m = p.parse(f)
|
338
338
|
}
|
339
339
|
end
|
@@ -347,7 +347,7 @@ It DOES end with a linebreak.
|
|
347
347
|
m = nil
|
348
348
|
data_as_file('parser.badmime2') do |f|
|
349
349
|
p.chunk_size = size
|
350
|
-
|
350
|
+
assert_nothing_raised("failed for chunk size #{size.to_s}") {
|
351
351
|
m = p.parse(f)
|
352
352
|
}
|
353
353
|
end
|
@@ -25,14 +25,14 @@
|
|
25
25
|
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
26
26
|
#
|
27
27
|
|
28
|
-
require '
|
28
|
+
require 'test/testbase'
|
29
29
|
require 'rmail/mailbox/mboxreader'
|
30
30
|
|
31
31
|
class TextRMailParserPushbackReader < TestBase
|
32
32
|
|
33
33
|
def test_pushback
|
34
34
|
reader = RMail::Parser::PushbackReader.new("")
|
35
|
-
|
35
|
+
assert_raise(RMail::Parser::Error) {
|
36
36
|
reader.pushback("hi bob")
|
37
37
|
}
|
38
38
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
#--
|
3
|
-
# Copyright (C) 2001, 2002 Matt Armstrong. All rights reserved.
|
3
|
+
# Copyright (C) 2001, 2002, 2007 Matt Armstrong. All rights reserved.
|
4
4
|
#
|
5
5
|
# Redistribution and use in source and binary forms, with or without
|
6
6
|
# modification, are permitted provided that the following conditions are met:
|
@@ -27,8 +27,7 @@
|
|
27
27
|
|
28
28
|
# Test the TestBase class itself
|
29
29
|
|
30
|
-
require '
|
31
|
-
require 'tests/testbase.rb'
|
30
|
+
require 'test/testbase.rb'
|
32
31
|
|
33
32
|
class TestTestBase < TestBase
|
34
33
|
|
@@ -73,7 +72,12 @@ class TestTestBase < TestBase
|
|
73
72
|
end
|
74
73
|
|
75
74
|
def verify_scratch_dir_name(dir)
|
76
|
-
assert_match(/
|
75
|
+
assert_match(/_scratch.*TestTestBase/, dir)
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_name
|
79
|
+
assert_match(/\btest_name\b/, name)
|
80
|
+
assert_match(/\bTestTestBase\b/, name)
|
77
81
|
end
|
78
82
|
|
79
83
|
def test_scratch_dir
|