email_address 0.1.9 → 0.1.10
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 +1 -1
- data/README.md +3 -0
- data/email_address.gemspec +4 -4
- data/lib/email_address.rb +3 -0
- data/lib/email_address/active_record_validator.rb +2 -0
- data/lib/email_address/address.rb +9 -5
- data/lib/email_address/canonical_email_address_type.rb +2 -0
- data/lib/email_address/config.rb +13 -8
- data/lib/email_address/email_address_type.rb +2 -0
- data/lib/email_address/exchanger.rb +10 -3
- data/lib/email_address/host.rb +16 -10
- data/lib/email_address/local.rb +30 -9
- data/lib/email_address/messages.yaml +20 -0
- data/lib/email_address/rewriter.rb +2 -0
- data/lib/email_address/version.rb +1 -1
- data/test/email_address/test_address.rb +7 -3
- data/test/email_address/test_host.rb +6 -6
- metadata +8 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b7864361d639e8c0d2609782b1d4d02a2d8c497bf3080a6bb563e5a8eac7bdc6
|
4
|
+
data.tar.gz: 1145528c90a7845ce092fae5791a8dde9d81a66709188d3a53eb9310a8e49e7e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a04d299269c34d29dc630335462bd8a6b778c9ce4eefa12ee5bb5a5f0e22fb6e435b4c84f413f6f194f8a2e8e4d94831d96f0cee3eef7fd28e8028bd839ffc85
|
7
|
+
data.tar.gz: 44184ef5b1c631e9a7cde11b8570c49473cceda7649cc625a386bd6c5ec8cd9fae5b024db82c06a99d237b025a249db92835492f99cc781a44654fb56d6999cf
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -22,6 +22,9 @@ address validator and attributes API custom datatypes.
|
|
22
22
|
|
23
23
|
Requires Ruby 2.0 or later.
|
24
24
|
|
25
|
+
Looking for a Javascript version of this library? Check out the
|
26
|
+
[email_address](https://www.npmjs.com/package/email_address) npm module.
|
27
|
+
|
25
28
|
## Quick Start
|
26
29
|
|
27
30
|
To quickly validate email addresses, use the valid? and error helpers.
|
data/email_address.gemspec
CHANGED
@@ -20,12 +20,12 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
spec.add_development_dependency "rake"
|
22
22
|
spec.add_development_dependency "minitest", "~> 5.11"
|
23
|
-
spec.add_development_dependency "bundler", "~> 1.
|
23
|
+
spec.add_development_dependency "bundler", "~> 1.16.0"
|
24
24
|
if RUBY_PLATFORM == 'java'
|
25
|
-
spec.add_development_dependency "activerecord", "= 4.2.
|
26
|
-
spec.add_development_dependency "activerecord-jdbcsqlite3-adapter", '
|
25
|
+
spec.add_development_dependency "activerecord", "= 4.2.10"
|
26
|
+
spec.add_development_dependency "activerecord-jdbcsqlite3-adapter", '~> 1.3.24'
|
27
27
|
else
|
28
|
-
spec.add_development_dependency "activerecord", "~> 5.2.0
|
28
|
+
spec.add_development_dependency "activerecord", "~> 5.2.0"
|
29
29
|
spec.add_development_dependency "sqlite3"
|
30
30
|
end
|
31
31
|
spec.add_development_dependency "codeclimate-test-reporter"
|
data/lib/email_address.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'digest/sha1'
|
2
4
|
require 'digest/md5'
|
3
5
|
|
@@ -30,6 +32,7 @@ module EmailAddress
|
|
30
32
|
@host = EmailAddress::Host.new(host, config)
|
31
33
|
@config = @host.config
|
32
34
|
@local = EmailAddress::Local.new(local, @config, @host)
|
35
|
+
@error = @error_message = nil
|
33
36
|
end
|
34
37
|
|
35
38
|
# Given an email address, this returns an array of [local, host] parts
|
@@ -228,7 +231,7 @@ module EmailAddress
|
|
228
231
|
def valid?(options={})
|
229
232
|
@error = nil
|
230
233
|
unless self.local.valid?
|
231
|
-
return set_error
|
234
|
+
return set_error self.local.error
|
232
235
|
end
|
233
236
|
unless self.host.valid?
|
234
237
|
return set_error self.host.error_message
|
@@ -259,7 +262,7 @@ module EmailAddress
|
|
259
262
|
smtp.start(@config[:smtp_helo_name] || 'localhost')
|
260
263
|
smtp.mailfrom @config[:smtp_mail_from] || 'postmaster@localhost'
|
261
264
|
smtp.rcptto self.to_s
|
262
|
-
p [:connect]
|
265
|
+
#p [:connect]
|
263
266
|
smtp.finish
|
264
267
|
true
|
265
268
|
rescue Net::SMTPUnknownError => e
|
@@ -277,17 +280,18 @@ module EmailAddress
|
|
277
280
|
end
|
278
281
|
|
279
282
|
def set_error(err, reason=nil)
|
280
|
-
@error =
|
283
|
+
@error = err
|
281
284
|
@reason= reason
|
285
|
+
@error_message = EmailAddress::Config.error_message(err)
|
282
286
|
false
|
283
287
|
end
|
284
288
|
|
285
289
|
def error_message
|
286
|
-
@
|
290
|
+
@error_message
|
287
291
|
end
|
288
292
|
|
289
293
|
def error
|
290
|
-
self.valid? ? nil : @
|
294
|
+
self.valid? ? nil : @error_message
|
291
295
|
end
|
292
296
|
|
293
297
|
end
|
data/lib/email_address/config.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module EmailAddress
|
2
4
|
# Global configurations and for default/unknown providers. Settings are:
|
3
5
|
#
|
@@ -92,6 +94,8 @@ module EmailAddress
|
|
92
94
|
# * exchanger_match: %w(google.com 127.0.0.1 10.9.8.0/24 ::1/64)
|
93
95
|
#
|
94
96
|
|
97
|
+
require 'yaml'
|
98
|
+
|
95
99
|
class Config
|
96
100
|
@config = {
|
97
101
|
dns_lookup: :mx, # :mx, :a, :off
|
@@ -121,6 +125,7 @@ module EmailAddress
|
|
121
125
|
address_fqdn_domain: nil, # Fully Qualified Domain Name = [host].[domain.tld]
|
122
126
|
}
|
123
127
|
|
128
|
+
# 2018-04: AOL and Yahoo now under "oath.com", owned by Verizon. Keeping separate for now
|
124
129
|
@providers = {
|
125
130
|
aol: {
|
126
131
|
host_match: %w(aol. compuserve. netscape. aim. cs.),
|
@@ -142,14 +147,10 @@ module EmailAddress
|
|
142
147
|
},
|
143
148
|
}
|
144
149
|
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
exceeds_size: "Address too long",
|
150
|
-
not_allowed: "Address is not allowed",
|
151
|
-
incomplete_domain: "Domain name is incomplete",
|
152
|
-
}
|
150
|
+
|
151
|
+
# Loads messages: {"en"=>{"email_address"=>{"invalid_address"=>"Invalid Email Address",...}}}
|
152
|
+
# Rails/I18n gem: t(email_address.error, scope: "email_address")
|
153
|
+
@errors = YAML.load_file(File.dirname(__FILE__)+"/messages.yaml")
|
153
154
|
|
154
155
|
# Set multiple default configuration settings
|
155
156
|
def self.configure(config={})
|
@@ -177,6 +178,10 @@ module EmailAddress
|
|
177
178
|
@providers[name]
|
178
179
|
end
|
179
180
|
|
181
|
+
def self.error_message(name, locale="en")
|
182
|
+
@errors[locale]["email_address"][name.to_s] || name.to_s
|
183
|
+
end
|
184
|
+
|
180
185
|
# Customize your own error message text.
|
181
186
|
def self.error_messages(hash=nil)
|
182
187
|
@errors = @errors.merge(hash) if hash
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'resolv'
|
2
4
|
require 'netaddr'
|
3
5
|
require 'socket'
|
@@ -6,7 +8,7 @@ module EmailAddress
|
|
6
8
|
class Exchanger
|
7
9
|
include Enumerable
|
8
10
|
|
9
|
-
def self.cached(host)
|
11
|
+
def self.cached(host, config={})
|
10
12
|
@host_cache ||= {}
|
11
13
|
@cache_size ||= ENV['EMAIL_ADDRESS_CACHE_SIZE'].to_i || 100
|
12
14
|
if @host_cache.has_key?(host)
|
@@ -14,9 +16,9 @@ module EmailAddress
|
|
14
16
|
@host_cache[host] = o # LRU cache, move to end
|
15
17
|
elsif @host_cache.size >= @cache_size
|
16
18
|
@host_cache.delete(@host_cache.keys.first)
|
17
|
-
@host_cache[host] = new(host)
|
19
|
+
@host_cache[host] = new(host, config)
|
18
20
|
else
|
19
|
-
@host_cache[host] = new(host)
|
21
|
+
@host_cache[host] = new(host, config)
|
20
22
|
end
|
21
23
|
end
|
22
24
|
|
@@ -44,7 +46,11 @@ module EmailAddress
|
|
44
46
|
|
45
47
|
# Returns: [["mta7.am0.yahoodns.net", "66.94.237.139", 1], ["mta5.am0.yahoodns.net", "67.195.168.230", 1], ["mta6.am0.yahoodns.net", "98.139.54.60", 1]]
|
46
48
|
# If not found, returns []
|
49
|
+
# Returns a dummy record when dns_lookup is turned off since it may exists, though
|
50
|
+
# may not find provider by MX name or IP. I'm not sure about the "0.0.0.0" ip, it should
|
51
|
+
# be good in this context, but in "listen" context it means "all bound IP's"
|
47
52
|
def mxers
|
53
|
+
return [["example.com", "0.0.0.0", 1]] if @config[:dns_lookup] == :off
|
48
54
|
@mxers ||= Resolv::DNS.open do |dns|
|
49
55
|
ress = dns.getresources(@host, Resolv::DNS::Resource::IN::MX)
|
50
56
|
records = ress.map do |r|
|
@@ -69,6 +75,7 @@ module EmailAddress
|
|
69
75
|
|
70
76
|
# Returns an array of MX IP address (String) for the given email domain
|
71
77
|
def mx_ips
|
78
|
+
return ["0.0.0.0"] if @config[:dns_lookup] == :off
|
72
79
|
mxers.map {|m| m[1] }
|
73
80
|
end
|
74
81
|
|
data/lib/email_address/host.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
|
1
2
|
require 'simpleidn'
|
2
3
|
require 'resolv'
|
3
4
|
require 'netaddr'
|
@@ -88,6 +89,7 @@ module EmailAddress
|
|
88
89
|
@original = host_name ||= ''
|
89
90
|
config[:host_type] ||= :email
|
90
91
|
@config = config
|
92
|
+
@error = @error_message = nil
|
91
93
|
parse(host_name)
|
92
94
|
end
|
93
95
|
|
@@ -334,6 +336,7 @@ module EmailAddress
|
|
334
336
|
|
335
337
|
# Returns: [official_hostname, alias_hostnames, address_family, *address_list]
|
336
338
|
def dns_a_record
|
339
|
+
@_dns_a_record = "0.0.0.0" if @config[:dns_lookup] == :off
|
337
340
|
@_dns_a_record ||= Socket.gethostbyname(self.dns_name)
|
338
341
|
rescue SocketError # not found, but could also mean network not work
|
339
342
|
@_dns_a_record ||= []
|
@@ -343,7 +346,7 @@ module EmailAddress
|
|
343
346
|
# The array will be empty if none are configured.
|
344
347
|
def exchangers
|
345
348
|
return nil if @config[:host_type] != :email || !self.dns_enabled?
|
346
|
-
@_exchangers ||= EmailAddress::Exchanger.cached(self.dns_name)
|
349
|
+
@_exchangers ||= EmailAddress::Exchanger.cached(self.dns_name, @config)
|
347
350
|
end
|
348
351
|
|
349
352
|
# Returns a DNS TXT Record
|
@@ -398,11 +401,6 @@ module EmailAddress
|
|
398
401
|
end
|
399
402
|
end
|
400
403
|
|
401
|
-
# The inverse of valid? -- Returns nil (falsey) if valid, otherwise error message
|
402
|
-
def error
|
403
|
-
valid? ? nil : @error_message
|
404
|
-
end
|
405
|
-
|
406
404
|
# True if the host name has a DNS A Record
|
407
405
|
def valid_dns?
|
408
406
|
bool = dns_a_record.size > 0 || set_error(:domain_unknown)
|
@@ -414,7 +412,9 @@ module EmailAddress
|
|
414
412
|
|
415
413
|
# True if the host name has valid MX servers configured in DNS
|
416
414
|
def valid_mx?
|
417
|
-
if self.exchangers.
|
415
|
+
if self.exchangers.blank?
|
416
|
+
set_error(:domain_unknown)
|
417
|
+
elsif self.exchangers.mx_ips.size > 0
|
418
418
|
if self.localhost? && !@config[:host_local]
|
419
419
|
set_error(:domain_no_localhost)
|
420
420
|
else
|
@@ -457,11 +457,11 @@ module EmailAddress
|
|
457
457
|
if self.ip_address
|
458
458
|
rel =
|
459
459
|
if self.ip_address.include?(":")
|
460
|
-
NetAddr::IPv6Net.parse("::1").rel(
|
460
|
+
NetAddr::IPv6Net.parse(""+"::1").rel(
|
461
461
|
NetAddr::IPv6Net.parse(self.ip_address)
|
462
462
|
)
|
463
463
|
else
|
464
|
-
NetAddr::IPv4Net.parse("127.0.0.0/8").rel(
|
464
|
+
NetAddr::IPv4Net.parse(""+"127.0.0.0/8").rel(
|
465
465
|
NetAddr::IPv4Net.parse(self.ip_address)
|
466
466
|
)
|
467
467
|
end
|
@@ -492,10 +492,16 @@ module EmailAddress
|
|
492
492
|
end
|
493
493
|
|
494
494
|
def set_error(err, reason=nil)
|
495
|
-
@
|
495
|
+
@error = err
|
496
496
|
@reason = reason
|
497
|
+
@error_message = EmailAddress::Config.error_message(err)
|
497
498
|
false
|
498
499
|
end
|
499
500
|
|
501
|
+
# The inverse of valid? -- Returns nil (falsey) if valid, otherwise error message
|
502
|
+
def error
|
503
|
+
self.valid? ? nil : @error_message
|
504
|
+
end
|
505
|
+
|
500
506
|
end
|
501
507
|
end
|
data/lib/email_address/local.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module EmailAddress
|
2
4
|
##############################################################################
|
3
5
|
# EmailAddress Local part consists of
|
@@ -103,6 +105,7 @@ module EmailAddress
|
|
103
105
|
self.config = config.empty? ? EmailAddress::Config.all_settings : config
|
104
106
|
self.local = local
|
105
107
|
@host = host
|
108
|
+
@error = @error_message = nil
|
106
109
|
end
|
107
110
|
|
108
111
|
def local=(raw)
|
@@ -189,7 +192,7 @@ module EmailAddress
|
|
189
192
|
self.conventional
|
190
193
|
elsif form == :canonical
|
191
194
|
self.canonical
|
192
|
-
elsif form == :
|
195
|
+
elsif form == :relaxed
|
193
196
|
self.relax
|
194
197
|
elsif form == :standard
|
195
198
|
self.standard
|
@@ -301,21 +304,23 @@ module EmailAddress
|
|
301
304
|
end
|
302
305
|
|
303
306
|
def valid_size?
|
307
|
+
return set_error(:local_size_long) if self.local.size > STANDARD_MAX_SIZE
|
304
308
|
if @host && @host.hosted_service?
|
305
|
-
return false if @config[:local_private_size] &&
|
306
|
-
!@config[:local_private_size].include?(self.local.size)
|
307
|
-
else
|
308
|
-
return false if @config[:local_size] &&
|
309
|
-
!@config[:local_size].include?(self.local.size)
|
309
|
+
return false if @config[:local_private_size] && !valid_size_checks(@config[:local_private_size])
|
310
310
|
end
|
311
|
-
return false if @config[:
|
312
|
-
return false if
|
311
|
+
return false if @config[:local_size] && !valid_size_checks(@config[:local_size])
|
312
|
+
return false if @config[:mailbox_size] && !valid_size_checks(@config[:mailbox_size])
|
313
|
+
true
|
314
|
+
end
|
315
|
+
|
316
|
+
def valid_size_checks(range)
|
317
|
+
return set_error(:local_size_short) if self.mailbox.size < range.first
|
318
|
+
return set_error(:local_size_long) if self.mailbox.size > range.last
|
313
319
|
true
|
314
320
|
end
|
315
321
|
|
316
322
|
def valid_encoding?(enc=@config[:local_encoding]||:ascii)
|
317
323
|
return false if enc == :ascii && self.unicode?
|
318
|
-
#return false if enc == :unicode && self.ascii?
|
319
324
|
true
|
320
325
|
end
|
321
326
|
|
@@ -365,5 +370,21 @@ module EmailAddress
|
|
365
370
|
end
|
366
371
|
false
|
367
372
|
end
|
373
|
+
|
374
|
+
def set_error(err, reason=nil)
|
375
|
+
@error = err
|
376
|
+
@reason= reason
|
377
|
+
@error_message = EmailAddress::Config.error_message(err)
|
378
|
+
false
|
379
|
+
end
|
380
|
+
|
381
|
+
def error_message
|
382
|
+
@error_message
|
383
|
+
end
|
384
|
+
|
385
|
+
def error
|
386
|
+
self.valid? ? nil : @error
|
387
|
+
end
|
388
|
+
|
368
389
|
end
|
369
390
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
en:
|
2
|
+
email_address:
|
3
|
+
address_unknown: "Unknown Email Address"
|
4
|
+
domain_does_not_accept_email: "This domain is not configured to accept email"
|
5
|
+
domain_invalid: "Invalid Domain Name"
|
6
|
+
domain_no_localhost: "localhost is not allowed for your domain name"
|
7
|
+
domain_unknown: "Domain name not registered"
|
8
|
+
exceeds_size: "Address too long"
|
9
|
+
incomplete_domain: "Domain name is incomplete"
|
10
|
+
invalid_address: "Invalid Email Address"
|
11
|
+
invalid_host: "Invalid Host/Domain Name"
|
12
|
+
invalid_mailbox: "Invalid Mailbox"
|
13
|
+
ip_address_forbidden: "IP Addresses are not allowed"
|
14
|
+
ip_address_no_localhost: "Localhost IP addresses are not allowed"
|
15
|
+
ipv4_address_invalid: "This is not a valid IPv4 address"
|
16
|
+
ipv6_address_invalid: "This is not a valid IPv6 address"
|
17
|
+
local_size_long: "Mailbox name too long"
|
18
|
+
local_size_short: "Mailbox name too short"
|
19
|
+
not_allowed: "Address is not allowed"
|
20
|
+
server_not_available: "The remote email server is not available"
|
@@ -77,9 +77,9 @@ class TestAddress < Minitest::Test
|
|
77
77
|
e = EmailAddress.new("User+tag.gmail.ws") # No domain means localhost
|
78
78
|
assert_equal '', e.hostname
|
79
79
|
assert_equal false, e.valid? # localhost not allowed by default
|
80
|
-
assert_equal EmailAddress.error("user1"),
|
81
|
-
assert_equal EmailAddress.error("user1", host_local:true),
|
82
|
-
assert_equal EmailAddress.error("user1@localhost", host_local:true),
|
80
|
+
assert_equal EmailAddress.error("user1"), "Invalid Domain Name"
|
81
|
+
assert_equal EmailAddress.error("user1", host_local:true), "This domain is not configured to accept email"
|
82
|
+
assert_equal EmailAddress.error("user1@localhost", host_local:true), "This domain is not configured to accept email"
|
83
83
|
assert_nil EmailAddress.error("user2@localhost", host_local:true, dns_lookup: :off, host_validation: :syntax)
|
84
84
|
end
|
85
85
|
|
@@ -112,4 +112,8 @@ class TestAddress < Minitest::Test
|
|
112
112
|
assert ! EmailAddress.valid?('example.user@foo.com/')
|
113
113
|
end
|
114
114
|
|
115
|
+
def test_relaxed_normal
|
116
|
+
assert ! EmailAddress.new('a.c.m.e.-industries@foo.com').valid?
|
117
|
+
assert true, EmailAddress.new('a.c.m.e.-industries@foo.com', local_format: :relaxed).valid?
|
118
|
+
end
|
115
119
|
end
|
@@ -114,12 +114,12 @@ class TestHost < MiniTest::Test
|
|
114
114
|
|
115
115
|
def test_errors
|
116
116
|
assert_nil EmailAddress::Host.new("yahoo.com").error
|
117
|
-
assert_equal EmailAddress::Host.new("example.com").error,
|
118
|
-
assert_equal EmailAddress::Host.new("yahoo.wtf").error,
|
117
|
+
assert_equal EmailAddress::Host.new("example.com").error, "This domain is not configured to accept email"
|
118
|
+
assert_equal EmailAddress::Host.new("yahoo.wtf").error, "Domain name not registered"
|
119
119
|
assert_nil EmailAddress::Host.new("ajsdfhajshdfklasjhd.wtf", host_validation: :syntax).error
|
120
|
-
assert_equal EmailAddress::Host.new("ya hoo.com", host_validation: :syntax).error,
|
121
|
-
assert_equal EmailAddress::Host.new("[127.0.0.1]").error,
|
122
|
-
assert_equal EmailAddress::Host.new("[127.0.0.666]", host_allow_ip:true).error,
|
123
|
-
assert_equal EmailAddress::Host.new("[IPv6::12t]", host_allow_ip:true).error,
|
120
|
+
assert_equal EmailAddress::Host.new("ya hoo.com", host_validation: :syntax).error, "Invalid Domain Name"
|
121
|
+
assert_equal EmailAddress::Host.new("[127.0.0.1]").error, "IP Addresses are not allowed"
|
122
|
+
assert_equal EmailAddress::Host.new("[127.0.0.666]", host_allow_ip:true).error, "This is not a valid IPv4 address"
|
123
|
+
assert_equal EmailAddress::Host.new("[IPv6::12t]", host_allow_ip:true).error, "This is not a valid IPv6 address"
|
124
124
|
end
|
125
125
|
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.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Allen Fair
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-07-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -44,28 +44,28 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 1.16.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: 1.16.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: 5.2.0
|
61
|
+
version: 5.2.0
|
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: 5.2.0
|
68
|
+
version: 5.2.0
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: sqlite3
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -145,6 +145,7 @@ files:
|
|
145
145
|
- lib/email_address/exchanger.rb
|
146
146
|
- lib/email_address/host.rb
|
147
147
|
- lib/email_address/local.rb
|
148
|
+
- lib/email_address/messages.yaml
|
148
149
|
- lib/email_address/rewriter.rb
|
149
150
|
- lib/email_address/version.rb
|
150
151
|
- test/activerecord/test_ar.rb
|
@@ -177,7 +178,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
177
178
|
version: '0'
|
178
179
|
requirements: []
|
179
180
|
rubyforge_project:
|
180
|
-
rubygems_version: 2.7.
|
181
|
+
rubygems_version: 2.7.6
|
181
182
|
signing_key:
|
182
183
|
specification_version: 4
|
183
184
|
summary: This gem provides a ruby language library for working with and validating
|