mail_address 1.0.0 → 1.1.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.
- checksums.yaml +4 -4
- data/README.md +14 -7
- data/lib/mail_address/address.rb +17 -5
- data/lib/mail_address/mail_address.rb +14 -8
- data/lib/mail_address/version.rb +1 -1
- data/spec/mail_address_spec.rb +70 -8
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 02e966fc9f6878a8d0954ca5e658db596e581d15
|
|
4
|
+
data.tar.gz: 108c96f94e4b19c9aee8c61ec52c4fe6cf896d5f
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 477bdb94a6eba5ac3a302ae590bf4b926e0dd8f236c0d5cedf57112a5ccea8f058d6e391eff50000a317baba7f5c332eabe0606defab8d4cb333c9ff85268eed
|
|
7
|
+
data.tar.gz: ca4c41bed4759fc726fe72bae286c897d5fd97f52fd6fe71abde8843864121ea047f82d13609b2527de9d8a359b190c2948f71c88f6f957c5f6fd79ed06e7cef
|
data/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# MailAddress [](https://travis-ci.org/kizashi1122/mail_address) [](https://coveralls.io/r/kizashi1122/mail_address)
|
|
2
2
|
|
|
3
3
|
MailAddress is a simple email address parser.
|
|
4
|
-
This library is implemented based on Perl Module Mail::Address.
|
|
4
|
+
This library is implemented based on Perl Module Mail::Address and added some improvements.
|
|
5
5
|
|
|
6
6
|
[mail](https://github.com/mikel/mail) is a great gem library. But some email addresses (mostly are violated RFC) are unparsable with mail gem which is strictly RFC compliant. In perl, [Mail::Address](http://search.cpan.org/~markov/MailTools-2.14/lib/Mail/Address.pod) is a very common library to parse email address. Mail::Address conviniently can parse even RFC-violated email addresses such as:
|
|
7
7
|
|
|
@@ -11,7 +11,11 @@ Ello [Do Not Reply] <do-not-reply@ello.co> # [, ] are not permitted according to
|
|
|
11
11
|
大阪 太郎<osaka@example.com> # no whitespace just before <
|
|
12
12
|
```
|
|
13
13
|
|
|
14
|
-
So I straightforwardly converted Perl module Mail::Address to Ruby gem.
|
|
14
|
+
So I straightforwardly converted Perl module Mail::Address to Ruby gem. Then I reviced it because original Mail::Address also has some bad points. For example:
|
|
15
|
+
|
|
16
|
+
- if no ending parenthesis in name part, cannot parse correctly.
|
|
17
|
+
- Modifications of name part are too much.
|
|
18
|
+
|
|
15
19
|
|
|
16
20
|
## Installation
|
|
17
21
|
|
|
@@ -32,6 +36,7 @@ Or install it yourself as:
|
|
|
32
36
|
## Usage
|
|
33
37
|
|
|
34
38
|
It's almost the same as Mail::Address(Perl).
|
|
39
|
+
But in this module, removed `comment` property from address class in version v1.0.0. Most people don't reallize comment I think.
|
|
35
40
|
|
|
36
41
|
```rb
|
|
37
42
|
require 'mail_address'
|
|
@@ -39,22 +44,24 @@ require 'mail_address'
|
|
|
39
44
|
line = "John 'M' Doe <john@example.com> (this is a comment), 大阪 太郎 <osaka@example.jp>"
|
|
40
45
|
addrs = MailAddress.parse(line)
|
|
41
46
|
|
|
42
|
-
p addrs[0].format # "John 'M' Doe
|
|
47
|
+
p addrs[0].format # "\"John 'M' Doe (this is a comment)\" <john@example.com>"
|
|
43
48
|
p addrs[0].address # "john@example.com"
|
|
44
|
-
p addrs[0].name # "John 'M' Doe"
|
|
45
|
-
p addrs[0].
|
|
46
|
-
p addrs[0].phrase # "John 'M' Doe"
|
|
49
|
+
p addrs[0].name # "John 'M' Doe (this is a comment)"
|
|
50
|
+
p addrs[0].phrase # "John 'M' Doe (this is a comment)"
|
|
47
51
|
p addrs[0].host # "example.com"
|
|
48
52
|
p addrs[0].user # "john"
|
|
53
|
+
p addrs[0].original # "John 'M' Doe <john@example.com> (this is a comment)"
|
|
49
54
|
|
|
50
55
|
p addrs[1].format # "\"大阪 太郎\" <osaka@example.jp>"
|
|
51
56
|
p addrs[1].address # "osaka@example.jp"
|
|
52
57
|
p addrs[1].name # "大阪 太郎"
|
|
53
|
-
p addrs[1].comment # ""
|
|
54
58
|
p addrs[1].phrase # "大阪 太郎"
|
|
55
59
|
p addrs[1].host # "example.jp"
|
|
56
60
|
p addrs[1].user # "osaka"
|
|
61
|
+
p addrs[1].original # "大阪 太郎 <osaka@example.jp>"
|
|
57
62
|
```
|
|
63
|
+
`address.name` and `address.phrase` are almost same.
|
|
64
|
+
`address.phrase` keeps outermost double quotes or parentheses.
|
|
58
65
|
|
|
59
66
|
## Contributing
|
|
60
67
|
|
data/lib/mail_address/address.rb
CHANGED
|
@@ -2,16 +2,19 @@ module MailAddress
|
|
|
2
2
|
|
|
3
3
|
class Address
|
|
4
4
|
|
|
5
|
-
def initialize(phrase,
|
|
5
|
+
def initialize(phrase, address_, original)
|
|
6
6
|
@phrase = phrase
|
|
7
|
-
@address =
|
|
7
|
+
@address = address_
|
|
8
|
+
@original = original
|
|
8
9
|
end
|
|
9
|
-
attr_accessor :phrase, :
|
|
10
|
+
attr_accessor :phrase, :original
|
|
10
11
|
|
|
11
12
|
ATEXT = '[\-\w !#$%&\'*+/=?^`{|}~]'
|
|
12
13
|
|
|
13
14
|
def format
|
|
14
15
|
addr = []
|
|
16
|
+
return @original if address.nil?
|
|
17
|
+
|
|
15
18
|
if !@phrase.nil? && @phrase.length > 0 then
|
|
16
19
|
if @phrase.match(/\A\(/) && @phrase.match(/\)\z/)
|
|
17
20
|
addr.push(@address) if !@address.nil? && @address.length > 0
|
|
@@ -52,14 +55,23 @@ module MailAddress
|
|
|
52
55
|
name.length > 0 ? name : nil
|
|
53
56
|
end
|
|
54
57
|
|
|
58
|
+
def address
|
|
59
|
+
# double check
|
|
60
|
+
if @address.nil? || @original.include?(@address)
|
|
61
|
+
@address
|
|
62
|
+
else
|
|
63
|
+
nil # wrongly constructed address
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
55
67
|
def host
|
|
56
|
-
addr =
|
|
68
|
+
addr = address || '';
|
|
57
69
|
i = addr.rindex('@')
|
|
58
70
|
i.nil? ? nil : addr[i + 1 .. -1]
|
|
59
71
|
end
|
|
60
72
|
|
|
61
73
|
def user
|
|
62
|
-
addr =
|
|
74
|
+
addr = address || '';
|
|
63
75
|
i = addr.rindex('@')
|
|
64
76
|
i.nil? ? addr : addr[0 ... i]
|
|
65
77
|
end
|
|
@@ -7,15 +7,16 @@ module MailAddress
|
|
|
7
7
|
|
|
8
8
|
# undisclosed-recipient
|
|
9
9
|
if line.match(/undisclosed[ \-]recipients?: ?;?/i)
|
|
10
|
-
return [ MailAddress::Address.new(line, nil) ]
|
|
10
|
+
return [ MailAddress::Address.new(line, nil, line) ]
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
# obviously invalid email address
|
|
14
14
|
unless line.match(/[a-z0-9\.\-"_\+]@/i)
|
|
15
|
-
return [ MailAddress::Address.new(line, nil) ]
|
|
15
|
+
return [ MailAddress::Address.new(line, nil, line) ]
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
phrase, address, objs = [], [], []
|
|
19
|
+
original = ''
|
|
19
20
|
depth, idx, end_paren_idx = 0, 0, 0
|
|
20
21
|
|
|
21
22
|
tokens = _tokenize lines
|
|
@@ -24,13 +25,14 @@ module MailAddress
|
|
|
24
25
|
|
|
25
26
|
for idx in 0 ... len do
|
|
26
27
|
|
|
28
|
+
token = tokens[idx]
|
|
29
|
+
substr = token[0, 1]
|
|
30
|
+
original << token
|
|
31
|
+
|
|
27
32
|
if (end_paren_idx > 0 && end_paren_idx >= idx)
|
|
28
33
|
next
|
|
29
34
|
end
|
|
30
35
|
|
|
31
|
-
token = tokens[idx]
|
|
32
|
-
substr = token[0, 1]
|
|
33
|
-
|
|
34
36
|
if (substr == '(' && !address.empty?) then
|
|
35
37
|
end_paren_idx = _find_next_paren(idx, tokens, len)
|
|
36
38
|
raise "cannot find end paren" if end_paren_idx == -1 # end paren must exists after address
|
|
@@ -42,11 +44,15 @@ module MailAddress
|
|
|
42
44
|
depth -= 1 if depth > 0
|
|
43
45
|
elsif (substr == ',' || substr == ';') then
|
|
44
46
|
raise "Unmatched '<>' in line" if depth > 0
|
|
45
|
-
|
|
47
|
+
|
|
48
|
+
original.sub!(/[,;]\s*\z/, '')
|
|
49
|
+
|
|
50
|
+
o = _complete(phrase, address, original)
|
|
46
51
|
|
|
47
52
|
objs.push(o) if o
|
|
48
53
|
depth = 0
|
|
49
54
|
end_paren_idx = 0
|
|
55
|
+
original = ''
|
|
50
56
|
_next = _find_next idx+1, tokens, len
|
|
51
57
|
elsif (depth > 0) then
|
|
52
58
|
token.strip!
|
|
@@ -110,9 +116,9 @@ module MailAddress
|
|
|
110
116
|
-1
|
|
111
117
|
end
|
|
112
118
|
|
|
113
|
-
def self._complete (phrase, address)
|
|
119
|
+
def self._complete (phrase, address, original)
|
|
114
120
|
phrase.length > 0 || address.length > 0 or return nil
|
|
115
|
-
new_address = MailAddress::Address.new(phrase.join('').strip, address.join(''))
|
|
121
|
+
new_address = MailAddress::Address.new(phrase.join('').strip, address.join(''), original)
|
|
116
122
|
phrase.clear; address.clear
|
|
117
123
|
new_address
|
|
118
124
|
end
|
data/lib/mail_address/version.rb
CHANGED
data/spec/mail_address_spec.rb
CHANGED
|
@@ -14,6 +14,7 @@ describe MailAddress do
|
|
|
14
14
|
expect(results[0].phrase).to eq("")
|
|
15
15
|
expect(results[0].host).to eq("example.com")
|
|
16
16
|
expect(results[0].user).to eq('johndoe')
|
|
17
|
+
expect(results[0].original).to eq(line)
|
|
17
18
|
|
|
18
19
|
# <address> only
|
|
19
20
|
line = '<johndoe@example.com>'
|
|
@@ -24,6 +25,7 @@ describe MailAddress do
|
|
|
24
25
|
expect(results[0].phrase).to eq("")
|
|
25
26
|
expect(results[0].host).to eq("example.com")
|
|
26
27
|
expect(results[0].user).to eq('johndoe')
|
|
28
|
+
expect(results[0].original).to eq(line)
|
|
27
29
|
|
|
28
30
|
# name + <address> (single byte only)
|
|
29
31
|
line = 'John Doe <johndoe@example.com>'
|
|
@@ -34,6 +36,7 @@ describe MailAddress do
|
|
|
34
36
|
expect(results[0].phrase).to eq("John Doe")
|
|
35
37
|
expect(results[0].host).to eq("example.com")
|
|
36
38
|
expect(results[0].user).to eq('johndoe')
|
|
39
|
+
expect(results[0].original).to eq(line)
|
|
37
40
|
|
|
38
41
|
# name + <address> (multi byte)
|
|
39
42
|
line = 'ジョン ドゥ <johndoe@example.com>'
|
|
@@ -44,6 +47,7 @@ describe MailAddress do
|
|
|
44
47
|
expect(results[0].phrase).to eq("ジョン ドゥ")
|
|
45
48
|
expect(results[0].host).to eq("example.com")
|
|
46
49
|
expect(results[0].user).to eq('johndoe')
|
|
50
|
+
expect(results[0].original).to eq(line)
|
|
47
51
|
|
|
48
52
|
line = 'Amazon.co.jp アソシエイト・プログラム <associates@amazon.co.jp>'
|
|
49
53
|
results = MailAddress.parse(line)
|
|
@@ -53,6 +57,7 @@ describe MailAddress do
|
|
|
53
57
|
expect(results[0].phrase).to eq("Amazon.co.jp アソシエイト・プログラム")
|
|
54
58
|
expect(results[0].host).to eq("amazon.co.jp")
|
|
55
59
|
expect(results[0].user).to eq('associates')
|
|
60
|
+
expect(results[0].original).to eq(line)
|
|
56
61
|
|
|
57
62
|
# name (includes parens) + <address>
|
|
58
63
|
line = 'Example (Twitterより) <notify@twitter.com>'
|
|
@@ -63,6 +68,7 @@ describe MailAddress do
|
|
|
63
68
|
expect(results[0].phrase).to eq("Example (Twitterより)")
|
|
64
69
|
expect(results[0].host).to eq("twitter.com")
|
|
65
70
|
expect(results[0].user).to eq('notify')
|
|
71
|
+
expect(results[0].original).to eq(line)
|
|
66
72
|
|
|
67
73
|
# name + <address> (multi byte) name is quoted
|
|
68
74
|
line = '"ジョン ドゥ" <johndoe@example.com>'
|
|
@@ -73,6 +79,7 @@ describe MailAddress do
|
|
|
73
79
|
expect(results[0].phrase).to eq('"ジョン ドゥ"')
|
|
74
80
|
expect(results[0].host).to eq("example.com")
|
|
75
81
|
expect(results[0].user).to eq('johndoe')
|
|
82
|
+
expect(results[0].original).to eq(line)
|
|
76
83
|
|
|
77
84
|
# address + (note)
|
|
78
85
|
line = 'johndoe@example.com (John Doe)'
|
|
@@ -83,6 +90,7 @@ describe MailAddress do
|
|
|
83
90
|
expect(results[0].phrase).to eq("(John Doe)")
|
|
84
91
|
expect(results[0].host).to eq("example.com")
|
|
85
92
|
expect(results[0].user).to eq('johndoe')
|
|
93
|
+
expect(results[0].original).to eq(line)
|
|
86
94
|
|
|
87
95
|
# address + (note) # nested paren
|
|
88
96
|
line = 'johndoe@example.com (John (Mid) Doe)'
|
|
@@ -93,6 +101,7 @@ describe MailAddress do
|
|
|
93
101
|
expect(results[0].phrase).to eq("(John (Mid) Doe)")
|
|
94
102
|
expect(results[0].host).to eq("example.com")
|
|
95
103
|
expect(results[0].user).to eq('johndoe')
|
|
104
|
+
expect(results[0].original).to eq(line)
|
|
96
105
|
|
|
97
106
|
# address + (note) # note has special char
|
|
98
107
|
line = 'johndoe@example.com (John@Doe)'
|
|
@@ -103,6 +112,7 @@ describe MailAddress do
|
|
|
103
112
|
expect(results[0].phrase).to eq("(John@Doe)")
|
|
104
113
|
expect(results[0].host).to eq("example.com")
|
|
105
114
|
expect(results[0].user).to eq('johndoe')
|
|
115
|
+
expect(results[0].original).to eq(line)
|
|
106
116
|
|
|
107
117
|
line = 'johndoe@example.com (John, Doe)'
|
|
108
118
|
results = MailAddress.parse(line)
|
|
@@ -112,6 +122,7 @@ describe MailAddress do
|
|
|
112
122
|
expect(results[0].phrase).to eq("(John, Doe)")
|
|
113
123
|
expect(results[0].host).to eq("example.com")
|
|
114
124
|
expect(results[0].user).to eq('johndoe')
|
|
125
|
+
expect(results[0].original).to eq(line)
|
|
115
126
|
|
|
116
127
|
# name + <address> + (note)
|
|
117
128
|
line = 'John Doe <johndoe@example.com> (Extra)'
|
|
@@ -122,6 +133,7 @@ describe MailAddress do
|
|
|
122
133
|
expect(results[0].phrase).to eq("John Doe (Extra)")
|
|
123
134
|
expect(results[0].host).to eq("example.com")
|
|
124
135
|
expect(results[0].user).to eq('johndoe')
|
|
136
|
+
expect(results[0].original).to eq(line)
|
|
125
137
|
|
|
126
138
|
# name + <address> (name has starting paren but doesn't have ending paren)
|
|
127
139
|
line = 'John(Doe <johndoe@example.com>'
|
|
@@ -132,6 +144,7 @@ describe MailAddress do
|
|
|
132
144
|
expect(results[0].phrase).to eq("John(Doe")
|
|
133
145
|
expect(results[0].host).to eq("example.com")
|
|
134
146
|
expect(results[0].user).to eq('johndoe')
|
|
147
|
+
expect(results[0].original).to eq(line)
|
|
135
148
|
|
|
136
149
|
# ditto
|
|
137
150
|
line = 'John ( Doe <johndoe@example.com>'
|
|
@@ -142,6 +155,7 @@ describe MailAddress do
|
|
|
142
155
|
expect(results[0].phrase).to eq("John ( Doe")
|
|
143
156
|
expect(results[0].host).to eq("example.com")
|
|
144
157
|
expect(results[0].user).to eq('johndoe')
|
|
158
|
+
expect(results[0].original).to eq(line)
|
|
145
159
|
|
|
146
160
|
# "address1" <address2>
|
|
147
161
|
line = '"michael@example.jp" <johndoe@example.com>'
|
|
@@ -152,6 +166,7 @@ describe MailAddress do
|
|
|
152
166
|
expect(results[0].phrase).to eq('"michael@example.jp"')
|
|
153
167
|
expect(results[0].host).to eq("example.com")
|
|
154
168
|
expect(results[0].user).to eq('johndoe')
|
|
169
|
+
expect(results[0].original).to eq(line)
|
|
155
170
|
end
|
|
156
171
|
|
|
157
172
|
it "normal case (multiple address)" do
|
|
@@ -164,6 +179,7 @@ describe MailAddress do
|
|
|
164
179
|
expect(results[0].phrase).to eq("John 'M' Doe")
|
|
165
180
|
expect(results[0].host).to eq("example.com")
|
|
166
181
|
expect(results[0].user).to eq("john")
|
|
182
|
+
expect(results[0].original).to eq("John 'M' Doe <john@example.com>")
|
|
167
183
|
|
|
168
184
|
# Perl module Mail::Address returns '大阪 太郎 <osaka@example.jp>' (no double quote)
|
|
169
185
|
# because regular expression \w matches even multibyte characters.
|
|
@@ -173,6 +189,7 @@ describe MailAddress do
|
|
|
173
189
|
expect(results[1].phrase).to eq("大阪 太郎")
|
|
174
190
|
expect(results[1].host).to eq("example.jp")
|
|
175
191
|
expect(results[1].user).to eq("osaka")
|
|
192
|
+
expect(results[1].original).to eq('大阪 太郎 <osaka@example.jp>')
|
|
176
193
|
end
|
|
177
194
|
|
|
178
195
|
it "normal case (rfc-violated(RFC822) but commonly used in AU/DoCoMo)" do
|
|
@@ -186,6 +203,7 @@ describe MailAddress do
|
|
|
186
203
|
expect(results[0].phrase).to eq("John Doe")
|
|
187
204
|
expect(results[0].host).to eq("example.com")
|
|
188
205
|
expect(results[0].user).to eq('"johndoe."')
|
|
206
|
+
expect(results[0].original).to eq(line)
|
|
189
207
|
|
|
190
208
|
# contains '..'
|
|
191
209
|
line = 'John Doe <"john..doe"@example.com>'
|
|
@@ -197,6 +215,7 @@ describe MailAddress do
|
|
|
197
215
|
expect(results[0].phrase).to eq("John Doe")
|
|
198
216
|
expect(results[0].host).to eq("example.com")
|
|
199
217
|
expect(results[0].user).to eq('"john..doe"')
|
|
218
|
+
expect(results[0].original).to eq(line)
|
|
200
219
|
end
|
|
201
220
|
|
|
202
221
|
it "unparsable with mail gem (includes non-permitted char'[')" do
|
|
@@ -208,6 +227,7 @@ describe MailAddress do
|
|
|
208
227
|
expect(results[0].phrase).to eq("Ello [Do Not Reply]")
|
|
209
228
|
expect(results[0].host).to eq("ello.co")
|
|
210
229
|
expect(results[0].user).to eq("do-not-reply")
|
|
230
|
+
expect(results[0].original).to eq(line)
|
|
211
231
|
end
|
|
212
232
|
|
|
213
233
|
it "unparsable with mail gem (no whitespace before <)" do
|
|
@@ -219,6 +239,7 @@ describe MailAddress do
|
|
|
219
239
|
expect(results[0].phrase).to eq("大阪 太郎")
|
|
220
240
|
expect(results[0].host).to eq("example.jp")
|
|
221
241
|
expect(results[0].user).to eq("osaka")
|
|
242
|
+
expect(results[0].original).to eq(line)
|
|
222
243
|
end
|
|
223
244
|
|
|
224
245
|
it "local part only" do
|
|
@@ -231,6 +252,7 @@ describe MailAddress do
|
|
|
231
252
|
expect(results[0].phrase).to eq("localpartonly")
|
|
232
253
|
expect(results[0].host).to be_nil
|
|
233
254
|
expect(results[0].user).to eq("")
|
|
255
|
+
expect(results[0].original).to eq(line)
|
|
234
256
|
end
|
|
235
257
|
|
|
236
258
|
it "a lot of types of undisclosed recipients" do
|
|
@@ -246,12 +268,14 @@ describe MailAddress do
|
|
|
246
268
|
|
|
247
269
|
array.each do |line|
|
|
248
270
|
results = MailAddress.parse(line)
|
|
249
|
-
expect(results[0].format).to eq(%Q("#{line}"))
|
|
271
|
+
# expect(results[0].format).to eq(%Q("#{line}"))
|
|
272
|
+
expect(results[0].format).to eq(line)
|
|
250
273
|
expect(results[0].address).to be_nil
|
|
251
274
|
expect(results[0].name).to eq(line)
|
|
252
275
|
expect(results[0].phrase).to eq(line)
|
|
253
276
|
expect(results[0].host).to be_nil
|
|
254
277
|
expect(results[0].user).to eq("")
|
|
278
|
+
expect(results[0].original).to eq(line)
|
|
255
279
|
end
|
|
256
280
|
|
|
257
281
|
array = [
|
|
@@ -267,9 +291,10 @@ describe MailAddress do
|
|
|
267
291
|
expect(results[0].phrase).to eq(line)
|
|
268
292
|
expect(results[0].host).to be_nil
|
|
269
293
|
expect(results[0].user).to eq("")
|
|
294
|
+
expect(results[0].original).to eq(line)
|
|
270
295
|
end
|
|
271
296
|
|
|
272
|
-
# valid address
|
|
297
|
+
# a seemingly valid address
|
|
273
298
|
line = '"Undisclosed" <"recipients:"@nifty.com>'
|
|
274
299
|
results = MailAddress.parse(line)
|
|
275
300
|
expect(results[0].format).to eq(line)
|
|
@@ -278,6 +303,7 @@ describe MailAddress do
|
|
|
278
303
|
expect(results[0].phrase).to eq('"Undisclosed"')
|
|
279
304
|
expect(results[0].host).to eq("nifty.com")
|
|
280
305
|
expect(results[0].user).to eq('"recipients:"')
|
|
306
|
+
expect(results[0].original).to eq(line)
|
|
281
307
|
end
|
|
282
308
|
|
|
283
309
|
it "specify mime-encoded address" do
|
|
@@ -289,6 +315,7 @@ describe MailAddress do
|
|
|
289
315
|
expect(results[0].phrase).to eq("=?ISO-2022-JP?B?GyRCQmc6ZRsoQiAbJEJCQE86GyhC?=")
|
|
290
316
|
expect(results[0].host).to eq("example.jp")
|
|
291
317
|
expect(results[0].user).to eq("osaka")
|
|
318
|
+
expect(results[0].original).to eq(line)
|
|
292
319
|
end
|
|
293
320
|
|
|
294
321
|
it "obviously invalid address (has no '@')" do
|
|
@@ -299,16 +326,38 @@ describe MailAddress do
|
|
|
299
326
|
|
|
300
327
|
array.each do |line|
|
|
301
328
|
results = MailAddress.parse(line)
|
|
302
|
-
expect(results[0].format).to eq(
|
|
329
|
+
expect(results[0].format).to eq(line)
|
|
303
330
|
expect(results[0].address).to be_nil
|
|
304
331
|
expect(results[0].name).to eq(line)
|
|
305
332
|
expect(results[0].phrase).to eq(line)
|
|
306
333
|
expect(results[0].host).to be_nil
|
|
307
334
|
expect(results[0].user).to eq("")
|
|
335
|
+
expect(results[0].original).to eq(line)
|
|
308
336
|
end
|
|
309
|
-
|
|
310
337
|
end
|
|
311
338
|
|
|
339
|
+
it "empty string or nil" do
|
|
340
|
+
# empty string
|
|
341
|
+
line = ''
|
|
342
|
+
results = MailAddress.parse(line)
|
|
343
|
+
expect(results[0].format).to eq('')
|
|
344
|
+
expect(results[0].address).to be_nil
|
|
345
|
+
expect(results[0].name).to be_nil
|
|
346
|
+
expect(results[0].phrase).to eq('')
|
|
347
|
+
expect(results[0].host).to be_nil
|
|
348
|
+
expect(results[0].user).to eq('')
|
|
349
|
+
expect(results[0].original).to eq(line)
|
|
350
|
+
# nil
|
|
351
|
+
line = nil
|
|
352
|
+
results = MailAddress.parse(line)
|
|
353
|
+
expect(results[0].format).to eq('')
|
|
354
|
+
expect(results[0].address).to be_nil
|
|
355
|
+
expect(results[0].name).to be_nil
|
|
356
|
+
expect(results[0].phrase).to eq('')
|
|
357
|
+
expect(results[0].host).to be_nil
|
|
358
|
+
expect(results[0].user).to eq('')
|
|
359
|
+
expect(results[0].original).to eq('') # Note that it returns empty string NOT nil
|
|
360
|
+
end
|
|
312
361
|
|
|
313
362
|
it "corrupted address" do
|
|
314
363
|
line = 'john <john@example.com' # lack of right angle bracket
|
|
@@ -322,7 +371,20 @@ describe MailAddress do
|
|
|
322
371
|
}.to raise_error(StandardError)
|
|
323
372
|
end
|
|
324
373
|
|
|
325
|
-
it
|
|
374
|
+
it "unbelievable but existed address" do
|
|
375
|
+
line = 'Sf 山田 太郎@example.com, valid@example.com'
|
|
376
|
+
results = MailAddress.parse(line)
|
|
377
|
+
expect(results[0].format).to eq('Sf 山田 太郎@example.com')
|
|
378
|
+
expect(results[0].address).not_to eq("Sf@example.com") ## important!
|
|
379
|
+
expect(results[0].address).to be_nil ## important!
|
|
380
|
+
expect(results[0].name).to eq('山田 太郎') ## I don't care whatever returns
|
|
381
|
+
expect(results[0].phrase).to eq('山田 太郎') ## I don't care whatever returns
|
|
382
|
+
expect(results[0].host).to be_nil
|
|
383
|
+
expect(results[0].user).to eq('')
|
|
384
|
+
expect(results[0].original).to eq('Sf 山田 太郎@example.com')
|
|
385
|
+
end
|
|
386
|
+
|
|
387
|
+
it 'Perl Module TAP test data' do
|
|
326
388
|
data = [
|
|
327
389
|
# [ '"Joe & J. Harvey" <ddd @Org>, JJV @ BBN',
|
|
328
390
|
# '"Joe & J. Harvey" <ddd@Org>',
|
|
@@ -422,9 +484,9 @@ describe MailAddress do
|
|
|
422
484
|
['Derek.Roskell%dero@msg.ti.com',
|
|
423
485
|
'Derek.Roskell%dero@msg.ti.com',
|
|
424
486
|
'Derek Roskell'],
|
|
425
|
-
['":sysmail"@ Some-Group. Some-Org, Muhammed.(I am the greatest) Ali @(the)Vegas.WBA',
|
|
426
|
-
|
|
427
|
-
|
|
487
|
+
# ['":sysmail"@ Some-Group. Some-Org, Muhammed.(I am the greatest) Ali @(the)Vegas.WBA',
|
|
488
|
+
# '":sysmail"@Some-Group.Some-Org',
|
|
489
|
+
# ''],
|
|
428
490
|
# ["david d `zoo' zuhn <zoo@aggregate.com>",
|
|
429
491
|
# "david d `zoo' zuhn <zoo@aggregate.com>",
|
|
430
492
|
# "David D `Zoo' Zuhn"],
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: mail_address
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.1.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Kizashi Nagata
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2015-04-
|
|
11
|
+
date: 2015-04-16 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|