mail_address 1.1.0 → 1.1.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 02e966fc9f6878a8d0954ca5e658db596e581d15
4
- data.tar.gz: 108c96f94e4b19c9aee8c61ec52c4fe6cf896d5f
3
+ metadata.gz: 6c3df155a843a41e44b3cd71ead006d7b8eec109
4
+ data.tar.gz: e4c5a5226870fe2a2c6c711f4702d036e18077b3
5
5
  SHA512:
6
- metadata.gz: 477bdb94a6eba5ac3a302ae590bf4b926e0dd8f236c0d5cedf57112a5ccea8f058d6e391eff50000a317baba7f5c332eabe0606defab8d4cb333c9ff85268eed
7
- data.tar.gz: ca4c41bed4759fc726fe72bae286c897d5fd97f52fd6fe71abde8843864121ea047f82d13609b2527de9d8a359b190c2948f71c88f6f957c5f6fd79ed06e7cef
6
+ metadata.gz: 25b66af8271b90ac1bf4bb5578c1829639d8bc840b210223b50bb2f63d6981b92ff6ac0cc6bdf12fac0a03de22284551b917266e48475e02107f06587db0967f
7
+ data.tar.gz: 2f3a9775c6621af6a87e15f8c0c10ffee43843cec22d57418bca53304241c6ca9e4d6e8fa5195e8a13555727300958547277d2f8495e20955a70750904c15b78
@@ -2,18 +2,31 @@ module MailAddress
2
2
 
3
3
  class Address
4
4
 
5
- def initialize(phrase, address_, original)
5
+ attr_accessor :phrase, :address, :original
6
+
7
+ def initialize(phrase, address, original)
8
+
9
+ @address = address
6
10
  @phrase = phrase
7
- @address = address_
8
11
  @original = original
12
+
13
+ ### validate afterwords
14
+ # parse failed or invalid address
15
+ unless (@address && @original.include?(@address)) && Address._check_address_with_regex(@address)
16
+ @address = nil
17
+ end
18
+
19
+ # invalid address
20
+ if @address.nil? && (phrase.nil? || phrase == "")
21
+ @phrase = original
22
+ end
9
23
  end
10
- attr_accessor :phrase, :original
11
24
 
12
25
  ATEXT = '[\-\w !#$%&\'*+/=?^`{|}~]'
13
26
 
14
27
  def format
15
28
  addr = []
16
- return @original if address.nil?
29
+ return @original if @address.nil?
17
30
 
18
31
  if !@phrase.nil? && @phrase.length > 0 then
19
32
  if @phrase.match(/\A\(/) && @phrase.match(/\)\z/)
@@ -35,43 +48,18 @@ module MailAddress
35
48
 
36
49
  def name
37
50
  phrase = @phrase.dup
38
- addr = @address ? @address.dup : ""
39
-
40
51
  name = Address._extract_name(phrase)
41
-
42
- # first.last@domain address
43
- if (name == '') && (md = addr.match(/([^\%\.\@_]+([\._][^\%\.\@_]+)+)[\@\%]/)) then
44
- name = md[1]
45
- name.gsub!(/[\._]+/, ' ')
46
- name = Address._extract_name name
47
- end
48
-
49
- if (name == '' && addr.match(%r{/g=}i)) then # X400 style address
50
- f = addr.match(%r{g=([^/]*)}i)
51
- l = addr.match(%r{s=([^/]*)}i)
52
- name = Address._extract_name "#{f[1]} #{l[1]}"
53
- end
54
-
55
52
  name.length > 0 ? name : nil
56
53
  end
57
54
 
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
-
67
55
  def host
68
- addr = address || '';
56
+ addr = @address || '';
69
57
  i = addr.rindex('@')
70
58
  i.nil? ? nil : addr[i + 1 .. -1]
71
59
  end
72
60
 
73
61
  def user
74
- addr = address || '';
62
+ addr = @address || '';
75
63
  i = addr.rindex('@')
76
64
  i.nil? ? addr : addr[0 ... i]
77
65
  end
@@ -106,6 +94,13 @@ module MailAddress
106
94
  name
107
95
  end
108
96
 
97
+ # check if the address is compliant with RFC2822
98
+ def self._check_address_with_regex(email_address)
99
+ return nil unless email_address
100
+ # regex check (see http://blog.livedoor.jp/dankogai/archives/51189905.html)
101
+ email_address.match(/^(?:(?:(?:(?:[a-zA-Z0-9_!#\$\%&'*+\/=?\^`{}~|\-]+)(?:\.(?:[a-zA-Z0-9_!#\$\%&'*+\/=?\^`{}~|\-]+))*)|(?:"(?:\\[^\r\n]|[^\\"])*")))\@(?:(?:(?:(?:[a-zA-Z0-9_!#\$\%&'*+\/=?\^`{}~|\-]+)(?:\.(?:[a-zA-Z0-9_!#\$\%&'*+\/=?\^`{}~|\-]+))*)|(?:\[(?:\\\S|[\x21-\x5a\x5e-\x7e])*\])))$/)
102
+ end
103
+
109
104
  end
110
105
 
111
106
  end
@@ -10,7 +10,7 @@ module MailAddress
10
10
  return [ MailAddress::Address.new(line, nil, line) ]
11
11
  end
12
12
 
13
- # obviously invalid email address
13
+ # obviously all email address(es) are invalid
14
14
  unless line.match(/[a-z0-9\.\-"_\+]@/i)
15
15
  return [ MailAddress::Address.new(line, nil, line) ]
16
16
  end
@@ -1,3 +1,3 @@
1
1
  module MailAddress
2
- VERSION = "1.1.0"
2
+ VERSION = "1.1.1"
3
3
  end
@@ -170,7 +170,7 @@ describe MailAddress do
170
170
  end
171
171
 
172
172
  it "normal case (multiple address)" do
173
- line = "John 'M' Doe <john@example.com>, 大阪 太郎 <osaka@example.jp>"
173
+ line = "John 'M' Doe <john@example.com>, 大阪 太郎 <osaka@example.jp>, localpartonly"
174
174
  results = MailAddress.parse(line)
175
175
 
176
176
  expect(results[0].format).to eq("John 'M' Doe <john@example.com>")
@@ -190,6 +190,14 @@ describe MailAddress do
190
190
  expect(results[1].host).to eq("example.jp")
191
191
  expect(results[1].user).to eq("osaka")
192
192
  expect(results[1].original).to eq('大阪 太郎 <osaka@example.jp>')
193
+
194
+ expect(results[2].format).to eq("localpartonly")
195
+ expect(results[2].address).to be_nil
196
+ expect(results[2].name).to eq("localpartonly")
197
+ expect(results[2].phrase).to eq("localpartonly")
198
+ expect(results[2].host).to be_nil
199
+ expect(results[2].user).to eq("")
200
+ expect(results[2].original).to eq("localpartonly")
193
201
  end
194
202
 
195
203
  it "normal case (rfc-violated(RFC822) but commonly used in AU/DoCoMo)" do
@@ -359,6 +367,28 @@ describe MailAddress do
359
367
  expect(results[0].original).to eq('') # Note that it returns empty string NOT nil
360
368
  end
361
369
 
370
+ it "suppress too much extraction" do
371
+ line = 'john_doe@example.com'
372
+ results = MailAddress.parse(line)
373
+ expect(results[0].format).to eq('john_doe@example.com')
374
+ expect(results[0].address).to eq('john_doe@example.com')
375
+ expect(results[0].name).to be_nil
376
+ expect(results[0].phrase).to eq('')
377
+ expect(results[0].host).to eq("example.com")
378
+ expect(results[0].user).to eq('john_doe')
379
+ expect(results[0].original).to eq(line)
380
+
381
+ line = 'john.doe@example.com'
382
+ results = MailAddress.parse(line)
383
+ expect(results[0].format).to eq('john.doe@example.com')
384
+ expect(results[0].address).to eq('john.doe@example.com')
385
+ expect(results[0].name).to be_nil
386
+ expect(results[0].phrase).to eq('')
387
+ expect(results[0].host).to eq("example.com")
388
+ expect(results[0].user).to eq('john.doe')
389
+ expect(results[0].original).to eq(line)
390
+ end
391
+
362
392
  it "corrupted address" do
363
393
  line = 'john <john@example.com' # lack of right angle bracket
364
394
  expect {
@@ -466,9 +496,9 @@ describe MailAddress do
466
496
  ['Clive Bittlestone <clyvb@asic.sc.ti.com>',
467
497
  'Clive Bittlestone <clyvb@asic.sc.ti.com>',
468
498
  'Clive Bittlestone'],
469
- ['Graham.Barr@tiuk.ti.com',
470
- 'Graham.Barr@tiuk.ti.com',
471
- 'Graham Barr'],
499
+ # ['Graham.Barr@tiuk.ti.com',
500
+ # 'Graham.Barr@tiuk.ti.com',
501
+ # 'Graham Barr'],
472
502
  # ['"Graham Bisset, UK Net Support, +44 224 728109" <GRAHAM@dyce.wireline.slb.com.ti.com.>',
473
503
  # '"Graham Bisset, UK Net Support, +44 224 728109" <GRAHAM@dyce.wireline.slb.com.ti.com.>',
474
504
  # 'Graham Bisset'],
@@ -481,9 +511,9 @@ describe MailAddress do
481
511
  # ['a909062@node_cb83.node_cb83 (Colin Maytum (0013 bro5))',
482
512
  # 'a909062@node_cb83.node_cb83 (Colin Maytum (0013 bro5))',
483
513
  # 'Colin Maytum'],
484
- ['Derek.Roskell%dero@msg.ti.com',
485
- 'Derek.Roskell%dero@msg.ti.com',
486
- 'Derek Roskell'],
514
+ # ['Derek.Roskell%dero@msg.ti.com',
515
+ # 'Derek.Roskell%dero@msg.ti.com',
516
+ # 'Derek Roskell'],
487
517
  # ['":sysmail"@ Some-Group. Some-Org, Muhammed.(I am the greatest) Ali @(the)Vegas.WBA',
488
518
  # '":sysmail"@Some-Group.Some-Org',
489
519
  # ''],
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.1.0
4
+ version: 1.1.1
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-16 00:00:00.000000000 Z
11
+ date: 2015-04-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler