json-schema 0.1.4 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/json-schema/validator.rb +24 -29
- data/test/test_files.rb +44 -0
- data/test/test_jsonschema.rb +162 -3
- metadata +6 -4
@@ -73,9 +73,9 @@ module JSON
|
|
73
73
|
|
74
74
|
# Validate the current schema
|
75
75
|
def validate_schema(current_schema, data, fragments)
|
76
|
-
|
76
|
+
|
77
77
|
ValidationMethods.each do |method|
|
78
|
-
if current_schema.schema[method]
|
78
|
+
if !current_schema.schema[method].nil?
|
79
79
|
self.send(("validate_" + method.sub('$','')).to_sym, current_schema, data, fragments)
|
80
80
|
end
|
81
81
|
end
|
@@ -346,10 +346,10 @@ module JSON
|
|
346
346
|
message = "The property '#{build_fragment(fragments)}' contains additional properties outside of the schema when none are allowed"
|
347
347
|
raise ValidationError.new(message, fragments, current_schema)
|
348
348
|
elsif current_schema.schema['additionalProperties'].is_a?(Hash)
|
349
|
-
|
349
|
+
extra_properties.each do |key|
|
350
350
|
schema = JSON::Schema.new(current_schema.schema['additionalProperties'],current_schema.uri)
|
351
351
|
fragments << key
|
352
|
-
validate_schema(schema,
|
352
|
+
validate_schema(schema, data[key], fragments)
|
353
353
|
fragments.pop
|
354
354
|
end
|
355
355
|
end
|
@@ -385,7 +385,7 @@ module JSON
|
|
385
385
|
if current_schema.schema['additionalItems'] == false && current_schema.schema['items'].length != data.length
|
386
386
|
message = "The property '#{build_fragment(fragments)}' contains additional array elements outside of the schema when none are allowed"
|
387
387
|
raise ValidationError.new(message, fragments, current_schema)
|
388
|
-
elsif current_schema.schema['
|
388
|
+
elsif current_schema.schema['additionalItems'].is_a?(Hash)
|
389
389
|
schema = JSON::Schema.new(current_schema.schema['additionalItems'],current_schema.uri)
|
390
390
|
data.each_with_index do |item,i|
|
391
391
|
if i >= current_schema.schema['items'].length
|
@@ -500,6 +500,9 @@ module JSON
|
|
500
500
|
schema = JSON::Schema.new(JSON.parse(open(uri.to_s).read), uri)
|
501
501
|
@schemas[uri.to_s] = schema
|
502
502
|
build_schemas(schema)
|
503
|
+
rescue JSON::ParserError
|
504
|
+
# Don't rescue this error, we want JSON formatting issues to bubble up
|
505
|
+
raise $!
|
503
506
|
rescue
|
504
507
|
# Failures will occur when this URI cannot be referenced yet. Don't worry about it,
|
505
508
|
# the proper error will fall out if the ref isn't ever defined
|
@@ -657,21 +660,17 @@ module JSON
|
|
657
660
|
begin
|
658
661
|
schema = JSON.parse(schema)
|
659
662
|
rescue
|
660
|
-
|
661
|
-
|
662
|
-
|
663
|
-
|
664
|
-
|
665
|
-
|
666
|
-
|
667
|
-
|
668
|
-
schema_uri = URI.parse("file://#{Dir.pwd}/#{schema}")
|
669
|
-
end
|
663
|
+
# Build a uri for it
|
664
|
+
schema_uri = URI.parse(schema)
|
665
|
+
if schema_uri.relative?
|
666
|
+
# Check for absolute path
|
667
|
+
if schema[0,1] == '/'
|
668
|
+
schema_uri = URI.parse("file://#{schema}")
|
669
|
+
else
|
670
|
+
schema_uri = URI.parse("file://#{Dir.pwd}/#{schema}")
|
670
671
|
end
|
671
|
-
schema = JSON.parse(open(schema_uri.to_s).read)
|
672
|
-
rescue
|
673
|
-
raise "Invalid schema: #{schema_uri.to_s}"
|
674
672
|
end
|
673
|
+
schema = JSON.parse(open(schema_uri.to_s).read)
|
675
674
|
end
|
676
675
|
end
|
677
676
|
|
@@ -685,19 +684,15 @@ module JSON
|
|
685
684
|
begin
|
686
685
|
data = JSON.parse(data)
|
687
686
|
rescue
|
688
|
-
|
689
|
-
|
690
|
-
if
|
691
|
-
|
692
|
-
|
693
|
-
|
694
|
-
schema_uri = URI.parse("file://#{Dir.pwd}/#{data}")
|
695
|
-
end
|
687
|
+
json_uri = URI.parse(data)
|
688
|
+
if json_uri.relative?
|
689
|
+
if data[0,1] == '/'
|
690
|
+
schema_uri = URI.parse("file://#{data}")
|
691
|
+
else
|
692
|
+
schema_uri = URI.parse("file://#{Dir.pwd}/#{data}")
|
696
693
|
end
|
697
|
-
data = JSON.parse(open(json_uri.to_s).read)
|
698
|
-
rescue
|
699
|
-
raise "Invalid JSON: #{json_uri.to_s}"
|
700
694
|
end
|
695
|
+
data = JSON.parse(open(json_uri.to_s).read)
|
701
696
|
end
|
702
697
|
end
|
703
698
|
data
|
data/test/test_files.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require File.dirname(__FILE__) + '/../lib/json-schema'
|
3
|
+
|
4
|
+
class JSONSchemaTest < Test::Unit::TestCase
|
5
|
+
def test_schema_from_file
|
6
|
+
data = {"a" => 5}
|
7
|
+
assert(JSON::Validator.validate(File.join(File.dirname(__FILE__),"schemas/good_schema_1.json"),data))
|
8
|
+
data = {"a" => "bad"}
|
9
|
+
assert(!JSON::Validator.validate(File.join(File.dirname(__FILE__),"schemas/good_schema_1.json"),data))
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_data_from_file
|
13
|
+
schema = {"type" => "object", "properties" => {"a" => {"type" => "integer"}}}
|
14
|
+
assert(JSON::Validator.validate(schema,File.join(File.dirname(__FILE__),"data/good_data_1.json")))
|
15
|
+
assert(!JSON::Validator.validate(schema,File.join(File.dirname(__FILE__),"data/bad_data_1.json")))
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_both_from_file
|
19
|
+
assert(JSON::Validator.validate(File.join(File.dirname(__FILE__),"schemas/good_schema_1.json"),File.join(File.dirname(__FILE__),"data/good_data_1.json")))
|
20
|
+
assert(!JSON::Validator.validate(File.join(File.dirname(__FILE__),"schemas/good_schema_1.json"),File.join(File.dirname(__FILE__),"data/bad_data_1.json")))
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_invalid_schema
|
24
|
+
data = {}
|
25
|
+
assert_raise JSON::ParserError do
|
26
|
+
assert(JSON::Validator.validate(File.join(File.dirname(__FILE__),"schemas/invalid_schema_1.json"),data))
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_invalid_data
|
31
|
+
schema = {}
|
32
|
+
assert_raise JSON::ParserError do
|
33
|
+
assert(JSON::Validator.validate(schema,File.join(File.dirname(__FILE__),"data/invalid_data_1.json")))
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_file_ref
|
38
|
+
data = {"b" => {"a" => 5}}
|
39
|
+
assert(JSON::Validator.validate(File.join(File.dirname(__FILE__),"schemas/good_schema_2.json"),data))
|
40
|
+
|
41
|
+
data = {"b" => {"a" => "boo"}}
|
42
|
+
assert(!JSON::Validator.validate(File.join(File.dirname(__FILE__),"schemas/good_schema_1.json"),data))
|
43
|
+
end
|
44
|
+
end
|
data/test/test_jsonschema.rb
CHANGED
@@ -146,7 +146,22 @@ class JSONSchemaTest < Test::Unit::TestCase
|
|
146
146
|
|
147
147
|
data["a"] = false
|
148
148
|
assert(!JSON::Validator.validate(schema,data))
|
149
|
-
|
149
|
+
|
150
|
+
# Test a union type with schemas
|
151
|
+
schema["properties"]["a"]["type"] = [{ "type" => "string" }, {"type" => "object", "properties" => {"b" => {"type" => "integer"}}}]
|
152
|
+
|
153
|
+
data["a"] = "test"
|
154
|
+
assert(JSON::Validator.validate(schema,data))
|
155
|
+
|
156
|
+
data["a"] = 5
|
157
|
+
assert(!JSON::Validator.validate(schema,data))
|
158
|
+
|
159
|
+
data["a"] = {"b" => 5}
|
160
|
+
assert(JSON::Validator.validate(schema,data))
|
161
|
+
|
162
|
+
data["a"] = {"b" => "taco"}
|
163
|
+
assert(!JSON::Validator.validate(schema,data))
|
164
|
+
end
|
150
165
|
|
151
166
|
|
152
167
|
|
@@ -157,12 +172,21 @@ class JSONSchemaTest < Test::Unit::TestCase
|
|
157
172
|
"a" => {"required" => true}
|
158
173
|
}
|
159
174
|
}
|
160
|
-
data = {
|
161
|
-
}
|
175
|
+
data = {}
|
162
176
|
|
163
177
|
assert(!JSON::Validator.validate(schema,data))
|
164
178
|
data['a'] = "Hello"
|
165
179
|
assert(JSON::Validator.validate(schema,data))
|
180
|
+
|
181
|
+
schema = {
|
182
|
+
"properties" => {
|
183
|
+
"a" => {"type" => "integer"}
|
184
|
+
}
|
185
|
+
}
|
186
|
+
|
187
|
+
data = {}
|
188
|
+
assert(JSON::Validator.validate(schema,data))
|
189
|
+
|
166
190
|
end
|
167
191
|
|
168
192
|
|
@@ -565,5 +589,140 @@ class JSONSchemaTest < Test::Unit::TestCase
|
|
565
589
|
end
|
566
590
|
|
567
591
|
|
592
|
+
|
593
|
+
def test_extends
|
594
|
+
schema = {
|
595
|
+
"properties" => {
|
596
|
+
"a" => { "type" => "integer"}
|
597
|
+
}
|
598
|
+
}
|
599
|
+
|
600
|
+
schema2 = {
|
601
|
+
"properties" => {
|
602
|
+
"a" => { "maximum" => 5 }
|
603
|
+
}
|
604
|
+
}
|
605
|
+
|
606
|
+
data = {
|
607
|
+
"a" => 10
|
608
|
+
}
|
609
|
+
|
610
|
+
assert(JSON::Validator.validate(schema,data))
|
611
|
+
assert(!JSON::Validator.validate(schema2,data))
|
612
|
+
|
613
|
+
schema["extends"] = schema2
|
614
|
+
|
615
|
+
assert(!JSON::Validator.validate(schema,data))
|
616
|
+
end
|
617
|
+
|
618
|
+
def test_pattern_properties
|
619
|
+
# Set up the default datatype
|
620
|
+
schema = {
|
621
|
+
"patternProperties" => {
|
622
|
+
"\\d+ taco" => {"type" => "integer"}
|
623
|
+
}
|
624
|
+
}
|
625
|
+
|
626
|
+
data = {
|
627
|
+
"a" => true,
|
628
|
+
"1 taco" => 1,
|
629
|
+
"20 tacos" => 20
|
630
|
+
}
|
631
|
+
|
632
|
+
assert(JSON::Validator.validate(schema,data))
|
633
|
+
data["20 tacos"] = "string!"
|
634
|
+
assert(!JSON::Validator.validate(schema,data))
|
635
|
+
end
|
636
|
+
|
637
|
+
|
638
|
+
def test_additional_properties
|
639
|
+
# Test no additional properties allowed
|
640
|
+
schema = {
|
641
|
+
"properties" => {
|
642
|
+
"a" => { "type" => "integer" }
|
643
|
+
},
|
644
|
+
"additionalProperties" => false
|
645
|
+
}
|
646
|
+
|
647
|
+
data = {
|
648
|
+
"a" => 10
|
649
|
+
}
|
650
|
+
|
651
|
+
assert(JSON::Validator.validate(schema,data))
|
652
|
+
data["b"] = 5
|
653
|
+
assert(!JSON::Validator.validate(schema,data))
|
654
|
+
|
655
|
+
# Test additional properties match a schema
|
656
|
+
schema["additionalProperties"] = { "type" => "string" }
|
657
|
+
data["b"] = "taco"
|
658
|
+
assert(JSON::Validator.validate(schema,data))
|
659
|
+
data["b"] = 5
|
660
|
+
assert(!JSON::Validator.validate(schema,data))
|
661
|
+
|
662
|
+
# Make sure this works with pattern properties set, too
|
663
|
+
schema = {
|
664
|
+
"patternProperties" => {
|
665
|
+
"\\d+ taco" => {"type" => "integer"}
|
666
|
+
},
|
667
|
+
"additionalProperties" => false
|
668
|
+
}
|
669
|
+
|
670
|
+
data = {
|
671
|
+
"5 tacos" => 5,
|
672
|
+
"20 tacos" => 20
|
673
|
+
}
|
674
|
+
|
675
|
+
assert(JSON::Validator.validate(schema,data))
|
676
|
+
data["b"] = 5
|
677
|
+
assert(!JSON::Validator.validate(schema,data))
|
678
|
+
end
|
679
|
+
|
680
|
+
|
681
|
+
def test_items
|
682
|
+
schema = {
|
683
|
+
"items" => { "type" => "integer" }
|
684
|
+
}
|
685
|
+
|
686
|
+
data = [1,2,4]
|
687
|
+
assert(JSON::Validator.validate(schema,data))
|
688
|
+
data = [1,2,"string"]
|
689
|
+
assert(!JSON::Validator.validate(schema,data))
|
690
|
+
|
691
|
+
schema = {
|
692
|
+
"items" => [
|
693
|
+
{"type" => "integer"},
|
694
|
+
{"type" => "string"}
|
695
|
+
]
|
696
|
+
}
|
697
|
+
|
698
|
+
data = [1,"string"]
|
699
|
+
assert(JSON::Validator.validate(schema,data))
|
700
|
+
data = [1,"string",3]
|
701
|
+
assert(JSON::Validator.validate(schema,data))
|
702
|
+
data = ["string",1]
|
703
|
+
assert(!JSON::Validator.validate(schema,data))
|
704
|
+
|
705
|
+
schema = {
|
706
|
+
"items" => [
|
707
|
+
{"type" => "integer"},
|
708
|
+
{"type" => "string"}
|
709
|
+
],
|
710
|
+
"additionalItems" => false
|
711
|
+
}
|
712
|
+
|
713
|
+
data = [1,"string"]
|
714
|
+
assert(JSON::Validator.validate(schema,data))
|
715
|
+
data = [1,"string",3]
|
716
|
+
assert(!JSON::Validator.validate(schema,data))
|
717
|
+
|
718
|
+
schema = {"items" => [{"type" => "integer"},{"type" => "string"}],"additionalItems" => {"type" => "integer"}}
|
719
|
+
|
720
|
+
data = [1,"string"]
|
721
|
+
assert(JSON::Validator.validate(schema,data))
|
722
|
+
data = [1,"string",3]
|
723
|
+
assert(JSON::Validator.validate(schema,data))
|
724
|
+
data = [1,"string","string"]
|
725
|
+
assert(!JSON::Validator.validate(schema,data))
|
726
|
+
end
|
568
727
|
end
|
569
728
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: json-schema
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 17
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 5
|
10
|
+
version: 0.1.5
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Kenny Hoxworth
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-
|
18
|
+
date: 2010-12-01 00:00:00 -05:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -45,6 +45,7 @@ files:
|
|
45
45
|
- lib/json-schema/uri/file.rb
|
46
46
|
- lib/json-schema/validator.rb
|
47
47
|
- lib/json-schema.rb
|
48
|
+
- test/test_files.rb
|
48
49
|
- test/test_jsonschema.rb
|
49
50
|
- README.textile
|
50
51
|
has_rdoc: true
|
@@ -82,4 +83,5 @@ signing_key:
|
|
82
83
|
specification_version: 3
|
83
84
|
summary: Ruby JSON Schema Validator
|
84
85
|
test_files:
|
86
|
+
- test/test_files.rb
|
85
87
|
- test/test_jsonschema.rb
|