json-schema 2.8.0 → 5.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +82 -11
  3. data/lib/json-schema/attribute.rb +13 -14
  4. data/lib/json-schema/attributes/additionalitems.rb +1 -0
  5. data/lib/json-schema/attributes/additionalproperties.rb +3 -6
  6. data/lib/json-schema/attributes/allof.rb +6 -4
  7. data/lib/json-schema/attributes/anyof.rb +2 -2
  8. data/lib/json-schema/attributes/const.rb +15 -0
  9. data/lib/json-schema/attributes/dependencies.rb +1 -6
  10. data/lib/json-schema/attributes/dependencies_v4.rb +11 -0
  11. data/lib/json-schema/attributes/disallow.rb +2 -1
  12. data/lib/json-schema/attributes/divisibleby.rb +1 -1
  13. data/lib/json-schema/attributes/enum.rb +2 -2
  14. data/lib/json-schema/attributes/extends.rb +7 -7
  15. data/lib/json-schema/attributes/format.rb +2 -1
  16. data/lib/json-schema/attributes/formats/custom.rb +1 -1
  17. data/lib/json-schema/attributes/formats/date.rb +2 -1
  18. data/lib/json-schema/attributes/formats/date_time.rb +3 -2
  19. data/lib/json-schema/attributes/formats/date_time_v4.rb +2 -1
  20. data/lib/json-schema/attributes/formats/ip.rb +1 -1
  21. data/lib/json-schema/attributes/formats/time.rb +1 -1
  22. data/lib/json-schema/attributes/formats/uri.rb +2 -1
  23. data/lib/json-schema/attributes/items.rb +1 -0
  24. data/lib/json-schema/attributes/limit.rb +0 -127
  25. data/lib/json-schema/attributes/limits/items.rb +15 -0
  26. data/lib/json-schema/attributes/limits/length.rb +15 -0
  27. data/lib/json-schema/attributes/limits/max_items.rb +15 -0
  28. data/lib/json-schema/attributes/limits/max_length.rb +15 -0
  29. data/lib/json-schema/attributes/limits/max_properties.rb +15 -0
  30. data/lib/json-schema/attributes/limits/maximum.rb +15 -0
  31. data/lib/json-schema/attributes/limits/maximum_inclusive.rb +11 -0
  32. data/lib/json-schema/attributes/limits/min_items.rb +15 -0
  33. data/lib/json-schema/attributes/limits/min_length.rb +15 -0
  34. data/lib/json-schema/attributes/limits/min_properties.rb +15 -0
  35. data/lib/json-schema/attributes/limits/minimum.rb +15 -0
  36. data/lib/json-schema/attributes/limits/minimum_inclusive.rb +11 -0
  37. data/lib/json-schema/attributes/limits/numeric.rb +16 -0
  38. data/lib/json-schema/attributes/limits/properties.rb +15 -0
  39. data/lib/json-schema/attributes/maxdecimal.rb +1 -1
  40. data/lib/json-schema/attributes/not.rb +2 -2
  41. data/lib/json-schema/attributes/oneof.rb +2 -4
  42. data/lib/json-schema/attributes/patternproperties.rb +2 -1
  43. data/lib/json-schema/attributes/properties.rb +9 -17
  44. data/lib/json-schema/attributes/properties_v4.rb +13 -0
  45. data/lib/json-schema/attributes/propertynames.rb +23 -0
  46. data/lib/json-schema/attributes/ref.rb +8 -8
  47. data/lib/json-schema/attributes/required.rb +4 -3
  48. data/lib/json-schema/attributes/type.rb +3 -2
  49. data/lib/json-schema/attributes/type_v4.rb +1 -1
  50. data/lib/json-schema/errors/validation_error.rb +5 -6
  51. data/lib/json-schema/schema/reader.rb +3 -1
  52. data/lib/json-schema/schema/validator.rb +3 -3
  53. data/lib/json-schema/schema.rb +3 -4
  54. data/lib/json-schema/util/array_set.rb +1 -1
  55. data/lib/json-schema/util/uri.rb +98 -75
  56. data/lib/json-schema/util/uuid.rb +203 -226
  57. data/lib/json-schema/validator.rb +122 -115
  58. data/lib/json-schema/validators/draft1.rb +21 -23
  59. data/lib/json-schema/validators/draft2.rb +22 -24
  60. data/lib/json-schema/validators/draft3.rb +26 -28
  61. data/lib/json-schema/validators/draft4.rb +34 -36
  62. data/lib/json-schema/validators/draft6.rb +36 -36
  63. data/lib/json-schema/validators/hyper-draft1.rb +2 -3
  64. data/lib/json-schema/validators/hyper-draft2.rb +2 -3
  65. data/lib/json-schema/validators/hyper-draft3.rb +2 -3
  66. data/lib/json-schema/validators/hyper-draft4.rb +2 -3
  67. data/lib/json-schema/validators/hyper-draft6.rb +2 -3
  68. data/lib/json-schema.rb +2 -3
  69. data/resources/draft-06.json +41 -41
  70. metadata +67 -31
@@ -4,6 +4,8 @@ require 'bigdecimal'
4
4
  require 'digest/sha1'
5
5
  require 'date'
6
6
  require 'thread'
7
+ require 'timeout'
8
+ require 'stringio'
7
9
  require 'yaml'
8
10
 
9
11
  require 'json-schema/schema/reader'
@@ -14,21 +16,22 @@ require 'json-schema/errors/json_parse_error'
14
16
  require 'json-schema/util/uri'
15
17
 
16
18
  module JSON
17
-
18
19
  class Validator
19
-
20
20
  @@schemas = {}
21
21
  @@cache_schemas = true
22
22
  @@default_opts = {
23
- :list => false,
24
- :version => nil,
25
- :validate_schema => false,
26
- :record_errors => false,
27
- :errors_as_objects => false,
28
- :insert_defaults => false,
29
- :clear_cache => false,
30
- :strict => false,
31
- :parse_data => true
23
+ list: false,
24
+ version: nil,
25
+ validate_schema: false,
26
+ record_errors: false,
27
+ errors_as_objects: false,
28
+ insert_defaults: false,
29
+ clear_cache: false,
30
+ strict: false,
31
+ allPropertiesRequired: false,
32
+ noAdditionalProperties: false,
33
+ parse_data: true,
34
+ parse_integer: true,
32
35
  }
33
36
  @@validators = {}
34
37
  @@default_validator = nil
@@ -37,32 +40,32 @@ module JSON
37
40
  @@serializer = nil
38
41
  @@mutex = Mutex.new
39
42
 
40
- def initialize(schema_data, data, opts={})
43
+ def initialize(schema_data, opts = {})
41
44
  @options = @@default_opts.clone.merge(opts)
42
45
  @errors = []
43
46
 
44
- validator = self.class.validator_for_name(@options[:version])
45
- @options[:version] = validator
47
+ configured_validator = self.class.validator_for_name(@options[:version])
46
48
  @options[:schema_reader] ||= self.class.schema_reader
47
49
 
48
- @validation_options = @options[:record_errors] ? {:record_errors => true} : {}
50
+ @validation_options = @options[:record_errors] ? { record_errors: true } : {}
49
51
  @validation_options[:insert_defaults] = true if @options[:insert_defaults]
50
- @validation_options[:strict] = true if @options[:strict] == true
52
+ if @options[:strict] == true
53
+ @validation_options[:allPropertiesRequired] = true
54
+ @validation_options[:noAdditionalProperties] = true
55
+ else
56
+ @validation_options[:allPropertiesRequired] = true if @options[:allPropertiesRequired]
57
+ @validation_options[:noAdditionalProperties] = true if @options[:noAdditionalProperties]
58
+ end
51
59
  @validation_options[:clear_cache] = true if !@@cache_schemas || @options[:clear_cache]
52
60
 
53
- @@mutex.synchronize { @base_schema = initialize_schema(schema_data) }
54
- @original_data = data
55
- @data = initialize_data(data)
61
+ @@mutex.synchronize { @base_schema = initialize_schema(schema_data, configured_validator) }
56
62
  @@mutex.synchronize { build_schemas(@base_schema) }
57
63
 
58
64
  # validate the schema, if requested
59
65
  if @options[:validate_schema]
60
- if @base_schema.schema["$schema"]
61
- base_validator = self.class.validator_for_name(@base_schema.schema["$schema"])
62
- end
63
- metaschema = base_validator ? base_validator.metaschema : validator.metaschema
64
66
  # Don't clear the cache during metaschema validation!
65
- self.class.validate!(metaschema, @base_schema.schema, {:clear_cache => false})
67
+ meta_validator = self.class.new(@base_schema.validator.metaschema, { clear_cache: false })
68
+ meta_validator.validate(@base_schema.schema)
66
69
  end
67
70
 
68
71
  # If the :fragment option is set, try and validate against the fragment
@@ -73,60 +76,61 @@ module JSON
73
76
 
74
77
  def schema_from_fragment(base_schema, fragment)
75
78
  schema_uri = base_schema.uri
76
- fragments = fragment.split("/")
79
+ fragments = fragment.split('/').map { |f| f.gsub('~0', '~').gsub('~1', '/') }
77
80
 
78
81
  # ensure the first element was a hash, per the fragment spec
79
- if fragments.shift != "#"
80
- raise JSON::Schema::SchemaError.new("Invalid fragment syntax in :fragment option")
82
+ if fragments.shift != '#'
83
+ raise JSON::Schema::SchemaError, 'Invalid fragment syntax in :fragment option'
81
84
  end
82
85
 
86
+ schema_fragment = base_schema.schema
83
87
  fragments.each do |f|
84
- if base_schema.is_a?(JSON::Schema) #test if fragment is a JSON:Schema instance
85
- if !base_schema.schema.has_key?(f)
86
- raise JSON::Schema::SchemaError.new("Invalid fragment resolution for :fragment option")
87
- end
88
- base_schema = base_schema.schema[f]
89
- elsif base_schema.is_a?(Hash)
90
- if !base_schema.has_key?(f)
91
- raise JSON::Schema::SchemaError.new("Invalid fragment resolution for :fragment option")
92
- end
93
- base_schema = JSON::Schema.new(base_schema[f],schema_uri,@options[:version])
94
- elsif base_schema.is_a?(Array)
95
- if base_schema[f.to_i].nil?
96
- raise JSON::Schema::SchemaError.new("Invalid fragment resolution for :fragment option")
97
- end
98
- base_schema = JSON::Schema.new(base_schema[f.to_i],schema_uri,@options[:version])
99
- else
100
- raise JSON::Schema::SchemaError.new("Invalid schema encountered when resolving :fragment option")
88
+ case schema_fragment
89
+ when Hash
90
+ schema_fragment = schema_fragment[f]
91
+ when Array
92
+ schema_fragment = schema_fragment[f.to_i]
101
93
  end
102
94
  end
103
95
 
96
+ unless schema_fragment.is_a?(Hash)
97
+ raise JSON::Schema::SchemaError, 'Invalid fragment resolution for :fragment option'
98
+ end
99
+
100
+ schema = JSON::Schema.new(schema_fragment, schema_uri, base_schema.validator)
101
+
104
102
  if @options[:list]
105
- base_schema.to_array_schema
103
+ schema.to_array_schema
104
+ elsif schema.is_a?(Hash)
105
+ JSON::Schema.new(schema, schema_uri, @options[:version])
106
106
  else
107
- base_schema
107
+ schema
108
108
  end
109
109
  end
110
110
 
111
111
  # Run a simple true/false validation of data against a schema
112
- def validate
113
- @base_schema.validate(@data,[],self,@validation_options)
112
+ def validate(data)
113
+ original_data = data
114
+ data = initialize_data(data)
115
+ @base_schema.validate(data, [], self, @validation_options)
114
116
 
115
117
  if @options[:record_errors]
116
118
  if @options[:errors_as_objects]
117
- @errors.map{|e| e.to_hash}
119
+ @errors.map { |e| e.to_hash }
118
120
  else
119
- @errors.map{|e| e.to_string}
121
+ @errors.map { |e| e.to_string }
120
122
  end
121
123
  else
122
124
  true
123
125
  end
124
126
  ensure
127
+ @errors = []
128
+
125
129
  if @validation_options[:clear_cache] == true
126
130
  self.class.clear_cache
127
131
  end
128
132
  if @validation_options[:insert_defaults]
129
- self.class.merge_missing_values(@data, @original_data)
133
+ self.class.merge_missing_values(data, original_data)
130
134
  end
131
135
  end
132
136
 
@@ -147,13 +151,13 @@ module JSON
147
151
  schema = parent_schema.schema
148
152
 
149
153
  # Build ref schemas if they exist
150
- if schema["$ref"]
151
- load_ref_schema(parent_schema, schema["$ref"])
154
+ if schema['$ref']
155
+ load_ref_schema(parent_schema, schema['$ref'])
152
156
  end
153
157
 
154
- case schema["extends"]
158
+ case schema['extends']
155
159
  when String
156
- load_ref_schema(parent_schema, schema["extends"])
160
+ load_ref_schema(parent_schema, schema['extends'])
157
161
  when Array
158
162
  schema['extends'].each do |type|
159
163
  handle_schema(parent_schema, type)
@@ -161,7 +165,7 @@ module JSON
161
165
  end
162
166
 
163
167
  # Check for schemas in union types
164
- ["type", "disallow"].each do |key|
168
+ %w[type disallow].each do |key|
165
169
  if schema[key].is_a?(Array)
166
170
  schema[key].each do |type|
167
171
  if type.is_a?(Hash)
@@ -175,7 +179,8 @@ module JSON
175
179
  # are themselves schemas.
176
180
  %w[definitions properties patternProperties].each do |key|
177
181
  next unless value = schema[key]
178
- value.each do |k, inner_schema|
182
+
183
+ value.each do |_k, inner_schema|
179
184
  handle_schema(parent_schema, inner_schema)
180
185
  end
181
186
  end
@@ -183,20 +188,22 @@ module JSON
183
188
  # Schema properties whose values are themselves schemas.
184
189
  %w[additionalProperties additionalItems dependencies extends].each do |key|
185
190
  next unless schema[key].is_a?(Hash)
191
+
186
192
  handle_schema(parent_schema, schema[key])
187
193
  end
188
194
 
189
195
  # Schema properties whose values may be an array of schemas.
190
196
  %w[allOf anyOf oneOf not].each do |key|
191
197
  next unless value = schema[key]
198
+
192
199
  Array(value).each do |inner_schema|
193
200
  handle_schema(parent_schema, inner_schema)
194
201
  end
195
202
  end
196
203
 
197
204
  # Items are always schemas
198
- if schema["items"]
199
- items = schema["items"].clone
205
+ if schema['items']
206
+ items = schema['items'].clone
200
207
  items = [items] unless items.is_a?(Array)
201
208
 
202
209
  items.each do |item|
@@ -205,10 +212,9 @@ module JSON
205
212
  end
206
213
 
207
214
  # Convert enum to a ArraySet
208
- if schema["enum"].is_a?(Array)
209
- schema["enum"] = ArraySet.new(schema["enum"])
215
+ if schema['enum'].is_a?(Array)
216
+ schema['enum'] = ArraySet.new(schema['enum'])
210
217
  end
211
-
212
218
  end
213
219
 
214
220
  # Either load a reference schema or create a new schema
@@ -231,58 +237,57 @@ module JSON
231
237
  @errors
232
238
  end
233
239
 
234
-
235
240
  class << self
236
- def validate(schema, data,opts={})
241
+ def validate(schema, data, opts = {})
237
242
  begin
238
243
  validate!(schema, data, opts)
239
244
  rescue JSON::Schema::ValidationError, JSON::Schema::SchemaError
240
- return false
245
+ false
241
246
  end
242
247
  end
243
248
 
244
- def validate_json(schema, data, opts={})
245
- validate(schema, data, opts.merge(:json => true))
249
+ def validate_json(schema, data, opts = {})
250
+ validate(schema, data, opts.merge(json: true))
246
251
  end
247
252
 
248
- def validate_uri(schema, data, opts={})
249
- validate(schema, data, opts.merge(:uri => true))
253
+ def validate_uri(schema, data, opts = {})
254
+ validate(schema, data, opts.merge(uri: true))
250
255
  end
251
256
 
252
- def validate!(schema, data,opts={})
253
- validator = new(schema, data, opts)
254
- validator.validate
257
+ def validate!(schema, data, opts = {})
258
+ validator = new(schema, opts)
259
+ validator.validate(data)
255
260
  end
256
261
 
257
- def validate2(schema, data, opts={})
258
- warn "[DEPRECATION NOTICE] JSON::Validator#validate2 has been replaced by JSON::Validator#validate! and will be removed in version >= 3. Please use the #validate! method instead."
262
+ def validate2(schema, data, opts = {})
263
+ warn '[DEPRECATION NOTICE] JSON::Validator#validate2 has been replaced by JSON::Validator#validate! and will be removed in version >= 3. Please use the #validate! method instead.'
259
264
  validate!(schema, data, opts)
260
265
  end
261
266
 
262
- def validate_json!(schema, data, opts={})
263
- validate!(schema, data, opts.merge(:json => true))
267
+ def validate_json!(schema, data, opts = {})
268
+ validate!(schema, data, opts.merge(json: true))
264
269
  end
265
270
 
266
- def validate_uri!(schema, data, opts={})
267
- validate!(schema, data, opts.merge(:uri => true))
271
+ def validate_uri!(schema, data, opts = {})
272
+ validate!(schema, data, opts.merge(uri: true))
268
273
  end
269
274
 
270
- def fully_validate(schema, data, opts={})
271
- validate!(schema, data, opts.merge(:record_errors => true))
275
+ def fully_validate(schema, data, opts = {})
276
+ validate!(schema, data, opts.merge(record_errors: true))
272
277
  end
273
278
 
274
- def fully_validate_schema(schema, opts={})
279
+ def fully_validate_schema(schema, opts = {})
275
280
  data = schema
276
281
  schema = validator_for_name(opts[:version]).metaschema
277
282
  fully_validate(schema, data, opts)
278
283
  end
279
284
 
280
- def fully_validate_json(schema, data, opts={})
281
- fully_validate(schema, data, opts.merge(:json => true))
285
+ def fully_validate_json(schema, data, opts = {})
286
+ fully_validate(schema, data, opts.merge(json: true))
282
287
  end
283
288
 
284
- def fully_validate_uri(schema, data, opts={})
285
- fully_validate(schema, data, opts.merge(:uri => true))
289
+ def fully_validate_uri(schema, data, opts = {})
290
+ fully_validate(schema, data, opts.merge(uri: true))
286
291
  end
287
292
 
288
293
  def schema_reader
@@ -295,7 +300,6 @@ module JSON
295
300
 
296
301
  def clear_cache
297
302
  @@schemas = {}
298
- JSON::Util::URI.clear_cache
299
303
  end
300
304
 
301
305
  def schemas
@@ -322,7 +326,7 @@ module JSON
322
326
  end
323
327
 
324
328
  def cache_schemas=(val)
325
- warn "[DEPRECATION NOTICE] Schema caching is now a validation option. Schemas will still be cached if this is set to true, but this method will be removed in version >= 3. Please use the :clear_cache validation option instead."
329
+ warn '[DEPRECATION NOTICE] Schema caching is now a validation option. Schemas will still be cached if this is set to true, but this method will be removed in version >= 3. Please use the :clear_cache validation option instead.'
326
330
  @@cache_schemas = val == true ? true : false
327
331
  end
328
332
 
@@ -334,32 +338,34 @@ module JSON
334
338
  @@default_validator
335
339
  end
336
340
 
337
- def validator_for_uri(schema_uri, raise_not_found=true)
341
+ def validator_for_uri(schema_uri, raise_not_found = true)
338
342
  return default_validator unless schema_uri
343
+
339
344
  u = JSON::Util::URI.parse(schema_uri)
340
345
  validator = validators["#{u.scheme}://#{u.host}#{u.path}"]
341
346
  if validator.nil? && raise_not_found
342
- raise JSON::Schema::SchemaError.new("Schema not found: #{schema_uri}")
347
+ raise JSON::Schema::SchemaError, "Schema not found: #{schema_uri}"
343
348
  else
344
349
  validator
345
350
  end
346
351
  end
347
352
 
348
- def validator_for_name(schema_name, raise_not_found=true)
353
+ def validator_for_name(schema_name, raise_not_found = true)
349
354
  return default_validator unless schema_name
355
+
350
356
  schema_name = schema_name.to_s
351
357
  validator = validators.values.detect do |v|
352
358
  Array(v.names).include?(schema_name)
353
359
  end
354
360
  if validator.nil? && raise_not_found
355
- raise JSON::Schema::SchemaError.new("The requested JSON schema version is not supported")
361
+ raise JSON::Schema::SchemaError, 'The requested JSON schema version is not supported'
356
362
  else
357
363
  validator
358
364
  end
359
365
  end
360
366
 
361
367
  def validator_for(schema_uri)
362
- warn "[DEPRECATION NOTICE] JSON::Validator#validator_for has been replaced by JSON::Validator#validator_for_uri and will be removed in version >= 3. Please use the #validator_for_uri method instead."
368
+ warn '[DEPRECATION NOTICE] JSON::Validator#validator_for has been replaced by JSON::Validator#validator_for_uri and will be removed in version >= 3. Please use the #validator_for_uri method instead.'
363
369
  validator_for_uri(schema_uri)
364
370
  end
365
371
 
@@ -371,7 +377,7 @@ module JSON
371
377
  @@default_validator = v
372
378
  end
373
379
 
374
- def register_format_validator(format, validation_proc, versions = (@@validators.flat_map{ |k, v| v.names.first } + [nil]))
380
+ def register_format_validator(format, validation_proc, versions = (@@validators.flat_map { |_k, v| v.names.first } + [nil]))
375
381
  custom_format_validator = JSON::Schema::CustomFormat.new(validation_proc)
376
382
  versions.each do |version|
377
383
  validator = validator_for_name(version)
@@ -379,14 +385,14 @@ module JSON
379
385
  end
380
386
  end
381
387
 
382
- def deregister_format_validator(format, versions = (@@validators.flat_map{ |k, v| v.names.first } + [nil]))
388
+ def deregister_format_validator(format, versions = (@@validators.flat_map { |_k, v| v.names.first } + [nil]))
383
389
  versions.each do |version|
384
390
  validator = validator_for_name(version)
385
391
  validator.formats[format.to_s] = validator.default_formats[format.to_s]
386
392
  end
387
393
  end
388
394
 
389
- def restore_default_formats(versions = (@@validators.flat_map{ |k, v| v.names.first } + [nil]))
395
+ def restore_default_formats(versions = (@@validators.flat_map { |_k, v| v.names.first } + [nil]))
390
396
  versions.each do |version|
391
397
  validator = validator_for_name(version)
392
398
  validator.formats = validator.default_formats.clone
@@ -410,7 +416,7 @@ module JSON
410
416
  if @@available_json_backends.include?(backend)
411
417
  @@json_backend = backend
412
418
  else
413
- raise JSON::Schema::JsonParseError.new("The JSON backend '#{backend}' could not be found.")
419
+ raise JSON::Schema::JsonParseError, "The JSON backend '#{backend}' could not be found."
414
420
  end
415
421
  end
416
422
  end
@@ -420,26 +426,26 @@ module JSON
420
426
  begin
421
427
  MultiJson.respond_to?(:adapter) ? MultiJson.load(s) : MultiJson.decode(s)
422
428
  rescue MultiJson::ParseError => e
423
- raise JSON::Schema::JsonParseError.new(e.message)
429
+ raise JSON::Schema::JsonParseError, e.message
424
430
  end
425
431
  else
426
432
  case @@json_backend.to_s
427
433
  when 'json'
428
434
  begin
429
- JSON.parse(s, :quirks_mode => true)
435
+ JSON.parse(s, quirks_mode: true)
430
436
  rescue JSON::ParserError => e
431
- raise JSON::Schema::JsonParseError.new(e.message)
437
+ raise JSON::Schema::JsonParseError, e.message
432
438
  end
433
439
  when 'yajl'
434
440
  begin
435
441
  json = StringIO.new(s)
436
442
  parser = Yajl::Parser.new
437
- parser.parse(json) or raise JSON::Schema::JsonParseError.new("The JSON could not be parsed by yajl")
443
+ parser.parse(json) or raise(JSON::Schema::JsonParseError, 'The JSON could not be parsed by yajl')
438
444
  rescue Yajl::ParseError => e
439
- raise JSON::Schema::JsonParseError.new(e.message)
445
+ raise JSON::Schema::JsonParseError, e.message
440
446
  end
441
447
  else
442
- raise JSON::Schema::JsonParseError.new("No supported JSON parsers found. The following parsers are suported:\n * yajl-ruby\n * json")
448
+ raise JSON::Schema::JsonParseError, "No supported JSON parsers found. The following parsers are suported:\n * yajl-ruby\n * json"
443
449
  end
444
450
  end
445
451
  end
@@ -478,7 +484,6 @@ module JSON
478
484
  end
479
485
  end
480
486
 
481
-
482
487
  if Gem::Specification::find_all_by_name('yajl-ruby').any?
483
488
  require 'yajl'
484
489
  @@available_json_backends << 'yajl'
@@ -486,11 +491,11 @@ module JSON
486
491
  end
487
492
 
488
493
  if @@json_backend == 'yajl'
489
- @@serializer = lambda{|o| Yajl::Encoder.encode(o) }
494
+ @@serializer = lambda { |o| Yajl::Encoder.encode(o) }
490
495
  elsif @@json_backend == 'json'
491
- @@serializer = lambda{|o| JSON.dump(o) }
496
+ @@serializer = lambda { |o| JSON.dump(o) }
492
497
  else
493
- @@serializer = lambda{|o| YAML.dump(o) }
498
+ @@serializer = lambda { |o| YAML.dump(o) }
494
499
  end
495
500
  end
496
501
  end
@@ -499,10 +504,10 @@ module JSON
499
504
 
500
505
  if Gem::Specification::find_all_by_name('uuidtools').any?
501
506
  require 'uuidtools'
502
- @@fake_uuid_generator = lambda{|s| UUIDTools::UUID.sha1_create(UUIDTools::UUID_URL_NAMESPACE, s).to_s }
507
+ @@fake_uuid_generator = lambda { |s| UUIDTools::UUID.sha1_create(UUIDTools::UUID_URL_NAMESPACE, s).to_s }
503
508
  else
504
509
  require 'json-schema/util/uuid'
505
- @@fake_uuid_generator = lambda{|s| JSON::Util::UUID.create_v5(s,JSON::Util::UUID::Nil).to_s }
510
+ @@fake_uuid_generator = lambda { |s| JSON::Util::UUID.create_v5(s, JSON::Util::UUID::Nil).to_s }
506
511
  end
507
512
 
508
513
  def serialize schema
@@ -517,12 +522,12 @@ module JSON
517
522
  @@fake_uuid_generator.call(schema)
518
523
  end
519
524
 
520
- def initialize_schema(schema)
525
+ def initialize_schema(schema, default_validator)
521
526
  if schema.is_a?(String)
522
527
  begin
523
528
  # Build a fake URI for this
524
529
  schema_uri = JSON::Util::URI.parse(fake_uuid(schema))
525
- schema = JSON::Schema.new(self.class.parse(schema), schema_uri, @options[:version])
530
+ schema = JSON::Schema.new(JSON::Validator.parse(schema), schema_uri, default_validator)
526
531
  if @options[:list] && @options[:fragment].nil?
527
532
  schema = schema.to_array_schema
528
533
  end
@@ -552,13 +557,13 @@ module JSON
552
557
  elsif schema.is_a?(Hash)
553
558
  schema_uri = JSON::Util::URI.parse(fake_uuid(serialize(schema)))
554
559
  schema = JSON::Schema.stringify(schema)
555
- schema = JSON::Schema.new(schema, schema_uri, @options[:version])
560
+ schema = JSON::Schema.new(schema, schema_uri, default_validator)
556
561
  if @options[:list] && @options[:fragment].nil?
557
562
  schema = schema.to_array_schema
558
563
  end
559
564
  self.class.add_schema(schema)
560
565
  else
561
- raise JSON::Schema::SchemaParseError, "Invalid schema - must be either a string or a hash"
566
+ raise JSON::Schema::SchemaParseError, 'Invalid schema - must be either a string or a hash'
562
567
  end
563
568
 
564
569
  schema
@@ -573,12 +578,14 @@ module JSON
573
578
  data = self.class.parse(custom_open(json_uri))
574
579
  elsif data.is_a?(String)
575
580
  begin
576
- data = self.class.parse(data)
581
+ # Check if the string is valid integer
582
+ strict_convert = data.match?(/\A[+-]?\d+\z/) && !@options[:parse_integer]
583
+ data = strict_convert ? data : self.class.parse(data)
577
584
  rescue JSON::Schema::JsonParseError
578
585
  begin
579
586
  json_uri = Util::URI.normalized_uri(data)
580
587
  data = self.class.parse(custom_open(json_uri))
581
- rescue JSON::Schema::JsonLoadError
588
+ rescue JSON::Schema::JsonLoadError, JSON::Schema::UriError
582
589
  # Silently discard the error - use the data as-is
583
590
  end
584
591
  end
@@ -591,7 +598,7 @@ module JSON
591
598
  uri = Util::URI.normalized_uri(uri) if uri.is_a?(String)
592
599
  if uri.absolute? && Util::URI::SUPPORTED_PROTOCOLS.include?(uri.scheme)
593
600
  begin
594
- open(uri.to_s).read
601
+ URI.open(uri.to_s).read
595
602
  rescue OpenURI::HTTPError, Timeout::Error => e
596
603
  raise JSON::Schema::JsonLoadError, e.message
597
604
  end
@@ -2,27 +2,26 @@ require 'json-schema/schema/validator'
2
2
 
3
3
  module JSON
4
4
  class Schema
5
-
6
5
  class Draft1 < Validator
7
6
  def initialize
8
7
  super
9
8
  @attributes = {
10
- "type" => JSON::Schema::TypeAttribute,
11
- "disallow" => JSON::Schema::DisallowAttribute,
12
- "format" => JSON::Schema::FormatAttribute,
13
- "maximum" => JSON::Schema::MaximumInclusiveAttribute,
14
- "minimum" => JSON::Schema::MinimumInclusiveAttribute,
15
- "minItems" => JSON::Schema::MinItemsAttribute,
16
- "maxItems" => JSON::Schema::MaxItemsAttribute,
17
- "minLength" => JSON::Schema::MinLengthAttribute,
18
- "maxLength" => JSON::Schema::MaxLengthAttribute,
19
- "maxDecimal" => JSON::Schema::MaxDecimalAttribute,
20
- "enum" => JSON::Schema::EnumAttribute,
21
- "properties" => JSON::Schema::PropertiesOptionalAttribute,
22
- "pattern" => JSON::Schema::PatternAttribute,
23
- "additionalProperties" => JSON::Schema::AdditionalPropertiesAttribute,
24
- "items" => JSON::Schema::ItemsAttribute,
25
- "extends" => JSON::Schema::ExtendsAttribute
9
+ 'type' => JSON::Schema::TypeAttribute,
10
+ 'disallow' => JSON::Schema::DisallowAttribute,
11
+ 'format' => JSON::Schema::FormatAttribute,
12
+ 'maximum' => JSON::Schema::MaximumInclusiveAttribute,
13
+ 'minimum' => JSON::Schema::MinimumInclusiveAttribute,
14
+ 'minItems' => JSON::Schema::MinItemsAttribute,
15
+ 'maxItems' => JSON::Schema::MaxItemsAttribute,
16
+ 'minLength' => JSON::Schema::MinLengthAttribute,
17
+ 'maxLength' => JSON::Schema::MaxLengthAttribute,
18
+ 'maxDecimal' => JSON::Schema::MaxDecimalAttribute,
19
+ 'enum' => JSON::Schema::EnumAttribute,
20
+ 'properties' => JSON::Schema::PropertiesOptionalAttribute,
21
+ 'pattern' => JSON::Schema::PatternAttribute,
22
+ 'additionalProperties' => JSON::Schema::AdditionalPropertiesAttribute,
23
+ 'items' => JSON::Schema::ItemsAttribute,
24
+ 'extends' => JSON::Schema::ExtendsAttribute,
26
25
  }
27
26
  @default_formats = {
28
27
  'date-time' => DateTimeFormat,
@@ -30,16 +29,15 @@ module JSON
30
29
  'time' => TimeFormat,
31
30
  'ip-address' => IP4Format,
32
31
  'ipv6' => IP6Format,
33
- 'uri' => UriFormat
32
+ 'uri' => UriFormat,
34
33
  }
35
34
  @formats = @default_formats.clone
36
- @uri = JSON::Util::URI.parse("http://json-schema.org/draft-01/schema#")
37
- @names = ["draft1"]
38
- @metaschema_name = "draft-01.json"
35
+ @uri = JSON::Util::URI.parse('http://json-schema.org/draft-01/schema#')
36
+ @names = ['draft1']
37
+ @metaschema_name = 'draft-01.json'
39
38
  end
40
39
 
41
- JSON::Validator.register_validator(self.new)
40
+ JSON::Validator.register_validator(new)
42
41
  end
43
-
44
42
  end
45
43
  end