mail_address 1.2.5 → 1.2.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +13 -4
- data/lib/mail_address/mail_address.rb +1 -1
- data/lib/mail_address/simple_parser.rb +3 -1
- data/lib/mail_address/version.rb +1 -1
- data/spec/mail_address_spec.rb +208 -107
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1aac359fd813893b39d93b4378c7913764a689b2
|
4
|
+
data.tar.gz: e2d4344aebabbc322ac97e09a4f7e504311e68ac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7eb4f797e2644adb1ac98916cdf8df42ab31b6449c54c530cfc73bbc43f87b5a1d89356ed7eb895f79d86e3eb0c4abbdb546487134637113be9402b4449d4a74
|
7
|
+
data.tar.gz: 543d58abd737430b13931dcd2dd404bab9e8abf8fe2128d4acc49849b7ced18a54cf1db5e91b6f1a384180cf32c10e9a1d9aa2c1968aa271926a54311ad3e3d4
|
data/README.md
CHANGED
@@ -2,20 +2,19 @@
|
|
2
2
|
|
3
3
|
MailAddress is a port of Mail::Address from Perl.
|
4
4
|
|
5
|
-
[mail](https://github.com/mikel/mail) is a great gem library. But some email addresses are unparsable with it. In perl, [Mail::Address](http://search.cpan.org/~markov/MailTools-2.14/lib/Mail/Address.pod) is a very common library to parse
|
5
|
+
[mail](https://github.com/mikel/mail) is a great gem library. But some email addresses are unparsable with it. In perl, [Mail::Address](http://search.cpan.org/~markov/MailTools-2.14/lib/Mail/Address.pod) is a very common library to parse email addresses. Mail::Address conviniently can parse even non-RFC-compliant email addresses such as:
|
6
6
|
|
7
7
|
```rb
|
8
8
|
# mail gem cannot parse the following addresses
|
9
9
|
Ello [Do Not Reply] <do-not-reply@ello.co> # [, ] are not permitted according to RFC5322
|
10
10
|
大阪 太郎<osaka@example.com> # no whitespace just before `<`
|
11
11
|
```
|
12
|
-
But Mail::Address has some bad points (below). These are fixed in MailAddress.
|
12
|
+
But Mail::Address(Perl) has some bad points (below). These are fixed in MailAddress.
|
13
13
|
|
14
14
|
- if no ending parenthesis in name part, cannot parse correctly.
|
15
15
|
- Modifications of name part are too much.
|
16
16
|
|
17
|
-
|
18
|
-
Many people could paste email addresses from Excel or the other spreadsheets. To accomplish this, also ported from a parser part of [Google Closure Library](https://github.com/google/closure-library/blob/master/closure/goog/format/emailaddress.js).
|
17
|
+
Many people copy and paste email addresses from Excel or the other spreadsheets. In this case, addresses are separated by whitespace(tab or space). To enable to parse this, also ported from a parser part of [Google Closure Library](https://github.com/google/closure-library/blob/master/closure/goog/format/emailaddress.js).
|
19
18
|
|
20
19
|
## Installation
|
21
20
|
|
@@ -60,9 +59,19 @@ p addrs[1].host # "example.jp"
|
|
60
59
|
p addrs[1].user # "osaka"
|
61
60
|
p addrs[1].original # "大阪 太郎 <osaka@example.jp>"
|
62
61
|
```
|
62
|
+
|
63
63
|
`address.name` and `address.phrase` are almost same.
|
64
64
|
`address.phrase` keeps outermost double quotes or parentheses.
|
65
65
|
|
66
|
+
### Parse addresses separated with whitespace
|
67
|
+
|
68
|
+
```rb
|
69
|
+
require 'mail_address'
|
70
|
+
|
71
|
+
line = "John Doe <john@example.com> second@example.com, third@example.com" # separated with space and comma
|
72
|
+
addrs = MailAddress.parse_simple(line)
|
73
|
+
```
|
74
|
+
|
66
75
|
## Contributing
|
67
76
|
|
68
77
|
1. Fork it ( https://github.com/[my-github-username]/mail_address/fork )
|
@@ -85,7 +85,7 @@ module MailAddress
|
|
85
85
|
while (line != '')
|
86
86
|
tmp = nil
|
87
87
|
if (
|
88
|
-
line.sub!(/\A("(?:[^"\\]+|\\.)*")(\s*)/, '')
|
88
|
+
line.match(/"[^"]+"/) && line.sub!(/\A("(?:[^"\\]+|\\.)*")(\s*)/, '') || # "..."
|
89
89
|
line.sub!(/\A(\[(?:[^\]\\]+|\\.)*\])(\s*)/, '') || # [...]
|
90
90
|
line.sub!(/\A([^\s()<>\@,;:\\".\[\]]+)(\s*)/, '') ||
|
91
91
|
line.sub!(/\A([()<>\@,;:\\".\[\]])(\s*)/, '')
|
@@ -12,7 +12,9 @@ module MailAddress
|
|
12
12
|
# CHARS_REQUIRE_QUOTES_ = SPECIAL_CHARS + ADDRESS_SEPARATORS_
|
13
13
|
ESCAPED_DOUBLE_QUOTES_ = /\\\"/
|
14
14
|
ESCAPED_BACKSLASHES_ = /\\\\/
|
15
|
-
|
15
|
+
QUOTED_REGEX_STR_ = '[+a-zA-Z0-9_.!#$%&\'*\\/=?^`{|}~-]+'
|
16
|
+
UNQUOTED_REGEX_STR_ = '"' + QUOTED_REGEX_STR_ + '"'
|
17
|
+
LOCAL_PART_REGEXP_STR_ = '(?:' + QUOTED_REGEX_STR_ + '|' + UNQUOTED_REGEX_STR_ + ')'
|
16
18
|
DOMAIN_PART_REGEXP_STR_ = '([a-zA-Z0-9-]+\\.)+[a-zA-Z0-9]{2,63}'
|
17
19
|
EMAIL_ADDRESS_ = Regexp.new('\\A' + LOCAL_PART_REGEXP_STR_ + '@' + DOMAIN_PART_REGEXP_STR_ + '\\z')
|
18
20
|
|
data/lib/mail_address/version.rb
CHANGED
data/spec/mail_address_spec.rb
CHANGED
@@ -11,8 +11,8 @@ describe MailAddress do
|
|
11
11
|
expect(results[0].format).to eq('johndoe@example.com')
|
12
12
|
expect(results[0].address).to eq('johndoe@example.com')
|
13
13
|
expect(results[0].name).to be_nil
|
14
|
-
expect(results[0].phrase).to eq(
|
15
|
-
expect(results[0].host).to eq(
|
14
|
+
expect(results[0].phrase).to eq('')
|
15
|
+
expect(results[0].host).to eq('example.com')
|
16
16
|
expect(results[0].user).to eq('johndoe')
|
17
17
|
expect(results[0].original).to eq(line)
|
18
18
|
|
@@ -22,8 +22,8 @@ describe MailAddress do
|
|
22
22
|
expect(results[0].format).to eq('johndoe@example.com')
|
23
23
|
expect(results[0].address).to eq('johndoe@example.com')
|
24
24
|
expect(results[0].name).to be_nil
|
25
|
-
expect(results[0].phrase).to eq(
|
26
|
-
expect(results[0].host).to eq(
|
25
|
+
expect(results[0].phrase).to eq('')
|
26
|
+
expect(results[0].host).to eq('example.com')
|
27
27
|
expect(results[0].user).to eq('johndoe')
|
28
28
|
expect(results[0].original).to eq(line)
|
29
29
|
|
@@ -32,9 +32,9 @@ describe MailAddress do
|
|
32
32
|
results = MailAddress.parse(line)
|
33
33
|
expect(results[0].format).to eq('John Doe <johndoe@example.com>')
|
34
34
|
expect(results[0].address).to eq('johndoe@example.com')
|
35
|
-
expect(results[0].name).to eq(
|
36
|
-
expect(results[0].phrase).to eq(
|
37
|
-
expect(results[0].host).to eq(
|
35
|
+
expect(results[0].name).to eq('John Doe')
|
36
|
+
expect(results[0].phrase).to eq('John Doe')
|
37
|
+
expect(results[0].host).to eq('example.com')
|
38
38
|
expect(results[0].user).to eq('johndoe')
|
39
39
|
expect(results[0].original).to eq(line)
|
40
40
|
|
@@ -43,9 +43,9 @@ describe MailAddress do
|
|
43
43
|
results = MailAddress.parse(line)
|
44
44
|
expect(results[0].format).to eq('"ジョン ドゥ" <johndoe@example.com>')
|
45
45
|
expect(results[0].address).to eq('johndoe@example.com')
|
46
|
-
expect(results[0].name).to eq(
|
47
|
-
expect(results[0].phrase).to eq(
|
48
|
-
expect(results[0].host).to eq(
|
46
|
+
expect(results[0].name).to eq('ジョン ドゥ')
|
47
|
+
expect(results[0].phrase).to eq('ジョン ドゥ')
|
48
|
+
expect(results[0].host).to eq('example.com')
|
49
49
|
expect(results[0].user).to eq('johndoe')
|
50
50
|
expect(results[0].original).to eq(line)
|
51
51
|
|
@@ -53,9 +53,9 @@ describe MailAddress do
|
|
53
53
|
results = MailAddress.parse(line)
|
54
54
|
expect(results[0].format).to eq('"Amazon.co.jp アソシエイト・プログラム" <associates@amazon.co.jp>')
|
55
55
|
expect(results[0].address).to eq('associates@amazon.co.jp')
|
56
|
-
expect(results[0].name).to eq(
|
57
|
-
expect(results[0].phrase).to eq(
|
58
|
-
expect(results[0].host).to eq(
|
56
|
+
expect(results[0].name).to eq('Amazon.co.jp アソシエイト・プログラム')
|
57
|
+
expect(results[0].phrase).to eq('Amazon.co.jp アソシエイト・プログラム')
|
58
|
+
expect(results[0].host).to eq('amazon.co.jp')
|
59
59
|
expect(results[0].user).to eq('associates')
|
60
60
|
expect(results[0].original).to eq(line)
|
61
61
|
|
@@ -64,9 +64,9 @@ describe MailAddress do
|
|
64
64
|
results = MailAddress.parse(line)
|
65
65
|
expect(results[0].format).to eq('"Example (Twitterより)" <notify@twitter.com>')
|
66
66
|
expect(results[0].address).to eq('notify@twitter.com')
|
67
|
-
expect(results[0].name).to eq(
|
68
|
-
expect(results[0].phrase).to eq(
|
69
|
-
expect(results[0].host).to eq(
|
67
|
+
expect(results[0].name).to eq('Example (Twitterより)')
|
68
|
+
expect(results[0].phrase).to eq('Example (Twitterより)')
|
69
|
+
expect(results[0].host).to eq('twitter.com')
|
70
70
|
expect(results[0].user).to eq('notify')
|
71
71
|
expect(results[0].original).to eq(line)
|
72
72
|
|
@@ -75,9 +75,9 @@ describe MailAddress do
|
|
75
75
|
results = MailAddress.parse(line)
|
76
76
|
expect(results[0].format).to eq('"ジョン ドゥ" <johndoe@example.com>')
|
77
77
|
expect(results[0].address).to eq('johndoe@example.com')
|
78
|
-
expect(results[0].name).to eq(
|
78
|
+
expect(results[0].name).to eq('ジョン ドゥ')
|
79
79
|
expect(results[0].phrase).to eq('"ジョン ドゥ"')
|
80
|
-
expect(results[0].host).to eq(
|
80
|
+
expect(results[0].host).to eq('example.com')
|
81
81
|
expect(results[0].user).to eq('johndoe')
|
82
82
|
expect(results[0].original).to eq(line)
|
83
83
|
|
@@ -86,9 +86,9 @@ describe MailAddress do
|
|
86
86
|
results = MailAddress.parse(line)
|
87
87
|
expect(results[0].format).to eq('johndoe@example.com (John Doe)')
|
88
88
|
expect(results[0].address).to eq('johndoe@example.com')
|
89
|
-
expect(results[0].name).to eq(
|
90
|
-
expect(results[0].phrase).to eq(
|
91
|
-
expect(results[0].host).to eq(
|
89
|
+
expect(results[0].name).to eq('John Doe')
|
90
|
+
expect(results[0].phrase).to eq('(John Doe)')
|
91
|
+
expect(results[0].host).to eq('example.com')
|
92
92
|
expect(results[0].user).to eq('johndoe')
|
93
93
|
expect(results[0].original).to eq(line)
|
94
94
|
|
@@ -97,9 +97,9 @@ describe MailAddress do
|
|
97
97
|
results = MailAddress.parse(line)
|
98
98
|
expect(results[0].format).to eq('johndoe@example.com (John (Mid) Doe)')
|
99
99
|
expect(results[0].address).to eq('johndoe@example.com')
|
100
|
-
expect(results[0].name).to eq(
|
101
|
-
expect(results[0].phrase).to eq(
|
102
|
-
expect(results[0].host).to eq(
|
100
|
+
expect(results[0].name).to eq('John (Mid) Doe')
|
101
|
+
expect(results[0].phrase).to eq('(John (Mid) Doe)')
|
102
|
+
expect(results[0].host).to eq('example.com')
|
103
103
|
expect(results[0].user).to eq('johndoe')
|
104
104
|
expect(results[0].original).to eq(line)
|
105
105
|
|
@@ -108,9 +108,9 @@ describe MailAddress do
|
|
108
108
|
results = MailAddress.parse(line)
|
109
109
|
expect(results[0].format).to eq('johndoe@example.com (John@Doe)')
|
110
110
|
expect(results[0].address).to eq('johndoe@example.com')
|
111
|
-
expect(results[0].name).to eq(
|
112
|
-
expect(results[0].phrase).to eq(
|
113
|
-
expect(results[0].host).to eq(
|
111
|
+
expect(results[0].name).to eq('John@Doe')
|
112
|
+
expect(results[0].phrase).to eq('(John@Doe)')
|
113
|
+
expect(results[0].host).to eq('example.com')
|
114
114
|
expect(results[0].user).to eq('johndoe')
|
115
115
|
expect(results[0].original).to eq(line)
|
116
116
|
|
@@ -118,9 +118,9 @@ describe MailAddress do
|
|
118
118
|
results = MailAddress.parse(line)
|
119
119
|
expect(results[0].format).to eq('johndoe@example.com (John, Doe)')
|
120
120
|
expect(results[0].address).to eq('johndoe@example.com')
|
121
|
-
expect(results[0].name).to eq(
|
122
|
-
expect(results[0].phrase).to eq(
|
123
|
-
expect(results[0].host).to eq(
|
121
|
+
expect(results[0].name).to eq('John, Doe')
|
122
|
+
expect(results[0].phrase).to eq('(John, Doe)')
|
123
|
+
expect(results[0].host).to eq('example.com')
|
124
124
|
expect(results[0].user).to eq('johndoe')
|
125
125
|
expect(results[0].original).to eq(line)
|
126
126
|
|
@@ -129,9 +129,9 @@ describe MailAddress do
|
|
129
129
|
results = MailAddress.parse(line)
|
130
130
|
expect(results[0].format).to eq('"John Doe (Extra)" <johndoe@example.com>')
|
131
131
|
expect(results[0].address).to eq('johndoe@example.com')
|
132
|
-
expect(results[0].name).to eq(
|
133
|
-
expect(results[0].phrase).to eq(
|
134
|
-
expect(results[0].host).to eq(
|
132
|
+
expect(results[0].name).to eq('John Doe (Extra)')
|
133
|
+
expect(results[0].phrase).to eq('John Doe (Extra)')
|
134
|
+
expect(results[0].host).to eq('example.com')
|
135
135
|
expect(results[0].user).to eq('johndoe')
|
136
136
|
expect(results[0].original).to eq(line)
|
137
137
|
|
@@ -140,9 +140,9 @@ describe MailAddress do
|
|
140
140
|
results = MailAddress.parse(line)
|
141
141
|
expect(results[0].format).to eq('"John(Doe" <johndoe@example.com>')
|
142
142
|
expect(results[0].address).to eq('johndoe@example.com')
|
143
|
-
expect(results[0].name).to eq(
|
144
|
-
expect(results[0].phrase).to eq(
|
145
|
-
expect(results[0].host).to eq(
|
143
|
+
expect(results[0].name).to eq('John(Doe')
|
144
|
+
expect(results[0].phrase).to eq('John(Doe')
|
145
|
+
expect(results[0].host).to eq('example.com')
|
146
146
|
expect(results[0].user).to eq('johndoe')
|
147
147
|
expect(results[0].original).to eq(line)
|
148
148
|
|
@@ -151,9 +151,9 @@ describe MailAddress do
|
|
151
151
|
results = MailAddress.parse(line)
|
152
152
|
expect(results[0].format).to eq('"John ( Doe" <johndoe@example.com>')
|
153
153
|
expect(results[0].address).to eq('johndoe@example.com')
|
154
|
-
expect(results[0].name).to eq(
|
155
|
-
expect(results[0].phrase).to eq(
|
156
|
-
expect(results[0].host).to eq(
|
154
|
+
expect(results[0].name).to eq('John ( Doe')
|
155
|
+
expect(results[0].phrase).to eq('John ( Doe')
|
156
|
+
expect(results[0].host).to eq('example.com')
|
157
157
|
expect(results[0].user).to eq('johndoe')
|
158
158
|
expect(results[0].original).to eq(line)
|
159
159
|
|
@@ -162,9 +162,9 @@ describe MailAddress do
|
|
162
162
|
results = MailAddress.parse(line)
|
163
163
|
expect(results[0].format).to eq('"michael@example.jp" <johndoe@example.com>')
|
164
164
|
expect(results[0].address).to eq('johndoe@example.com')
|
165
|
-
expect(results[0].name).to eq(
|
165
|
+
expect(results[0].name).to eq('michael@example.jp')
|
166
166
|
expect(results[0].phrase).to eq('"michael@example.jp"')
|
167
|
-
expect(results[0].host).to eq(
|
167
|
+
expect(results[0].host).to eq('example.com')
|
168
168
|
expect(results[0].user).to eq('johndoe')
|
169
169
|
expect(results[0].original).to eq(line)
|
170
170
|
end
|
@@ -177,76 +177,177 @@ describe MailAddress do
|
|
177
177
|
expect(results[0].address).to eq("john@example.com")
|
178
178
|
expect(results[0].name).to eq("John 'M' Doe")
|
179
179
|
expect(results[0].phrase).to eq("John 'M' Doe")
|
180
|
-
expect(results[0].host).to eq(
|
181
|
-
expect(results[0].user).to eq(
|
180
|
+
expect(results[0].host).to eq('example.com')
|
181
|
+
expect(results[0].user).to eq('john')
|
182
182
|
expect(results[0].original).to eq("John 'M' Doe <john@example.com>")
|
183
183
|
|
184
184
|
# Perl module Mail::Address returns '大阪 太郎 <osaka@example.jp>' (no double quote)
|
185
185
|
# because regular expression \w matches even multibyte characters.
|
186
|
-
expect(results[1].format).to eq("
|
187
|
-
expect(results[1].address).to eq(
|
188
|
-
expect(results[1].name).to eq(
|
189
|
-
expect(results[1].phrase).to eq(
|
190
|
-
expect(results[1].host).to eq(
|
191
|
-
expect(results[1].user).to eq(
|
186
|
+
expect(results[1].format).to eq('"大阪 太郎" <osaka@example.jp>')
|
187
|
+
expect(results[1].address).to eq('osaka@example.jp')
|
188
|
+
expect(results[1].name).to eq('大阪 太郎')
|
189
|
+
expect(results[1].phrase).to eq('大阪 太郎')
|
190
|
+
expect(results[1].host).to eq('example.jp')
|
191
|
+
expect(results[1].user).to eq('osaka')
|
192
192
|
expect(results[1].original).to eq('大阪 太郎 <osaka@example.jp>')
|
193
193
|
|
194
|
-
expect(results[2].format).to eq(
|
194
|
+
expect(results[2].format).to eq('localpartonly')
|
195
195
|
expect(results[2].address).to be_nil
|
196
|
-
expect(results[2].name).to eq(
|
197
|
-
expect(results[2].phrase).to eq(
|
196
|
+
expect(results[2].name).to eq('localpartonly')
|
197
|
+
expect(results[2].phrase).to eq('localpartonly')
|
198
198
|
expect(results[2].host).to be_nil
|
199
|
-
expect(results[2].user).to eq(
|
200
|
-
expect(results[2].original).to eq(
|
199
|
+
expect(results[2].user).to eq('')
|
200
|
+
expect(results[2].original).to eq('localpartonly')
|
201
201
|
end
|
202
202
|
|
203
203
|
it "normal case (rfc-violated(RFC822) but commonly used in AU/DoCoMo)" do
|
204
204
|
# dot before @
|
205
|
-
line = '
|
205
|
+
line = 'johndoe.@example.com' # no double quotes
|
206
|
+
results = MailAddress.parse(line)
|
207
|
+
|
208
|
+
expect(results[0].format).to eq('johndoe.@example.com')
|
209
|
+
expect(results[0].address).to eq('johndoe.@example.com')
|
210
|
+
expect(results[0].name).to be_nil
|
211
|
+
expect(results[0].phrase).to eq('')
|
212
|
+
expect(results[0].host).to eq('example.com')
|
213
|
+
expect(results[0].user).to eq('johndoe.')
|
214
|
+
expect(results[0].original).to eq(line)
|
215
|
+
|
216
|
+
line = '"johndoe."@example.com' # enclosed with double quotes
|
217
|
+
results = MailAddress.parse(line)
|
218
|
+
|
219
|
+
expect(results[0].format).to eq('"johndoe."@example.com')
|
220
|
+
expect(results[0].address).to eq('"johndoe."@example.com')
|
221
|
+
expect(results[0].name).to be_nil
|
222
|
+
expect(results[0].phrase).to eq('')
|
223
|
+
expect(results[0].host).to eq('example.com')
|
224
|
+
expect(results[0].user).to eq('"johndoe."')
|
225
|
+
expect(results[0].original).to eq(line)
|
226
|
+
|
227
|
+
line = 'John Doe <johndoe.@example.com>' # no double quotes
|
206
228
|
results = MailAddress.parse(line)
|
207
229
|
|
208
230
|
expect(results[0].format).to eq('John Doe <johndoe.@example.com>')
|
209
231
|
expect(results[0].address).to eq('johndoe.@example.com')
|
210
|
-
expect(results[0].name).to eq(
|
211
|
-
expect(results[0].phrase).to eq(
|
212
|
-
expect(results[0].host).to eq(
|
232
|
+
expect(results[0].name).to eq('John Doe')
|
233
|
+
expect(results[0].phrase).to eq('John Doe')
|
234
|
+
expect(results[0].host).to eq('example.com')
|
213
235
|
expect(results[0].user).to eq('johndoe.')
|
214
236
|
expect(results[0].original).to eq(line)
|
215
237
|
|
238
|
+
line = 'John Doe <"johndoe."@example.com>' # enclosed with double quotes
|
239
|
+
results = MailAddress.parse(line)
|
240
|
+
|
241
|
+
expect(results[0].format).to eq('John Doe <"johndoe."@example.com>')
|
242
|
+
expect(results[0].address).to eq('"johndoe."@example.com')
|
243
|
+
expect(results[0].name).to eq('John Doe')
|
244
|
+
expect(results[0].phrase).to eq('John Doe')
|
245
|
+
expect(results[0].host).to eq('example.com')
|
246
|
+
expect(results[0].user).to eq('"johndoe."')
|
247
|
+
expect(results[0].original).to eq(line)
|
248
|
+
|
216
249
|
# contains '..'
|
217
|
-
line = '
|
250
|
+
line = 'john..doe@example.com' # enclosed with double quotes
|
251
|
+
results = MailAddress.parse(line)
|
252
|
+
|
253
|
+
expect(results[0].format).to eq('john..doe@example.com')
|
254
|
+
expect(results[0].address).to eq('john..doe@example.com')
|
255
|
+
expect(results[0].name).to be_nil
|
256
|
+
expect(results[0].phrase).to eq('')
|
257
|
+
expect(results[0].host).to eq('example.com')
|
258
|
+
expect(results[0].user).to eq('john..doe')
|
259
|
+
expect(results[0].original).to eq(line)
|
260
|
+
|
261
|
+
line = '"john..doe"@example.com' # enclosed with double quotes
|
262
|
+
results = MailAddress.parse(line)
|
263
|
+
|
264
|
+
expect(results[0].format).to eq('"john..doe"@example.com')
|
265
|
+
expect(results[0].address).to eq('"john..doe"@example.com')
|
266
|
+
expect(results[0].name).to be_nil
|
267
|
+
expect(results[0].phrase).to eq('')
|
268
|
+
expect(results[0].host).to eq('example.com')
|
269
|
+
expect(results[0].user).to eq('"john..doe"')
|
270
|
+
expect(results[0].original).to eq(line)
|
271
|
+
|
272
|
+
line = 'John Doe <john..doe@example.com>' # no double quotes
|
218
273
|
results = MailAddress.parse(line)
|
219
274
|
|
220
275
|
expect(results[0].format).to eq('John Doe <john..doe@example.com>')
|
221
276
|
expect(results[0].address).to eq('john..doe@example.com')
|
222
|
-
expect(results[0].name).to eq(
|
223
|
-
expect(results[0].phrase).to eq(
|
224
|
-
expect(results[0].host).to eq(
|
277
|
+
expect(results[0].name).to eq('John Doe')
|
278
|
+
expect(results[0].phrase).to eq('John Doe')
|
279
|
+
expect(results[0].host).to eq('example.com')
|
225
280
|
expect(results[0].user).to eq('john..doe')
|
226
281
|
expect(results[0].original).to eq(line)
|
282
|
+
|
283
|
+
line = 'John Doe <"john..doe"@example.com>' # enclosed with double quotes
|
284
|
+
results = MailAddress.parse(line)
|
285
|
+
|
286
|
+
expect(results[0].format).to eq('John Doe <"john..doe"@example.com>')
|
287
|
+
expect(results[0].address).to eq('"john..doe"@example.com')
|
288
|
+
expect(results[0].name).to eq('John Doe')
|
289
|
+
expect(results[0].phrase).to eq('John Doe')
|
290
|
+
expect(results[0].host).to eq('example.com')
|
291
|
+
expect(results[0].user).to eq('"john..doe"')
|
292
|
+
expect(results[0].original).to eq(line)
|
293
|
+
end
|
294
|
+
|
295
|
+
it "Unclosed double quotes" do
|
296
|
+
line = '"john..doe@example.com'
|
297
|
+
results = MailAddress.parse(line)
|
298
|
+
expect(results[0].format).to eq('"john..doe@example.com')
|
299
|
+
expect(results[0].address).to be_nil
|
300
|
+
expect(results[0].name).to eq('john..doe@example.com') ## IRREGULAR PATTERN
|
301
|
+
expect(results[0].phrase).to eq('"john..doe@example.com') ## IRREGULAR PATTERN
|
302
|
+
expect(results[0].host).to be_nil
|
303
|
+
expect(results[0].user).to eq("")
|
304
|
+
expect(results[0].original).to eq(line)
|
305
|
+
|
306
|
+
line = 'john..doe"@example.com'
|
307
|
+
results = MailAddress.parse(line)
|
308
|
+
expect(results[0].format).to eq('john..doe"@example.com')
|
309
|
+
expect(results[0].address).to be_nil
|
310
|
+
expect(results[0].name).to eq('john..doe"@example.com') ## IRREGULAR PATTERN
|
311
|
+
expect(results[0].phrase).to eq('john..doe"@example.com') ## IRREGULAR PATTERN
|
312
|
+
expect(results[0].host).to be_nil
|
313
|
+
expect(results[0].user).to eq("")
|
314
|
+
expect(results[0].original).to eq(line)
|
315
|
+
|
316
|
+
#
|
317
|
+
# it takes about 1 minutes in v1.4.5
|
318
|
+
#
|
319
|
+
line = '"ooooooooooooooooo@docomo.ne.jp'
|
320
|
+
results = MailAddress.parse(line)
|
321
|
+
expect(results[0].format).to eq('"ooooooooooooooooo@docomo.ne.jp')
|
322
|
+
expect(results[0].address).to be_nil
|
323
|
+
expect(results[0].name).to eq('ooooooooooooooooo@docomo.ne.jp') ## IRREGULAR PATTERN
|
324
|
+
expect(results[0].phrase).to eq('"ooooooooooooooooo@docomo.ne.jp') ## IRREGULAR PATTERN
|
325
|
+
expect(results[0].host).to be_nil
|
326
|
+
expect(results[0].user).to eq("")
|
327
|
+
expect(results[0].original).to eq(line)
|
227
328
|
end
|
228
329
|
|
229
330
|
it "unparsable with mail gem (includes non-permitted char'[')" do
|
230
331
|
line = "Ello [Do Not Reply] <do-not-reply@ello.co>"
|
231
332
|
results = MailAddress.parse(line)
|
232
|
-
expect(results[0].format).to eq("
|
233
|
-
expect(results[0].address).to eq(
|
234
|
-
expect(results[0].name).to eq(
|
235
|
-
expect(results[0].phrase).to eq(
|
236
|
-
expect(results[0].host).to eq(
|
237
|
-
expect(results[0].user).to eq(
|
333
|
+
expect(results[0].format).to eq('"Ello [Do Not Reply]" <do-not-reply@ello.co>')
|
334
|
+
expect(results[0].address).to eq('do-not-reply@ello.co')
|
335
|
+
expect(results[0].name).to eq('Ello')
|
336
|
+
expect(results[0].phrase).to eq('Ello [Do Not Reply]')
|
337
|
+
expect(results[0].host).to eq('ello.co')
|
338
|
+
expect(results[0].user).to eq('do-not-reply')
|
238
339
|
expect(results[0].original).to eq(line)
|
239
340
|
end
|
240
341
|
|
241
342
|
it "unparsable with mail gem (no whitespace before <)" do
|
242
343
|
line = "大阪 太郎<osaka@example.jp>"
|
243
344
|
results = MailAddress.parse(line)
|
244
|
-
expect(results[0].format).to eq("
|
245
|
-
expect(results[0].address).to eq(
|
246
|
-
expect(results[0].name).to eq(
|
247
|
-
expect(results[0].phrase).to eq(
|
248
|
-
expect(results[0].host).to eq(
|
249
|
-
expect(results[0].user).to eq(
|
345
|
+
expect(results[0].format).to eq('"大阪 太郎" <osaka@example.jp>')
|
346
|
+
expect(results[0].address).to eq('osaka@example.jp')
|
347
|
+
expect(results[0].name).to eq('大阪 太郎')
|
348
|
+
expect(results[0].phrase).to eq('大阪 太郎')
|
349
|
+
expect(results[0].host).to eq('example.jp')
|
350
|
+
expect(results[0].user).to eq('osaka')
|
250
351
|
expect(results[0].original).to eq(line)
|
251
352
|
end
|
252
353
|
|
@@ -254,39 +355,39 @@ describe MailAddress do
|
|
254
355
|
# if local part only, do not treat as an email address
|
255
356
|
line = "localpartonly"
|
256
357
|
results = MailAddress.parse(line)
|
257
|
-
expect(results[0].format).to eq(
|
358
|
+
expect(results[0].format).to eq('localpartonly')
|
258
359
|
expect(results[0].address).to be_nil
|
259
|
-
expect(results[0].name).to eq(
|
260
|
-
expect(results[0].phrase).to eq(
|
360
|
+
expect(results[0].name).to eq('localpartonly')
|
361
|
+
expect(results[0].phrase).to eq('localpartonly')
|
261
362
|
expect(results[0].host).to be_nil
|
262
|
-
expect(results[0].user).to eq(
|
363
|
+
expect(results[0].user).to eq('')
|
263
364
|
expect(results[0].original).to eq(line)
|
264
365
|
end
|
265
366
|
|
266
367
|
it "includes invalid addresses only among valid addresses " do
|
267
368
|
line = "aaaa, xyz@example.com, bbbb"
|
268
369
|
results = MailAddress.parse(line)
|
269
|
-
expect(results[0].format).to eq(
|
370
|
+
expect(results[0].format).to eq('aaaa')
|
270
371
|
expect(results[0].address).to be_nil
|
271
|
-
expect(results[0].name).to eq(
|
272
|
-
expect(results[0].phrase).to eq(
|
372
|
+
expect(results[0].name).to eq('aaaa')
|
373
|
+
expect(results[0].phrase).to eq('aaaa')
|
273
374
|
expect(results[0].host).to be_nil
|
274
|
-
expect(results[0].user).to eq(
|
275
|
-
expect(results[0].original).to eq(
|
276
|
-
expect(results[1].format).to eq(
|
277
|
-
expect(results[1].address).to eq(
|
375
|
+
expect(results[0].user).to eq('')
|
376
|
+
expect(results[0].original).to eq('aaaa')
|
377
|
+
expect(results[1].format).to eq('xyz@example.com')
|
378
|
+
expect(results[1].address).to eq('xyz@example.com')
|
278
379
|
expect(results[1].name).to be_nil
|
279
|
-
expect(results[1].phrase).to eq(
|
280
|
-
expect(results[1].host).to eq(
|
281
|
-
expect(results[1].user).to eq(
|
282
|
-
expect(results[1].original).to eq(
|
283
|
-
expect(results[2].format).to eq(
|
380
|
+
expect(results[1].phrase).to eq('')
|
381
|
+
expect(results[1].host).to eq('example.com')
|
382
|
+
expect(results[1].user).to eq('xyz')
|
383
|
+
expect(results[1].original).to eq('xyz@example.com')
|
384
|
+
expect(results[2].format).to eq('bbbb')
|
284
385
|
expect(results[2].address).to be_nil
|
285
|
-
expect(results[2].name).to eq(
|
286
|
-
expect(results[2].phrase).to eq(
|
386
|
+
expect(results[2].name).to eq('bbbb')
|
387
|
+
expect(results[2].phrase).to eq('bbbb')
|
287
388
|
expect(results[2].host).to be_nil
|
288
|
-
expect(results[2].user).to eq(
|
289
|
-
expect(results[2].original).to eq(
|
389
|
+
expect(results[2].user).to eq('')
|
390
|
+
expect(results[2].original).to eq('bbbb')
|
290
391
|
end
|
291
392
|
|
292
393
|
it "a lot of types of undisclosed recipients" do
|
@@ -307,7 +408,7 @@ describe MailAddress do
|
|
307
408
|
expect(results[0].name).to eq(line)
|
308
409
|
expect(results[0].phrase).to eq(line)
|
309
410
|
expect(results[0].host).to be_nil
|
310
|
-
expect(results[0].user).to eq(
|
411
|
+
expect(results[0].user).to eq('')
|
311
412
|
expect(results[0].original).to eq(line)
|
312
413
|
end
|
313
414
|
|
@@ -323,7 +424,7 @@ describe MailAddress do
|
|
323
424
|
expect(results[0].name).to eq(line)
|
324
425
|
expect(results[0].phrase).to eq(line)
|
325
426
|
expect(results[0].host).to be_nil
|
326
|
-
expect(results[0].user).to eq(
|
427
|
+
expect(results[0].user).to eq('')
|
327
428
|
expect(results[0].original).to eq(line)
|
328
429
|
end
|
329
430
|
|
@@ -342,12 +443,12 @@ describe MailAddress do
|
|
342
443
|
it "specify mime-encoded address" do
|
343
444
|
line = "=?ISO-2022-JP?B?GyRCQmc6ZRsoQiAbJEJCQE86GyhC?= <osaka@example.jp>"
|
344
445
|
results = MailAddress.parse(line)
|
345
|
-
expect(results[0].format).to eq(
|
346
|
-
expect(results[0].address).to eq(
|
446
|
+
expect(results[0].format).to eq('=?ISO-2022-JP?B?GyRCQmc6ZRsoQiAbJEJCQE86GyhC?= <osaka@example.jp>')
|
447
|
+
expect(results[0].address).to eq('osaka@example.jp')
|
347
448
|
expect(results[0].name).to be_nil
|
348
|
-
expect(results[0].phrase).to eq(
|
349
|
-
expect(results[0].host).to eq(
|
350
|
-
expect(results[0].user).to eq(
|
449
|
+
expect(results[0].phrase).to eq('=?ISO-2022-JP?B?GyRCQmc6ZRsoQiAbJEJCQE86GyhC?=')
|
450
|
+
expect(results[0].host).to eq('example.jp')
|
451
|
+
expect(results[0].user).to eq('osaka')
|
351
452
|
expect(results[0].original).to eq(line)
|
352
453
|
end
|
353
454
|
|
@@ -365,7 +466,7 @@ describe MailAddress do
|
|
365
466
|
expect(results[0].name).to eq(line.strip)
|
366
467
|
expect(results[0].phrase).to eq(line)
|
367
468
|
expect(results[0].host).to be_nil
|
368
|
-
expect(results[0].user).to eq(
|
469
|
+
expect(results[0].user).to eq('')
|
369
470
|
expect(results[0].original).to eq(line)
|
370
471
|
end
|
371
472
|
end
|
@@ -426,7 +527,7 @@ describe MailAddress do
|
|
426
527
|
expect(results[0].address).to eq('john_doe@example.com')
|
427
528
|
expect(results[0].name).to be_nil
|
428
529
|
expect(results[0].phrase).to eq('')
|
429
|
-
expect(results[0].host).to eq(
|
530
|
+
expect(results[0].host).to eq('example.com')
|
430
531
|
expect(results[0].user).to eq('john_doe')
|
431
532
|
expect(results[0].original).to eq(line)
|
432
533
|
|
@@ -436,7 +537,7 @@ describe MailAddress do
|
|
436
537
|
expect(results[0].address).to eq('john.doe@example.com')
|
437
538
|
expect(results[0].name).to be_nil
|
438
539
|
expect(results[0].phrase).to eq('')
|
439
|
-
expect(results[0].host).to eq(
|
540
|
+
expect(results[0].host).to eq('example.com')
|
440
541
|
expect(results[0].user).to eq('john.doe')
|
441
542
|
expect(results[0].original).to eq(line)
|
442
543
|
end
|
@@ -455,7 +556,7 @@ describe MailAddress do
|
|
455
556
|
line = 'john <john@example.com> (last' # lack of right parenthesis
|
456
557
|
expect {
|
457
558
|
results = MailAddress.parse(line)
|
458
|
-
}.to raise_error(StandardError,
|
559
|
+
}.to raise_error(StandardError, 'cannot find end paren')
|
459
560
|
end
|
460
561
|
|
461
562
|
it "unbelievable but existed address" do
|
@@ -616,8 +717,8 @@ describe MailAddress do
|
|
616
717
|
# p "#{i} #{test_src}"
|
617
718
|
result = MailAddress.parse(test_src)[0]
|
618
719
|
|
619
|
-
result_format = result.format ||
|
620
|
-
result_name = result.name ||
|
720
|
+
result_format = result.format || ''
|
721
|
+
result_name = result.name || ''
|
621
722
|
|
622
723
|
expect(result_name).to eq(exp_name)
|
623
724
|
expect(result_format).to eq(exp_format)
|
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.2.
|
4
|
+
version: 1.2.6
|
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-
|
11
|
+
date: 2015-07-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -116,7 +116,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
116
116
|
version: '0'
|
117
117
|
requirements: []
|
118
118
|
rubyforge_project:
|
119
|
-
rubygems_version: 2.4.
|
119
|
+
rubygems_version: 2.4.5
|
120
120
|
signing_key:
|
121
121
|
specification_version: 4
|
122
122
|
summary: Simple Mail Address Parser
|