json-schema 0.1.4 → 0.1.5

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.
@@ -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