validates_host 0.2.0 → 1.2.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 +7 -0
- data/.gitignore +5 -4
- data/.rubocop.yml +53 -0
- data/.ruby-gemset +1 -0
- data/.travis.yml +31 -0
- data/Gemfile +3 -1
- data/README.md +24 -3
- data/Rakefile +9 -4
- data/gemfiles/Gemfile.rails3 +6 -0
- data/gemfiles/Gemfile.rails4 +5 -0
- data/gemfiles/Gemfile.rails5 +5 -0
- data/lib/validates_host.rb +16 -5
- data/lib/validates_host/domain_name.rb +15 -0
- data/lib/validates_host/domain_name_validator.rb +3 -19
- data/lib/validates_host/host_name.rb +15 -0
- data/lib/validates_host/host_name_validator.rb +3 -19
- data/lib/validates_host/ip.rb +17 -0
- data/lib/validates_host/ip_validator.rb +3 -19
- data/lib/validates_host/{shoulda-matchers/domain_name_matcher.rb → require_a_valid_domain_name_matcher.rb} +9 -11
- data/lib/validates_host/{shoulda-matchers/host_name_matcher.rb → require_a_valid_host_name_matcher.rb} +9 -11
- data/lib/validates_host/{shoulda-matchers/ip_matcher.rb → require_a_valid_ip_matcher.rb} +9 -11
- data/lib/validates_host/require_a_valid_subnet_matcher.rb +35 -0
- data/lib/validates_host/subnet.rb +15 -0
- data/lib/validates_host/subnet_validator.rb +7 -0
- data/lib/validates_host/version.rb +3 -1
- data/spec/fake_app/server.rb +19 -5
- data/spec/fake_app/subnet.rb +11 -0
- data/spec/shoulda/matchers/active_model/require_a_valid_domain_name_matcher_spec.rb +23 -0
- data/spec/shoulda/matchers/active_model/require_a_valid_host_name_matcher_spec.rb +23 -0
- data/spec/shoulda/matchers/active_model/require_a_valid_ip_matcher_spec.rb +23 -0
- data/spec/shoulda/matchers/active_model/require_a_valid_subnet_matcher_spec.rb +23 -0
- data/spec/spec_helper.rb +11 -7
- data/spec/validates_host/domain_name_validator_spec.rb +41 -0
- data/spec/validates_host/host_name_validator_spec.rb +41 -0
- data/spec/validates_host/ip_validator_spec.rb +56 -0
- data/spec/validates_host/subnet_validator_spec.rb +41 -0
- data/validates_host.gemspec +22 -19
- metadata +89 -88
- data/lib/validates_host/remarkable.rb +0 -3
- data/lib/validates_host/remarkable/domain_name_matcher.rb +0 -29
- data/lib/validates_host/remarkable/host_name_matcher.rb +0 -29
- data/lib/validates_host/remarkable/ip_matcher.rb +0 -29
- data/lib/validates_host/shoulda-matchers.rb +0 -3
- data/spec/fake_app/db/migrations/create_servers.rb +0 -13
- data/spec/validates_host.rb/domain_name_validator_spec.rb +0 -40
- data/spec/validates_host.rb/host_name_validator_spec.rb +0 -40
- data/spec/validates_host.rb/ip_validator_spec.rb +0 -40
- data/spec/validates_host.rb/remarkable/domain_name_matcher_spec.rb +0 -20
- data/spec/validates_host.rb/remarkable/host_name_matcher_spec.rb +0 -20
- data/spec/validates_host.rb/remarkable/ip_matcher_spec.rb +0 -20
- data/spec/validates_host.rb/shoulda-matchers/domain_name_matcher_spec.rb +0 -20
- data/spec/validates_host.rb/shoulda-matchers/host_name_matcher_spec.rb +0 -20
- data/spec/validates_host.rb/shoulda-matchers/ip_matcher_spec.rb +0 -20
@@ -1,17 +1,15 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'shoulda-matchers'
|
2
4
|
|
3
5
|
module Shoulda
|
4
6
|
module Matchers
|
5
7
|
module ActiveModel
|
6
8
|
def require_a_valid_ip(attribute = :ip)
|
7
|
-
|
9
|
+
RequireAValidIpMatcher.new(attribute)
|
8
10
|
end
|
9
11
|
|
10
|
-
class
|
11
|
-
def initialize(attribute)
|
12
|
-
@attribute = attribute
|
13
|
-
end
|
14
|
-
|
12
|
+
class RequireAValidIpMatcher < ValidationMatcher
|
15
13
|
def description
|
16
14
|
"require #{@attribute} to be a valid ip"
|
17
15
|
end
|
@@ -19,19 +17,19 @@ module Shoulda
|
|
19
17
|
def matches?(subject)
|
20
18
|
super(subject)
|
21
19
|
|
22
|
-
disallows_invalid_value
|
20
|
+
disallows_invalid_value && allows_valid_value
|
23
21
|
end
|
24
22
|
|
25
23
|
private
|
26
24
|
|
27
25
|
def disallows_invalid_value
|
28
|
-
disallows_value_of(
|
26
|
+
disallows_value_of('10.0.0')
|
29
27
|
end
|
30
28
|
|
31
29
|
def allows_valid_value
|
32
|
-
allows_value_of(
|
30
|
+
allows_value_of('10.10.10.1')
|
33
31
|
end
|
34
32
|
end
|
35
33
|
end
|
36
34
|
end
|
37
|
-
end
|
35
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'shoulda-matchers'
|
4
|
+
|
5
|
+
module Shoulda
|
6
|
+
module Matchers
|
7
|
+
module ActiveModel
|
8
|
+
def require_a_valid_subnet(attribute = :value)
|
9
|
+
RequireAValidSubnetMatcher.new(attribute)
|
10
|
+
end
|
11
|
+
|
12
|
+
class RequireAValidSubnetMatcher < ValidationMatcher
|
13
|
+
def description
|
14
|
+
"require #{@attribute} to be a valid subnet"
|
15
|
+
end
|
16
|
+
|
17
|
+
def matches?(subject)
|
18
|
+
super(subject)
|
19
|
+
|
20
|
+
disallows_invalid_value && allows_valid_value
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def disallows_invalid_value
|
26
|
+
disallows_value_of('10.0.0')
|
27
|
+
end
|
28
|
+
|
29
|
+
def allows_valid_value
|
30
|
+
allows_value_of('10.10.10.1/28')
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ValidatesHost
|
4
|
+
class Subnet
|
5
|
+
def initialize(subnet)
|
6
|
+
@subnet = subnet
|
7
|
+
end
|
8
|
+
|
9
|
+
def valid?
|
10
|
+
return true if @subnet.blank?
|
11
|
+
|
12
|
+
@subnet =~ %r{^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}/(2[4-9]|30)$}
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/spec/fake_app/server.rb
CHANGED
@@ -1,5 +1,19 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Server
|
4
|
+
include ActiveModel::Validations
|
5
|
+
include ActiveModel::Conversion
|
6
|
+
extend ActiveModel::Naming
|
7
|
+
|
8
|
+
attr_accessor :domain_name, :host_name, :ip
|
9
|
+
|
10
|
+
validates :domain_name, domain_name: true
|
11
|
+
validates :host_name, host_name: true
|
12
|
+
validates :ip, ip: true
|
13
|
+
|
14
|
+
def initialize(attributes = {})
|
15
|
+
attributes.each do |name, value|
|
16
|
+
send("#{name}=", value)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Shoulda::Matchers::ActiveModel::RequireAValidDomainNameMatcher do
|
6
|
+
let(:server) { Server.new }
|
7
|
+
|
8
|
+
it 'accepts on domain_name' do
|
9
|
+
expect(server).to require_a_valid_domain_name(:domain_name)
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'accepts without a specified attribute' do
|
13
|
+
expect(server).to require_a_valid_domain_name
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'rejects on host_name' do
|
17
|
+
expect(server).not_to require_a_valid_domain_name(:host_name)
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'has a description message' do
|
21
|
+
expect(require_a_valid_domain_name.description).to eq('require domain_name to be a valid domain name')
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Shoulda::Matchers::ActiveModel::RequireAValidHostNameMatcher do
|
6
|
+
let(:server) { Server.new }
|
7
|
+
|
8
|
+
it 'accepts on host_name' do
|
9
|
+
expect(server).to require_a_valid_host_name(:host_name)
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'accepts without a specified attribute' do
|
13
|
+
expect(server).to require_a_valid_host_name
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'rejects on domain_name' do
|
17
|
+
expect(server).not_to require_a_valid_host_name(:domain_name)
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'has a description message' do
|
21
|
+
expect(require_a_valid_host_name.description).to eq('require host_name to be a valid host name')
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Shoulda::Matchers::ActiveModel::RequireAValidIpMatcher do
|
6
|
+
let(:server) { Server.new }
|
7
|
+
|
8
|
+
it 'accepts on ip' do
|
9
|
+
expect(server).to require_a_valid_ip(:ip)
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'accepts without a specified attribute' do
|
13
|
+
expect(server).to require_a_valid_ip
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'rejects on domain_name' do
|
17
|
+
expect(server).not_to require_a_valid_ip(:domain_name)
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'has a description message' do
|
21
|
+
expect(require_a_valid_ip.description).to eq('require ip to be a valid ip')
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Shoulda::Matchers::ActiveModel::RequireAValidSubnetMatcher do
|
6
|
+
let(:subnet) { Subnet.new }
|
7
|
+
|
8
|
+
it 'accepts on value' do
|
9
|
+
expect(subnet).to require_a_valid_subnet(:value)
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'accepts without a specified attribute' do
|
13
|
+
expect(subnet).to require_a_valid_subnet
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'rejects on id' do
|
17
|
+
expect(subnet).not_to require_a_valid_subnet(:id)
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'has a description message' do
|
21
|
+
expect(require_a_valid_subnet.description).to eq('require value to be a valid subnet')
|
22
|
+
end
|
23
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,10 +1,14 @@
|
|
1
|
-
|
2
|
-
require "rspec"
|
3
|
-
require "active_record"
|
1
|
+
# frozen_string_literal: true
|
4
2
|
|
5
|
-
|
6
|
-
|
3
|
+
require 'rspec'
|
4
|
+
require 'active_model'
|
5
|
+
require 'coveralls'
|
6
|
+
require 'shoulda-matchers'
|
7
7
|
|
8
|
-
|
8
|
+
Coveralls.wear!
|
9
9
|
|
10
|
-
|
10
|
+
require 'validates_host'
|
11
|
+
require 'fake_app/server'
|
12
|
+
require 'fake_app/subnet'
|
13
|
+
|
14
|
+
include Shoulda::Matchers::ActiveModel
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe DomainNameValidator do
|
6
|
+
let(:server) { Server.new }
|
7
|
+
|
8
|
+
context 'when domain_name is invalid' do
|
9
|
+
before do
|
10
|
+
server.domain_name = 'http://'
|
11
|
+
server.valid?
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'sets object as invalid' do
|
15
|
+
expect(server).not_to be_valid
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'sets an error' do
|
19
|
+
expect(server.errors[:domain_name]).to eq(['is invalid'])
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'when domain_name is valid' do
|
24
|
+
before do
|
25
|
+
server.domain_name = 'example.com'
|
26
|
+
server.valid?
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'sets object as valid' do
|
30
|
+
expect(server).to be_valid
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'does not set an error on attribute' do
|
34
|
+
expect(server.errors[:domain_name]).to be_blank
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'is valid with a nil value' do
|
39
|
+
expect(server).to be_valid
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe HostNameValidator do
|
6
|
+
let(:server) { Server.new }
|
7
|
+
|
8
|
+
context 'when host_name is invalid' do
|
9
|
+
before do
|
10
|
+
server.host_name = 'http://'
|
11
|
+
server.valid?
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'sets object as invalid' do
|
15
|
+
expect(server).not_to be_valid
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'sets an error' do
|
19
|
+
expect(server.errors[:host_name]).to eq(['is invalid'])
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'when host_name is valid' do
|
24
|
+
before do
|
25
|
+
server.host_name = 'bd01'
|
26
|
+
server.valid?
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'sets object as valid' do
|
30
|
+
expect(server).to be_valid
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'does not set an error on attribute' do
|
34
|
+
expect(server.errors[:host_name]).to be_blank
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'is valid with a nil value' do
|
39
|
+
expect(server).to be_valid
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe IpValidator do
|
6
|
+
let(:server) { Server.new }
|
7
|
+
|
8
|
+
context 'when ip is invalid' do
|
9
|
+
before do
|
10
|
+
server.ip = '127.0.0'
|
11
|
+
server.valid?
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'sets object as invalid' do
|
15
|
+
expect(server).not_to be_valid
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'sets an error' do
|
19
|
+
expect(server.errors[:ip]).to eq(['is invalid'])
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'when ip is IPV4 valid' do
|
24
|
+
before do
|
25
|
+
server.ip = '10.10.10.1'
|
26
|
+
server.valid?
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'sets object as valid' do
|
30
|
+
expect(server).to be_valid
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'does not set an error on attribute' do
|
34
|
+
expect(server.errors[:ip]).to be_blank
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context 'when ip is IPV6 valid' do
|
39
|
+
before do
|
40
|
+
server.ip = 'fd92:fe56:b43a:062e:ffff:ffff:ffff:ffff'
|
41
|
+
server.valid?
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'sets object as valid' do
|
45
|
+
expect(server).to be_valid
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'does not set an error on attribute' do
|
49
|
+
expect(server.errors[:ip]).to be_blank
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'is valid with a nil value' do
|
54
|
+
expect(server).to be_valid
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe SubnetValidator do
|
6
|
+
let(:subnet) { Subnet.new }
|
7
|
+
|
8
|
+
context 'when subnet is invalid' do
|
9
|
+
before do
|
10
|
+
subnet.value = '127.0.0'
|
11
|
+
subnet.valid?
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'sets object as invalid' do
|
15
|
+
expect(subnet).not_to be_valid
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'sets an error' do
|
19
|
+
expect(subnet.errors[:value]).to eq(['is invalid'])
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'when subnet is valid' do
|
24
|
+
before do
|
25
|
+
subnet.value = '10.10.10.1/28'
|
26
|
+
subnet.valid?
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'sets object as valid' do
|
30
|
+
expect(subnet).to be_valid
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'does not set an error on attribute' do
|
34
|
+
expect(subnet.errors[:value]).to be_blank
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'is valid with a nil value' do
|
39
|
+
expect(subnet).to be_valid
|
40
|
+
end
|
41
|
+
end
|