json-schema 2.1.9 → 2.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.
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ NmM0OTNmZTRkM2JmNmNlYWM2MDA0ZjNlZmFlMzZkM2JjOWRmZGQ1ZQ==
5
+ data.tar.gz: !binary |-
6
+ MTdmODg5Njc3NmRjZDliZGU1YjYxMGQwNWQ1ZGY4NDFhMWEyZjcxZA==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ MjUxNmNmNWUzZWQ1MzgyMDk1YjZiNTkyODM1NzFiNmU2MWI0NDMxY2NkN2Rj
10
+ M2VhNDBkODlkZDg0MGEyMDZhMWFmZWU2MzIwYTBjNjliYWVkM2Y5YTZhNGM2
11
+ Y2Y5ZjgzNzJmYzhkZjhlMWI0ODljMzA3Mjk5N2JkNjlhZmIzNWQ=
12
+ data.tar.gz: !binary |-
13
+ MzQ3NWRlNzJhZWY5NWFjZWRmN2U4N2MxMTlkMjgyNDU3OWMxMWFjOWY2MDk5
14
+ Njk3YjZjZGQyNTk2MjFhZjczZTRkZDgwZmQ3MWFlZDM3YTVkMTAyYmNlMWI1
15
+ ZWQ4YTkyZDRlNzY5NGYzMDY3MmZkY2ExYmRiMzdkY2U4MzFjNDU=
@@ -22,7 +22,7 @@ From the git repo:
22
22
 
23
23
  <pre>
24
24
  $ gem build json-schema.gemspec
25
- $ gem install json-schema-2.1.9.gem
25
+ $ gem install json-schema-2.2.0.gem
26
26
  </pre>
27
27
 
28
28
 
@@ -74,6 +74,18 @@ data = ['user','user','user']
74
74
  JSON::Validator.validate('user.json', data, :list => true)
75
75
  </pre>
76
76
 
77
+ h3. Strictly validate an object's properties
78
+
79
+ With the <code>:strict</code>code> option, validation fails when an object contains properties that are not defined in the schema's property list or doesn't match the <code>additionalProperties</code> property. Furthermore, all properties are treated as <code>required</code> by default.
80
+
81
+ <pre>
82
+ require 'rubygems'
83
+ require 'json-schema'
84
+
85
+ data = ['user','user','user']
86
+ JSON::Validator.validate('user.json', data, :list => true)
87
+ </pre>
88
+
77
89
  h3. Catch a validation error and print it out
78
90
 
79
91
  <pre>
@@ -15,7 +15,7 @@ module JSON
15
15
 
16
16
  addprop = current_schema.schema['additionalProperties']
17
17
  if addprop.is_a?(Hash)
18
- matching_properties= extra_properties # & addprop.keys
18
+ matching_properties = extra_properties # & addprop.keys
19
19
  matching_properties.each do |key|
20
20
  schema = JSON::Schema.new(addprop[key] || addprop, current_schema.uri, validator)
21
21
  fragments << key
@@ -13,7 +13,8 @@ module JSON
13
13
  data[property.to_s] = (default.is_a?(Hash) ? default.clone : default)
14
14
  end
15
15
 
16
- if property_schema['required'] && !data.has_key?(property.to_s) && !data.has_key?(property.to_sym)
16
+
17
+ if (property_schema['required'] || options[:strict] == true) && !data.has_key?(property.to_s) && !data.has_key?(property.to_sym)
17
18
  message = "The property '#{build_fragment(fragments)}' did not contain a required property of '#{property}'"
18
19
  validation_error(processor, message, fragments, current_schema, self, options[:record_errors])
19
20
  end
@@ -25,6 +26,18 @@ module JSON
25
26
  fragments.pop
26
27
  end
27
28
  end
29
+
30
+ # When strict is true, ensure no undefined properties exist in the data
31
+ if (options[:strict] == true && !current_schema.schema.has_key?('additionalProperties'))
32
+ diff = data.select do |k,v|
33
+ !current_schema.schema['properties'].has_key?(k.to_s) && !current_schema.schema['properties'].has_key?(k.to_sym)
34
+ end
35
+
36
+ if diff.size > 0
37
+ message = "The property '#{build_fragment(fragments)}' contained undefined properties: '#{diff.keys.join(", ")}'"
38
+ validation_error(processor, message, fragments, current_schema, self, options[:record_errors])
39
+ end
40
+ end
28
41
  end
29
42
  end
30
43
  end
@@ -13,6 +13,11 @@ module JSON
13
13
  data[property.to_s] = (default.is_a?(Hash) ? default.clone : default)
14
14
  end
15
15
 
16
+ if (options[:strict] == true && !data.has_key?(property.to_s) && !data.has_key?(property.to_sym))
17
+ message = "The property '#{build_fragment(fragments)}' did not contain a required property of '#{property}'"
18
+ validation_error(processor, message, fragments, current_schema, self, options[:record_errors])
19
+ end
20
+
16
21
  if data.has_key?(property.to_s) || data.has_key?(property.to_sym)
17
22
  schema = JSON::Schema.new(property_schema,current_schema.uri,validator)
18
23
  fragments << property.to_s
@@ -21,6 +26,18 @@ module JSON
21
26
  end
22
27
  end
23
28
  end
29
+
30
+ # When strict is true, ensure no undefined properties exist in the data
31
+ if (options[:strict] == true && !current_schema.schema.has_key?('additionalProperties'))
32
+ diff = data.select do |k,v|
33
+ !current_schema.schema['properties'].has_key?(k.to_s) && !current_schema.schema['properties'].has_key?(k.to_sym)
34
+ end
35
+
36
+ if diff.size > 0
37
+ message = "The property '#{build_fragment(fragments)}' contained undefined properties: '#{diff.keys.join(", ")}'"
38
+ validation_error(processor, message, fragments, current_schema, self, options[:record_errors])
39
+ end
40
+ end
24
41
  end
25
42
  end
26
43
  end
@@ -113,7 +113,8 @@ module JSON
113
113
  :record_errors => false,
114
114
  :errors_as_objects => false,
115
115
  :insert_defaults => false,
116
- :clear_cache => true
116
+ :clear_cache => true,
117
+ :strict => false
117
118
  }
118
119
  @@validators = {}
119
120
  @@default_validator = nil
@@ -158,6 +159,7 @@ module JSON
158
159
 
159
160
  @validation_options = @options[:record_errors] ? {:record_errors => true} : {}
160
161
  @validation_options[:insert_defaults] = true if @options[:insert_defaults]
162
+ @validation_options[:strict] = true if @options[:strict] == true
161
163
 
162
164
  @@mutex.synchronize { @base_schema = initialize_schema(schema_data) }
163
165
  @data = initialize_data(data)
@@ -480,6 +480,55 @@ class JSONSchemaDraft3Test < Test::Unit::TestCase
480
480
  assert(!JSON::Validator.validate(schema,data))
481
481
  end
482
482
 
483
+ def test_strict_properties
484
+ schema = {
485
+ "$schema" => "http://json-schema.org/draft-03/schema#",
486
+ "properties" => {
487
+ "a" => {"type" => "string"},
488
+ "b" => {"type" => "string"}
489
+ }
490
+ }
491
+
492
+ data = {"a" => "a"}
493
+ assert(!JSON::Validator.validate(schema,data,:strict => true))
494
+
495
+ data = {"b" => "b"}
496
+ assert(!JSON::Validator.validate(schema,data,:strict => true))
497
+
498
+ data = {"a" => "a", "b" => "b"}
499
+ assert(JSON::Validator.validate(schema,data,:strict => true))
500
+
501
+ data = {"a" => "a", "b" => "b", "c" => "c"}
502
+ assert(!JSON::Validator.validate(schema,data,:strict => true))
503
+ end
504
+
505
+ def test_strict_properties_additional_props
506
+ schema = {
507
+ "$schema" => "http://json-schema.org/draft-03/schema#",
508
+ "properties" => {
509
+ "a" => {"type" => "string"},
510
+ "b" => {"type" => "string"}
511
+ },
512
+ "additionalProperties" => {"type" => "integer"}
513
+ }
514
+
515
+ data = {"a" => "a"}
516
+ assert(!JSON::Validator.validate(schema,data,:strict => true))
517
+
518
+ data = {"b" => "b"}
519
+ assert(!JSON::Validator.validate(schema,data,:strict => true))
520
+
521
+ data = {"a" => "a", "b" => "b"}
522
+ assert(JSON::Validator.validate(schema,data,:strict => true))
523
+
524
+ data = {"a" => "a", "b" => "b", "c" => "c"}
525
+ assert(!JSON::Validator.validate(schema,data,:strict => true))
526
+
527
+ data = {"a" => "a", "b" => "b", "c" => 3}
528
+ assert(JSON::Validator.validate(schema,data,:strict => true))
529
+ end
530
+
531
+
483
532
 
484
533
  def test_pattern
485
534
  # Set up the default datatype
@@ -415,6 +415,54 @@ class JSONSchemaDraft4Test < Test::Unit::TestCase
415
415
  assert(!JSON::Validator.validate(schema,data))
416
416
  end
417
417
 
418
+ def test_strict_properties
419
+ schema = {
420
+ "$schema" => "http://json-schema.org/draft-04/schema#",
421
+ "properties" => {
422
+ "a" => {"type" => "string"},
423
+ "b" => {"type" => "string"}
424
+ }
425
+ }
426
+
427
+ data = {"a" => "a"}
428
+ assert(!JSON::Validator.validate(schema,data,:strict => true))
429
+
430
+ data = {"b" => "b"}
431
+ assert(!JSON::Validator.validate(schema,data,:strict => true))
432
+
433
+ data = {"a" => "a", "b" => "b"}
434
+ assert(JSON::Validator.validate(schema,data,:strict => true))
435
+
436
+ data = {"a" => "a", "b" => "b", "c" => "c"}
437
+ assert(!JSON::Validator.validate(schema,data,:strict => true))
438
+ end
439
+
440
+ def test_strict_properties_additional_props
441
+ schema = {
442
+ "$schema" => "http://json-schema.org/draft-04/schema#",
443
+ "properties" => {
444
+ "a" => {"type" => "string"},
445
+ "b" => {"type" => "string"}
446
+ },
447
+ "additionalProperties" => {"type" => "integer"}
448
+ }
449
+
450
+ data = {"a" => "a"}
451
+ assert(!JSON::Validator.validate(schema,data,:strict => true))
452
+
453
+ data = {"b" => "b"}
454
+ assert(!JSON::Validator.validate(schema,data,:strict => true))
455
+
456
+ data = {"a" => "a", "b" => "b"}
457
+ assert(JSON::Validator.validate(schema,data,:strict => true))
458
+
459
+ data = {"a" => "a", "b" => "b", "c" => "c"}
460
+ assert(!JSON::Validator.validate(schema,data,:strict => true))
461
+
462
+ data = {"a" => "a", "b" => "b", "c" => 3}
463
+ assert(JSON::Validator.validate(schema,data,:strict => true))
464
+ end
465
+
418
466
 
419
467
 
420
468
  def test_unique_items
metadata CHANGED
@@ -1,15 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json-schema
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.9
5
- prerelease:
4
+ version: 2.2.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Kenny Hoxworth
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2014-01-05 00:00:00.000000000 Z
11
+ date: 2014-01-15 00:00:00.000000000 Z
13
12
  dependencies: []
14
13
  description:
15
14
  email: hoxworth@gmail.com
@@ -114,27 +113,26 @@ files:
114
113
  homepage: http://github.com/hoxworth/json-schema/tree/master
115
114
  licenses:
116
115
  - MIT
116
+ metadata: {}
117
117
  post_install_message:
118
118
  rdoc_options: []
119
119
  require_paths:
120
120
  - lib
121
121
  required_ruby_version: !ruby/object:Gem::Requirement
122
- none: false
123
122
  requirements:
124
123
  - - ! '>='
125
124
  - !ruby/object:Gem::Version
126
125
  version: '0'
127
126
  required_rubygems_version: !ruby/object:Gem::Requirement
128
- none: false
129
127
  requirements:
130
128
  - - ! '>='
131
129
  - !ruby/object:Gem::Version
132
130
  version: '0'
133
131
  requirements: []
134
132
  rubyforge_project:
135
- rubygems_version: 1.8.23
133
+ rubygems_version: 2.0.7
136
134
  signing_key:
137
- specification_version: 3
135
+ specification_version: 4
138
136
  summary: Ruby JSON Schema Validator
139
137
  test_files:
140
138
  - test/test_all_of_ref_schema.rb