email_address 0.1.17 → 0.1.18
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/README.md +27 -0
- data/lib/email_address.rb +17 -18
- data/lib/email_address/active_record_validator.rb +2 -2
- data/lib/email_address/address.rb +15 -15
- data/lib/email_address/canonical_email_address_type.rb +14 -12
- data/lib/email_address/config.rb +1 -1
- data/lib/email_address/email_address_type.rb +15 -13
- data/lib/email_address/exchanger.rb +3 -3
- data/lib/email_address/host.rb +6 -6
- data/lib/email_address/local.rb +2 -2
- data/lib/email_address/version.rb +1 -1
- data/test/test_aliasing.rb +54 -0
- metadata +7 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2a5ff67ec79e4de2d356293664296391fc8296ad6a6ba08f1d1256e93f7c729c
|
4
|
+
data.tar.gz: 5485014c6f886d9a382c046f9025948eeed6c114accde2957424f1f613d1b51b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 336f61eb9e81ccf8fe859b0d05e5e4d1aaf734e06328169ce919a01fdf30caaebdb2f44e673b52cdde99e3790c413c854e486fd97e4c610b5ee6349c1e3dbe40
|
7
|
+
data.tar.gz: c08f83be388d6fdb646ea46439c0a65543091e401b9c9d38e312a7d2dc34313c3269f9c16916340d090f48ae224a1cd18631153d6478f87e32073f38e319ff28
|
data/README.md
CHANGED
@@ -552,6 +552,33 @@ The value is an array of match tokens.
|
|
552
552
|
* host_match: %w(.org example.com hotmail. user*@ sub.*.com)
|
553
553
|
* exchanger_match: %w(google.com 127.0.0.1 10.9.8.0/24 ::1/64)
|
554
554
|
|
555
|
+
### Namespace conflict resolution
|
556
|
+
|
557
|
+
If your application already uses the `EmailAddress` class name,
|
558
|
+
it's possible to create an alias prior to loading your code:
|
559
|
+
|
560
|
+
For a Rails application, you can do this in `config/application.rb`
|
561
|
+
after the `Bundler.require` line, usually:
|
562
|
+
|
563
|
+
```ruby
|
564
|
+
Bundler.require(*Rails.groups)
|
565
|
+
```
|
566
|
+
|
567
|
+
Add these lines immediately after that point:
|
568
|
+
|
569
|
+
```ruby
|
570
|
+
EmailAddressValidator = EmailAddress
|
571
|
+
Object.send(:remove_const, :EmailAddress)
|
572
|
+
```
|
573
|
+
|
574
|
+
Then your application loads with your EmailAddress class. You may
|
575
|
+
then use this gem with `EmailAddressValidator` or whatever name you
|
576
|
+
gave it above:
|
577
|
+
|
578
|
+
```ruby
|
579
|
+
EmailAddressValidator.valid?("clark.kent@gmail.com") # => true
|
580
|
+
```
|
581
|
+
|
555
582
|
## Notes
|
556
583
|
|
557
584
|
#### Internationalization
|
data/lib/email_address.rb
CHANGED
@@ -40,31 +40,30 @@ module EmailAddress
|
|
40
40
|
# secret to use in options[:secret]
|
41
41
|
class << self
|
42
42
|
(%i[valid? error normal redact munge canonical reference base srs] &
|
43
|
-
|
43
|
+
Address.public_instance_methods
|
44
44
|
).each do |proxy_method|
|
45
45
|
define_method(proxy_method) do |*args, &block|
|
46
|
-
|
46
|
+
Address.new(*args).public_send(proxy_method, &block)
|
47
47
|
end
|
48
48
|
end
|
49
|
-
end
|
50
|
-
|
51
49
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
50
|
+
# Creates an instance of this email address.
|
51
|
+
# This is a short-cut to EmailAddress::Address.new
|
52
|
+
def new(email_address, config={})
|
53
|
+
Address.new(email_address, config)
|
54
|
+
end
|
57
55
|
|
58
|
-
|
59
|
-
|
60
|
-
|
56
|
+
def new_redacted(email_address, config={})
|
57
|
+
Address.new(Address.new(email_address, config).redact)
|
58
|
+
end
|
61
59
|
|
62
|
-
|
63
|
-
|
64
|
-
|
60
|
+
def new_canonical(email_address, config={})
|
61
|
+
Address.new(Address.new(email_address, config).canonical, config)
|
62
|
+
end
|
65
63
|
|
66
|
-
|
67
|
-
|
68
|
-
|
64
|
+
# Does the email address match any of the given rules
|
65
|
+
def matches?(email_address, rules, config={})
|
66
|
+
Address.new(email_address, config).matches?(rules)
|
67
|
+
end
|
69
68
|
end
|
70
69
|
end
|
@@ -35,10 +35,10 @@ module EmailAddress
|
|
35
35
|
|
36
36
|
def validate_email(r,f)
|
37
37
|
return if r[f].nil?
|
38
|
-
e =
|
38
|
+
e = Address.new(r[f])
|
39
39
|
unless e.valid?
|
40
40
|
r.errors[f] << (@opt[:message] ||
|
41
|
-
|
41
|
+
Config.error_messages[:invalid_address] ||
|
42
42
|
"Invalid Email Address")
|
43
43
|
end
|
44
44
|
end
|
@@ -5,32 +5,32 @@ require "digest/md5"
|
|
5
5
|
|
6
6
|
module EmailAddress
|
7
7
|
# Implements the Email Address container, which hold the Local
|
8
|
-
# (EmailAddress::Local) and Host (
|
8
|
+
# (EmailAddress::Local) and Host (EmailAddress::Host) parts.
|
9
9
|
class Address
|
10
10
|
include Comparable
|
11
|
-
include
|
11
|
+
include Rewriter
|
12
12
|
|
13
13
|
attr_accessor :original, :local, :host, :config, :reason
|
14
14
|
|
15
|
-
CONVENTIONAL_REGEX = /\A#{
|
16
|
-
@#{
|
17
|
-
STANDARD_REGEX = /\A#{
|
18
|
-
@#{
|
19
|
-
RELAXED_REGEX = /\A#{
|
20
|
-
@#{
|
15
|
+
CONVENTIONAL_REGEX = /\A#{Local::CONVENTIONAL_MAILBOX_WITHIN}
|
16
|
+
@#{Host::DNS_HOST_REGEX}\z/x
|
17
|
+
STANDARD_REGEX = /\A#{Local::STANDARD_LOCAL_WITHIN}
|
18
|
+
@#{Host::DNS_HOST_REGEX}\z/x
|
19
|
+
RELAXED_REGEX = /\A#{Local::RELAXED_MAILBOX_WITHIN}
|
20
|
+
@#{Host::DNS_HOST_REGEX}\z/x
|
21
21
|
|
22
22
|
# Given an email address of the form "local@hostname", this sets up the
|
23
23
|
# instance, and initializes the address to the "normalized" format of the
|
24
24
|
# address. The original string is available in the #original method.
|
25
25
|
def initialize(email_address, config = {})
|
26
|
-
@config =
|
26
|
+
@config = Config.new(config)
|
27
27
|
@original = email_address
|
28
28
|
email_address = (email_address || "").strip
|
29
29
|
email_address = parse_rewritten(email_address) unless config[:skip_rewrite]
|
30
|
-
local, host =
|
30
|
+
local, host = Address.split_local_host(email_address)
|
31
31
|
|
32
|
-
@host =
|
33
|
-
@local =
|
32
|
+
@host = Host.new(host, @config)
|
33
|
+
@local = Local.new(local, @config, @host)
|
34
34
|
@error = @error_message = nil
|
35
35
|
end
|
36
36
|
|
@@ -114,7 +114,7 @@ module EmailAddress
|
|
114
114
|
alias to_s normal
|
115
115
|
|
116
116
|
def inspect
|
117
|
-
"
|
117
|
+
"#<#{self.class}:0x#{object_id.to_s(16)} address=\"#{self}\">"
|
118
118
|
end
|
119
119
|
|
120
120
|
# Returns the canonical email address according to the provider
|
@@ -190,7 +190,7 @@ module EmailAddress
|
|
190
190
|
# of this addres with another, using the canonical or redacted forms.
|
191
191
|
def same_as?(other_email)
|
192
192
|
if other_email.is_a?(String)
|
193
|
-
other_email =
|
193
|
+
other_email = Address.new(other_email)
|
194
194
|
end
|
195
195
|
|
196
196
|
canonical == other_email.canonical ||
|
@@ -276,7 +276,7 @@ module EmailAddress
|
|
276
276
|
def set_error(err, reason = nil)
|
277
277
|
@error = err
|
278
278
|
@reason = reason
|
279
|
-
@error_message =
|
279
|
+
@error_message = Config.error_message(err)
|
280
280
|
false
|
281
281
|
end
|
282
282
|
|
@@ -29,20 +29,22 @@
|
|
29
29
|
# user.canonical_email #=> "patsmith@gmail.com"
|
30
30
|
################################################################################
|
31
31
|
|
32
|
-
|
32
|
+
module EmailAddress
|
33
|
+
class CanonicalEmailAddressType < ActiveRecord::Type::Value
|
33
34
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
35
|
+
# From user input, setter
|
36
|
+
def cast(value)
|
37
|
+
super(Address.new(value).canonical)
|
38
|
+
end
|
38
39
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
40
|
+
# From a database value
|
41
|
+
def deserialize(value)
|
42
|
+
value && Address.new(value).normal
|
43
|
+
end
|
43
44
|
|
44
|
-
|
45
|
-
|
46
|
-
|
45
|
+
# To a database value (string)
|
46
|
+
def serialize(value)
|
47
|
+
value && Address.new(value).normal
|
48
|
+
end
|
47
49
|
end
|
48
50
|
end
|
data/lib/email_address/config.rb
CHANGED
@@ -29,20 +29,22 @@
|
|
29
29
|
# user.canonical_email #=> "patsmith@gmail.com"
|
30
30
|
################################################################################
|
31
31
|
|
32
|
-
|
32
|
+
module EmailAddress
|
33
|
+
class EmailAddressType < ActiveRecord::Type::Value
|
33
34
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
35
|
+
# From user input, setter
|
36
|
+
def cast(value)
|
37
|
+
super(Address.new(value).normal)
|
38
|
+
end
|
38
39
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
40
|
+
# From a database value
|
41
|
+
def deserialize(value)
|
42
|
+
value && Address.new(value).normal
|
43
|
+
end
|
44
|
+
|
45
|
+
# To a database value (string)
|
46
|
+
def serialize(value)
|
47
|
+
value && Address.new(value).normal
|
48
|
+
end
|
47
49
|
end
|
48
50
|
end
|
@@ -24,7 +24,7 @@ module EmailAddress
|
|
24
24
|
|
25
25
|
def initialize(host, config = {})
|
26
26
|
@host = host
|
27
|
-
@config = config.is_a?(Hash) ?
|
27
|
+
@config = config.is_a?(Hash) ? Config.new(config) : config
|
28
28
|
@dns_disabled = @config[:host_validation] == :syntax || @config[:dns_lookup] == :off
|
29
29
|
end
|
30
30
|
|
@@ -38,7 +38,7 @@ module EmailAddress
|
|
38
38
|
# Returns the provider name based on the MX-er host names, or nil if not matched
|
39
39
|
def provider
|
40
40
|
return @provider if defined? @provider
|
41
|
-
|
41
|
+
Config.providers.each do |provider, config|
|
42
42
|
if config[:exchanger_match] && matches?(config[:exchanger_match])
|
43
43
|
return @provider = provider
|
44
44
|
end
|
@@ -76,7 +76,7 @@ module EmailAddress
|
|
76
76
|
|
77
77
|
# Returns Array of domain names for the MX'ers, used to determine the Provider
|
78
78
|
def domains
|
79
|
-
@_domains ||= mxers.map { |m|
|
79
|
+
@_domains ||= mxers.map { |m| Host.new(m.first).domain_name }.sort.uniq
|
80
80
|
end
|
81
81
|
|
82
82
|
# Returns an array of MX IP address (String) for the given email domain
|
data/lib/email_address/host.rb
CHANGED
@@ -87,7 +87,7 @@ module EmailAddress
|
|
87
87
|
def initialize(host_name, config = {})
|
88
88
|
@original = host_name ||= ""
|
89
89
|
config[:host_type] ||= :email
|
90
|
-
@config = config.is_a?(Hash) ?
|
90
|
+
@config = config.is_a?(Hash) ? Config.new(config) : config
|
91
91
|
@error = @error_message = nil
|
92
92
|
parse(host_name)
|
93
93
|
end
|
@@ -209,7 +209,7 @@ module EmailAddress
|
|
209
209
|
def find_provider # :nodoc:
|
210
210
|
return provider if provider
|
211
211
|
|
212
|
-
|
212
|
+
Config.providers.each do |provider, config|
|
213
213
|
if config[:host_match] && matches?(config[:host_match])
|
214
214
|
return set_provider(provider, config)
|
215
215
|
end
|
@@ -233,7 +233,7 @@ module EmailAddress
|
|
233
233
|
end
|
234
234
|
|
235
235
|
def hosted_provider
|
236
|
-
|
236
|
+
Exchanger.cached(dns_name).provider
|
237
237
|
end
|
238
238
|
|
239
239
|
############################################################################
|
@@ -338,11 +338,11 @@ module EmailAddress
|
|
338
338
|
@_dns_a_record ||= []
|
339
339
|
end
|
340
340
|
|
341
|
-
# Returns an array of
|
341
|
+
# Returns an array of Exchanger hosts configured in DNS.
|
342
342
|
# The array will be empty if none are configured.
|
343
343
|
def exchangers
|
344
344
|
# return nil if @config[:host_type] != :email || !self.dns_enabled?
|
345
|
-
@_exchangers ||=
|
345
|
+
@_exchangers ||= Exchanger.cached(dns_name, @config)
|
346
346
|
end
|
347
347
|
|
348
348
|
# Returns a DNS TXT Record
|
@@ -497,7 +497,7 @@ module EmailAddress
|
|
497
497
|
def set_error(err, reason = nil)
|
498
498
|
@error = err
|
499
499
|
@reason = reason
|
500
|
-
@error_message =
|
500
|
+
@error_message = Config.error_message(err)
|
501
501
|
false
|
502
502
|
end
|
503
503
|
|
data/lib/email_address/local.rb
CHANGED
@@ -107,7 +107,7 @@ module EmailAddress
|
|
107
107
|
%r/^([\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+)$/i.freeze
|
108
108
|
|
109
109
|
def initialize(local, config={}, host=nil)
|
110
|
-
@config = config.is_a?(Hash) ?
|
110
|
+
@config = config.is_a?(Hash) ? Config.new(config) : config
|
111
111
|
self.local = local
|
112
112
|
@host = host
|
113
113
|
@error = @error_message = nil
|
@@ -388,7 +388,7 @@ module EmailAddress
|
|
388
388
|
def set_error(err, reason=nil)
|
389
389
|
@error = err
|
390
390
|
@reason= reason
|
391
|
-
@error_message =
|
391
|
+
@error_message = Config.error_message(err)
|
392
392
|
false
|
393
393
|
end
|
394
394
|
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
require_relative 'test_helper'
|
3
|
+
|
4
|
+
class TestAliasing < MiniTest::Test
|
5
|
+
def setup
|
6
|
+
Object.send(:const_set, :EmailAddressValidator, EmailAddress)
|
7
|
+
Object.send(:remove_const, :EmailAddress)
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_email_address_not_defined
|
11
|
+
assert_nil defined?(EmailAddress)
|
12
|
+
assert_nil defined?(EmailAddress::Address)
|
13
|
+
assert_nil defined?(EmailAddress::Config)
|
14
|
+
assert_nil defined?(EmailAddress::Exchanger)
|
15
|
+
assert_nil defined?(EmailAddress::Host)
|
16
|
+
assert_nil defined?(EmailAddress::Local)
|
17
|
+
assert_nil defined?(EmailAddress::Rewriter)
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_alias_defined
|
21
|
+
assert_equal defined?(EmailAddressValidator), "constant"
|
22
|
+
assert_equal defined?(EmailAddressValidator::Address), "constant"
|
23
|
+
assert_equal defined?(EmailAddressValidator::Config), "constant"
|
24
|
+
assert_equal defined?(EmailAddressValidator::Exchanger), "constant"
|
25
|
+
assert_equal defined?(EmailAddressValidator::Host), "constant"
|
26
|
+
assert_equal defined?(EmailAddressValidator::Local), "constant"
|
27
|
+
assert_equal defined?(EmailAddressValidator::Rewriter), "constant"
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_alias_class_methods
|
31
|
+
assert_equal true, EmailAddressValidator.valid?("user@yahoo.com")
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_alias_host_methods
|
35
|
+
assert_equal true, EmailAddressValidator::Host.new("yahoo.com").valid?
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_alias_address_methods
|
39
|
+
assert_equal true, EmailAddressValidator::Address.new("user@yahoo.com").valid?
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_alias_config_methods
|
43
|
+
assert Hash, EmailAddressValidator::Config.new.to_h
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_alias_local_methods
|
47
|
+
assert_equal true, EmailAddressValidator::Local.new("user").valid?
|
48
|
+
end
|
49
|
+
|
50
|
+
def teardown
|
51
|
+
Object.send(:const_set, :EmailAddress, EmailAddressValidator)
|
52
|
+
Object.send(:remove_const, :EmailAddressValidator)
|
53
|
+
end
|
54
|
+
end
|
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.1.
|
4
|
+
version: 0.1.18
|
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: 2020-
|
11
|
+
date: 2020-06-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -162,13 +162,14 @@ files:
|
|
162
162
|
- test/email_address/test_host.rb
|
163
163
|
- test/email_address/test_local.rb
|
164
164
|
- test/email_address/test_rewriter.rb
|
165
|
+
- test/test_aliasing.rb
|
165
166
|
- test/test_email_address.rb
|
166
167
|
- test/test_helper.rb
|
167
168
|
homepage: https://github.com/afair/email_address
|
168
169
|
licenses:
|
169
170
|
- MIT
|
170
171
|
metadata: {}
|
171
|
-
post_install_message:
|
172
|
+
post_install_message:
|
172
173
|
rdoc_options: []
|
173
174
|
require_paths:
|
174
175
|
- lib
|
@@ -184,7 +185,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
184
185
|
version: '0'
|
185
186
|
requirements: []
|
186
187
|
rubygems_version: 3.0.6
|
187
|
-
signing_key:
|
188
|
+
signing_key:
|
188
189
|
specification_version: 4
|
189
190
|
summary: This gem provides a ruby language library for working with and validating
|
190
191
|
email addresses. By default, it validates against conventional usage, the format
|
@@ -199,5 +200,6 @@ test_files:
|
|
199
200
|
- test/email_address/test_host.rb
|
200
201
|
- test/email_address/test_local.rb
|
201
202
|
- test/email_address/test_rewriter.rb
|
203
|
+
- test/test_aliasing.rb
|
202
204
|
- test/test_email_address.rb
|
203
205
|
- test/test_helper.rb
|