validators 3.3.0 → 3.4.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/.github/FUNDING.yml +1 -0
  3. data/.rubocop.yml +3 -18
  4. data/README.md +29 -24
  5. data/Rakefile +0 -1
  6. data/bin/sync-reserved-subdomains +96 -0
  7. data/data/reserved_subdomains.txt +4 -22
  8. data/lib/validators/disposable_domains.rb +18 -0
  9. data/lib/validators/disposable_emails.rb +7 -4
  10. data/lib/validators/ip.rb +6 -6
  11. data/lib/validators/locale/en.yml +5 -4
  12. data/lib/validators/locale/pt-BR.yml +7 -3
  13. data/lib/validators/tld.rb +7 -5
  14. data/lib/validators/validates_cnpj_format_of.rb +1 -2
  15. data/lib/validators/validates_cpf_format_of.rb +1 -2
  16. data/lib/validators/validates_datetime.rb +3 -2
  17. data/lib/validators/validates_email_format_of.rb +5 -5
  18. data/lib/validators/validates_ssh_private_key.rb +1 -3
  19. data/lib/validators/validates_ssh_public_key.rb +1 -3
  20. data/lib/validators/version.rb +2 -2
  21. data/lib/validators.rb +8 -1
  22. data/test/test_helper.rb +1 -2
  23. data/test/validators/disposable_email_test.rb +0 -2
  24. data/test/validators/validates_cnpj_format_of_test.rb +3 -3
  25. data/test/validators/validates_cpf_format_of_test.rb +3 -3
  26. data/test/validators/validates_email_format_of_test.rb +23 -0
  27. data/test/validators/validates_ssh_private_key/common_test.rb +3 -3
  28. data/test/validators/validates_ssh_public_key_test.rb +3 -3
  29. data/test/validators/validates_url_format_of/with_tld_validation_test.rb +18 -0
  30. data/test/validators/validates_url_format_of/without_tld_validation_test.rb +18 -0
  31. data/validators.gemspec +3 -1
  32. metadata +25 -46
  33. data/bin/sync-disposable-hostnames +0 -230
  34. data/bin/sync-tld +0 -20
  35. data/data/country_tlds.txt +0 -235
  36. data/data/disposable_domains.txt +0 -110996
  37. data/data/disposable_emails.txt +0 -38
  38. data/data/tld.txt +0 -1508
  39. data/lib/validators/disposable_hostnames.rb +0 -11
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 862ad7c2a49bcc38d917336b109047a330c6de6c6da16d83ea7953ddefe70096
4
- data.tar.gz: fb5e0b9db3ec0fdbc064eb6467cb36fab3d0f4bab6f29a5c8439c8d5edeb46fd
3
+ metadata.gz: d0f693875b0571922e182c06e57d4710dc698506a3859d943973706a4565fa3a
4
+ data.tar.gz: 36729706a9f37dec4243a16bd7e1a2e77007e07e03077413a78d04fba2607d53
5
5
  SHA512:
6
- metadata.gz: b8842cf3ee2161ef2fe18c384efdb5ff6407c135560a95b91689d29b8ff65d87272c599288de55a6422dfaa6ff4be3b0b00fbd7ea8a8472e47bc08acfb973a85
7
- data.tar.gz: 7a6fe664d6ef7a33735b8bf41cc198f8509a5712f788a2db93d6f2c4b39678ad6965eea1557fb6e43551a4d947a0cfd2e89c16a53c0721b6ada4390baa8cf293
6
+ metadata.gz: ee2529d3bf6c418fff9f38c104c9f8d3df27121213472ef15b12ae19c37f4dbbeb527b821f1d48b4d803a06810efd1fbb7b3807f3cdec574c76ea1d547840def
7
+ data.tar.gz: 278ff5305f827bf8f097426de34ab0543b57474dc731586b6c278e199b8c7c8ac1499c8d0c875dd54378ab292009a9a8e8bc44f8ea16ba75f317fcdaa9b682eb
@@ -0,0 +1 @@
1
+ github: [fnando]
data/.rubocop.yml CHANGED
@@ -3,20 +3,13 @@ inherit_gem:
3
3
  rubocop-fnando: .rubocop.yml
4
4
 
5
5
  AllCops:
6
- TargetRubyVersion: 2.6
6
+ TargetRubyVersion: 2.5
7
+ Exclude:
8
+ - vendor/**/*
7
9
 
8
10
  Style/AsciiComments:
9
11
  Enabled: false
10
12
 
11
- Metrics/AbcSize:
12
- Enabled: false
13
-
14
- Metrics/CyclomaticComplexity:
15
- Enabled: false
16
-
17
- Metrics/PerceivedComplexity:
18
- Enabled: false
19
-
20
13
  Style/Alias:
21
14
  Enabled: false
22
15
 
@@ -26,13 +19,5 @@ Layout/LineLength:
26
19
  Style/IfUnlessModifier:
27
20
  Enabled: false
28
21
 
29
- Metrics/MethodLength:
30
- Enabled: false
31
-
32
- Metrics/BlockLength:
33
- Exclude:
34
- - bin/**/*
35
- - "*.gemspec"
36
-
37
22
  Layout/EmptyLinesAroundAttributeAccessor:
38
23
  Enabled: false
data/README.md CHANGED
@@ -2,7 +2,8 @@
2
2
 
3
3
  [![Build Status](https://travis-ci.org/fnando/validators.svg)](https://travis-ci.org/fnando/validators)
4
4
  [![Code Climate](https://codeclimate.com/github/fnando/validators/badges/gpa.svg)](https://codeclimate.com/github/fnando/validators)
5
- [![Test Coverage](https://codeclimate.com/github/fnando/validators/badges/coverage.svg)](https://codeclimate.com/github/fnando/validators)
5
+ [![Gem](https://img.shields.io/gem/v/validators.svg)](https://rubygems.org/gems/validators)
6
+ [![Gem](https://img.shields.io/gem/dt/validators.svg)](https://rubygems.org/gems/validators)
6
7
 
7
8
  Add some nice ActiveModel/ActiveRecord validators.
8
9
 
@@ -20,6 +21,11 @@ gem "validators"
20
21
 
21
22
  ## Usage
22
23
 
24
+ **Notice**: Some validators will require additional dependencies; whenever you
25
+ get a message like
26
+ `gem-name is not part of the bundle. Add it to your project's Gemfile.`, all you
27
+ have to do is adding that gem to your own project's Gemfile.
28
+
23
29
  ### validates_email_format_of
24
30
 
25
31
  ```ruby
@@ -32,7 +38,9 @@ class User < ActiveRecord::Base
32
38
  end
33
39
  ```
34
40
 
35
- By default, it rejects disposable e-mails (e.g. mailinator). This loads a lot of data (~1.7MB), but you can disable this validation by setting `disposable: true`.
41
+ By default, it rejects disposable e-mails (e.g. mailinator). This loads a lot of
42
+ data (~1.7MB), but you can disable this validation by setting
43
+ `disposable: true`.
36
44
 
37
45
  ```ruby
38
46
  class User < ActiveRecord::Base
@@ -135,7 +143,6 @@ Rules:
135
143
  - labels do not consist of numeric values only
136
144
  - TLD validation (optional)
137
145
 
138
-
139
146
  ```ruby
140
147
  class Server < ActiveRecord::Base
141
148
  validates_hostname :hostname
@@ -152,8 +159,8 @@ A valid username/subdomain follows the hostname label validation:
152
159
  - cannot begin or end with a hyphen
153
160
  - cannot consist of numeric values only
154
161
 
155
- The compiled list will be used for both username and subdomain validations.
156
- This validation loads ~20KB of text.
162
+ The compiled list will be used for both username and subdomain validations. This
163
+ validation loads ~20KB of text.
157
164
 
158
165
  ```ruby
159
166
  class Server < ActiveRecord::Base
@@ -189,27 +196,25 @@ end
189
196
 
190
197
  ## Maintainer
191
198
 
192
- * [Nando Vieira](http://nandovieira.com)
199
+ - [Nando Vieira](http://nandovieira.com)
193
200
 
194
201
  ## License
195
202
 
196
203
  (The MIT License)
197
204
 
198
- Permission is hereby granted, free of charge, to any person obtaining
199
- a copy of this software and associated documentation files (the
200
- 'Software'), to deal in the Software without restriction, including
201
- without limitation the rights to use, copy, modify, merge, publish,
202
- distribute, sublicense, and/or sell copies of the Software, and to
203
- permit persons to whom the Software is furnished to do so, subject to
204
- the following conditions:
205
-
206
- The above copyright notice and this permission notice shall be
207
- included in all copies or substantial portions of the Software.
208
-
209
- THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
210
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
211
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
212
- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
213
- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
214
- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
215
- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
205
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
206
+ this software and associated documentation files (the 'Software'), to deal in
207
+ the Software without restriction, including without limitation the rights to
208
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
209
+ the Software, and to permit persons to whom the Software is furnished to do so,
210
+ subject to the following conditions:
211
+
212
+ The above copyright notice and this permission notice shall be included in all
213
+ copies or substantial portions of the Software.
214
+
215
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
216
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
217
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
218
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
219
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
220
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile CHANGED
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "bundler/setup"
4
3
  require "bundler/gem_tasks"
5
4
  require "rake/testtask"
6
5
  require "rubocop/rake_task"
@@ -0,0 +1,96 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "bundler/setup"
5
+ require "open-uri"
6
+ require "json"
7
+ require "yaml"
8
+ require "email_data"
9
+ require "aitch"
10
+
11
+ def fetch_nkkollaw
12
+ matchers = YAML.safe_load(Aitch.get("https://github.com/nkkollaw/reserved-subdomains/raw/master/reserved-subdomains.yaml").body).map(&:to_s)
13
+ matchers.map do |matcher|
14
+ next matcher unless matcher.start_with?("/")
15
+
16
+ matcher.gsub(%r{/(.*?)/}) do |_m, _group|
17
+ new_matcher = Regexp.last_match(1).gsub("[0-9]+", "[0-9-]*")
18
+ "/^#{new_matcher}$/"
19
+ end
20
+ end
21
+ end
22
+
23
+ def fetch_mottie
24
+ data = JSON.parse(Aitch.get("https://github.com/Mottie/github-reserved-names/raw/master/oddballs.json").body, symbolize_names: true)
25
+ data.keys.map(&:to_s)
26
+ end
27
+
28
+ def fetch_jedireza
29
+ data = JSON.parse(Aitch.get("https://github.com/jedireza/reserved-subdomains/raw/master/names.json").body, symbolize_names: true)
30
+ data.map(&:to_s)
31
+ end
32
+
33
+ def fetch_mvila
34
+ data = JSON.parse(Aitch.get("https://github.com/mvila/reserved-usernames/raw/master/data.json").body)
35
+ data.map(&:to_s)
36
+ end
37
+
38
+ def fetch_lukes
39
+ data = JSON.parse(Aitch.get("https://github.com/lukes/ISO-3166-Countries-with-Regional-Codes/raw/master/all/all.json").body)
40
+ data.map do |info|
41
+ info["alpha-2"].downcase
42
+ end
43
+ end
44
+
45
+ def fetch_dominicsayers
46
+ %w[
47
+ https://github.com/dominicsayers/reserved_subdomain/raw/master/lib/reserved_subdomain/literals/miscellaneous.txt
48
+ ].each_with_object([]) do |url, buffer|
49
+ data = Aitch.get(url).body.lines
50
+ buffer.push(*data.map(&:chomp))
51
+ end
52
+ end
53
+
54
+ subdomains = []
55
+ subdomains << fetch_nkkollaw
56
+ subdomains << fetch_mottie
57
+ subdomains << fetch_jedireza
58
+ subdomains << fetch_mvila
59
+ subdomains << fetch_lukes
60
+ subdomains << fetch_dominicsayers
61
+ subdomains << ("a".."z").to_a
62
+ subdomains << EmailData.tlds
63
+ subdomains << %w[
64
+ /^db[0-9-]*$/
65
+ /^dc[0-9-]*$/
66
+ /^dev[0-9-]*$/
67
+ /^dns[0-9-]*$/
68
+ /^ftp[0-9-]*$/
69
+ /^host[0-9-]*$/
70
+ /^mail[0-9-]*$/
71
+ /^mx[0-9-]*$/
72
+ /^ns[0-9-]*$/
73
+ /^ntp[0-9-]*$/
74
+ /^server[0-9-]*$/
75
+ /^smtp[0-9-]*$/
76
+ /^static[0-9-]*$/
77
+ /^support[0-9-]*$/
78
+ /^test[0-9-]*$/
79
+ /^vpn[0-9-]*$/
80
+ /^web[0-9-]*$/
81
+ /^www[0-9-]*$/
82
+ /^your.+$/
83
+ /^[0-9-]+$/
84
+ eu
85
+ us
86
+ ]
87
+
88
+ subdomains = subdomains.flatten.map do |subdomain|
89
+ next subdomain if subdomain.start_with?("/")
90
+
91
+ subdomain.gsub(/[-_]/, "")
92
+ end
93
+
94
+ File.open("./data/reserved_subdomains.txt", "w") do |file|
95
+ file << subdomains.flatten.uniq.sort.map(&:downcase).join("\n")
96
+ end
@@ -136,6 +136,7 @@ adult
136
136
  adv
137
137
  advanceautoparts
138
138
  advertising
139
+ advisories
139
140
  ae
140
141
  aecom
141
142
  aeg
@@ -144,7 +145,6 @@ aero
144
145
  aes
145
146
  aetna
146
147
  af
147
- afamilycompany
148
148
  affiliate
149
149
  affiliates
150
150
  afginc
@@ -398,7 +398,6 @@ brother
398
398
  brussels
399
399
  bs
400
400
  bt
401
- budapest
402
401
  bug
403
402
  bugatti
404
403
  bugs
@@ -451,7 +450,6 @@ cars
451
450
  cart
452
451
  casa
453
452
  case
454
- caseih
455
453
  casestudies
456
454
  caseys
457
455
  cash
@@ -472,7 +470,6 @@ cc
472
470
  cd
473
471
  cdn
474
472
  cdw
475
- ceb
476
473
  celanese
477
474
  celgene
478
475
  centene
@@ -743,7 +740,6 @@ drupal
743
740
  dteenergy
744
741
  dtv
745
742
  dubai
746
- duck
747
743
  dukeenergy
748
744
  dunlop
749
745
  dupont
@@ -950,7 +946,6 @@ fs
950
946
  ftp
951
947
  ftr
952
948
  fujitsu
953
- fujixerox
954
949
  fun
955
950
  fund
956
951
  furniture
@@ -1008,7 +1003,6 @@ github
1008
1003
  gives
1009
1004
  giving
1010
1005
  gl
1011
- glade
1012
1006
  glass
1013
1007
  gle
1014
1008
  global
@@ -1230,7 +1224,6 @@ item
1230
1224
  items
1231
1225
  itv
1232
1226
  itw
1233
- iveco
1234
1227
  j
1235
1228
  jabber
1236
1229
  jabil
@@ -1243,7 +1236,6 @@ javanese
1243
1236
  javascript
1244
1237
  jbhunt
1245
1238
  jcb
1246
- jcp
1247
1239
  jcpenney
1248
1240
  je
1249
1241
  jeep
@@ -1292,6 +1284,7 @@ kg
1292
1284
  kh
1293
1285
  ki
1294
1286
  kia
1287
+ kids
1295
1288
  kiewit
1296
1289
  kim
1297
1290
  kimberlyclark
@@ -1397,7 +1390,6 @@ live
1397
1390
  livejournal
1398
1391
  livenation
1399
1392
  living
1400
- lixil
1401
1393
  lj
1402
1394
  lk
1403
1395
  lkqcorp
@@ -1435,7 +1427,6 @@ ltd
1435
1427
  ltda
1436
1428
  lu
1437
1429
  lundbeck
1438
- lupin
1439
1430
  luxe
1440
1431
  luxury
1441
1432
  lv
@@ -1631,7 +1622,6 @@ networkip
1631
1622
  neustar
1632
1623
  new
1633
1624
  newellbrands
1634
- newholland
1635
1625
  newmont
1636
1626
  news
1637
1627
  newscorp
@@ -1709,7 +1699,6 @@ oauth
1709
1699
  oauthclients
1710
1700
  obi
1711
1701
  observer
1712
- off
1713
1702
  offer
1714
1703
  offers
1715
1704
  office
@@ -1732,7 +1721,6 @@ oneok
1732
1721
  ong
1733
1722
  onl
1734
1723
  online
1735
- onyourside
1736
1724
  ooo
1737
1725
  open
1738
1726
  openid
@@ -1924,11 +1912,9 @@ query
1924
1912
  quest
1925
1913
  questdiagnostics
1926
1914
  quintiles
1927
- qvc
1928
1915
  r
1929
1916
  racing
1930
1917
  radio
1931
- raid
1932
1918
  ralphlauren
1933
1919
  random
1934
1920
  ranking
@@ -1999,7 +1985,6 @@ ril
1999
1985
  rio
2000
1986
  rip
2001
1987
  riteaid
2002
- rmit
2003
1988
  ro
2004
1989
  rocher
2005
1990
  rocks
@@ -2071,7 +2056,6 @@ schools
2071
2056
  schule
2072
2057
  schwarz
2073
2058
  science
2074
- scjohnson
2075
2059
  scot
2076
2060
  script
2077
2061
  scripts
@@ -2128,7 +2112,6 @@ shopping
2128
2112
  shouji
2129
2113
  show
2130
2114
  showtime
2131
- shriram
2132
2115
  si
2133
2116
  signin
2134
2117
  signout
@@ -2176,6 +2159,7 @@ southerncompany
2176
2159
  southwest
2177
2160
  soy
2178
2161
  sp
2162
+ spa
2179
2163
  space
2180
2164
  spam
2181
2165
  spanish
@@ -2189,7 +2173,6 @@ spiritaero
2189
2173
  sport
2190
2174
  sports
2191
2175
  spot
2192
- spreadbetting
2193
2176
  sql
2194
2177
  sr
2195
2178
  src
@@ -2262,7 +2245,6 @@ suzuki
2262
2245
  sv
2263
2246
  svn
2264
2247
  swatch
2265
- swiftcover
2266
2248
  swiss
2267
2249
  sx
2268
2250
  sy
@@ -2646,12 +2628,12 @@ xn3bst00m
2646
2628
  xn3ds443g
2647
2629
  xn3e0b707e
2648
2630
  xn3hcrj9c
2649
- xn3oq18vl8pn36a
2650
2631
  xn3pxu8k
2651
2632
  xn42c2d9a
2652
2633
  xn45br5cyl
2653
2634
  xn45brj9c
2654
2635
  xn45q11c
2636
+ xn4dbrk0ce
2655
2637
  xn4gbrim
2656
2638
  xn54b7fta0cc
2657
2639
  xn55qw42g
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Validators
4
+ class DisposableDomains
5
+ def self.all
6
+ @all ||=
7
+ begin
8
+ Validators.require_dependency! "root_domain"
9
+ Validators.require_dependency! "email_data"
10
+ EmailData.disposable_domains
11
+ end
12
+ end
13
+
14
+ def self.include?(domain)
15
+ all.include?(domain)
16
+ end
17
+ end
18
+ end
@@ -2,15 +2,18 @@
2
2
 
3
3
  module Validators
4
4
  class DisposableEmails
5
- FILE_PATH = File.expand_path("../../data/disposable_emails.txt", __dir__)
6
-
7
5
  def self.all
8
- @all ||= File.read(FILE_PATH).lines.map(&:chomp)
6
+ @all ||=
7
+ begin
8
+ Validators.require_dependency! "root_domain"
9
+ Validators.require_dependency! "email_data"
10
+ EmailData.disposable_emails
11
+ end
9
12
  end
10
13
 
11
14
  def self.include?(email)
12
15
  mailbox, domain = email.to_s.split("@")
13
- mailbox = mailbox.to_s.gsub(".", "")
16
+ mailbox = mailbox.to_s.delete(".")
14
17
  mailbox = mailbox.gsub(/\+(.+)?\Z/, "")
15
18
 
16
19
  all.include?("#{mailbox}@#{domain}")
data/lib/validators/ip.rb CHANGED
@@ -11,13 +11,13 @@ module Validators
11
11
  # Extracted from Ruby 1.8.7
12
12
  def v6?(addr)
13
13
  # IPv6 (normal)
14
- return true if /\A[\da-f]{1,4}(:[\da-f]{1,4})*\Z/i =~ addr
15
- return true if /\A[\da-f]{1,4}(:[\da-f]{1,4})*::([\da-f]{1,4}(:[\da-f]{1,4})*)?\Z/i =~ addr
16
- return true if /\A::([\da-f]{1,4}(:[\da-f]{1,4})*)?\Z/i =~ addr
14
+ return true if /\A[\da-f]{1,4}(:[\da-f]{1,4})*\Z/i.match?(addr)
15
+ return true if /\A[\da-f]{1,4}(:[\da-f]{1,4})*::([\da-f]{1,4}(:[\da-f]{1,4})*)?\Z/i.match?(addr)
16
+ return true if /\A::([\da-f]{1,4}(:[\da-f]{1,4})*)?\Z/i.match?(addr)
17
17
  # IPv6 (IPv4 compat)
18
- return true if /\A[\da-f]{1,4}(:[\da-f]{1,4})*:/i =~ addr && v4?($')
19
- return true if /\A[\da-f]{1,4}(:[\da-f]{1,4})*::([\da-f]{1,4}(:[\da-f]{1,4})*:)?/i =~ addr && v4?($')
20
- return true if /\A::([\da-f]{1,4}(:[\da-f]{1,4})*:)?/i =~ addr && v4?($')
18
+ return true if /\A[\da-f]{1,4}(:[\da-f]{1,4})*:/i =~ addr && v4?(Regexp.last_match.post_match)
19
+ return true if /\A[\da-f]{1,4}(:[\da-f]{1,4})*::([\da-f]{1,4}(:[\da-f]{1,4})*:)?/i =~ addr && v4?(Regexp.last_match.post_match)
20
+ return true if /\A::([\da-f]{1,4}(:[\da-f]{1,4})*:)?/i =~ addr && v4?(Regexp.last_match.post_match)
21
21
 
22
22
  false
23
23
  end
@@ -3,8 +3,8 @@ en:
3
3
  activemodel: &activemodel
4
4
  errors:
5
5
  messages:
6
- disposable_email: "is not allowed (high-bounce email)"
7
6
  disposable_domain: "is not allowed (high-bounce domain)"
7
+ disposable_email: "is not allowed (high-bounce email)"
8
8
  invalid_cnpj: "is not a valid CNPJ"
9
9
  invalid_cpf: "is not a valid CPF"
10
10
  invalid_date: "is not a valid date"
@@ -17,14 +17,15 @@ en:
17
17
  invalid_ipv6_address: "is not a valid IPv6 address"
18
18
  invalid_owner: "is not associated with your user"
19
19
  invalid_ssh_private_key: "is not a valid private SSH key"
20
- invalid_ssh_private_key_bits: "needs to be at least %{required} bits; got %{value} bits instead"
20
+ invalid_ssh_private_key_bits:
21
+ "needs to be at least %{required} bits; got %{value} bits instead"
21
22
  invalid_ssh_private_key_type: "must be a %{value} key"
22
23
  invalid_ssh_public_key: "is not a valid public SSH key"
24
+ invalid_subdomain: "is invalid"
23
25
  invalid_url: "is not a valid address"
26
+ invalid_username: "is invalid"
24
27
  reserved_subdomain: "%{value} is a reserved subdomain"
25
- invalid_subdomain: "is invalid"
26
28
  reserved_username: "%{value} is a reserved username"
27
- invalid_username: "is invalid"
28
29
 
29
30
  activerecord:
30
31
  <<: *activemodel
@@ -3,8 +3,8 @@ pt-BR:
3
3
  activemodel: &activemodel
4
4
  errors:
5
5
  messages:
6
- disposable_email: "não é permitido (e-mail temporário)"
7
6
  disposable_domain: "não é permitido (e-mail temporário)"
7
+ disposable_email: "não é permitido (e-mail temporário)"
8
8
  invalid_cnpj: "não é um CNPJ válido"
9
9
  invalid_cpf: "não é um CPF válido"
10
10
  invalid_date: "não é uma data válida"
@@ -17,11 +17,15 @@ pt-BR:
17
17
  invalid_ipv6_address: "não é um endereço IPv6 válido"
18
18
  invalid_owner: "não está associado ao seu usuário"
19
19
  invalid_ssh_private_key: "não é uma chave privada de SSH válida"
20
- invalid_ssh_private_key_bits: "precisa ter pelo menos %{required} bits; a sua chave tem %{value} bits"
20
+ invalid_ssh_private_key_bits:
21
+ "precisa ter pelo menos %{required} bits; a sua chave tem %{value}
22
+ bits"
21
23
  invalid_ssh_private_key_type: "precisa ser uma chave %{value}"
22
24
  invalid_ssh_public_key: "não é uma chave pública de SSH válida"
25
+ invalid_subdomain: "é inválido"
23
26
  invalid_url: "não parece ser uma URL válida"
24
- reserved_hostname: "%{value} é um hostname reservado"
27
+ invalid_username: "não é válido"
28
+ reserved_subdomain: "%{value} é um subdomínio reservado"
25
29
  reserved_username: "%{value} é nome de usuário reservado"
26
30
 
27
31
  activerecord:
@@ -2,10 +2,12 @@
2
2
 
3
3
  module Validators
4
4
  class TLD
5
- FILE_PATH = File.expand_path("../../data/tld.txt", __dir__)
6
-
7
5
  def self.all
8
- @all ||= File.read(FILE_PATH).lines.map(&:chomp)
6
+ @all ||=
7
+ begin
8
+ Validators.require_dependency! "email_data"
9
+ EmailData.tlds
10
+ end
9
11
  end
10
12
 
11
13
  def self.host_with_valid_tld?(host)
@@ -13,10 +15,10 @@ module Validators
13
15
 
14
16
  return false if host.split(".").size == 1
15
17
 
16
- valid?(host[/\.([^.]+)$/, 1].to_s.downcase)
18
+ include?(host[/\.([^.]+)$/, 1].to_s.downcase)
17
19
  end
18
20
 
19
- def self.valid?(tld)
21
+ def self.include?(tld)
20
22
  all.include?(tld)
21
23
  end
22
24
  end
@@ -25,10 +25,9 @@ module ActiveModel
25
25
  # end
26
26
  #
27
27
  def validates_cnpj_format_of(*attr_names)
28
+ Validators.require_dependency! "cpf_cnpj"
28
29
  require "cnpj"
29
30
  validates_with CnpjValidator, _merge_attributes(attr_names)
30
- rescue LoadError
31
- raise "cpf_cnpj is not part of the bundle. Add it to Gemfile."
32
31
  end
33
32
 
34
33
  alias_method :validates_cnpj, :validates_cnpj_format_of
@@ -25,10 +25,9 @@ module ActiveModel
25
25
  # end
26
26
  #
27
27
  def validates_cpf_format_of(*attr_names)
28
+ Validators.require_dependency! "cpf_cnpj"
28
29
  require "cpf"
29
30
  validates_with CpfValidator, _merge_attributes(attr_names)
30
- rescue LoadError
31
- raise "cpf_cnpj is not part of the bundle. Add it to Gemfile."
32
31
  end
33
32
 
34
33
  alias_method :validates_cpf, :validates_cpf_format_of
@@ -40,9 +40,10 @@ module ActiveModel
40
40
  record.__send__(option) if record.respond_to?(option)
41
41
  end
42
42
 
43
- if date.is_a?(Time)
43
+ case date
44
+ when Time
44
45
  value = value.to_time
45
- elsif date.is_a?(Date)
46
+ when Date
46
47
  value = value.to_date
47
48
  end
48
49
 
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "root_domain"
4
-
5
3
  module ActiveModel
6
4
  module Validations
7
5
  class EmailValidator < EachValidator
@@ -21,8 +19,8 @@ module ActiveModel
21
19
  end
22
20
 
23
21
  def validate_email_format(record, attribute, value, options)
24
- return if value.to_s =~ Validators::EMAIL_FORMAT
25
- return if value.to_s =~ Validators::MICROSOFT_EMAIL_FORMAT
22
+ return if Validators::EMAIL_FORMAT.match?(value.to_s)
23
+ return if Validators::MICROSOFT_EMAIL_FORMAT.match?(value.to_s)
26
24
 
27
25
  record.errors.add(
28
26
  attribute,
@@ -50,7 +48,7 @@ module ActiveModel
50
48
  hostname = value.to_s.split(AT_SIGN).last.to_s.downcase
51
49
  root_domain = RootDomain.call(hostname)
52
50
 
53
- return unless Validators::DisposableHostnames.all.include?(root_domain)
51
+ return unless Validators::DisposableDomains.include?(root_domain)
54
52
 
55
53
  record.errors.add(
56
54
  attribute,
@@ -79,6 +77,8 @@ module ActiveModel
79
77
  # end
80
78
  #
81
79
  def validates_email_format_of(*attr_names)
80
+ Validators.require_dependency! "root_domain"
81
+ Validators.require_dependency! "email_data"
82
82
  validates_with EmailValidator, _merge_attributes(attr_names)
83
83
  end
84
84
 
@@ -56,10 +56,8 @@ module ActiveModel
56
56
  # end
57
57
  #
58
58
  def validates_ssh_private_key(*attr_names)
59
- require "sshkey"
59
+ Validators.require_dependency! "sshkey"
60
60
  validates_with SshPrivateKeyValidator, _merge_attributes(attr_names)
61
- rescue LoadError
62
- raise "sshkey is not part of the bundle. Add it to Gemfile."
63
61
  end
64
62
  end
65
63
  end