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.
@@ -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
- data.each do |key,value|
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, value, fragments)
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['additionaItems'].is_a?(Hash)
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
- begin
661
- # Build a uri for it
662
- schema_uri = URI.parse(schema)
663
- if schema_uri.relative?
664
- # Check for absolute path
665
- if schema[0,1] == '/'
666
- schema_uri = URI.parse("file://#{schema}")
667
- else
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
- begin
689
- json_uri = URI.parse(data)
690
- if json_uri.relative?
691
- if data[0,1] == '/'
692
- schema_uri = URI.parse("file://#{data}")
693
- else
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
@@ -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
@@ -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
- end
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: 19
4
+ hash: 17
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 4
10
- version: 0.1.4
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-11-30 00:00:00 -05:00
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