email_address 0.1.2 → 0.2.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 +5 -5
- data/.github/workflows/ci.yml +18 -0
- data/Gemfile +1 -1
- data/README.md +255 -123
- data/Rakefile +2 -3
- data/email_address.gemspec +27 -22
- data/lib/email_address/active_record_validator.rb +10 -11
- data/lib/email_address/address.rb +126 -80
- data/lib/email_address/canonical_email_address_type.rb +16 -12
- data/lib/email_address/config.rb +102 -51
- data/lib/email_address/email_address_type.rb +17 -13
- data/lib/email_address/exchanger.rb +44 -33
- data/lib/email_address/host.rb +217 -105
- data/lib/email_address/local.rb +127 -87
- data/lib/email_address/messages.yaml +21 -0
- data/lib/email_address/rewriter.rb +144 -0
- data/lib/email_address/version.rb +1 -1
- data/lib/email_address.rb +48 -53
- data/test/activerecord/test_ar.rb +17 -13
- data/test/activerecord/user.rb +31 -30
- data/test/email_address/test_address.rb +84 -21
- data/test/email_address/test_config.rb +10 -10
- data/test/email_address/test_exchanger.rb +6 -7
- data/test/email_address/test_host.rb +59 -21
- data/test/email_address/test_local.rb +49 -36
- data/test/email_address/test_rewriter.rb +11 -0
- data/test/test_aliasing.rb +53 -0
- data/test/test_email_address.rb +15 -19
- data/test/test_helper.rb +9 -8
- metadata +43 -21
- data/.travis.yml +0 -10
@@ -1,22 +1,20 @@
|
|
1
|
-
|
2
|
-
require_relative '../test_helper'
|
1
|
+
require_relative "../test_helper"
|
3
2
|
|
4
3
|
class TestLocal < MiniTest::Test
|
5
|
-
|
6
4
|
def test_valid_standard
|
7
5
|
[ # Via https://en.wikipedia.org/wiki/Email_address
|
8
|
-
%
|
9
|
-
%
|
10
|
-
%
|
11
|
-
%
|
12
|
-
%
|
13
|
-
%
|
14
|
-
%
|
15
|
-
%
|
16
|
-
%
|
17
|
-
%
|
18
|
-
%
|
19
|
-
%
|
6
|
+
%(prettyandsimple),
|
7
|
+
%(very.common),
|
8
|
+
%(disposable.style.email.with+symbol),
|
9
|
+
%(other.email-with-dash),
|
10
|
+
%("much.more unusual"),
|
11
|
+
%{"(comment)very.unusual.@.unusual.com"},
|
12
|
+
%(#!$%&'*+-/=?^_`{}|~),
|
13
|
+
%(" "),
|
14
|
+
%{"very.(),:;<>[]\\".VERY.\\"very@\\ \\"very\\".unusual"},
|
15
|
+
%{"()<>[]:,;@\\\"!#$%&'*+-/=?^_`{}| ~.a"},
|
16
|
+
%(token." ".token),
|
17
|
+
%(abc."defghi".xyz)
|
20
18
|
].each do |local|
|
21
19
|
assert EmailAddress::Local.new(local, local_fix: false).standard?, local
|
22
20
|
end
|
@@ -24,15 +22,15 @@ class TestLocal < MiniTest::Test
|
|
24
22
|
|
25
23
|
def test_invalid_standard
|
26
24
|
[ # Via https://en.wikipedia.org/wiki/Email_address
|
27
|
-
%
|
28
|
-
%
|
29
|
-
%
|
30
|
-
%
|
31
|
-
%
|
32
|
-
%
|
33
|
-
%
|
34
|
-
%
|
35
|
-
%
|
25
|
+
%(A@b@c),
|
26
|
+
%{a"b(c)d,e:f;g<h>i[j\k]l},
|
27
|
+
%(just"not"right),
|
28
|
+
%(this is"not\allowed),
|
29
|
+
%(this\ still\"not\\allowed),
|
30
|
+
%(john..doe),
|
31
|
+
%( invalid),
|
32
|
+
%(invalid ),
|
33
|
+
%(abc"defghi"xyz)
|
36
34
|
].each do |local|
|
37
35
|
assert_equal false, EmailAddress::Local.new(local, local_fix: false).standard?, local
|
38
36
|
end
|
@@ -42,25 +40,25 @@ class TestLocal < MiniTest::Test
|
|
42
40
|
assert EmailAddress::Local.new("first..last", local_format: :relaxed).valid?, "relax.."
|
43
41
|
assert EmailAddress::Local.new("first.-last", local_format: :relaxed).valid?, "relax.-"
|
44
42
|
assert EmailAddress::Local.new("a", local_format: :relaxed).valid?, "relax single"
|
45
|
-
assert
|
43
|
+
assert EmailAddress::Local.new("firstlast_", local_format: :relaxed).valid?, "last_"
|
46
44
|
end
|
47
45
|
|
48
46
|
def test_unicode
|
49
|
-
assert !
|
47
|
+
assert !EmailAddress::Local.new("üñîçøðé1", local_encoding: :ascii).standard?, "not üñîçøðé1"
|
50
48
|
assert EmailAddress::Local.new("üñîçøðé2", local_encoding: :unicode).standard?, "üñîçøðé2"
|
51
|
-
assert
|
49
|
+
assert EmailAddress::Local.new("test", local_encoding: :unicode).valid?, "unicode should include ascii"
|
50
|
+
assert !EmailAddress::Local.new("üñîçøðé3").valid?, "üñîçøðé3 valid"
|
52
51
|
end
|
53
52
|
|
54
|
-
|
55
53
|
def test_valid_conventional
|
56
|
-
%w
|
54
|
+
%w[first.last first First+Tag o'brien].each do |local|
|
57
55
|
assert EmailAddress::Local.new(local).conventional?, local
|
58
56
|
end
|
59
57
|
end
|
60
58
|
|
61
59
|
def test_invalid_conventional
|
62
|
-
(%w
|
63
|
-
assert !
|
60
|
+
(%w[first;.last +leading trailing+ o%brien] + ["first space"]).each do |local|
|
61
|
+
assert !EmailAddress::Local.new(local, local_fix: false).conventional?, local
|
64
62
|
end
|
65
63
|
end
|
66
64
|
|
@@ -71,8 +69,8 @@ class TestLocal < MiniTest::Test
|
|
71
69
|
|
72
70
|
def test_format
|
73
71
|
assert_equal :conventional, EmailAddress::Local.new("can1").format?
|
74
|
-
assert_equal :standard, EmailAddress::Local.new(%
|
75
|
-
assert_equal "can1", EmailAddress::Local.new(%
|
72
|
+
assert_equal :standard, EmailAddress::Local.new(%("can1")).format?
|
73
|
+
assert_equal "can1", EmailAddress::Local.new(%{"can1(commment)"}).format(:conventional)
|
76
74
|
end
|
77
75
|
|
78
76
|
def test_redacted
|
@@ -83,13 +81,28 @@ class TestLocal < MiniTest::Test
|
|
83
81
|
|
84
82
|
def test_matches
|
85
83
|
a = EmailAddress.new("User+tag@gmail.com")
|
86
|
-
assert_equal false,
|
87
|
-
assert_equal false,
|
88
|
-
assert_equal
|
84
|
+
assert_equal false, a.matches?("user")
|
85
|
+
assert_equal false, a.matches?("user@")
|
86
|
+
assert_equal "user*@", a.matches?("user*@")
|
89
87
|
end
|
90
88
|
|
91
89
|
def test_munge
|
92
90
|
assert_equal "us*****", EmailAddress::Local.new("User+tag").munge
|
93
91
|
end
|
94
92
|
|
93
|
+
def test_hosted
|
94
|
+
assert EmailAddress.valid?("x@exposure.co")
|
95
|
+
assert EmailAddress.error("xxxx+subscriber@gmail.com")
|
96
|
+
assert EmailAddress.valid?("xxxxx+subscriber@gmail.com")
|
97
|
+
end
|
98
|
+
|
99
|
+
def test_ending_underscore
|
100
|
+
assert EmailAddress.valid?("name_@icloud.com")
|
101
|
+
assert EmailAddress.valid?("username_@gmail.com")
|
102
|
+
assert EmailAddress.valid?("username_____@gmail.com")
|
103
|
+
end
|
104
|
+
|
105
|
+
def test_tag_punctuation
|
106
|
+
assert EmailAddress.valid?("first.last+foo.bar@gmail.com")
|
107
|
+
end
|
95
108
|
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require_relative "../test_helper"
|
2
|
+
|
3
|
+
class TestRewriter < Minitest::Test
|
4
|
+
def test_srs
|
5
|
+
ea = "first.LAST+tag@gmail.com"
|
6
|
+
e = EmailAddress.new(ea)
|
7
|
+
s = e.srs("example.com")
|
8
|
+
assert s.match(EmailAddress::Address::SRS_FORMAT_REGEX)
|
9
|
+
assert EmailAddress.new(s).to_s == e.to_s
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require_relative "test_helper"
|
2
|
+
|
3
|
+
class TestAliasing < MiniTest::Test
|
4
|
+
def setup
|
5
|
+
Object.send(:const_set, :EmailAddressValidator, EmailAddress)
|
6
|
+
Object.send(:remove_const, :EmailAddress)
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_email_address_not_defined
|
10
|
+
assert_nil defined?(EmailAddress)
|
11
|
+
assert_nil defined?(EmailAddress::Address)
|
12
|
+
assert_nil defined?(EmailAddress::Config)
|
13
|
+
assert_nil defined?(EmailAddress::Exchanger)
|
14
|
+
assert_nil defined?(EmailAddress::Host)
|
15
|
+
assert_nil defined?(EmailAddress::Local)
|
16
|
+
assert_nil defined?(EmailAddress::Rewriter)
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_alias_defined
|
20
|
+
assert_equal defined?(EmailAddressValidator), "constant"
|
21
|
+
assert_equal defined?(EmailAddressValidator::Address), "constant"
|
22
|
+
assert_equal defined?(EmailAddressValidator::Config), "constant"
|
23
|
+
assert_equal defined?(EmailAddressValidator::Exchanger), "constant"
|
24
|
+
assert_equal defined?(EmailAddressValidator::Host), "constant"
|
25
|
+
assert_equal defined?(EmailAddressValidator::Local), "constant"
|
26
|
+
assert_equal defined?(EmailAddressValidator::Rewriter), "constant"
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_alias_class_methods
|
30
|
+
assert_equal true, EmailAddressValidator.valid?("user@yahoo.com")
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_alias_host_methods
|
34
|
+
assert_equal true, EmailAddressValidator::Host.new("yahoo.com").valid?
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_alias_address_methods
|
38
|
+
assert_equal true, EmailAddressValidator::Address.new("user@yahoo.com").valid?
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_alias_config_methods
|
42
|
+
assert Hash, EmailAddressValidator::Config.new.to_h
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_alias_local_methods
|
46
|
+
assert_equal true, EmailAddressValidator::Local.new("user").valid?
|
47
|
+
end
|
48
|
+
|
49
|
+
def teardown
|
50
|
+
Object.send(:const_set, :EmailAddress, EmailAddressValidator)
|
51
|
+
Object.send(:remove_const, :EmailAddressValidator)
|
52
|
+
end
|
53
|
+
end
|
data/test/test_email_address.rb
CHANGED
@@ -1,45 +1,42 @@
|
|
1
|
-
|
2
|
-
require_relative 'test_helper'
|
1
|
+
require_relative "test_helper"
|
3
2
|
|
4
3
|
class TestEmailAddress < MiniTest::Test
|
5
|
-
|
6
4
|
def test_new
|
7
|
-
a = EmailAddress.new(
|
8
|
-
assert_equal
|
9
|
-
assert_equal
|
5
|
+
a = EmailAddress.new("user@example.com")
|
6
|
+
assert_equal "user", a.local.to_s
|
7
|
+
assert_equal "example.com", a.host.to_s
|
10
8
|
end
|
11
9
|
|
12
10
|
def test_canonical
|
13
|
-
assert_equal "firstlast@gmail.com", EmailAddress.canonical(
|
14
|
-
a = EmailAddress.new_canonical(
|
15
|
-
assert_equal
|
11
|
+
assert_equal "firstlast@gmail.com", EmailAddress.canonical("First.Last+TAG@gmail.com")
|
12
|
+
a = EmailAddress.new_canonical("First.Last+TAG@gmail.com")
|
13
|
+
assert_equal "firstlast", a.local.to_s
|
16
14
|
end
|
17
15
|
|
18
16
|
def test_normal
|
19
|
-
assert_equal
|
17
|
+
assert_equal "user+tag@gmail.com", EmailAddress.normal("USER+TAG@GMAIL.com")
|
20
18
|
end
|
21
19
|
|
22
20
|
def test_valid
|
23
|
-
assert_equal true, EmailAddress.valid?(
|
24
|
-
assert_equal true, EmailAddress.valid?(
|
21
|
+
assert_equal true, EmailAddress.valid?("user@yahoo.com")
|
22
|
+
assert_equal true, EmailAddress.valid?("a@yahoo.com")
|
25
23
|
end
|
26
24
|
|
27
25
|
def test_matches
|
28
|
-
assert_equal
|
26
|
+
assert_equal "yahoo.", EmailAddress.matches?("user@yahoo.com", "yahoo.")
|
29
27
|
end
|
30
28
|
|
31
29
|
def test_reference
|
32
|
-
assert_equal
|
30
|
+
assert_equal "dfeafc750cecde54f9a4775f5713bf01", EmailAddress.reference("user@yahoo.com")
|
33
31
|
end
|
34
32
|
|
35
33
|
def test_redact
|
36
|
-
assert_equal
|
34
|
+
assert_equal "{e037b6c476357f34f92b8f35b25d179a4f573f1e}@yahoo.com", EmailAddress.redact("user@yahoo.com")
|
37
35
|
end
|
38
36
|
|
39
37
|
def test_cases
|
40
|
-
%w
|
41
|
-
|
42
|
-
assert EmailAddress.valid?(address, dns_lookup: :off), "valid?(#{address})"
|
38
|
+
%w[miles.o'brien@yahoo.com first.last@gmail.com a-b.c_d+e@f.gx].each do |address|
|
39
|
+
assert EmailAddress.valid?(address, host_validation: :syntax), "valid?(#{address})"
|
43
40
|
end
|
44
41
|
end
|
45
42
|
|
@@ -47,5 +44,4 @@ class TestEmailAddress < MiniTest::Test
|
|
47
44
|
assert_equal "", EmailAddress.normal("")
|
48
45
|
assert_equal "", EmailAddress.normal(" ")
|
49
46
|
end
|
50
|
-
|
51
47
|
end
|
data/test/test_helper.rb
CHANGED
@@ -1,11 +1,12 @@
|
|
1
|
-
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__),
|
1
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
|
2
2
|
|
3
|
-
require
|
3
|
+
require "pry"
|
4
|
+
require "simplecov"
|
4
5
|
SimpleCov.start
|
5
6
|
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
11
|
-
require
|
7
|
+
require "active_record"
|
8
|
+
require "rubygems"
|
9
|
+
require "minitest/autorun"
|
10
|
+
require "minitest/unit"
|
11
|
+
require "minitest/pride"
|
12
|
+
require "email_address"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: email_address
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.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: 2021-07-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -30,42 +30,42 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 5.
|
33
|
+
version: '5.11'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 5.
|
40
|
+
version: '5.11'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: bundler
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: activerecord
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
61
|
+
version: 6.1.4
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
68
|
+
version: 6.1.4
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: sqlite3
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -81,7 +81,7 @@ dependencies:
|
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
84
|
+
name: simplecov
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - ">="
|
@@ -95,13 +95,13 @@ dependencies:
|
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
98
|
+
name: pry
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
101
|
- - ">="
|
102
102
|
- !ruby/object:Gem::Version
|
103
103
|
version: '0'
|
104
|
-
type: :
|
104
|
+
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
@@ -109,7 +109,21 @@ dependencies:
|
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
|
-
name:
|
112
|
+
name: standard
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 1.1.1
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 1.1.1
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: simpleidn
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
114
128
|
requirements:
|
115
129
|
- - ">="
|
@@ -129,8 +143,8 @@ executables: []
|
|
129
143
|
extensions: []
|
130
144
|
extra_rdoc_files: []
|
131
145
|
files:
|
146
|
+
- ".github/workflows/ci.yml"
|
132
147
|
- ".gitignore"
|
133
|
-
- ".travis.yml"
|
134
148
|
- Gemfile
|
135
149
|
- LICENSE.txt
|
136
150
|
- README.md
|
@@ -145,6 +159,8 @@ files:
|
|
145
159
|
- lib/email_address/exchanger.rb
|
146
160
|
- lib/email_address/host.rb
|
147
161
|
- lib/email_address/local.rb
|
162
|
+
- lib/email_address/messages.yaml
|
163
|
+
- lib/email_address/rewriter.rb
|
148
164
|
- lib/email_address/version.rb
|
149
165
|
- test/activerecord/test_ar.rb
|
150
166
|
- test/activerecord/user.rb
|
@@ -153,13 +169,15 @@ files:
|
|
153
169
|
- test/email_address/test_exchanger.rb
|
154
170
|
- test/email_address/test_host.rb
|
155
171
|
- test/email_address/test_local.rb
|
172
|
+
- test/email_address/test_rewriter.rb
|
173
|
+
- test/test_aliasing.rb
|
156
174
|
- test/test_email_address.rb
|
157
175
|
- test/test_helper.rb
|
158
176
|
homepage: https://github.com/afair/email_address
|
159
177
|
licenses:
|
160
178
|
- MIT
|
161
179
|
metadata: {}
|
162
|
-
post_install_message:
|
180
|
+
post_install_message:
|
163
181
|
rdoc_options: []
|
164
182
|
require_paths:
|
165
183
|
- lib
|
@@ -167,16 +185,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
167
185
|
requirements:
|
168
186
|
- - ">="
|
169
187
|
- !ruby/object:Gem::Version
|
170
|
-
version: '
|
188
|
+
version: '2.5'
|
189
|
+
- - "<"
|
190
|
+
- !ruby/object:Gem::Version
|
191
|
+
version: '4'
|
171
192
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
172
193
|
requirements:
|
173
194
|
- - ">="
|
174
195
|
- !ruby/object:Gem::Version
|
175
196
|
version: '0'
|
176
197
|
requirements: []
|
177
|
-
|
178
|
-
|
179
|
-
signing_key:
|
198
|
+
rubygems_version: 3.2.15
|
199
|
+
signing_key:
|
180
200
|
specification_version: 4
|
181
201
|
summary: This gem provides a ruby language library for working with and validating
|
182
202
|
email addresses. By default, it validates against conventional usage, the format
|
@@ -190,5 +210,7 @@ test_files:
|
|
190
210
|
- test/email_address/test_exchanger.rb
|
191
211
|
- test/email_address/test_host.rb
|
192
212
|
- test/email_address/test_local.rb
|
213
|
+
- test/email_address/test_rewriter.rb
|
214
|
+
- test/test_aliasing.rb
|
193
215
|
- test/test_email_address.rb
|
194
216
|
- test/test_helper.rb
|