validators 2.3.0 → 2.4.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 +4 -4
- data/.travis.yml +12 -0
- data/Gemfile.lock +55 -48
- data/README.md +27 -0
- data/data/tld.txt +886 -0
- data/lib/validators.rb +12 -12
- data/lib/validators/constants.rb +11 -0
- data/lib/validators/validates_hostname_format_of.rb +62 -0
- data/lib/validators/validates_url_format_of.rb +34 -6
- data/lib/validators/version.rb +1 -1
- data/spec/spec_helper.rb +4 -1
- data/spec/support/hostnames.rb +26 -0
- data/spec/support/models.rb +37 -0
- data/spec/support/urls.rb +1 -1
- data/spec/validators/validates_hostname_format_of_spec.rb +38 -0
- data/spec/validators/validates_url_format_of_spec.rb +41 -25
- data/validators.gemspec +2 -1
- metadata +28 -7
data/lib/validators.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
|
-
require "validators/constants"
|
2
|
-
require "validators/ip"
|
3
|
-
require "validators/validates_datetime"
|
4
|
-
require "validators/validates_ip_address"
|
5
|
-
require "validators/validates_email_format_of"
|
6
|
-
require "validators/validates_url_format_of"
|
7
|
-
require "validators/validates_ownership_of"
|
8
|
-
require "validators/validates_cpf_format_of"
|
9
|
-
require "validators/validates_cnpj_format_of"
|
10
|
-
require "validators/validates_ssh_private_key"
|
11
|
-
require "validators/validates_ssh_public_key"
|
12
|
-
|
13
1
|
module Validators
|
2
|
+
require "validators/constants"
|
3
|
+
require "validators/ip"
|
4
|
+
require "validators/validates_datetime"
|
5
|
+
require "validators/validates_ip_address"
|
6
|
+
require "validators/validates_email_format_of"
|
7
|
+
require "validators/validates_url_format_of"
|
8
|
+
require "validators/validates_ownership_of"
|
9
|
+
require "validators/validates_cpf_format_of"
|
10
|
+
require "validators/validates_cnpj_format_of"
|
11
|
+
require "validators/validates_ssh_private_key"
|
12
|
+
require "validators/validates_ssh_public_key"
|
13
|
+
require "validators/validates_hostname_format_of"
|
14
14
|
end
|
data/lib/validators/constants.rb
CHANGED
@@ -14,4 +14,15 @@ module Validators
|
|
14
14
|
([/?]\S*)? # optional /whatever or ?whatever
|
15
15
|
\z
|
16
16
|
]ixs
|
17
|
+
|
18
|
+
URL_FORMAT_WITHOUT_TLD_VALIDATION = %r[
|
19
|
+
\A
|
20
|
+
https?:// # http:// or https://
|
21
|
+
([^\s:@]+:[^\s:@]*@)? # optional username:pw@
|
22
|
+
( (([^\W_]+\.)*xn--)?[^\W_]+([-.][^\W_]+)*\..{2,}\.? | # domain (including Punycode/IDN)...
|
23
|
+
#{IPv4_PART}(\.#{IPv4_PART}){3} ) # or IPv4
|
24
|
+
(:\d{1,5})? # optional port
|
25
|
+
([/?]\S*)? # optional /whatever or ?whatever
|
26
|
+
\z
|
27
|
+
]ixs
|
17
28
|
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module ActiveModel
|
2
|
+
module Validations
|
3
|
+
class HostnameValidator < EachValidator
|
4
|
+
# Rules taken from http://www.zytrax.com/books/dns/apa/names.html
|
5
|
+
def validate_each(record, attribute, value)
|
6
|
+
return if valid_hostname?(value.to_s)
|
7
|
+
|
8
|
+
record.errors.add(attribute, :invalid_hostname,
|
9
|
+
:message => options[:message],
|
10
|
+
:value => value
|
11
|
+
)
|
12
|
+
end
|
13
|
+
|
14
|
+
def valid_hostname?(host)
|
15
|
+
host = host.to_s
|
16
|
+
uri = URI(host)
|
17
|
+
|
18
|
+
uri.host.nil? &&
|
19
|
+
uri.scheme.nil? &&
|
20
|
+
uri.fragment.nil? &&
|
21
|
+
uri.query.nil? &&
|
22
|
+
uri.path == host &&
|
23
|
+
host.split('.').all? {|label| valid_label?(label) } &&
|
24
|
+
host.size <= 255 &&
|
25
|
+
valid_tld?(host)
|
26
|
+
rescue URI::InvalidURIError
|
27
|
+
false
|
28
|
+
end
|
29
|
+
|
30
|
+
def valid_label?(label)
|
31
|
+
!label.start_with?('-') &&
|
32
|
+
!label.match(/\A\d+\z/) &&
|
33
|
+
label.match(/\A[a-z0-9-]{1,63}\z/i)
|
34
|
+
end
|
35
|
+
|
36
|
+
def valid_tld?(host)
|
37
|
+
return true unless options[:tld]
|
38
|
+
return false if host.split('.').size == 1
|
39
|
+
|
40
|
+
tld = host[/\.(.*?)$/, 1].to_s.downcase
|
41
|
+
UrlValidator.tlds.include?(tld)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
module ClassMethods
|
46
|
+
# Validates whether or not the specified URL is valid.
|
47
|
+
#
|
48
|
+
# class User < ActiveRecord::Base
|
49
|
+
# validates_hostname_format_of :site
|
50
|
+
#
|
51
|
+
# # Validates against a list of valid TLD.
|
52
|
+
# validates_hostname_format_of :site, tld: true
|
53
|
+
# end
|
54
|
+
#
|
55
|
+
def validates_hostname_format_of(*attr_names)
|
56
|
+
validates_with HostnameValidator, _merge_attributes(attr_names)
|
57
|
+
end
|
58
|
+
|
59
|
+
alias_method :validates_hostname, :validates_hostname_format_of
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -1,13 +1,38 @@
|
|
1
1
|
module ActiveModel
|
2
2
|
module Validations
|
3
3
|
class UrlValidator < EachValidator
|
4
|
+
TLD_FILE_PATH = File.expand_path('../../../data/tld.txt', __FILE__)
|
5
|
+
|
6
|
+
def self.tlds
|
7
|
+
@tld ||= File.read(TLD_FILE_PATH).lines.map(&:chomp)
|
8
|
+
end
|
9
|
+
|
4
10
|
def validate_each(record, attribute, value)
|
5
|
-
if value.to_s
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
+
return if url?(value.to_s)
|
12
|
+
|
13
|
+
record.errors.add(attribute, :invalid_url,
|
14
|
+
:message => options[:message],
|
15
|
+
:value => value
|
16
|
+
)
|
17
|
+
end
|
18
|
+
|
19
|
+
def url?(url)
|
20
|
+
uri = URI(url)
|
21
|
+
regex = options[:tld] ? Validators::URL_FORMAT_WITHOUT_TLD_VALIDATION :
|
22
|
+
Validators::URL_FORMAT
|
23
|
+
|
24
|
+
uri.kind_of?(URI::HTTP) &&
|
25
|
+
url.match(regex) &&
|
26
|
+
valid_tld?(uri.host)
|
27
|
+
rescue URI::InvalidURIError
|
28
|
+
false
|
29
|
+
end
|
30
|
+
|
31
|
+
def valid_tld?(host)
|
32
|
+
return true unless options[:tld]
|
33
|
+
tld = host[/\.(.*?)$/, 1].to_s.downcase
|
34
|
+
|
35
|
+
self.class.tlds.include?(tld)
|
11
36
|
end
|
12
37
|
end
|
13
38
|
|
@@ -16,6 +41,9 @@ module ActiveModel
|
|
16
41
|
#
|
17
42
|
# class User < ActiveRecord::Base
|
18
43
|
# validates_url_format_of :site
|
44
|
+
#
|
45
|
+
# # Validates against a list of valid TLD.
|
46
|
+
# validates_url_format_of :site, tld: true
|
19
47
|
# end
|
20
48
|
#
|
21
49
|
def validates_url_format_of(*attr_names)
|
data/lib/validators/version.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -1,10 +1,13 @@
|
|
1
|
-
require "
|
1
|
+
require "codeclimate-test-reporter"
|
2
|
+
CodeClimate::TestReporter.start
|
2
3
|
|
4
|
+
require "bundler/setup"
|
3
5
|
require "active_record"
|
4
6
|
require "validators"
|
5
7
|
require "active_support/all"
|
6
8
|
|
7
9
|
Time.zone = "America/Sao_Paulo"
|
10
|
+
TLDs = ActiveModel::Validations::UrlValidator.tlds.sample(100)
|
8
11
|
|
9
12
|
Dir[File.dirname(__FILE__) + "/support/**/*.rb"].each {|f| require f}
|
10
13
|
|
@@ -0,0 +1,26 @@
|
|
1
|
+
VALID_HOSTNAMES = %W[
|
2
|
+
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com
|
3
|
+
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com
|
4
|
+
a-b.com
|
5
|
+
a-b-.com
|
6
|
+
a123.com
|
7
|
+
123a.com
|
8
|
+
ABC123.com
|
9
|
+
123ABC.com
|
10
|
+
]
|
11
|
+
|
12
|
+
INVALID_HOSTNAMES = %W[
|
13
|
+
192.168.42.42
|
14
|
+
a..com
|
15
|
+
#{'a'*64}.com
|
16
|
+
http://example.com
|
17
|
+
https://example.com
|
18
|
+
example.com?a=1
|
19
|
+
example.com#fragment
|
20
|
+
-example.com
|
21
|
+
1234
|
22
|
+
example.-test.com
|
23
|
+
example.1234.com
|
24
|
+
example_domain.com
|
25
|
+
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com
|
26
|
+
]
|
data/spec/support/models.rb
CHANGED
@@ -20,3 +20,40 @@ end
|
|
20
20
|
class Person < ActiveRecord::Base
|
21
21
|
self.table_name = :users
|
22
22
|
end
|
23
|
+
|
24
|
+
class UserWithTLD
|
25
|
+
include ActiveModel::Validations
|
26
|
+
attr_accessor :url
|
27
|
+
|
28
|
+
validates_url_format_of :url, tld: true
|
29
|
+
|
30
|
+
def self.name
|
31
|
+
'User'
|
32
|
+
end
|
33
|
+
|
34
|
+
def initialize(url)
|
35
|
+
@url = url
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
class ServerWithoutTLD
|
40
|
+
include ActiveModel::Validations
|
41
|
+
attr_accessor :host
|
42
|
+
|
43
|
+
validates_hostname :host
|
44
|
+
|
45
|
+
def initialize(host)
|
46
|
+
@host = host
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
class ServerWithTLD
|
51
|
+
include ActiveModel::Validations
|
52
|
+
attr_accessor :host
|
53
|
+
|
54
|
+
validates_hostname :host, tld: true
|
55
|
+
|
56
|
+
def initialize(host)
|
57
|
+
@host = host
|
58
|
+
end
|
59
|
+
end
|
data/spec/support/urls.rb
CHANGED
@@ -12,7 +12,6 @@ VALID_URLS = [
|
|
12
12
|
'http://user:pass@example.com',
|
13
13
|
'http://user:@example.com',
|
14
14
|
'http://example.com/~user',
|
15
|
-
'http://example.xy', # Not a real TLD, but we're fine with anything of 2-6 chars
|
16
15
|
'http://example.museum',
|
17
16
|
'http://1.0.255.249',
|
18
17
|
'http://1.2.3.4:80',
|
@@ -22,6 +21,7 @@ VALID_URLS = [
|
|
22
21
|
'http://xn--rksmrgs-5wao1o.nu', # Punycode
|
23
22
|
'http://www.xn--rksmrgs-5wao1o.nu',
|
24
23
|
'http://foo.bar.xn--rksmrgs-5wao1o.nu',
|
24
|
+
'http://example.xy', # Only valid TLD
|
25
25
|
'http://example.com.', # Explicit TLD root period
|
26
26
|
'http://example.com./foo'
|
27
27
|
]
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe ".validates_hostname_format_of" do
|
4
|
+
context "with TLD validation" do
|
5
|
+
it 'rejects invalid TLD' do
|
6
|
+
server = ServerWithTLD.new('example.xy')
|
7
|
+
expect(server).not_to be_valid
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'rejects only host label' do
|
11
|
+
server = ServerWithTLD.new('com')
|
12
|
+
expect(server).not_to be_valid
|
13
|
+
end
|
14
|
+
|
15
|
+
TLDs.each do |tld|
|
16
|
+
it "accepts #{tld} as TLD" do
|
17
|
+
server = ServerWithTLD.new("example.#{tld}")
|
18
|
+
expect(server).to be_valid
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context "without TLD validation" do
|
24
|
+
VALID_HOSTNAMES.each do |host|
|
25
|
+
it "accepts #{host}" do
|
26
|
+
server = ServerWithoutTLD.new(host)
|
27
|
+
expect(server).to be_valid
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
INVALID_HOSTNAMES.each do |host|
|
32
|
+
it "rejects #{host}" do
|
33
|
+
server = ServerWithoutTLD.new(host)
|
34
|
+
expect(server).not_to be_valid
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -2,38 +2,54 @@
|
|
2
2
|
require "spec_helper"
|
3
3
|
|
4
4
|
describe ".validates_url_format_of" do
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
context "validating TLD" do
|
6
|
+
it "rejects invalid TLD" do
|
7
|
+
user = UserWithTLD.new('http://example.xy')
|
8
|
+
expect(user).not_to be_valid
|
9
|
+
end
|
8
10
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
11
|
+
TLDs.each do |tld|
|
12
|
+
it "accepts #{tld} as TLD" do
|
13
|
+
user = UserWithTLD.new("http://example.#{tld}")
|
14
|
+
expect(user).to be_valid
|
15
|
+
end
|
13
16
|
end
|
14
17
|
end
|
15
18
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
expect(user).not_to be_valid
|
19
|
+
context "without validating TLD" do
|
20
|
+
before do
|
21
|
+
User.validates_url_format_of :url, :allow_blank => false
|
20
22
|
end
|
21
|
-
end
|
22
23
|
|
23
|
-
|
24
|
-
|
25
|
-
|
24
|
+
VALID_URLS.each do |url|
|
25
|
+
it "accepts #{url.inspect} as a valid url" do
|
26
|
+
user = User.new(:url => url)
|
27
|
+
expect(user).to be_valid
|
28
|
+
end
|
29
|
+
end
|
26
30
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
31
|
+
INVALID_URLS.each do |url|
|
32
|
+
it "rejects #{url.inspect} as a valid url" do
|
33
|
+
user = User.new(:url => url)
|
34
|
+
expect(user).not_to be_valid
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
it "defines alias method" do
|
39
|
+
expect(User).to respond_to(:validates_url)
|
40
|
+
end
|
41
|
+
|
42
|
+
it "uses default error message" do
|
43
|
+
user = User.new(:url => "invalid")
|
44
|
+
expect(user).not_to be_valid
|
45
|
+
expect(user.errors[:url]).to eq(["is not a valid address"])
|
46
|
+
end
|
32
47
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
48
|
+
it "uses I18n string as error message [pt-BR]" do
|
49
|
+
I18n.locale = :'pt-BR'
|
50
|
+
user = User.new(:url => "invalid")
|
51
|
+
expect(user).not_to be_valid
|
52
|
+
expect(user.errors[:url]).to eq(["não parece ser uma URL válida"])
|
53
|
+
end
|
38
54
|
end
|
39
55
|
end
|
data/validators.gemspec
CHANGED
@@ -17,10 +17,11 @@ Gem::Specification.new do |s|
|
|
17
17
|
s.require_paths = ["lib"]
|
18
18
|
|
19
19
|
s.add_development_dependency "activerecord", ">= 3.0"
|
20
|
-
s.add_development_dependency "rspec"
|
20
|
+
s.add_development_dependency "rspec"
|
21
21
|
s.add_development_dependency "sqlite3-ruby"
|
22
22
|
s.add_development_dependency "rake"
|
23
23
|
s.add_development_dependency "pry-meta"
|
24
24
|
s.add_development_dependency "cpf_cnpj"
|
25
25
|
s.add_development_dependency "sshkey"
|
26
|
+
s.add_development_dependency "codeclimate-test-reporter"
|
26
27
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: validators
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nando Vieira
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-04-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -28,16 +28,16 @@ dependencies:
|
|
28
28
|
name: rspec
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: '0'
|
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:
|
40
|
+
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: sqlite3-ruby
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -108,6 +108,20 @@ dependencies:
|
|
108
108
|
- - ">="
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: codeclimate-test-reporter
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
111
125
|
description: Add some nice ActiveRecord validators.
|
112
126
|
email:
|
113
127
|
- fnando.vieira@gmail.com
|
@@ -117,10 +131,12 @@ extra_rdoc_files: []
|
|
117
131
|
files:
|
118
132
|
- ".gitignore"
|
119
133
|
- ".rspec"
|
134
|
+
- ".travis.yml"
|
120
135
|
- Gemfile
|
121
136
|
- Gemfile.lock
|
122
137
|
- README.md
|
123
138
|
- Rakefile
|
139
|
+
- data/tld.txt
|
124
140
|
- lib/validators.rb
|
125
141
|
- lib/validators/constants.rb
|
126
142
|
- lib/validators/ip.rb
|
@@ -128,6 +144,7 @@ files:
|
|
128
144
|
- lib/validators/validates_cpf_format_of.rb
|
129
145
|
- lib/validators/validates_datetime.rb
|
130
146
|
- lib/validators/validates_email_format_of.rb
|
147
|
+
- lib/validators/validates_hostname_format_of.rb
|
131
148
|
- lib/validators/validates_ip_address.rb
|
132
149
|
- lib/validators/validates_ownership_of.rb
|
133
150
|
- lib/validators/validates_ssh_private_key.rb
|
@@ -138,6 +155,7 @@ files:
|
|
138
155
|
- spec/spec_helper.rb
|
139
156
|
- spec/support/dates.rb
|
140
157
|
- spec/support/emails.rb
|
158
|
+
- spec/support/hostnames.rb
|
141
159
|
- spec/support/ips.rb
|
142
160
|
- spec/support/models.rb
|
143
161
|
- spec/support/translations.yml
|
@@ -147,6 +165,7 @@ files:
|
|
147
165
|
- spec/validators/validates_cpf_format_of_spec.rb
|
148
166
|
- spec/validators/validates_datetime_spec.rb
|
149
167
|
- spec/validators/validates_email_format_of_spec.rb
|
168
|
+
- spec/validators/validates_hostname_format_of_spec.rb
|
150
169
|
- spec/validators/validates_ip_address_spec.rb
|
151
170
|
- spec/validators/validates_ownership_of_spec.rb
|
152
171
|
- spec/validators/validates_ssh_private_key_spec.rb
|
@@ -172,7 +191,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
172
191
|
version: '0'
|
173
192
|
requirements: []
|
174
193
|
rubyforge_project:
|
175
|
-
rubygems_version: 2.
|
194
|
+
rubygems_version: 2.4.6
|
176
195
|
signing_key:
|
177
196
|
specification_version: 4
|
178
197
|
summary: Add some nice ActiveRecord validators.
|
@@ -181,6 +200,7 @@ test_files:
|
|
181
200
|
- spec/spec_helper.rb
|
182
201
|
- spec/support/dates.rb
|
183
202
|
- spec/support/emails.rb
|
203
|
+
- spec/support/hostnames.rb
|
184
204
|
- spec/support/ips.rb
|
185
205
|
- spec/support/models.rb
|
186
206
|
- spec/support/translations.yml
|
@@ -190,6 +210,7 @@ test_files:
|
|
190
210
|
- spec/validators/validates_cpf_format_of_spec.rb
|
191
211
|
- spec/validators/validates_datetime_spec.rb
|
192
212
|
- spec/validators/validates_email_format_of_spec.rb
|
213
|
+
- spec/validators/validates_hostname_format_of_spec.rb
|
193
214
|
- spec/validators/validates_ip_address_spec.rb
|
194
215
|
- spec/validators/validates_ownership_of_spec.rb
|
195
216
|
- spec/validators/validates_ssh_private_key_spec.rb
|