email_address 0.1.17 → 0.1.18
Sign up to get free protection for your applications and to get access to all the features.
- 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
|