json-schema 2.7.0 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +70 -12
  3. data/lib/json-schema/attribute.rb +10 -0
  4. data/lib/json-schema/attributes/allof.rb +1 -1
  5. data/lib/json-schema/attributes/anyof.rb +1 -1
  6. data/lib/json-schema/attributes/const.rb +15 -0
  7. data/lib/json-schema/attributes/dependencies.rb +0 -6
  8. data/lib/json-schema/attributes/dependencies_v4.rb +11 -0
  9. data/lib/json-schema/attributes/divisibleby.rb +1 -1
  10. data/lib/json-schema/attributes/formats/custom.rb +1 -1
  11. data/lib/json-schema/attributes/formats/date.rb +1 -1
  12. data/lib/json-schema/attributes/formats/date_time.rb +1 -1
  13. data/lib/json-schema/attributes/formats/date_time_v4.rb +1 -1
  14. data/lib/json-schema/attributes/formats/ip.rb +1 -1
  15. data/lib/json-schema/attributes/formats/time.rb +1 -1
  16. data/lib/json-schema/attributes/formats/uri.rb +1 -1
  17. data/lib/json-schema/attributes/limit.rb +0 -127
  18. data/lib/json-schema/attributes/limits/items.rb +15 -0
  19. data/lib/json-schema/attributes/limits/length.rb +15 -0
  20. data/lib/json-schema/attributes/limits/max_items.rb +15 -0
  21. data/lib/json-schema/attributes/limits/max_length.rb +15 -0
  22. data/lib/json-schema/attributes/limits/max_properties.rb +15 -0
  23. data/lib/json-schema/attributes/limits/maximum.rb +15 -0
  24. data/lib/json-schema/attributes/limits/maximum_inclusive.rb +11 -0
  25. data/lib/json-schema/attributes/limits/min_items.rb +15 -0
  26. data/lib/json-schema/attributes/limits/min_length.rb +15 -0
  27. data/lib/json-schema/attributes/limits/min_properties.rb +15 -0
  28. data/lib/json-schema/attributes/limits/minimum.rb +15 -0
  29. data/lib/json-schema/attributes/limits/minimum_inclusive.rb +11 -0
  30. data/lib/json-schema/attributes/limits/numeric.rb +16 -0
  31. data/lib/json-schema/attributes/limits/properties.rb +15 -0
  32. data/lib/json-schema/attributes/not.rb +1 -1
  33. data/lib/json-schema/attributes/oneof.rb +2 -2
  34. data/lib/json-schema/attributes/properties.rb +0 -8
  35. data/lib/json-schema/attributes/properties_v4.rb +13 -0
  36. data/lib/json-schema/attributes/ref.rb +1 -17
  37. data/lib/json-schema/attributes/type.rb +0 -10
  38. data/lib/json-schema/attributes/type_v4.rb +1 -1
  39. data/lib/json-schema/schema/reader.rb +1 -1
  40. data/lib/json-schema/schema/validator.rb +2 -1
  41. data/lib/json-schema/schema.rb +2 -2
  42. data/lib/json-schema/util/array_set.rb +4 -4
  43. data/lib/json-schema/util/uri.rb +42 -0
  44. data/lib/json-schema/util/uuid.rb +0 -1
  45. data/lib/json-schema/validator.rb +72 -88
  46. data/lib/json-schema/validators/draft6.rb +57 -0
  47. data/lib/json-schema/validators/hyper-draft3.rb +13 -0
  48. data/lib/json-schema/validators/hyper-draft6.rb +13 -0
  49. data/lib/json-schema.rb +1 -2
  50. data/resources/draft-03.json +173 -173
  51. data/resources/draft-06.json +150 -0
  52. metadata +31 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: f440a3f87c238f6b4a3ba8fb93818ae17affd9fc
4
- data.tar.gz: 910c2401bf9e11a0d57dfe8e47086c876e7e48b4
2
+ SHA256:
3
+ metadata.gz: ab17ffc9133c3115ad9bb2f4b37338ee71d1994bf62849e7557b7e41a9d1d8e9
4
+ data.tar.gz: 3c44c431d8997fa255613bd6235fdd82b3c7c15ecc9e1077a1d41ff33b31c69b
5
5
  SHA512:
6
- metadata.gz: dbf3e34a23275021b9cf6f9d9ccb5aa86956182411f55e93fa3cd29b30d24b01d18c30e191cb31dd5a1c71b780188b08cb261d7248e203bcfa74d9b1f104f273
7
- data.tar.gz: a5311ed16954806392eabe157ccd92d9b54b3e20e228697c31bc0042f1455c0b7e4bff6a2b33db473a93116020fdcf9a6296e621cb55638287103142e54c3839
6
+ metadata.gz: 999689f22f02b64395c78b537ee86f6f0390e9cb2dc57e14293d310999bf11b5633b2fe16f1ca4c773bedb90e002452617f3df6926ff955deb84cca5446381ce
7
+ data.tar.gz: 71f12207a56541aab4ba1157d74e988295aff34e181daeb8937ed1e8bdc7a81025baaad536a0634da49527d63c71d341d433832cb56672b60f7fd920dcecda1a
data/README.md CHANGED
@@ -1,8 +1,11 @@
1
- [![Travis](https://travis-ci.org/ruby-json-schema/json-schema.svg?branch=master)](https://travis-ci.org/ruby-json-schema/json-schema)
2
- [![Code Climate](https://codeclimate.com/github/ruby-json-schema/json-schema/badges/gpa.svg)](https://codeclimate.com/github/ruby-json-schema/json-schema)
1
+ # Ruby JSON Schema Validator
3
2
 
4
- Ruby JSON Schema Validator
5
- ==========================
3
+ [![License](https://img.shields.io/github/license/voxpupuli/json-schema.svg)](https://github.com/voxpupuli/json-schema/blob/master/LICENSE)
4
+ [![Test](https://github.com/voxpupuli/json-schema/actions/workflows/test.yml/badge.svg)](https://github.com/voxpupuli/json-schema/actions/workflows/test.yml)
5
+ [![Release](https://github.com/voxpupuli/json-schema/actions/workflows/release.yml/badge.svg)](https://github.com/voxpupuli/json-schema/actions/workflows/release.yml)
6
+ [![RubyGem Version](https://img.shields.io/gem/v/json-schema.svg)](https://rubygems.org/gems/json-schema)
7
+ [![RubyGem Downloads](https://img.shields.io/gem/dt/json-schema.svg)](https://rubygems.org/gems/json-schema)
8
+ [![Donated by Iain Beeston](https://img.shields.io/badge/donated%20by-Iain%20Beeston-fb7047.svg)](#transfer-notice)
6
9
 
7
10
  This library is intended to provide Ruby with an interface for validating JSON
8
11
  objects against a JSON schema conforming to [JSON Schema Draft
@@ -16,7 +19,7 @@ Additional Resources
16
19
  --------------------
17
20
 
18
21
  - [Google Groups](https://groups.google.com/forum/#!forum/ruby-json-schema)
19
- - #ruby-json-schema on chat.freenode.net
22
+ - #voxpupuli on irc.libera.chat
20
23
 
21
24
  Version 2.0.0 Upgrade Notes
22
25
  ---------------------------
@@ -26,6 +29,14 @@ default**, so schemas that do not declare a validator using the `$schema`
26
29
  keyword will use Draft-04 now instead of Draft-03. This is the reason for the
27
30
  major version upgrade.
28
31
 
32
+ Version 3.0.0 Upgrade Notes
33
+ ---------------------------
34
+
35
+ All individual changes are documented in the CHANGELOG.md. The biggest change
36
+ is that the new version only supports Ruby 2.5 and newer. Take a look into the
37
+ gemspec file to see the currently supported Ruby version and also
38
+ `.github/workflows/test.yml` to see the Ruby versions we test on.
39
+
29
40
  Installation
30
41
  ------------
31
42
 
@@ -38,8 +49,8 @@ gem install json-schema
38
49
  From the git repo:
39
50
 
40
51
  ```sh
41
- $ gem build json-schema.gemspec
42
- $ gem install json-schema-2.5.2.gem
52
+ gem build json-schema.gemspec
53
+ gem install json-schema-*.gem
43
54
  ```
44
55
 
45
56
  Validation
@@ -165,7 +176,7 @@ JSON::Validator.validate(schema, [{"a" => 1}, {"a" => 2}, {"a" => 3}])
165
176
  JSON::Validator.fully_validate(schema, { "a" => "taco" }, :errors_as_objects => true)
166
177
 
167
178
  #
168
- # with the `:strict` option, all properties are condisidered to have `"required": true` and all objects `"additionalProperties": false`
179
+ # with the `:strict` option, all properties are considered to have `"required": true` and all objects `"additionalProperties": false`
169
180
  #
170
181
 
171
182
  # => true
@@ -290,17 +301,17 @@ class BitwiseAndAttribute < JSON::Schema::Attribute
290
301
  def self.validate(current_schema, data, fragments, processor, validator, options = {})
291
302
  if data.is_a?(Integer) && data & current_schema.schema['bitwise-and'].to_i == 0
292
303
  message = "The property '#{build_fragment(fragments)}' did not evaluate to true when bitwise-AND'd with #{current_schema.schema['bitwise-or']}"
293
- raise JSON::Schema::ValidationError.new(message, fragments, current_schema)
304
+ validation_error(processor, message, fragments, current_schema, self, options[:record_errors])
294
305
  end
295
306
  end
296
307
  end
297
308
 
298
- class ExtendedSchema < JSON::Schema::Validator
309
+ class ExtendedSchema < JSON::Schema::Draft3
299
310
  def initialize
300
311
  super
301
- extend_schema_definition("http://json-schema.org/draft-03/schema#")
302
312
  @attributes["bitwise-and"] = BitwiseAndAttribute
303
- @uri = URI.parse("http://test.com/test.json")
313
+ @uri = JSON::Util::URI.parse("http://test.com/test.json")
314
+ @names = ["http://test.com/test.json"]
304
315
  end
305
316
 
306
317
  JSON::Validator.register_validator(self.new)
@@ -374,6 +385,33 @@ schema = {
374
385
  errors = JSON::Validator.fully_validate(schema, {"a" => "23"})
375
386
  ```
376
387
 
388
+ Validating a JSON Schema
389
+ ------------------------
390
+
391
+ To validate that a JSON Schema conforms to the JSON Schema standard,
392
+ you need to validate your schema against the metaschema for the appropriate
393
+ JSON Schema Draft. All of the normal validation methods can be used
394
+ for this. First retrieve the appropriate metaschema from the internal
395
+ cache (using `JSON::Validator.validator_for_name()` or
396
+ `JSON::Validator.validator_for_uri()`) and then simply validate your
397
+ schema against it.
398
+
399
+
400
+ ```ruby
401
+ require "json-schema"
402
+
403
+ schema = {
404
+ "type" => "object",
405
+ "properties" => {
406
+ "a" => {"type" => "integer"}
407
+ }
408
+ }
409
+
410
+ metaschema = JSON::Validator.validator_for_name("draft4").metaschema
411
+ # => true
412
+ JSON::Validator.validate(metaschema, schema)
413
+ ```
414
+
377
415
  Controlling Remote Schema Reading
378
416
  ---------------------------------
379
417
 
@@ -444,3 +482,23 @@ value is of the correct datatype (e.g., an instance value is validated to be an
444
482
  integer or a float in the case of 'utc-millisec').
445
483
 
446
484
  Additionally, JSON::Validator does not handle any json hyperschema attributes.
485
+
486
+ # Transfer Notice
487
+
488
+ This plugin was originally authored by [Iain Beeston](https://github.com/iainbeeston).
489
+ The maintainer preferred that [Vox Pupuli](https://voxpupuli.org/) take ownership of the module for future improvement and maintenance.
490
+ Existing pull requests and issues were transferred, please fork and continue to contribute [here](https://github.com/voxpupuli/json-schema).
491
+
492
+ # License
493
+
494
+ This gem is licensed unter the [MIT license](LICENSE.md).
495
+
496
+ ## Release information
497
+
498
+ To make a new release, please do:
499
+ * update the version in VERSION.yml
500
+ * Install gems with `bundle install --with release --path .vendor`
501
+ * generate the changelog with `bundle exec rake changelog`
502
+ * Check if the new version matches the closed issues/PRs in the changelog
503
+ * Create a PR with it
504
+ * After it got merged, push a tag. GitHub actions will do the actual release to rubygems and GitHub Packages
@@ -38,6 +38,16 @@ module JSON
38
38
  valid_classes = TYPE_CLASS_MAPPINGS.fetch(type) { return true }
39
39
  Array(valid_classes).any? { |c| data.is_a?(c) }
40
40
  end
41
+
42
+ # Lookup Schema type of given class instance
43
+ def self.type_of_data(data)
44
+ type, _ = TYPE_CLASS_MAPPINGS.map { |k,v| [k,v] }.sort_by { |(_, v)|
45
+ -Array(v).map { |klass| klass.ancestors.size }.max
46
+ }.find { |(_, v)|
47
+ Array(v).any? { |klass| data.kind_of?(klass) }
48
+ }
49
+ type
50
+ end
41
51
  end
42
52
  end
43
53
  end
@@ -29,7 +29,7 @@ module JSON
29
29
  end
30
30
 
31
31
  if !valid || !errors.empty?
32
- message = "The property '#{build_fragment(fragments)}' of type #{data.class} did not match all of the required schemas"
32
+ message = "The property '#{build_fragment(fragments)}' of type #{type_of_data(data)} did not match all of the required schemas"
33
33
  validation_error(processor, message, fragments, current_schema, self, options[:record_errors])
34
34
  validation_errors(processor).last.sub_errors = errors
35
35
  end
@@ -37,7 +37,7 @@ module JSON
37
37
  end
38
38
 
39
39
  if !valid
40
- message = "The property '#{build_fragment(fragments)}' of type #{data.class} did not match one or more of the required schemas"
40
+ message = "The property '#{build_fragment(fragments)}' of type #{type_of_data(data)} did not match one or more of the required schemas"
41
41
  validation_error(processor, message, fragments, current_schema, self, options[:record_errors])
42
42
  validation_errors(processor).last.sub_errors = errors
43
43
  end
@@ -0,0 +1,15 @@
1
+ require 'json-schema/attribute'
2
+
3
+ module JSON
4
+ class Schema
5
+ class ConstAttribute < Attribute
6
+ def self.validate(current_schema, data, fragments, processor, validator, options = {})
7
+ const_value = current_schema.schema['const']
8
+ unless const_value == data
9
+ message = "The property '#{build_fragment(fragments)}' value #{data.inspect} did not match constant '#{const_value}'"
10
+ validation_error(processor, message, fragments, current_schema, self, options[:record_errors])
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -34,11 +34,5 @@ module JSON
34
34
  value.is_a?(String) || value.is_a?(Array) || value.is_a?(Hash)
35
35
  end
36
36
  end
37
-
38
- class DependenciesV4Attribute < DependenciesAttribute
39
- def self.accept_value?(value)
40
- value.is_a?(Array) || value.is_a?(Hash)
41
- end
42
- end
43
37
  end
44
38
  end
@@ -0,0 +1,11 @@
1
+ require 'json-schema/attributes/dependencies'
2
+
3
+ module JSON
4
+ class Schema
5
+ class DependenciesV4Attribute < DependenciesAttribute
6
+ def self.accept_value?(value)
7
+ value.is_a?(Array) || value.is_a?(Hash)
8
+ end
9
+ end
10
+ end
11
+ end
@@ -12,7 +12,7 @@ module JSON
12
12
 
13
13
  factor = current_schema.schema[keyword]
14
14
 
15
- if factor == 0 || factor == 0.0 || (BigDecimal.new(data.to_s) % BigDecimal.new(factor.to_s)).to_f != 0
15
+ if factor == 0 || factor == 0.0 || (BigDecimal(data.to_s) % BigDecimal(factor.to_s)).to_f != 0
16
16
  message = "The property '#{build_fragment(fragments)}' was not divisible by #{factor}"
17
17
  validation_error(processor, message, fragments, current_schema, self, options[:record_errors])
18
18
  end
@@ -1,4 +1,4 @@
1
- require 'json-schema/attribute'
1
+ require 'json-schema/attributes/format'
2
2
  require 'json-schema/errors/custom_format_error'
3
3
 
4
4
  module JSON
@@ -1,4 +1,4 @@
1
- require 'json-schema/attribute'
1
+ require 'json-schema/attributes/format'
2
2
 
3
3
  module JSON
4
4
  class Schema
@@ -1,4 +1,4 @@
1
- require 'json-schema/attribute'
1
+ require 'json-schema/attributes/format'
2
2
 
3
3
  module JSON
4
4
  class Schema
@@ -1,4 +1,4 @@
1
- require 'json-schema/attribute'
1
+ require 'json-schema/attributes/format'
2
2
 
3
3
  module JSON
4
4
  class Schema
@@ -11,7 +11,7 @@ module JSON
11
11
  begin
12
12
  ip = IPAddr.new(data)
13
13
  rescue ArgumentError => e
14
- raise e unless e.message == 'invalid address'
14
+ raise e unless e.message.start_with?('invalid address')
15
15
  end
16
16
 
17
17
  family = ip_version == 6 ? Socket::AF_INET6 : Socket::AF_INET
@@ -1,4 +1,4 @@
1
- require 'json-schema/attribute'
1
+ require 'json-schema/attributes/format'
2
2
 
3
3
  module JSON
4
4
  class Schema
@@ -1,4 +1,4 @@
1
- require 'json-schema/attribute'
1
+ require 'json-schema/attributes/format'
2
2
  require 'json-schema/errors/uri_error'
3
3
 
4
4
  module JSON
@@ -48,132 +48,5 @@ module JSON
48
48
  raise NotImplementedError
49
49
  end
50
50
  end
51
-
52
- class MinLengthAttribute < LimitAttribute
53
- def self.acceptable_type
54
- String
55
- end
56
-
57
- def self.limit_name
58
- 'minLength'
59
- end
60
-
61
- def self.error_message(schema)
62
- "was not of a minimum string length of #{limit(schema)}"
63
- end
64
-
65
- def self.value(data)
66
- data.length
67
- end
68
- end
69
-
70
- class MaxLengthAttribute < MinLengthAttribute
71
- def self.limit_name
72
- 'maxLength'
73
- end
74
-
75
- def self.error_message(schema)
76
- "was not of a maximum string length of #{limit(schema)}"
77
- end
78
- end
79
-
80
- class MinItemsAttribute < LimitAttribute
81
- def self.acceptable_type
82
- Array
83
- end
84
-
85
- def self.value(data)
86
- data.length
87
- end
88
-
89
- def self.limit_name
90
- 'minItems'
91
- end
92
-
93
- def self.error_message(schema)
94
- "did not contain a minimum number of items #{limit(schema)}"
95
- end
96
- end
97
-
98
- class MaxItemsAttribute < MinItemsAttribute
99
- def self.limit_name
100
- 'maxItems'
101
- end
102
-
103
- def self.error_message(schema)
104
- "had more items than the allowed #{limit(schema)}"
105
- end
106
- end
107
-
108
- class MinPropertiesAttribute < LimitAttribute
109
- def self.acceptable_type
110
- Hash
111
- end
112
-
113
- def self.value(data)
114
- data.size
115
- end
116
-
117
- def self.limit_name
118
- 'minProperties'
119
- end
120
-
121
- def self.error_message(schema)
122
- "did not contain a minimum number of properties #{limit(schema)}"
123
- end
124
- end
125
-
126
- class MaxPropertiesAttribute < MinPropertiesAttribute
127
- def self.limit_name
128
- 'maxProperties'
129
- end
130
-
131
- def self.error_message(schema)
132
- "had more properties than the allowed #{limit(schema)}"
133
- end
134
- end
135
-
136
- class NumericLimitAttribute < LimitAttribute
137
- def self.acceptable_type
138
- Numeric
139
- end
140
-
141
- def self.error_message(schema)
142
- exclusivity = exclusive?(schema) ? 'exclusively' : 'inclusively'
143
- format("did not have a %s value of %s, %s", limit_name, limit(schema), exclusivity)
144
- end
145
- end
146
-
147
- class MaximumAttribute < NumericLimitAttribute
148
- def self.limit_name
149
- 'maximum'
150
- end
151
-
152
- def self.exclusive?(schema)
153
- schema['exclusiveMaximum']
154
- end
155
- end
156
-
157
- class MaximumInclusiveAttribute < MaximumAttribute
158
- def self.exclusive?(schema)
159
- schema['maximumCanEqual'] == false
160
- end
161
- end
162
-
163
- class MinimumAttribute < NumericLimitAttribute
164
- def self.limit_name
165
- 'minimum'
166
- end
167
-
168
- def self.exclusive?(schema)
169
- schema['exclusiveMinimum']
170
- end
171
- end
172
-
173
- class MinimumInclusiveAttribute < MinimumAttribute
174
- def self.exclusive?(schema)
175
- schema['minimumCanEqual'] == false
176
- end
177
- end
178
51
  end
179
52
  end
@@ -0,0 +1,15 @@
1
+ require 'json-schema/attributes/limit'
2
+
3
+ module JSON
4
+ class Schema
5
+ class ItemsLimitAttribute < LimitAttribute
6
+ def self.acceptable_type
7
+ Array
8
+ end
9
+
10
+ def self.value(data)
11
+ data.length
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ require 'json-schema/attributes/limit'
2
+
3
+ module JSON
4
+ class Schema
5
+ class LengthLimitAttribute < LimitAttribute
6
+ def self.acceptable_type
7
+ String
8
+ end
9
+
10
+ def self.value(data)
11
+ data.length
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ require 'json-schema/attributes/limits/items'
2
+
3
+ module JSON
4
+ class Schema
5
+ class MaxItemsAttribute < ItemsLimitAttribute
6
+ def self.limit_name
7
+ 'maxItems'
8
+ end
9
+
10
+ def self.error_message(schema)
11
+ "had more items than the allowed #{limit(schema)}"
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ require 'json-schema/attributes/limits/length'
2
+
3
+ module JSON
4
+ class Schema
5
+ class MaxLengthAttribute < LengthLimitAttribute
6
+ def self.limit_name
7
+ 'maxLength'
8
+ end
9
+
10
+ def self.error_message(schema)
11
+ "was not of a maximum string length of #{limit(schema)}"
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ require 'json-schema/attributes/limits/properties'
2
+
3
+ module JSON
4
+ class Schema
5
+ class MaxPropertiesAttribute < PropertiesLimitAttribute
6
+ def self.limit_name
7
+ 'maxProperties'
8
+ end
9
+
10
+ def self.error_message(schema)
11
+ "had more properties than the allowed #{limit(schema)}"
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ require 'json-schema/attributes/limits/numeric'
2
+
3
+ module JSON
4
+ class Schema
5
+ class MaximumAttribute < NumericLimitAttribute
6
+ def self.limit_name
7
+ 'maximum'
8
+ end
9
+
10
+ def self.exclusive?(schema)
11
+ schema['exclusiveMaximum']
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,11 @@
1
+ require 'json-schema/attributes/limits/maximum'
2
+
3
+ module JSON
4
+ class Schema
5
+ class MaximumInclusiveAttribute < MaximumAttribute
6
+ def self.exclusive?(schema)
7
+ schema['maximumCanEqual'] == false
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,15 @@
1
+ require 'json-schema/attributes/limits/items'
2
+
3
+ module JSON
4
+ class Schema
5
+ class MinItemsAttribute < ItemsLimitAttribute
6
+ def self.limit_name
7
+ 'minItems'
8
+ end
9
+
10
+ def self.error_message(schema)
11
+ "did not contain a minimum number of items #{limit(schema)}"
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ require 'json-schema/attributes/limits/length'
2
+
3
+ module JSON
4
+ class Schema
5
+ class MinLengthAttribute < LengthLimitAttribute
6
+ def self.limit_name
7
+ 'minLength'
8
+ end
9
+
10
+ def self.error_message(schema)
11
+ "was not of a minimum string length of #{limit(schema)}"
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ require 'json-schema/attributes/limits/properties'
2
+
3
+ module JSON
4
+ class Schema
5
+ class MinPropertiesAttribute < PropertiesLimitAttribute
6
+ def self.limit_name
7
+ 'minProperties'
8
+ end
9
+
10
+ def self.error_message(schema)
11
+ "did not contain a minimum number of properties #{limit(schema)}"
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ require 'json-schema/attributes/limits/numeric'
2
+
3
+ module JSON
4
+ class Schema
5
+ class MinimumAttribute < NumericLimitAttribute
6
+ def self.limit_name
7
+ 'minimum'
8
+ end
9
+
10
+ def self.exclusive?(schema)
11
+ schema['exclusiveMinimum']
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,11 @@
1
+ require 'json-schema/attributes/limits/minimum'
2
+
3
+ module JSON
4
+ class Schema
5
+ class MinimumInclusiveAttribute < MinimumAttribute
6
+ def self.exclusive?(schema)
7
+ schema['minimumCanEqual'] == false
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,16 @@
1
+ require 'json-schema/attributes/limit'
2
+
3
+ module JSON
4
+ class Schema
5
+ class NumericLimitAttribute < LimitAttribute
6
+ def self.acceptable_type
7
+ Numeric
8
+ end
9
+
10
+ def self.error_message(schema)
11
+ exclusivity = exclusive?(schema) ? 'exclusively' : 'inclusively'
12
+ format("did not have a %s value of %s, %s", limit_name, limit(schema), exclusivity)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,15 @@
1
+ require 'json-schema/attributes/limit'
2
+
3
+ module JSON
4
+ class Schema
5
+ class PropertiesLimitAttribute < LimitAttribute
6
+ def self.acceptable_type
7
+ Hash
8
+ end
9
+
10
+ def self.value(data)
11
+ data.size
12
+ end
13
+ end
14
+ end
15
+ end
@@ -14,7 +14,7 @@ module JSON
14
14
  if options[:record_errors] && errors_copy.length != processor.validation_errors.length
15
15
  processor.validation_errors.replace(errors_copy)
16
16
  else
17
- message = "The property '#{build_fragment(fragments)}' of type #{data.class} matched the disallowed schema"
17
+ message = "The property '#{build_fragment(fragments)}' of type #{type_of_data(data)} matched the disallowed schema"
18
18
  failed = false
19
19
  end
20
20
  rescue ValidationError