email_address 0.0.3 → 0.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/.travis.yml +10 -0
- data/Gemfile +0 -1
- data/README.md +451 -197
- data/Rakefile +4 -9
- data/email_address.gemspec +9 -5
- data/lib/email_address.rb +55 -24
- data/lib/email_address/active_record_validator.rb +5 -5
- data/lib/email_address/address.rb +152 -72
- data/lib/email_address/canonical_email_address_type.rb +46 -0
- data/lib/email_address/config.rb +148 -64
- data/lib/email_address/email_address_type.rb +15 -31
- data/lib/email_address/exchanger.rb +31 -34
- data/lib/email_address/host.rb +327 -51
- data/lib/email_address/local.rb +304 -52
- data/lib/email_address/version.rb +1 -1
- data/test/activerecord/test_ar.rb +22 -0
- data/test/activerecord/user.rb +71 -0
- data/test/email_address/test_address.rb +53 -27
- data/test/email_address/test_config.rb +23 -8
- data/test/email_address/test_exchanger.rb +22 -10
- data/test/email_address/test_host.rb +47 -6
- data/test/email_address/test_local.rb +80 -16
- data/test/test_email_address.rb +38 -4
- data/test/test_helper.rb +7 -5
- metadata +68 -34
- data/lib/email_address/domain_matcher.rb +0 -98
- data/lib/email_address/domain_parser.rb +0 -69
- data/lib/email_address/matcher.rb +0 -119
- data/lib/email_address/validator.rb +0 -141
- data/test/email_address/test_domain_matcher.rb +0 -21
- data/test/email_address/test_domain_parser.rb +0 -29
- data/test/email_address/test_matcher.rb +0 -44
- data/test/email_address/test_validator.rb +0 -16
data/test/test_email_address.rb
CHANGED
@@ -5,13 +5,47 @@ class TestEmailAddress < MiniTest::Test
|
|
5
5
|
|
6
6
|
def test_new
|
7
7
|
a = EmailAddress.new('user@example.com')
|
8
|
-
assert_equal a.local.to_s
|
9
|
-
assert_equal a.host.to_s
|
8
|
+
assert_equal 'user', a.local.to_s
|
9
|
+
assert_equal 'example.com', a.host.to_s
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_canonical
|
13
|
+
assert_equal "firstlast@gmail.com", EmailAddress.canonical('First.Last+TAG@gmail.com')
|
14
|
+
a = EmailAddress.new_canonical('First.Last+TAG@gmail.com')
|
15
|
+
assert_equal 'firstlast', a.local.to_s
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_normal
|
19
|
+
assert_equal 'user+tag@gmail.com', EmailAddress.normal('USER+TAG@GMAIL.com')
|
10
20
|
end
|
11
21
|
|
12
22
|
def test_valid
|
13
|
-
|
14
|
-
assert_equal
|
23
|
+
assert_equal true, EmailAddress.valid?('user@yahoo.com')
|
24
|
+
assert_equal true, EmailAddress.valid?('a@yahoo.com')
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_matches
|
28
|
+
assert_equal 'yahoo.', EmailAddress.matches?('user@yahoo.com', 'yahoo.')
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_reference
|
32
|
+
assert_equal 'dfeafc750cecde54f9a4775f5713bf01', EmailAddress.reference('user@yahoo.com')
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_redact
|
36
|
+
assert_equal '{e037b6c476357f34f92b8f35b25d179a4f573f1e}@yahoo.com', EmailAddress.redact('user@yahoo.com')
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_cases
|
40
|
+
%w( miles.o'brien@yahoo.com first..last@gmail.com a-b.c_d+e@f.gx
|
41
|
+
).each do |address|
|
42
|
+
assert EmailAddress.valid?(address, dns_lookup: :off), "valid?(#{address})"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_empty
|
47
|
+
assert_equal "", EmailAddress.normal("")
|
48
|
+
assert_equal "", EmailAddress.normal(" ")
|
15
49
|
end
|
16
50
|
|
17
51
|
end
|
data/test/test_helper.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
2
|
+
|
3
|
+
require 'codeclimate-test-reporter'
|
4
|
+
CodeClimate::TestReporter.start
|
5
|
+
|
6
|
+
require 'active_record'
|
1
7
|
require 'rubygems'
|
2
8
|
require 'minitest/autorun'
|
9
|
+
require 'minitest/unit'
|
3
10
|
require 'minitest/pride'
|
4
|
-
|
5
|
-
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
6
|
-
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
7
11
|
require 'email_address'
|
8
|
-
|
9
|
-
# Go!
|
metadata
CHANGED
@@ -1,88 +1,128 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: email_address
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Allen Fair
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-01-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
15
|
+
requirements:
|
16
|
+
- - ">="
|
17
|
+
- !ruby/object:Gem::Version
|
18
|
+
version: '0'
|
19
|
+
name: rake
|
20
|
+
prerelease: false
|
21
|
+
type: :development
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
15
28
|
requirement: !ruby/object:Gem::Requirement
|
16
29
|
requirements:
|
17
30
|
- - "~>"
|
18
31
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
32
|
+
version: 5.8.3
|
33
|
+
name: minitest
|
34
|
+
prerelease: false
|
20
35
|
type: :development
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 5.8.3
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
requirement: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - "~>"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '1.3'
|
47
|
+
name: bundler
|
21
48
|
prerelease: false
|
49
|
+
type: :development
|
22
50
|
version_requirements: !ruby/object:Gem::Requirement
|
23
51
|
requirements:
|
24
52
|
- - "~>"
|
25
53
|
- !ruby/object:Gem::Version
|
26
54
|
version: '1.3'
|
27
55
|
- !ruby/object:Gem::Dependency
|
28
|
-
name: activemodel
|
29
56
|
requirement: !ruby/object:Gem::Requirement
|
30
57
|
requirements:
|
31
58
|
- - "~>"
|
32
59
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
34
|
-
|
60
|
+
version: 4.2.5
|
61
|
+
name: activerecord
|
35
62
|
prerelease: false
|
63
|
+
type: :development
|
36
64
|
version_requirements: !ruby/object:Gem::Requirement
|
37
65
|
requirements:
|
38
66
|
- - "~>"
|
39
67
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
68
|
+
version: 4.2.5
|
41
69
|
- !ruby/object:Gem::Dependency
|
42
|
-
name: rake
|
43
70
|
requirement: !ruby/object:Gem::Requirement
|
44
71
|
requirements:
|
45
72
|
- - ">="
|
46
73
|
- !ruby/object:Gem::Version
|
47
74
|
version: '0'
|
48
|
-
|
75
|
+
name: activerecord-jdbcsqlite3-adapter
|
49
76
|
prerelease: false
|
77
|
+
type: :development
|
50
78
|
version_requirements: !ruby/object:Gem::Requirement
|
51
79
|
requirements:
|
52
80
|
- - ">="
|
53
81
|
- !ruby/object:Gem::Version
|
54
82
|
version: '0'
|
55
83
|
- !ruby/object:Gem::Dependency
|
56
|
-
name: simpleidn
|
57
84
|
requirement: !ruby/object:Gem::Requirement
|
58
85
|
requirements:
|
59
86
|
- - ">="
|
60
87
|
- !ruby/object:Gem::Version
|
61
88
|
version: '0'
|
62
|
-
|
89
|
+
name: codeclimate-test-reporter
|
63
90
|
prerelease: false
|
91
|
+
type: :development
|
64
92
|
version_requirements: !ruby/object:Gem::Requirement
|
65
93
|
requirements:
|
66
94
|
- - ">="
|
67
95
|
- !ruby/object:Gem::Version
|
68
96
|
version: '0'
|
69
97
|
- !ruby/object:Gem::Dependency
|
70
|
-
name: netaddr
|
71
98
|
requirement: !ruby/object:Gem::Requirement
|
72
99
|
requirements:
|
73
100
|
- - ">="
|
74
101
|
- !ruby/object:Gem::Version
|
75
102
|
version: '0'
|
103
|
+
name: simpleidn
|
104
|
+
prerelease: false
|
76
105
|
type: :runtime
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - ">="
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '0'
|
117
|
+
name: netaddr
|
77
118
|
prerelease: false
|
119
|
+
type: :runtime
|
78
120
|
version_requirements: !ruby/object:Gem::Requirement
|
79
121
|
requirements:
|
80
122
|
- - ">="
|
81
123
|
- !ruby/object:Gem::Version
|
82
124
|
version: '0'
|
83
|
-
description:
|
84
|
-
The EmailAddress library is an _opinionated_ email address handler and
|
85
|
-
validator.
|
125
|
+
description: The EmailAddress Gem to work with and validate email addresses.
|
86
126
|
email:
|
87
127
|
- allen.fair@gmail.com
|
88
128
|
executables: []
|
@@ -90,6 +130,7 @@ extensions: []
|
|
90
130
|
extra_rdoc_files: []
|
91
131
|
files:
|
92
132
|
- ".gitignore"
|
133
|
+
- ".travis.yml"
|
93
134
|
- Gemfile
|
94
135
|
- LICENSE.txt
|
95
136
|
- README.md
|
@@ -98,32 +139,27 @@ files:
|
|
98
139
|
- lib/email_address.rb
|
99
140
|
- lib/email_address/active_record_validator.rb
|
100
141
|
- lib/email_address/address.rb
|
142
|
+
- lib/email_address/canonical_email_address_type.rb
|
101
143
|
- lib/email_address/config.rb
|
102
|
-
- lib/email_address/domain_matcher.rb
|
103
|
-
- lib/email_address/domain_parser.rb
|
104
144
|
- lib/email_address/email_address_type.rb
|
105
145
|
- lib/email_address/exchanger.rb
|
106
146
|
- lib/email_address/host.rb
|
107
147
|
- lib/email_address/local.rb
|
108
|
-
- lib/email_address/matcher.rb
|
109
|
-
- lib/email_address/validator.rb
|
110
148
|
- lib/email_address/version.rb
|
149
|
+
- test/activerecord/test_ar.rb
|
150
|
+
- test/activerecord/user.rb
|
111
151
|
- test/email_address/test_address.rb
|
112
152
|
- test/email_address/test_config.rb
|
113
|
-
- test/email_address/test_domain_matcher.rb
|
114
|
-
- test/email_address/test_domain_parser.rb
|
115
153
|
- test/email_address/test_exchanger.rb
|
116
154
|
- test/email_address/test_host.rb
|
117
155
|
- test/email_address/test_local.rb
|
118
|
-
- test/email_address/test_matcher.rb
|
119
|
-
- test/email_address/test_validator.rb
|
120
156
|
- test/test_email_address.rb
|
121
157
|
- test/test_helper.rb
|
122
158
|
homepage: https://github.com/afair/email_address
|
123
159
|
licenses:
|
124
160
|
- MIT
|
125
161
|
metadata: {}
|
126
|
-
post_install_message:
|
162
|
+
post_install_message:
|
127
163
|
rdoc_options: []
|
128
164
|
require_paths:
|
129
165
|
- lib
|
@@ -138,20 +174,18 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
138
174
|
- !ruby/object:Gem::Version
|
139
175
|
version: '0'
|
140
176
|
requirements: []
|
141
|
-
rubyforge_project:
|
142
|
-
rubygems_version: 2.
|
143
|
-
signing_key:
|
177
|
+
rubyforge_project:
|
178
|
+
rubygems_version: 2.4.8
|
179
|
+
signing_key:
|
144
180
|
specification_version: 4
|
145
|
-
summary:
|
181
|
+
summary: This gem provides a ruby language library for working with and validating email addresses. By default, it validates against conventional usage, the format preferred for user email addresses. It can be configured to validate against RFC “Standard” formats, common email service provider formats, and perform DNS validation.
|
146
182
|
test_files:
|
183
|
+
- test/activerecord/test_ar.rb
|
184
|
+
- test/activerecord/user.rb
|
147
185
|
- test/email_address/test_address.rb
|
148
186
|
- test/email_address/test_config.rb
|
149
|
-
- test/email_address/test_domain_matcher.rb
|
150
|
-
- test/email_address/test_domain_parser.rb
|
151
187
|
- test/email_address/test_exchanger.rb
|
152
188
|
- test/email_address/test_host.rb
|
153
189
|
- test/email_address/test_local.rb
|
154
|
-
- test/email_address/test_matcher.rb
|
155
|
-
- test/email_address/test_validator.rb
|
156
190
|
- test/test_email_address.rb
|
157
191
|
- test/test_helper.rb
|
@@ -1,98 +0,0 @@
|
|
1
|
-
module EmailAddress
|
2
|
-
##############################################################################
|
3
|
-
#
|
4
|
-
# DEPRECATING... See EmailAddress::Matcher now
|
5
|
-
#
|
6
|
-
# DomainMatcher - Matches a domain to a set of patterns
|
7
|
-
#
|
8
|
-
# Match Patterns
|
9
|
-
# hostname sub.domain.tld
|
10
|
-
# domain domain.tld
|
11
|
-
# registration domain
|
12
|
-
# tld .tld, .domain.tld
|
13
|
-
##############################################################################
|
14
|
-
class DomainMatcher
|
15
|
-
attr_reader :host_name, :parts, :domain_name, :registration_name,
|
16
|
-
:tld, :subdomains, :ip_address
|
17
|
-
|
18
|
-
def self.matches?(domain, rule)
|
19
|
-
DomainMatcher.new(domain, rule).matches?
|
20
|
-
end
|
21
|
-
|
22
|
-
def initialize(host_name, rule=nil)
|
23
|
-
@host_name = host_name.downcase
|
24
|
-
@host = EmailAddress::Host.new(@host_name)
|
25
|
-
@rule = rule
|
26
|
-
matches?
|
27
|
-
end
|
28
|
-
|
29
|
-
def matches?(rule=nil)
|
30
|
-
rule ||= @rule
|
31
|
-
case rule
|
32
|
-
when String
|
33
|
-
rule_matches?(rule)
|
34
|
-
when Array
|
35
|
-
list_matches?(rule)
|
36
|
-
else
|
37
|
-
false
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def rule_matches?(rule)
|
42
|
-
rule.downcase!
|
43
|
-
@host_name == rule || registration_name_matches?(rule) ||
|
44
|
-
domain_matches?(rule) || tld_matches?(rule) || glob_matches?(rule)
|
45
|
-
end
|
46
|
-
|
47
|
-
def list_matches?(list)
|
48
|
-
list.each {|rule| return true if rule_matches?(rule) }
|
49
|
-
false
|
50
|
-
end
|
51
|
-
|
52
|
-
# Matches a rule as a glob match, with * and ? characters
|
53
|
-
def glob_matches?(rule)
|
54
|
-
File.fnmatch?(rule, @host_name)
|
55
|
-
end
|
56
|
-
|
57
|
-
# Does "sub.example.com" match "example" registration name
|
58
|
-
def registration_name_matches?(rule)
|
59
|
-
rule.match(/\A(\w+)\z/) && @host.registration_name == rule.downcase ? true : false
|
60
|
-
end
|
61
|
-
|
62
|
-
# Does "sub.example.com" match "example.com" domain name
|
63
|
-
def domain_matches?(rule)
|
64
|
-
rule.match(/\A[^\.]+\.[^\.]+\z/) && @host.domain_name == rule.downcase ? true : false
|
65
|
-
end
|
66
|
-
|
67
|
-
# Does "sub.example.com" match ".com" and ".example.com" top level names?
|
68
|
-
def tld_matches?(rule)
|
69
|
-
rule.match(/\A\..+\z/) &&
|
70
|
-
( @host_name[-rule.size, rule.size] == rule.downcase || ".#{@host_name}" == rule) \
|
71
|
-
? true : false
|
72
|
-
end
|
73
|
-
|
74
|
-
# Does an IP of mail exchanger for "sub.example.com" match "xxx.xx.xx.xx/xx"?
|
75
|
-
def ip_cidr_matches?(rule)
|
76
|
-
return false unless rule.match(/\A\d.+\/\d+\z/) && @host.exchanger
|
77
|
-
@host.exchanger.in_cidr?(r) ? true : false
|
78
|
-
end
|
79
|
-
|
80
|
-
#def provider_matches?(rule)
|
81
|
-
# if rule.downcase.match(/\A\:(\w+)\z/)
|
82
|
-
# p ["PROVIDER", rule, @host_name, provider_by_domain ]
|
83
|
-
# prov = provider_by_domain
|
84
|
-
# prov && prov == $1 ? true : false
|
85
|
-
# end
|
86
|
-
#end
|
87
|
-
|
88
|
-
## Match only by
|
89
|
-
#def provider_by_domain
|
90
|
-
# base = EmailAddress::Config.providers[:default]
|
91
|
-
# EmailAddress::Config.providers.first do |name, defn|
|
92
|
-
# defn = base.merge(defn)
|
93
|
-
# return name if matches?(defn[:domains])
|
94
|
-
# end
|
95
|
-
# nil
|
96
|
-
#end
|
97
|
-
end
|
98
|
-
end
|
@@ -1,69 +0,0 @@
|
|
1
|
-
require 'simpleidn'
|
2
|
-
|
3
|
-
module EmailAddress
|
4
|
-
##############################################################################
|
5
|
-
# Builds hash of host name/domain name parts
|
6
|
-
# For: subdomain.example.co.uk
|
7
|
-
# host_name: "subdomain.example.co.uk"
|
8
|
-
# subdomains: "subdomain"
|
9
|
-
# registration_name: "example"
|
10
|
-
# domain_name: "example.co.uk"
|
11
|
-
# tld: "co.uk"
|
12
|
-
# ip_address: nil or "ipaddress" used in [ipaddress] syntax
|
13
|
-
##############################################################################
|
14
|
-
class DomainParser
|
15
|
-
attr_reader :host_name, :parts, :domain_name, :registration_name,
|
16
|
-
:tld, :subdomains, :ip_address
|
17
|
-
|
18
|
-
def self.parse(domain)
|
19
|
-
EmailAddress::DomainParser.new(domain).parts
|
20
|
-
end
|
21
|
-
|
22
|
-
def initialize(host_name)
|
23
|
-
@host_name = host_name.downcase
|
24
|
-
parse_host(@host_name)
|
25
|
-
end
|
26
|
-
|
27
|
-
def parse_host(host)
|
28
|
-
@host_name = host.strip.downcase.gsub(' ', '').gsub(/\(.*\)/, '')
|
29
|
-
@subdomains = @registration_name = @domain_name = @tld = ''
|
30
|
-
@ip_address = nil
|
31
|
-
|
32
|
-
# IP Address: [127.0.0.1], [IPV6:.....]
|
33
|
-
if @host_name =~ /\A\[(.+)\]\z/
|
34
|
-
@ip_address = $1
|
35
|
-
|
36
|
-
# Subdomain only (root@localhost)
|
37
|
-
elsif @host_name.index('.').nil?
|
38
|
-
@subdomains = @host_name
|
39
|
-
|
40
|
-
# Split sub.domain from .tld: *.com, *.xx.cc, *.cc
|
41
|
-
elsif @host_name =~ /\A(.+)\.(\w{3,10})\z/ ||
|
42
|
-
@host_name =~ /\A(.+)\.(\w{1,3}\.\w\w)\z/ ||
|
43
|
-
@host_name =~ /\A(.+)\.(\w\w)\z/
|
44
|
-
|
45
|
-
@tld = $2;
|
46
|
-
sld = $1 # Second level domain
|
47
|
-
if sld =~ /\A(.+)\.(.+)\z/ # is subdomain? sub.example [.tld]
|
48
|
-
@subdomains = $1
|
49
|
-
@registration_name = $2
|
50
|
-
else
|
51
|
-
@registration_name = sld
|
52
|
-
@domain_name = sld + '.' + @tld
|
53
|
-
end
|
54
|
-
@domain_name = @registration_name + '.' + @tld
|
55
|
-
end
|
56
|
-
@parts = {host_name:@host_name, subdomains:@subdomains, domain_name:@domain_name,
|
57
|
-
registration_name:@registration_name, tld:@tld, ip_address:@ip_address}
|
58
|
-
end
|
59
|
-
|
60
|
-
# Returns provider based on configured domain name matches, or nil if unmatched
|
61
|
-
# For best results, # consider the Exchanger.provider result as well.
|
62
|
-
def provider
|
63
|
-
EmailAddress::Config.providers.each do |name, defn|
|
64
|
-
return name if EmailAddress::DomainMatcher.matches?(@host_name, defn[:domains])
|
65
|
-
end
|
66
|
-
nil
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|