email_assessor 0.9.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (111) hide show
  1. checksums.yaml +4 -4
  2. data/assets/data/blacklisted_domains/_prioritization.txt +1 -0
  3. data/assets/data/disposable_domains/0.txt +723 -0
  4. data/assets/data/disposable_domains/1.txt +1500 -0
  5. data/assets/data/disposable_domains/2.txt +1267 -0
  6. data/assets/data/disposable_domains/3.txt +1078 -0
  7. data/assets/data/disposable_domains/4.txt +854 -0
  8. data/assets/data/disposable_domains/5.txt +793 -0
  9. data/assets/data/disposable_domains/6.txt +900 -0
  10. data/assets/data/disposable_domains/7.txt +787 -0
  11. data/assets/data/disposable_domains/8.txt +979 -0
  12. data/assets/data/disposable_domains/9.txt +843 -0
  13. data/assets/data/disposable_domains/_prioritization.txt +1 -0
  14. data/assets/data/disposable_domains/a.txt +10167 -0
  15. data/assets/data/disposable_domains/b.txt +10443 -0
  16. data/assets/data/disposable_domains/c.txt +10152 -0
  17. data/assets/data/disposable_domains/d.txt +7619 -0
  18. data/assets/data/disposable_domains/e.txt +5689 -0
  19. data/assets/data/disposable_domains/f.txt +6375 -0
  20. data/assets/data/disposable_domains/g.txt +6309 -0
  21. data/assets/data/disposable_domains/h.txt +6204 -0
  22. data/assets/data/disposable_domains/i.txt +4814 -0
  23. data/assets/data/disposable_domains/j.txt +3163 -0
  24. data/assets/data/disposable_domains/k.txt +4308 -0
  25. data/assets/data/disposable_domains/l.txt +5903 -0
  26. data/assets/data/disposable_domains/m.txt +11177 -0
  27. data/assets/data/disposable_domains/n.txt +4895 -0
  28. data/assets/data/disposable_domains/o.txt +4161 -0
  29. data/assets/data/disposable_domains/p.txt +8264 -0
  30. data/assets/data/disposable_domains/q.txt +1493 -0
  31. data/assets/data/disposable_domains/r.txt +6199 -0
  32. data/assets/data/disposable_domains/s.txt +12775 -0
  33. data/assets/data/disposable_domains/t.txt +9496 -0
  34. data/assets/data/disposable_domains/u.txt +2662 -0
  35. data/assets/data/disposable_domains/v.txt +3766 -0
  36. data/assets/data/disposable_domains/w.txt +4633 -0
  37. data/assets/data/disposable_domains/x.txt +2449 -0
  38. data/assets/data/disposable_domains/y.txt +2278 -0
  39. data/assets/data/disposable_domains/z.txt +2035 -0
  40. data/assets/data/disposable_domains//351/231/270.txt +1 -0
  41. data/assets/data/disposable_domains//353/234/203.txt +1 -0
  42. data/assets/data/educational_domains/5.txt +1 -0
  43. data/assets/data/educational_domains/_prioritization.txt +1 -0
  44. data/assets/data/educational_domains/a.txt +232 -0
  45. data/assets/data/educational_domains/b.txt +112 -0
  46. data/assets/data/educational_domains/c.txt +126 -0
  47. data/assets/data/educational_domains/d.txt +90 -0
  48. data/assets/data/educational_domains/e.txt +331 -0
  49. data/assets/data/educational_domains/f.txt +156 -0
  50. data/assets/data/educational_domains/g.txt +75 -0
  51. data/assets/data/educational_domains/h.txt +147 -0
  52. data/assets/data/educational_domains/i.txt +179 -0
  53. data/assets/data/educational_domains/j.txt +26 -0
  54. data/assets/data/educational_domains/k.txt +142 -0
  55. data/assets/data/educational_domains/l.txt +88 -0
  56. data/assets/data/educational_domains/m.txt +155 -0
  57. data/assets/data/educational_domains/n.txt +98 -0
  58. data/assets/data/educational_domains/o.txt +39 -0
  59. data/assets/data/educational_domains/p.txt +128 -0
  60. data/assets/data/educational_domains/q.txt +4 -0
  61. data/assets/data/educational_domains/r.txt +69 -0
  62. data/assets/data/educational_domains/s.txt +251 -0
  63. data/assets/data/educational_domains/t.txt +146 -0
  64. data/assets/data/educational_domains/u.txt +975 -0
  65. data/assets/data/educational_domains/v.txt +78 -0
  66. data/assets/data/educational_domains/w.txt +59 -0
  67. data/assets/data/educational_domains/x.txt +1 -0
  68. data/assets/data/educational_domains/y.txt +17 -0
  69. data/assets/data/educational_domains/z.txt +13 -0
  70. data/assets/data/fastpass_domains/_prioritization.txt +1 -0
  71. data/assets/data/fastpass_domains/a.txt +2 -0
  72. data/assets/data/fastpass_domains/c.txt +3 -0
  73. data/assets/data/fastpass_domains/d.txt +1 -0
  74. data/assets/data/fastpass_domains/f.txt +1 -0
  75. data/assets/data/fastpass_domains/g.txt +5 -0
  76. data/assets/data/fastpass_domains/h.txt +33 -0
  77. data/assets/data/fastpass_domains/i.txt +1 -0
  78. data/assets/data/fastpass_domains/l.txt +6 -0
  79. data/assets/data/fastpass_domains/m.txt +4 -0
  80. data/assets/data/fastpass_domains/o.txt +28 -0
  81. data/assets/data/fastpass_domains/p.txt +3 -0
  82. data/assets/data/fastpass_domains/r.txt +1 -0
  83. data/assets/data/fastpass_domains/s.txt +3 -0
  84. data/assets/data/fastpass_domains/t.txt +1 -0
  85. data/assets/data/fastpass_domains/w.txt +2 -0
  86. data/assets/data/fastpass_domains/y.txt +42 -0
  87. data/lib/email_assessor/address.rb +8 -17
  88. data/lib/email_assessor/directory_domain_list.rb +51 -0
  89. data/lib/email_assessor/domain_token_set.rb +46 -0
  90. data/lib/email_assessor/email_validator.rb +0 -16
  91. data/lib/email_assessor/empty_domain_list.rb +23 -0
  92. data/lib/email_assessor/file_domain_list.rb +23 -0
  93. data/lib/email_assessor/version.rb +1 -1
  94. data/lib/email_assessor.rb +59 -25
  95. metadata +94 -22
  96. data/.gitignore +0 -18
  97. data/.travis.yml +0 -9
  98. data/CHANGELOG.md +0 -9
  99. data/Gemfile +0 -4
  100. data/LICENSE.txt +0 -22
  101. data/README.md +0 -132
  102. data/Rakefile +0 -10
  103. data/email_assessor.gemspec +0 -31
  104. data/gemfiles/activemodel4.gemfile +0 -5
  105. data/pull_mailchecker_emails.rb +0 -21
  106. data/spec/email_assessor_spec.rb +0 -209
  107. data/spec/spec_helper.rb +0 -19
  108. data/vendor/disposable_domains.txt +0 -56944
  109. data/vendor/educational_domains.txt +0 -3697
  110. data/vendor/fastpass_domains.txt +0 -136
  111. /data/{vendor/blacklisted_domains.txt → assets/data/blacklisted_domains/b.txt} +0 -0
@@ -0,0 +1,78 @@
1
+ va.lv
2
+ valahia.ro
3
+ valleystudent.org
4
+ vaniercollege.qc.ca
5
+ vansd.org
6
+ vbu.co.in
7
+ vbu.se
8
+ vcc.ca
9
+ vdu.lt
10
+ veda-edu.com
11
+ venturaedu.org
12
+ ver.ucc.mx
13
+ vern.hr
14
+ vet-alfort.fr
15
+ vet-lyon.fr
16
+ vet-nantes.fr
17
+ veths.no
18
+ vfrta.ru
19
+ vfu.bg
20
+ vfu.cz
21
+ vgafk.ru
22
+ vgasa.ru
23
+ vgmu.vitebsk.by
24
+ vgta.vrn.ru
25
+ vgtu.lt
26
+ victoria-uni.ch
27
+ victoryedu.com
28
+ vicu.utoronto.ca
29
+ vieup.ru
30
+ vignanuniversity.org
31
+ vikramuniversity.org
32
+ vinayakamissions.com
33
+ vineland.org
34
+ vkgu.kz
35
+ vksu-ara.org
36
+ vlekho.be
37
+ vlerick.be
38
+ vlsu.ru
39
+ vmchs.com
40
+ vnmu.vn.ua
41
+ voenmeh.ru
42
+ volsu.ru
43
+ vorskoler.com
44
+ vorskoler.net
45
+ vpu.lt
46
+ vsau.ru
47
+ vsavm.com
48
+ vsb.cz
49
+ vscht.cz
50
+ vsci.cz
51
+ vse.cz
52
+ vsgaki.burnet.ru
53
+ vsgtu.eastsib.ru
54
+ vslib.cz
55
+ vsm.sk
56
+ vsma.info
57
+ vsmu.sk
58
+ vsp.cz
59
+ vspu.kirov.ru
60
+ vspu.ru
61
+ vssladkovicovo.sk
62
+ vssvalzbety.sk
63
+ vstu.ru
64
+ vstu.vinnica.ua
65
+ vstu.vitebsk.by
66
+ vsu.by
67
+ vsu.ru
68
+ vsvu.sk
69
+ vu.lt
70
+ vu.nl
71
+ vub.be
72
+ vumk.eu
73
+ vusd.us
74
+ vut.cz
75
+ vutbr.cz
76
+ vvsd.org
77
+ vvsu.ru
78
+ vxu.se
@@ -0,0 +1,59 @@
1
+ wabash348.com
2
+ wageningenuniversity.nl
3
+ waitakerecollege.school.nz
4
+ wakf.org
5
+ warrenk12nc.org
6
+ warrensd.org
7
+ washk12.org
8
+ watfordboys.org
9
+ wbuafs.nic.in
10
+ wbut.net
11
+ wcs-g.com
12
+ wcusd.net
13
+ wdsdjxy.com
14
+ web.prover.com.br
15
+ webs.satlink.com
16
+ webster.ch
17
+ wenk.be
18
+ westburyschools.org
19
+ westcoastuniversity-edu.com
20
+ westcoastuniversity.bz
21
+ westfieldacademy.co.uk
22
+ westhillscollege.com
23
+ westmorelandschool.org
24
+ westorangeschools.org
25
+ whu-koblenz.de
26
+ williamgilbert.co.uk
27
+ willistonschools.org
28
+ wilsonk12tn.us
29
+ windesheim.nl
30
+ wit.ie
31
+ wittenborg.eu
32
+ wiut.uz
33
+ wkau.kz
34
+ wlodkowic.pl
35
+ wlu.ca
36
+ wmsd.net
37
+ wmu.se
38
+ worcesterschools.net
39
+ wpsstudent.com
40
+ wsb.poznan.pl
41
+ wsb.toi.tarnow.pl
42
+ wsdoc.me
43
+ wsei.lublin.pl
44
+ wsiz.rzeszow.pl
45
+ wsm.gdynia.pl
46
+ wsm.szczecin.pl
47
+ wsp.bydgoszcz.pl
48
+ wsp.czest.pl
49
+ wsp.krakow.pl
50
+ wsp.slupsk.pl
51
+ wsp.zgora.pl
52
+ wsps.waw.pl
53
+ wsub.waw.pl
54
+ wsz.pl
55
+ wszib.krakow.pl
56
+ wvu.edu
57
+ wwu.de
58
+ www2.mozcom.com
59
+ wzmu.net
@@ -0,0 +1 @@
1
+ xza.cn
@@ -0,0 +1,17 @@
1
+ yandex.ru
2
+ yarmouthschools.org
3
+ ycdsbk12.ca
4
+ ycmou.com
5
+ yizhuan.com
6
+ yorku.ca
7
+ yppsb.id
8
+ yrdsb.ca
9
+ ysmu.am
10
+ ysparmaruniversity.org
11
+ yspu.yar.ru
12
+ ystu.yar.ru
13
+ ysu.am
14
+ ysu.ru
15
+ yukoncollege.yk.ca
16
+ yuniv.net
17
+ yznu.cn
@@ -0,0 +1,13 @@
1
+ zcu.cz
2
+ zdsoft.com.cn
3
+ zetechcollege.com
4
+ zgfxy.cn
5
+ zhaw.ch
6
+ zhdk.ch
7
+ zhezu.kz
8
+ zhgu.kz
9
+ zhwin.ch
10
+ znuel.net
11
+ zpsb.szczecin.pl
12
+ zsem.hr
13
+ zuyd.nl
@@ -0,0 +1 @@
1
+ dfirtawcpsmglohy
@@ -0,0 +1,2 @@
1
+ aol.com
2
+ att.net
@@ -0,0 +1,3 @@
1
+ citromail.hu
2
+ comcast.net
3
+ cox.net
@@ -0,0 +1 @@
1
+ duck.com
@@ -0,0 +1 @@
1
+ fastmail.com
@@ -0,0 +1,5 @@
1
+ gmail.com
2
+ gmx.at
3
+ gmx.de
4
+ gmx.fr
5
+ googlemail.com
@@ -0,0 +1,33 @@
1
+ hotmail.be
2
+ hotmail.ca
3
+ hotmail.ch
4
+ hotmail.cl
5
+ hotmail.co.id
6
+ hotmail.co.jp
7
+ hotmail.co.kr
8
+ hotmail.co.nz
9
+ hotmail.co.th
10
+ hotmail.co.uk
11
+ hotmail.co.za
12
+ hotmail.com
13
+ hotmail.com.ar
14
+ hotmail.com.au
15
+ hotmail.com.br
16
+ hotmail.com.tr
17
+ hotmail.com.tw
18
+ hotmail.de
19
+ hotmail.dk
20
+ hotmail.es
21
+ hotmail.fi
22
+ hotmail.fr
23
+ hotmail.gr
24
+ hotmail.hu
25
+ hotmail.it
26
+ hotmail.my
27
+ hotmail.nl
28
+ hotmail.no
29
+ hotmail.ph
30
+ hotmail.rs
31
+ hotmail.se
32
+ hotmail.sg
33
+ hotmail.sk
@@ -0,0 +1 @@
1
+ icloud.com
@@ -0,0 +1,6 @@
1
+ live.co.uk
2
+ live.com
3
+ live.com.mx
4
+ live.de
5
+ live.fr
6
+ live.nl
@@ -0,0 +1,4 @@
1
+ mail.com
2
+ mail.ru
3
+ me.com
4
+ msn.com
@@ -0,0 +1,28 @@
1
+ o2.pl
2
+ orange.fr
3
+ outlook.at
4
+ outlook.be
5
+ outlook.co.id
6
+ outlook.co.nz
7
+ outlook.co.th
8
+ outlook.com
9
+ outlook.com.ar
10
+ outlook.com.au
11
+ outlook.com.br
12
+ outlook.com.tr
13
+ outlook.com.vn
14
+ outlook.cz
15
+ outlook.de
16
+ outlook.dk
17
+ outlook.es
18
+ outlook.fr
19
+ outlook.hu
20
+ outlook.in
21
+ outlook.it
22
+ outlook.jp
23
+ outlook.kr
24
+ outlook.ph
25
+ outlook.pt
26
+ outlook.sa
27
+ outlook.sg
28
+ outlook.sk
@@ -0,0 +1,3 @@
1
+ pm.me
2
+ proton.me
3
+ protonmail.com
@@ -0,0 +1 @@
1
+ rocketmail.com
@@ -0,0 +1,3 @@
1
+ sbcglobal.net
2
+ seznam.cz
3
+ simplelogin.com
@@ -0,0 +1 @@
1
+ tuta.io
@@ -0,0 +1,2 @@
1
+ web.de
2
+ wp.pl
@@ -0,0 +1,42 @@
1
+ yahoo.at
2
+ yahoo.be
3
+ yahoo.ca
4
+ yahoo.cl
5
+ yahoo.co.id
6
+ yahoo.co.in
7
+ yahoo.co.jp
8
+ yahoo.co.nz
9
+ yahoo.co.th
10
+ yahoo.co.uk
11
+ yahoo.co.za
12
+ yahoo.com
13
+ yahoo.com.ar
14
+ yahoo.com.au
15
+ yahoo.com.br
16
+ yahoo.com.co
17
+ yahoo.com.hk
18
+ yahoo.com.hr
19
+ yahoo.com.mx
20
+ yahoo.com.my
21
+ yahoo.com.ph
22
+ yahoo.com.sg
23
+ yahoo.com.tw
24
+ yahoo.com.ve
25
+ yahoo.com.vn
26
+ yahoo.de
27
+ yahoo.dk
28
+ yahoo.es
29
+ yahoo.fr
30
+ yahoo.gr
31
+ yahoo.hu
32
+ yahoo.ie
33
+ yahoo.in
34
+ yahoo.it
35
+ yahoo.ne.jp
36
+ yahoo.nl
37
+ yahoo.no
38
+ yahoo.pl
39
+ yahoo.ro
40
+ yahoo.se
41
+ yandex.com
42
+ ymail.com
@@ -115,38 +115,25 @@ module EmailAssessor
115
115
  end
116
116
 
117
117
  def disposable?
118
- domain_in_file?(EmailAssessor::DISPOSABLE_DOMAINS_FILE_NAME)
118
+ domain_in_list?(EmailAssessor.disposable_domains)
119
119
  end
120
120
 
121
121
  def blacklisted?
122
- domain_in_file?(EmailAssessor::BLACKLISTED_DOMAINS_FILE_NAME)
122
+ domain_in_list?(EmailAssessor.blacklisted_domains)
123
123
  end
124
124
 
125
125
  def educational?
126
- domain_in_file?(EmailAssessor::EDUCATIONAL_DOMAINS_FILE_NAME)
126
+ domain_in_list?(EmailAssessor.educational_domains)
127
127
  end
128
128
 
129
129
  def fastpass?
130
- domain_in_file?(EmailAssessor::FASTPASS_DOMAINS_FILE_NAME)
131
- end
132
-
133
- def domain_in_file?(filename)
134
- valid? && EmailAssessor.any_token_in_file?(domain_tokens, filename)
130
+ domain_in_list?(EmailAssessor.fastpass_domains)
135
131
  end
136
132
 
137
133
  def valid_mx?
138
134
  valid? && mx_servers.any?
139
135
  end
140
136
 
141
- def mx_server_is_in?(domain_list_file)
142
- mx_servers.any? do |mx_server|
143
- return false unless mx_server.respond_to?(:exchange)
144
- mx_server = mx_server.exchange.to_s
145
-
146
- EmailAssessor.domain_in_file?(mx_server, domain_list_file)
147
- end
148
- end
149
-
150
137
  def mx_servers
151
138
  @mx_servers ||= Resolv::DNS.open do |dns|
152
139
  mx_servers = dns.getresources(@address.domain, Resolv::DNS::Resource::IN::MX)
@@ -157,6 +144,10 @@ module EmailAssessor
157
144
 
158
145
  private
159
146
 
147
+ def domain_in_list?(list)
148
+ valid? && list.include_any?(domain_tokens)
149
+ end
150
+
160
151
  def domain_tokens
161
152
  @domain_tokens ||= EmailAssessor.tokenize_domain(@address.domain)
162
153
  end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EmailAssessor
4
+ class DirectoryDomainList
5
+ attr_reader :pathname
6
+
7
+ def include_any?(domain_token_set)
8
+ chars = if @prioritization.present?
9
+ @prioritization
10
+ else
11
+ domain_token_set.indexes
12
+ end
13
+
14
+ chars.any? { |char| domain_list(char).include_any?(domain_token_set) }
15
+ end
16
+
17
+ def sample
18
+ File.open(Dir.glob(File.join(@pathname, "?.txt")).first, &:readline).chomp
19
+ end
20
+
21
+ private
22
+
23
+ def initialize(pathname)
24
+ prioritization_file_name = File.join(pathname, "_prioritization.txt")
25
+
26
+ @prioritization = File.read(prioritization_file_name).split("").freeze if File.exist?(prioritization_file_name)
27
+ @pathname = pathname
28
+ @file_map = {
29
+ # {first_char} => FileDomainList | nil
30
+ }
31
+ end
32
+
33
+ def domain_list(char)
34
+ cached = @file_map[char]
35
+
36
+ return cached unless cached.nil?
37
+
38
+ file_name = File.join(@pathname, "#{char}.txt")
39
+
40
+ domain_list = if File.file?(file_name)
41
+ FileDomainList.new(file_name)
42
+ else
43
+ EmptyDomainList.instance
44
+ end
45
+
46
+ @file_map[char] = domain_list
47
+
48
+ domain_list
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EmailAssessor
4
+ class DomainTokenSet
5
+ class << self
6
+ def parse(domain)
7
+ parts = domain.downcase.split(".")
8
+ indexed_tokens = {
9
+ # {first_char} => { {segment} => nil }
10
+ }
11
+
12
+ parts.length.times do
13
+ segment = parts.join(".").freeze
14
+
15
+ (indexed_tokens[segment.chr] ||= Hash.new)[segment] = nil
16
+
17
+ parts.shift
18
+ end
19
+
20
+ indexed_tokens.each_value(&:freeze)
21
+ indexed_tokens.freeze
22
+
23
+ new(indexed_tokens)
24
+ end
25
+ end
26
+
27
+ def include?(domain)
28
+ tokens_of_char = @indexed_tokens[domain.chr]
29
+
30
+ return false if tokens_of_char.nil?
31
+
32
+ tokens_of_char.key?(domain)
33
+ end
34
+
35
+ def indexes
36
+ @indexes ||= @indexed_tokens.keys
37
+ end
38
+
39
+ private
40
+
41
+ def initialize(indexed_tokens)
42
+ @indexed_tokens = indexed_tokens
43
+ @indexes = nil # Shape friendliness
44
+ end
45
+ end
46
+ end
@@ -58,21 +58,5 @@ class EmailValidator < ActiveModel::EachValidator
58
58
  if options[:educational]
59
59
  error(record, attribute, error_type(:educational, options)) && return if address.educational?
60
60
  end
61
-
62
- # if options[:domain_not_in]
63
- # matched_blocklist = options[:domain_not_in].select do |entry|
64
- # unless entry.key?(:blocklist)
65
- # fail "domain_not_in entries must be in format { blocklist: \"filename\"[, message: symbol|string] }"
66
- # end
67
-
68
- # next unless address.domain_in_blocklist?(entry[:blocklist])
69
-
70
- # error(record, attribute, entry[:message])
71
-
72
- # true
73
- # end
74
-
75
- # return if matched_blocklist
76
- # end
77
61
  end
78
62
  end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EmailAssessor
4
+ class EmptyDomainList
5
+ class << self
6
+ def instance
7
+ @instance ||= new
8
+ end
9
+ end
10
+
11
+ def include_any?(*)
12
+ false
13
+ end
14
+
15
+ def sample
16
+ nil
17
+ end
18
+
19
+ def pathname
20
+ nil
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EmailAssessor
4
+ class FileDomainList
5
+ attr_reader :pathname
6
+
7
+ def include_any?(domain_token_set)
8
+ File.foreach(@pathname, chomp: true).any? do |domain|
9
+ domain_token_set.include?(domain)
10
+ end
11
+ end
12
+
13
+ def sample
14
+ File.open(@pathname, &:readline).chomp
15
+ end
16
+
17
+ private
18
+
19
+ def initialize(pathname)
20
+ @pathname = pathname
21
+ end
22
+ end
23
+ end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module EmailAssessor
3
- VERSION = "0.9.1"
3
+ VERSION = "1.0.0"
4
4
  end
@@ -1,41 +1,75 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require "email_assessor/email_validator"
4
+ require "email_assessor/directory_domain_list"
5
+ require "email_assessor/file_domain_list"
6
+ require "email_assessor/empty_domain_list"
7
+ require "email_assessor/domain_token_set"
3
8
 
4
9
  module EmailAssessor
5
- DISPOSABLE_DOMAINS_FILE_NAME = File.expand_path("../../vendor/disposable_domains.txt", __FILE__)
6
- FASTPASS_DOMAINS_FILE_NAME = File.expand_path("../../vendor/fastpass_domains.txt", __FILE__)
7
- EDUCATIONAL_DOMAINS_FILE_NAME = File.expand_path("../../vendor/educational_domains.txt", __FILE__)
8
- BLACKLISTED_DOMAINS_FILE_NAME = File.expand_path("vendor/blacklisted_domains.txt")
10
+ class << self
11
+ def tokenize_domain(domain)
12
+ EmailAssessor::DomainTokenSet.parse(domain)
13
+ end
9
14
 
10
- def self.domain_is_disposable?(domain)
11
- domain_in_file?(domain, DISPOSABLE_DOMAINS_FILE_NAME)
12
- end
15
+ def [](pathname)
16
+ @domain_list_cache ||= {
17
+ # {pathname} => {domain list}
18
+ }
13
19
 
14
- def self.domain_is_blacklisted?(domain)
15
- domain_in_file?(domain, BLACKLISTED_DOMAINS_FILE_NAME)
16
- end
20
+ return @domain_list_cache[pathname] if @domain_list_cache.key?(pathname)
17
21
 
18
- def self.domain_in_file?(domain, file_name)
19
- any_token_in_file?(tokenize_domain(domain), file_name)
20
- end
22
+ list = if File.directory?(pathname)
23
+ DirectoryDomainList.new(pathname)
24
+ elsif File.file?(pathname)
25
+ FileDomainList.new(pathname)
26
+ end
21
27
 
22
- def self.any_token_in_file?(domain_tokens, file_name)
23
- file_name ||= ""
28
+ @domain_list_cache[pathname] = list
24
29
 
25
- File.foreach(file_name, chomp: true).any? do |line|
26
- domain_tokens.key?(line)
30
+ list
27
31
  end
28
- end
29
32
 
30
- def self.tokenize_domain(domain)
31
- parts = domain.downcase.split(".")
32
- tokens = {}
33
+ def disposable_domains
34
+ @disposable_domains ||= default_domain_list("disposable_domains")
35
+ end
36
+
37
+ def disposable_domains=(pathname)
38
+ @disposable_domains = self[pathname]
39
+ end
40
+
41
+ def blacklisted_domains
42
+ @blacklisted_domains ||= default_domain_list("blacklisted_domains")
43
+ end
33
44
 
34
- parts.length.times do
35
- tokens[parts.join(".")] = nil
36
- parts.shift
45
+ def blacklisted_domains=(pathname)
46
+ @blacklisted_domains = self[pathname]
37
47
  end
38
48
 
39
- tokens
49
+ def educational_domains
50
+ @educational_domains ||= default_domain_list("educational_domains")
51
+ end
52
+
53
+ def educational_domains=(pathname)
54
+ @educational_domains = self[pathname]
55
+ end
56
+
57
+ def fastpass_domains
58
+ @fastpass_domains ||= default_domain_list("fastpass_domains")
59
+ end
60
+
61
+ def fastpass_domains=(pathname)
62
+ @fastpass_domains = self[pathname]
63
+ end
64
+
65
+ private
66
+
67
+ def default_domain_list(category)
68
+ self[File.expand_path("../../vendor/#{category}.txt", __FILE__)] ||
69
+ self[File.expand_path("../../vendor/#{category}", __FILE__)] ||
70
+ self[File.expand_path("../../assets/data/#{category}.txt", __FILE__)] ||
71
+ self[File.expand_path("../../assets/data/#{category}", __FILE__)] ||
72
+ EmptyDomainList.instance
73
+ end
40
74
  end
41
75
  end