schemacop 1.0.2 → 2.0.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/.gitignore +2 -1
- data/.rubocop.yml +59 -1
- data/CHANGELOG.md +10 -0
- data/README.md +389 -199
- data/Rakefile +2 -0
- data/VERSION +1 -1
- data/doc/Schemacop.html +41 -130
- data/doc/Schemacop/ArrayValidator.html +329 -0
- data/doc/Schemacop/BooleanValidator.html +145 -0
- data/doc/Schemacop/Collector.html +535 -0
- data/doc/Schemacop/Exceptions.html +39 -39
- data/doc/Schemacop/Exceptions/InvalidSchemaError.html +124 -0
- data/doc/Schemacop/Exceptions/ValidationError.html +124 -0
- data/doc/Schemacop/FieldNode.html +409 -0
- data/doc/Schemacop/FloatValidator.html +158 -0
- data/doc/Schemacop/HashValidator.html +263 -0
- data/doc/Schemacop/IntegerValidator.html +158 -0
- data/doc/Schemacop/NilValidator.html +145 -0
- data/doc/Schemacop/Node.html +1426 -0
- data/doc/Schemacop/NodeResolver.html +242 -0
- data/doc/Schemacop/NodeSupportingField.html +590 -0
- data/doc/Schemacop/NodeSupportingType.html +614 -0
- data/doc/Schemacop/NodeWithBlock.html +289 -0
- data/doc/Schemacop/NumberValidator.html +232 -0
- data/doc/Schemacop/ObjectValidator.html +288 -0
- data/doc/Schemacop/RootNode.html +171 -0
- data/doc/Schemacop/Schema.html +697 -0
- data/doc/Schemacop/StringValidator.html +295 -0
- data/doc/ScopedEnv.html +351 -0
- data/doc/_index.html +190 -47
- data/doc/class_list.html +24 -31
- data/doc/css/full_list.css +32 -31
- data/doc/css/style.css +244 -91
- data/doc/file.README.html +428 -232
- data/doc/file_list.html +26 -30
- data/doc/frames.html +7 -16
- data/doc/index.html +428 -232
- data/doc/inheritance.graphml +524 -0
- data/doc/inheritance.pdf +825 -0
- data/doc/js/app.js +106 -77
- data/doc/js/full_list.js +170 -135
- data/doc/method_list.html +494 -38
- data/doc/top-level-namespace.html +36 -36
- data/lib/schemacop.rb +22 -7
- data/lib/schemacop/collector.rb +34 -0
- data/lib/schemacop/exceptions.rb +2 -8
- data/lib/schemacop/field_node.rb +26 -0
- data/lib/schemacop/node.rb +127 -0
- data/lib/schemacop/node_resolver.rb +14 -0
- data/lib/schemacop/node_supporting_field.rb +62 -0
- data/lib/schemacop/node_supporting_type.rb +112 -0
- data/lib/schemacop/node_with_block.rb +16 -0
- data/lib/schemacop/root_node.rb +4 -0
- data/lib/schemacop/schema.rb +61 -0
- data/lib/schemacop/scoped_env.rb +18 -0
- data/lib/schemacop/validator/array_validator.rb +30 -0
- data/lib/schemacop/validator/boolean_validator.rb +5 -0
- data/lib/schemacop/validator/float_validator.rb +5 -0
- data/lib/schemacop/validator/hash_validator.rb +18 -0
- data/lib/schemacop/validator/integer_validator.rb +5 -0
- data/lib/schemacop/validator/nil_validator.rb +5 -0
- data/lib/schemacop/validator/number_validator.rb +19 -0
- data/lib/schemacop/validator/object_validator.rb +21 -0
- data/lib/schemacop/validator/string_validator.rb +37 -0
- data/schemacop.gemspec +7 -5
- data/test/custom_check_test.rb +86 -0
- data/test/custom_if_test.rb +95 -0
- data/test/nil_dis_allow_test.rb +41 -0
- data/test/short_forms_test.rb +316 -0
- data/test/test_helper.rb +6 -0
- data/test/types_test.rb +83 -0
- data/test/validator_array_test.rb +97 -0
- data/test/validator_boolean_test.rb +15 -0
- data/test/validator_float_test.rb +57 -0
- data/test/validator_hash_test.rb +71 -0
- data/test/validator_integer_test.rb +46 -0
- data/test/validator_nil_test.rb +13 -0
- data/test/validator_number_test.rb +60 -0
- data/test/validator_object_test.rb +87 -0
- data/test/validator_string_test.rb +76 -0
- metadata +78 -14
- data/doc/Schemacop/Exceptions/Base.html +0 -127
- data/doc/Schemacop/Exceptions/InvalidSchema.html +0 -141
- data/doc/Schemacop/Exceptions/Validation.html +0 -142
- data/doc/Schemacop/MethodValidation.html +0 -120
- data/doc/Schemacop/MethodValidation/ClassMethods.html +0 -196
- data/doc/Schemacop/Validator.html +0 -254
- data/lib/schemacop/validator.rb +0 -145
- data/test/schemacop_validator_test.rb +0 -257
data/test/test_helper.rb
ADDED
data/test/types_test.rb
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Schemacop
|
4
|
+
class TypesTest < Minitest::Test
|
5
|
+
def setup
|
6
|
+
@datatype_samples = { array: [],
|
7
|
+
boolean: true,
|
8
|
+
float: 2.3,
|
9
|
+
hash: {},
|
10
|
+
integer: -5,
|
11
|
+
number: -3.2,
|
12
|
+
object: self,
|
13
|
+
string: 'miau' }.freeze
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_multitype
|
17
|
+
assert_only_types_allowed(
|
18
|
+
Schema.new do
|
19
|
+
type :integer
|
20
|
+
type :boolean
|
21
|
+
end, [:integer, :boolean]
|
22
|
+
)
|
23
|
+
|
24
|
+
assert_only_types_allowed(
|
25
|
+
Schema.new([:integer, :boolean]),
|
26
|
+
[:integer, :boolean]
|
27
|
+
)
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_all_data_types
|
31
|
+
@datatype_samples.keys.each do |type|
|
32
|
+
assert_only_types_allowed(Schema.new(type), type)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_conditional_types
|
37
|
+
s = Schema.new do
|
38
|
+
type :boolean
|
39
|
+
type :integer, min: 5
|
40
|
+
end
|
41
|
+
|
42
|
+
assert_nil s.validate! true
|
43
|
+
assert_nil s.validate! false
|
44
|
+
assert_nil s.validate! 5
|
45
|
+
|
46
|
+
assert_verr { s.validate! 'sali' }
|
47
|
+
assert_verr { s.validate! 4 }
|
48
|
+
end
|
49
|
+
|
50
|
+
# For short form test see short_forms_test.rb
|
51
|
+
def test_array_subtype_explicit
|
52
|
+
s = Schema.new do
|
53
|
+
type :array do
|
54
|
+
type :integer
|
55
|
+
end
|
56
|
+
end
|
57
|
+
assert_nil s.validate! [5]
|
58
|
+
assert_verr { s.validate! [nil] }
|
59
|
+
assert_verr { s.validate! ['a'] }
|
60
|
+
assert_verr { s.validate! [5, 'a'] }
|
61
|
+
assert_verr { s.validate! [5, nil] }
|
62
|
+
end
|
63
|
+
|
64
|
+
private
|
65
|
+
|
66
|
+
def assert_only_types_allowed(schema, allowed_types)
|
67
|
+
allowed_types = [*allowed_types]
|
68
|
+
@datatype_samples.each do |type, data|
|
69
|
+
if allowed_types.include?(type) ||
|
70
|
+
# All the weird cases need to be differentiated
|
71
|
+
(type == :float && allowed_types.include?(:number)) ||
|
72
|
+
(type == :integer && allowed_types.include?(:number)) ||
|
73
|
+
(type == :number && allowed_types.include?(:float)) ||
|
74
|
+
allowed_types.include?(:object)
|
75
|
+
|
76
|
+
assert_nil schema.validate! data
|
77
|
+
else
|
78
|
+
assert_verr { schema.validate! data }
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Schemacop
|
4
|
+
class ValidatorArrayTest < Minitest::Test
|
5
|
+
def test_basic
|
6
|
+
s = Schema.new do
|
7
|
+
type :array do
|
8
|
+
type :integer
|
9
|
+
end
|
10
|
+
end
|
11
|
+
assert_nil s.validate!([])
|
12
|
+
assert_nil s.validate!([0])
|
13
|
+
assert_nil s.validate!([0, 1])
|
14
|
+
assert_verr { s.validate!(['string']) }
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_option_min
|
18
|
+
s = Schema.new do
|
19
|
+
type :array, min: 2
|
20
|
+
end
|
21
|
+
|
22
|
+
assert_nil s.validate!([0, 1])
|
23
|
+
assert_nil s.validate!([0, 1, 2])
|
24
|
+
assert_verr { s.validate!([]) }
|
25
|
+
assert_verr { s.validate!([0]) }
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_option_max
|
29
|
+
s = Schema.new do
|
30
|
+
type :array, max: 2
|
31
|
+
end
|
32
|
+
|
33
|
+
assert_nil s.validate!([])
|
34
|
+
assert_nil s.validate!([0])
|
35
|
+
assert_nil s.validate!([0, 1])
|
36
|
+
assert_verr { s.validate!([0, 1, 2]) }
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_options_min_max
|
40
|
+
s = Schema.new do
|
41
|
+
type :array, min: 2, max: 3 do
|
42
|
+
type :integer
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
assert_nil s.validate!([1, 2])
|
47
|
+
assert_nil s.validate!([1, 2, 3])
|
48
|
+
assert_verr { s.validate!([]) }
|
49
|
+
assert_verr { s.validate!([1]) }
|
50
|
+
assert_verr { s.validate!([1, 2, 3, 4]) }
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_nil
|
54
|
+
s = Schema.new do
|
55
|
+
type :array, nil: true do
|
56
|
+
type :integer
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
assert_nil s.validate!([1, nil, 2])
|
61
|
+
assert_verr { s.validate!([1, nil, 'nope']) }
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_multiple_arrays
|
65
|
+
s = Schema.new do
|
66
|
+
type :array, if: proc { |arr| arr&.first&.is_a?(Integer) } do
|
67
|
+
type :integer
|
68
|
+
end
|
69
|
+
type :array, if: proc { |arr| arr&.first&.is_a?(String) } do
|
70
|
+
type :string
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
assert_nil s.validate!([1, 2, 3])
|
75
|
+
assert_nil s.validate!(%w(one two three))
|
76
|
+
assert_verr { s.validate!([1, 'mix']) }
|
77
|
+
assert_verr { s.validate!([]) }
|
78
|
+
end
|
79
|
+
|
80
|
+
def test_multiple_arrays_with_empty
|
81
|
+
s = Schema.new do
|
82
|
+
type :array, if: proc { |arr| arr&.first&.is_a?(Integer) } do
|
83
|
+
type :integer
|
84
|
+
end
|
85
|
+
type :array, if: proc { |arr| arr&.first&.is_a?(String) } do
|
86
|
+
type :string
|
87
|
+
end
|
88
|
+
type :array
|
89
|
+
end
|
90
|
+
|
91
|
+
assert_nil s.validate!([])
|
92
|
+
assert_nil s.validate!([1, 2, 3])
|
93
|
+
assert_nil s.validate!(%w(one two three))
|
94
|
+
assert_verr { s.validate!([1, 'mix']) }
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Schemacop
|
4
|
+
class ValidatorBooleanTest < Minitest::Test
|
5
|
+
def test_basic
|
6
|
+
s = Schema.new do
|
7
|
+
type :boolean
|
8
|
+
end
|
9
|
+
assert_nil s.validate! true
|
10
|
+
assert_nil s.validate! false
|
11
|
+
assert_verr { s.validate! nil }
|
12
|
+
assert_verr { s.validate! 1 }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Schemacop
|
4
|
+
class ValidatorFloatTest < Minitest::Test
|
5
|
+
def test_basic
|
6
|
+
s = Schema.new do
|
7
|
+
type :float
|
8
|
+
end
|
9
|
+
assert_nil s.validate!(-3.0)
|
10
|
+
assert_nil s.validate!(-3.123)
|
11
|
+
assert_nil s.validate!(0.0)
|
12
|
+
assert_nil s.validate!(15.0)
|
13
|
+
assert_nil s.validate!(15.13)
|
14
|
+
assert_verr { s.validate!(-3) }
|
15
|
+
assert_verr { s.validate!(0) }
|
16
|
+
assert_verr { s.validate!(15) }
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_option_min
|
20
|
+
s = Schema.new do
|
21
|
+
type :float, min: -2
|
22
|
+
end
|
23
|
+
|
24
|
+
assert_nil s.validate!(-2.0)
|
25
|
+
assert_nil s.validate!(-1.99999)
|
26
|
+
assert_nil s.validate!(1.2)
|
27
|
+
assert_verr { s.validate!(-5.2) }
|
28
|
+
assert_verr { s.validate!(-2.00001) }
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_option_max
|
32
|
+
s = Schema.new do
|
33
|
+
type :float, max: 5.2
|
34
|
+
end
|
35
|
+
|
36
|
+
assert_nil s.validate!(-2.0)
|
37
|
+
assert_nil s.validate!(5.2)
|
38
|
+
assert_verr { s.validate!(5.200001) }
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_options_min_max
|
42
|
+
s = Schema.new do
|
43
|
+
type :float, min: -2, max: 5.2
|
44
|
+
end
|
45
|
+
|
46
|
+
assert_nil s.validate!(-2.0)
|
47
|
+
assert_nil s.validate!(-1.99999)
|
48
|
+
assert_nil s.validate!(0.0)
|
49
|
+
assert_nil s.validate!(1.2)
|
50
|
+
assert_nil s.validate!(5.2)
|
51
|
+
assert_verr { s.validate!(-2.00001) }
|
52
|
+
assert_verr { s.validate!(5.200001) }
|
53
|
+
assert_verr { s.validate!(6) }
|
54
|
+
assert_verr { s.validate!(0) }
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Schemacop
|
4
|
+
class ValidatorHashTest < Minitest::Test
|
5
|
+
def test_basic
|
6
|
+
s = Schema.new do
|
7
|
+
type :hash do
|
8
|
+
req :one do
|
9
|
+
type :integer
|
10
|
+
end
|
11
|
+
req :two do
|
12
|
+
type :boolean
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
assert_nil s.validate!(one: 3, two: true)
|
17
|
+
assert_verr { s.validate!(one: 3) }
|
18
|
+
assert_verr { s.validate!(two: true) }
|
19
|
+
assert_verr { s.validate!({}) }
|
20
|
+
assert_verr { s.validate!(one: 3, two: true, three: 3) }
|
21
|
+
assert_verr { s.validate!(one: 3, three: true) }
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_nested
|
25
|
+
s = Schema.new do
|
26
|
+
type :hash do
|
27
|
+
req :h do
|
28
|
+
type :hash do
|
29
|
+
req :i do
|
30
|
+
type :integer
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
s.validate(h: { i: 3 })
|
37
|
+
assert_verr { s.validate!(h: { i: true }) }
|
38
|
+
assert_verr { s.validate!(h: {}) }
|
39
|
+
assert_verr { s.validate!({}) }
|
40
|
+
assert_verr { s.validate!(g: { i: 3 }) }
|
41
|
+
assert_verr { s.validate!(h: { j: 3 }) }
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_req_opt
|
45
|
+
s = Schema.new do
|
46
|
+
type :hash do
|
47
|
+
req :r do
|
48
|
+
type :boolean
|
49
|
+
end
|
50
|
+
req? :r_nil do
|
51
|
+
type :boolean
|
52
|
+
end
|
53
|
+
opt :o do
|
54
|
+
type :boolean
|
55
|
+
end
|
56
|
+
opt! :o_nonnil do
|
57
|
+
type :boolean
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
assert_nil s.validate!(r: true, r_nil: false)
|
63
|
+
assert_nil s.validate!(r: true, r_nil: nil)
|
64
|
+
assert_nil s.validate!(r: true, r_nil: false, o: false)
|
65
|
+
assert_nil s.validate!(r: true, r_nil: false, o: nil)
|
66
|
+
assert_verr { s.validate!(r: true, r_nil: false, o_nonnil: nil) }
|
67
|
+
assert_verr { s.validate!(o: true) }
|
68
|
+
assert_verr { s.validate!(r: nil, r_nil: false, o: true) }
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Schemacop
|
4
|
+
class ValidatorIntegerTest < Minitest::Test
|
5
|
+
def test_basic
|
6
|
+
s = Schema.new do
|
7
|
+
type :integer
|
8
|
+
end
|
9
|
+
assert_nil s.validate!(-3)
|
10
|
+
assert_nil s.validate!(0)
|
11
|
+
assert_nil s.validate!(15)
|
12
|
+
assert_verr { s.validate!(0.0) }
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_option_min
|
16
|
+
s = Schema.new do
|
17
|
+
type :integer, min: 6
|
18
|
+
end
|
19
|
+
|
20
|
+
assert_nil s.validate!(6)
|
21
|
+
assert_nil s.validate!(7)
|
22
|
+
assert_verr { s.validate!(5) }
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_option_max
|
26
|
+
s = Schema.new do
|
27
|
+
type :integer, max: 7
|
28
|
+
end
|
29
|
+
|
30
|
+
assert_nil s.validate!(6)
|
31
|
+
assert_nil s.validate!(7)
|
32
|
+
assert_verr { s.validate!(8) }
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_options_min_max
|
36
|
+
s = Schema.new do
|
37
|
+
type :integer, min: 6, max: 7
|
38
|
+
end
|
39
|
+
|
40
|
+
assert_nil s.validate!(6)
|
41
|
+
assert_nil s.validate!(7)
|
42
|
+
assert_verr { s.validate!(5) }
|
43
|
+
assert_verr { s.validate!(8) }
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Schemacop
|
4
|
+
class ValidatorNumberTest < Minitest::Test
|
5
|
+
def test_basic
|
6
|
+
s = Schema.new do
|
7
|
+
type :number
|
8
|
+
end
|
9
|
+
assert_nil s.validate!(-3)
|
10
|
+
assert_nil s.validate!(-3.123)
|
11
|
+
assert_nil s.validate!(0)
|
12
|
+
assert_nil s.validate!(15)
|
13
|
+
assert_nil s.validate!(15.13)
|
14
|
+
assert_verr { s.validate!('0.12') }
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_option_min
|
18
|
+
s = Schema.new do
|
19
|
+
type :number, min: -2
|
20
|
+
end
|
21
|
+
|
22
|
+
assert_nil s.validate!(-2)
|
23
|
+
assert_nil s.validate!(-1.99999)
|
24
|
+
assert_nil s.validate!(0)
|
25
|
+
assert_nil s.validate!(1.2)
|
26
|
+
assert_verr { s.validate!(-3) }
|
27
|
+
assert_verr { s.validate!(-2.00001) }
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_option_max
|
31
|
+
s = Schema.new do
|
32
|
+
type :number, max: 5.2
|
33
|
+
end
|
34
|
+
|
35
|
+
assert_nil s.validate!(-2)
|
36
|
+
assert_nil s.validate!(-1.9)
|
37
|
+
assert_nil s.validate!(0)
|
38
|
+
assert_nil s.validate!(5.19999)
|
39
|
+
assert_nil s.validate!(5.2)
|
40
|
+
assert_verr { s.validate!(5.200001) }
|
41
|
+
assert_verr { s.validate!(6) }
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_options_min_max
|
45
|
+
s = Schema.new do
|
46
|
+
type :number, min: -2, max: 5.2
|
47
|
+
end
|
48
|
+
|
49
|
+
assert_nil s.validate!(-2)
|
50
|
+
assert_nil s.validate!(-1.99999)
|
51
|
+
assert_nil s.validate!(0)
|
52
|
+
assert_nil s.validate!(1.2)
|
53
|
+
assert_nil s.validate!(5.2)
|
54
|
+
assert_verr { s.validate!(-3) }
|
55
|
+
assert_verr { s.validate!(-2.00001) }
|
56
|
+
assert_verr { s.validate!(5.200001) }
|
57
|
+
assert_verr { s.validate!(6) }
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|