json-schema 2.3.0 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- YzRhZDY5NzVjYTlkZTM4MDU4YjI1Mjg5YWI3MmJkMDdhNjFiZGE3OA==
4
+ ZjMyNzMwODM4YmUyNjNkZjBhNzkzN2E4M2MxYTM2YzhiMzg4MzZlYw==
5
5
  data.tar.gz: !binary |-
6
- YWJhZDY3ZWRlZDBlNWFiNDc0ZTM5MzcyZjkyNWJkNWViOGNjN2NiMA==
6
+ ZWY0NWQ1ZWRlMzVlNTI4N2NhYjk0ZGM4OGIxMzMzNzU5NGE2ZmEwYg==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- OTYzYzFkYzlkMjM5NjY0ZjBmNTVjM2IwZmM0ODQxZWQwMDk5OGE5MTliMmQw
10
- MmMwYjAwNWE3NzkzMDYzNzUzN2Q0M2RhMjNmNTFlZGYzZDE0MmMxMTRjM2I2
11
- NGM2ZWIxMmE0N2NjMjBjMjRmZTk3NDYyY2Q2YTcyMjNhYzEzMTY=
9
+ MDE3Yzc0MmYwNmFkNjUzYmNiYTFhYjg4ODY5MzZjODgyZWIyODBkYWUwZjJh
10
+ NjJjODk4MGFhNTFlOTkyOTZkYTQ5ODQ2YjYxYjJjZGNjZWIxOTcxNzEyMmYy
11
+ NzI2MDcwNGU5Mzg0N2IyYzU5NzU0NThkMTNjZjFmZDVhZGNiNjc=
12
12
  data.tar.gz: !binary |-
13
- YWY3ZjZkMTcxMWRhNDA0MWQxODk3MWQwNzc0NjgyZTc2ZjE5YzE4MjYwYjFj
14
- NzI5N2I3NDRhYWM0Y2U4MjhmNDMxZTc1YWYwZmRhNWMxODk5ZjU1YzliZmFm
15
- YmY4MTA0ZWRlMzYyMWQ1NDA3MDk5MzUwYmJkN2ExNmQ0NDU5ZjA=
13
+ ZDJjNzIyZDg0NDUxODQyZjM4MzZkNWUxOWViYTA3MDM4MjdmN2Q2ZjBkOTBi
14
+ NzllYzUyNDc5MDZkZmM0M2U3NmFiZDc5Njk3YTYxNzBiMjYwYjIwMjZmZWY0
15
+ M2QxMzIwN2EzOTUxNWRjZmQ5ZGQwZTEwNjBjMDVjZTBlNTAxZWE=
@@ -1,4 +1,5 @@
1
1
  !https://travis-ci.org/hoxworth/json-schema.svg?branch=master!:https://travis-ci.org/hoxworth/json-schema
2
+ !https://codeclimate.com/github/hoxworth/json-schema/badges/gpa.svg!:https://codeclimate.com/github/hoxworth/json-schema
2
3
 
3
4
  h1. Ruby JSON Schema Validator
4
5
 
@@ -24,7 +25,7 @@ From the git repo:
24
25
 
25
26
  <pre>
26
27
  $ gem build json-schema.gemspec
27
- $ gem install json-schema-2.3.0.gem
28
+ $ gem install json-schema-2.4.0.gem
28
29
  </pre>
29
30
 
30
31
 
@@ -329,6 +330,46 @@ data = {"a" => 0, "b" => "taco"}
329
330
  JSON::Validator.validate(schema,data) # => false
330
331
  </pre>
331
332
 
333
+ h3. Custom format validation
334
+
335
+ The JSON schema standard allows custom formats in schema definitions which should be ignored by validators that do not support them. JSON::Schema allows registering procs as custom format validators which receive the value to be checked as parameter and must raise a <code>JSON::Schema::CustomFormatError</code> to indicate a format violation. The error message will be prepended by the property namne, e.g. "The property '#a'":
336
+
337
+ <pre>
338
+ require 'rubygems'
339
+ require 'json-schema'
340
+
341
+ format_proc = -> value {
342
+ raise JSON::Schema::CustomFormatError.new("must be 42") unless value == "42"
343
+ }
344
+
345
+ # register the proc for format 'the-answer' for draft4 schema
346
+ JSON::Validator.register_format_validator("the-answer", format_proc, ["draft4"])
347
+
348
+ # omitting the version parameter uses ["draft1", "draft2", "draft3", "draft4"] as default
349
+ JSON::Validator.register_format_validator("the-answer", format_proc)
350
+
351
+ # deregistering the custom validator
352
+ # (also ["draft1", "draft2", "draft3", "draft4"] as default version)
353
+ JSON::Validator.deregister_format_validator('the-answer', ["draft4"])
354
+
355
+ # shortcut to restore the default formats for validators (same default as before)
356
+ JSON::Validator.restore_default_formats(["draft4"])
357
+
358
+ # with the validator registered as above, the following results in
359
+ # ["The property '#a' must be 42"] as returned errors
360
+ schema = {
361
+ "$schema" => "http://json-schema.org/draft-04/schema#",
362
+ "properties" => {
363
+ "a" => {
364
+ "type" => "string",
365
+ "format" => "the-answer",
366
+ }
367
+ }
368
+ }
369
+ errors = JSON::Validator.fully_validate(schema, {"a" => "23"})
370
+
371
+ </pre>
372
+
332
373
  h2. JSON Backends
333
374
 
334
375
  The JSON Schema library currently supports the <code>json</code> and <code>yajl-ruby</code> backend JSON parsers. If either of these libraries are installed, they will be automatically loaded and used to parse any JSON strings supplied by the user.
@@ -348,8 +389,10 @@ The 'format' attribute is only validated for the following values:
348
389
  * date-time
349
390
  * date
350
391
  * time
351
- * ip-address
392
+ * ip-address (IPv4 address in draft1, draft2 and draft3)
393
+ * ipv4 (IPv4 address in draft4)
352
394
  * ipv6
395
+ * uri
353
396
 
354
397
  All other 'format' attribute values are simply checked to ensure the instance value is of the correct datatype (e.g., an instance value is validated to be an integer or a float in the case of 'utc-millisec').
355
398
 
@@ -1,12 +1,6 @@
1
1
  require 'rubygems'
2
2
 
3
- if begin
4
- Gem::Specification::find_by_name('multi_json')
5
- rescue Gem::LoadError
6
- false
7
- rescue
8
- Gem.available?('multi_json')
9
- end
3
+ if Gem::Specification::find_all_by_name('multi_json').any?
10
4
  require 'multi_json'
11
5
 
12
6
  # Force MultiJson to load an engine before we define the JSON constant here; otherwise,
@@ -14,7 +8,6 @@ if begin
14
8
  MultiJson.respond_to?(:adapter) ? MultiJson.adapter : MultiJson.engine
15
9
  end
16
10
 
17
- require 'rubygems'
18
11
  require 'json-schema/util/hash'
19
12
  require 'json-schema/util/array_set'
20
13
  require 'json-schema/schema'
@@ -6,12 +6,17 @@ module JSON
6
6
  def self.validate(current_schema, data, fragments, processor, validator, options = {})
7
7
  if data.is_a?(Hash)
8
8
  current_schema.schema['dependencies'].each do |property,dependency_value|
9
- if (data.has_key?(property.to_s) || data.has_key?(property.to_sym)) && dependency_value.is_a?(Array)
10
- dependency_value.each do |value|
11
- if !data.has_key?(value.to_s) && !data.has_key?(value.to_sym)
12
- message = "The property '#{build_fragment(fragments)}' has a property '#{property}' that depends on a missing property '#{value}'"
13
- validation_error(processor, message, fragments, current_schema, self, options[:record_errors])
9
+ if (data.has_key?(property.to_s) || data.has_key?(property.to_sym))
10
+ if dependency_value.is_a?(Array)
11
+ dependency_value.each do |value|
12
+ if !data.has_key?(value.to_s) && !data.has_key?(value.to_sym)
13
+ message = "The property '#{build_fragment(fragments)}' has a property '#{property}' that depends on a missing property '#{value}'"
14
+ validation_error(processor, message, fragments, current_schema, self, options[:record_errors])
15
+ end
14
16
  end
17
+ elsif dependency_value.is_a?(Hash)
18
+ schema = JSON::Schema.new(dependency_value,current_schema.uri,validator)
19
+ schema.validate(data, fragments, processor, options)
15
20
  end
16
21
  end
17
22
  end
@@ -1,7 +1,6 @@
1
1
  require 'json-schema/attribute'
2
2
  require 'json-schema/errors/custom_format_error'
3
3
 
4
- require 'uri'
5
4
  module JSON
6
5
  class Schema
7
6
  class CustomFormat < FormatAttribute
@@ -1,22 +1,21 @@
1
1
  require 'json-schema/attribute'
2
- require 'uri'
2
+
3
3
  module JSON
4
4
  class Schema
5
5
  class DateFormat < FormatAttribute
6
+ REGEXP = /\A\d{4}-\d{2}-\d{2}\z/
7
+
6
8
  def self.validate(current_schema, data, fragments, processor, validator, options = {})
7
9
  if data.is_a?(String)
8
10
  error_message = "The property '#{build_fragment(fragments)}' must be a date in the format of YYYY-MM-DD"
9
- r = Regexp.new('^\d\d\d\d-\d\d-\d\d$')
10
- if (r.match(data))
11
+ if REGEXP.match(data)
11
12
  begin
12
13
  Date.parse(data)
13
14
  rescue Exception
14
15
  validation_error(processor, error_message, fragments, current_schema, self, options[:record_errors])
15
- return
16
16
  end
17
17
  else
18
18
  validation_error(processor, error_message, fragments, current_schema, self, options[:record_errors])
19
- return
20
19
  end
21
20
  end
22
21
  end
@@ -1,32 +1,33 @@
1
1
  require 'json-schema/attribute'
2
- require 'uri'
2
+
3
3
  module JSON
4
4
  class Schema
5
5
  class DateTimeFormat < FormatAttribute
6
+ REGEXP = /\A\d{4}-\d{2}-\d{2}T(\d{2}):(\d{2}):(\d{2})([\.,]\d+)?(Z|[+-](\d{2})(:?\d{2})?)?\z/
7
+
6
8
  def self.validate(current_schema, data, fragments, processor, validator, options = {})
7
9
  # Timestamp in restricted ISO-8601 YYYY-MM-DDThh:mm:ssZ with optional decimal fraction of the second
8
10
  if data.is_a?(String)
9
11
  error_message = "The property '#{build_fragment(fragments)}' must be a date/time in the ISO-8601 format of YYYY-MM-DDThh:mm:ssZ or YYYY-MM-DDThh:mm:ss.ssZ"
10
- r = Regexp.new('^\d\d\d\d-\d\d-\d\dT(\d\d):(\d\d):(\d\d)([\.,]\d+)?(Z|[+-](\d\d)(:?\d\d)?)?$')
11
- if (m = r.match(data))
12
+ if (m = REGEXP.match(data))
12
13
  parts = data.split("T")
14
+
13
15
  begin
14
16
  Date.parse(parts[0])
15
17
  rescue Exception
16
18
  validation_error(processor, error_message, fragments, current_schema, self, options[:record_errors])
17
19
  return
18
20
  end
21
+
19
22
  begin
20
23
  validation_error(processor, error_message, fragments, current_schema, self, options[:record_errors]) and return if m[1].to_i > 23
21
24
  validation_error(processor, error_message, fragments, current_schema, self, options[:record_errors]) and return if m[2].to_i > 59
22
25
  validation_error(processor, error_message, fragments, current_schema, self, options[:record_errors]) and return if m[3].to_i > 59
23
26
  rescue Exception
24
27
  validation_error(processor, error_message, fragments, current_schema, self, options[:record_errors])
25
- return
26
28
  end
27
29
  else
28
30
  validation_error(processor, error_message, fragments, current_schema, self, options[:record_errors])
29
- return
30
31
  end
31
32
  end
32
33
  end
@@ -0,0 +1,18 @@
1
+ require 'json-schema/attribute'
2
+
3
+ module JSON
4
+ class Schema
5
+ class DateTimeV4Format < FormatAttribute
6
+ def self.validate(current_schema, data, fragments, processor, validator, options = {})
7
+ if data.is_a?(String)
8
+ error_message = "The property '#{build_fragment(fragments)}' must be a valid RFC3339 date/time string"
9
+ begin
10
+ DateTime.rfc3339(data)
11
+ rescue ArgumentError
12
+ validation_error(processor, error_message, fragments, current_schema, self, options[:record_errors])
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -1,20 +1,18 @@
1
1
  require 'json-schema/attribute'
2
- require 'uri'
2
+ require 'ipaddr'
3
+
3
4
  module JSON
4
5
  class Schema
5
6
  class IP4Format < FormatAttribute
6
7
  def self.validate(current_schema, data, fragments, processor, validator, options = {})
7
8
  if data.is_a?(String)
8
9
  error_message = "The property '#{build_fragment(fragments)}' must be a valid IPv4 address"
9
- r = Regexp.new('^(\d+){1,3}\.(\d+){1,3}\.(\d+){1,3}\.(\d+){1,3}$')
10
- if (m = r.match(data))
11
- 1.upto(4) do |x|
12
- validation_error(processor, error_message, fragments, current_schema, self, options[:record_errors]) and return if m[x].to_i > 255
13
- end
14
- else
15
- validation_error(processor, error_message, fragments, current_schema, self, options[:record_errors])
16
- return
10
+ begin
11
+ ip = IPAddr.new data
12
+ rescue ArgumentError => e
13
+ raise e unless e.message == 'invalid address'
17
14
  end
15
+ validation_error(processor, error_message, fragments, current_schema, self, options[:record_errors]) unless ip && ip.ipv4?
18
16
  end
19
17
  end
20
18
  end
@@ -1,28 +1,18 @@
1
1
  require 'json-schema/attribute'
2
- require 'uri'
2
+ require 'ipaddr'
3
+
3
4
  module JSON
4
5
  class Schema
5
6
  class IP6Format < FormatAttribute
6
7
  def self.validate(current_schema, data, fragments, processor, validator, options = {})
7
8
  if data.is_a?(String)
8
9
  error_message = "The property '#{build_fragment(fragments)}' must be a valid IPv6 address"
9
- r = Regexp.new('^[a-f0-9:]+$')
10
- if (r.match(data))
11
- # All characters are valid, now validate structure
12
- parts = data.split(":")
13
- validation_error(processor, error_message, fragments, current_schema, self, options[:record_errors]) and return if parts.length > 8
14
- condensed_zeros = false
15
- parts.each do |part|
16
- if part.length == 0
17
- validation_error(processor, error_message, fragments, current_schema, self, options[:record_errors]) and return if condensed_zeros
18
- condensed_zeros = true
19
- end
20
- validation_error(processor, error_message, fragments, current_schema, self, options[:record_errors]) and return if part.length > 4
21
- end
22
- else
23
- validation_error(processor, error_message, fragments, current_schema, self, options[:record_errors])
24
- return
10
+ begin
11
+ ip = IPAddr.new data
12
+ rescue ArgumentError => e
13
+ raise e unless e.message == 'invalid address'
25
14
  end
15
+ validation_error(processor, error_message, fragments, current_schema, self, options[:record_errors]) unless ip && ip.ipv6?
26
16
  end
27
17
  end
28
18
  end
@@ -1,19 +1,19 @@
1
1
  require 'json-schema/attribute'
2
- require 'uri'
2
+
3
3
  module JSON
4
4
  class Schema
5
5
  class TimeFormat < FormatAttribute
6
+ REGEXP = /\A(\d{2}):(\d{2}):(\d{2})\z/
7
+
6
8
  def self.validate(current_schema, data, fragments, processor, validator, options = {})
7
9
  if data.is_a?(String)
8
10
  error_message = "The property '#{build_fragment(fragments)}' must be a time in the format of hh:mm:ss"
9
- r = Regexp.new('^(\d\d):(\d\d):(\d\d)$')
10
- if (m = r.match(data))
11
+ if (m = REGEXP.match(data))
11
12
  validation_error(processor, error_message, fragments, current_schema, self, options[:record_errors]) and return if m[1].to_i > 23
12
13
  validation_error(processor, error_message, fragments, current_schema, self, options[:record_errors]) and return if m[2].to_i > 59
13
14
  validation_error(processor, error_message, fragments, current_schema, self, options[:record_errors]) and return if m[3].to_i > 59
14
15
  else
15
16
  validation_error(processor, error_message, fragments, current_schema, self, options[:record_errors])
16
- return
17
17
  end
18
18
  end
19
19
  end
@@ -49,6 +49,7 @@ module JSON
49
49
  fragment_path = ''
50
50
  fragments.each do |fragment|
51
51
  if fragment && fragment != ''
52
+ fragment = URI.unescape(fragment.gsub('~0', '~').gsub('~1', '/'))
52
53
  if target_schema.is_a?(Array)
53
54
  target_schema = target_schema[fragment.to_i]
54
55
  else
@@ -1,7 +1,7 @@
1
1
  module JSON
2
2
  class Schema
3
3
  class Validator
4
- attr_accessor :attributes, :formats, :uri, :names, :metaschema
4
+ attr_accessor :attributes, :formats, :uri, :names
5
5
  attr_reader :default_formats
6
6
 
7
7
  def initialize()
@@ -10,7 +10,7 @@ module JSON
10
10
  @default_formats = {}
11
11
  @uri = nil
12
12
  @names = []
13
- @metaschema = ''
13
+ @metaschema_name = ''
14
14
  end
15
15
 
16
16
  def extend_schema_definition(schema_uri)
@@ -26,6 +26,11 @@ module JSON
26
26
  end
27
27
  data
28
28
  end
29
+
30
+ def metaschema
31
+ resources = File.expand_path('../../../../resources', __FILE__)
32
+ File.join(resources, @metaschema_name)
33
+ end
29
34
  end
30
35
  end
31
36
  end
File without changes
@@ -70,6 +70,7 @@ module JSON
70
70
  end
71
71
 
72
72
  def schema_from_fragment(base_schema, fragment)
73
+ schema_uri = base_schema.uri
73
74
  fragments = fragment.split("/")
74
75
 
75
76
  # ensure the first element was a hash, per the fragment spec
@@ -82,17 +83,17 @@ module JSON
82
83
  if !base_schema.schema.has_key?(f)
83
84
  raise JSON::Schema::SchemaError.new("Invalid fragment resolution for :fragment option")
84
85
  end
85
- base_schema = base_schema.schema[f]
86
+ base_schema = base_schema.schema[f]
86
87
  elsif base_schema.is_a?(Hash)
87
88
  if !base_schema.has_key?(f)
88
89
  raise JSON::Schema::SchemaError.new("Invalid fragment resolution for :fragment option")
89
90
  end
90
- base_schema = initialize_schema(base_schema[f]) #need to return a Schema instance for validation to work
91
+ base_schema = JSON::Schema.new(base_schema[f],schema_uri,@options[:version])
91
92
  elsif base_schema.is_a?(Array)
92
93
  if base_schema[f.to_i].nil?
93
94
  raise JSON::Schema::SchemaError.new("Invalid fragment resolution for :fragment option")
94
95
  end
95
- base_schema = initialize_schema(base_schema[f.to_i])
96
+ base_schema = JSON::Schema.new(base_schema[f.to_i],schema_uri,@options[:version])
96
97
  else
97
98
  raise JSON::Schema::SchemaError.new("Invalid schema encountered when resolving :fragment option")
98
99
  end
@@ -417,7 +418,7 @@ module JSON
417
418
  when 'yajl'
418
419
  json = StringIO.new(s)
419
420
  parser = Yajl::Parser.new
420
- parser.parse(json)
421
+ parser.parse(json) or raise JSON::Schema::JsonParseError.new("The JSON could not be parsed by yajl")
421
422
  else
422
423
  raise JSON::Schema::JsonParseError.new("No supported JSON parsers found. The following parsers are suported:\n * yajl-ruby\n * json")
423
424
  end
@@ -425,33 +426,22 @@ module JSON
425
426
  end
426
427
 
427
428
  if !defined?(MultiJson)
428
- if begin
429
- Gem::Specification::find_by_name('json')
430
- rescue Gem::LoadError
431
- false
432
- rescue
433
- Gem.available?('json')
434
- end
429
+ if Gem::Specification::find_all_by_name('json').any?
435
430
  require 'json'
436
431
  @@available_json_backends << 'json'
437
432
  @@json_backend = 'json'
433
+ else
434
+ # Try force-loading json for rubies > 1.9.2
435
+ begin
436
+ require 'json'
437
+ @@available_json_backends << 'json'
438
+ @@json_backend = 'json'
439
+ rescue LoadError
440
+ end
438
441
  end
439
442
 
440
- # Try force-loading json for rubies > 1.9.2
441
- begin
442
- require 'json'
443
- @@available_json_backends << 'json'
444
- @@json_backend = 'json'
445
- rescue LoadError
446
- end
447
443
 
448
- if begin
449
- Gem::Specification::find_by_name('yajl-ruby')
450
- rescue Gem::LoadError
451
- false
452
- rescue
453
- Gem.available?('yajl-ruby')
454
- end
444
+ if Gem::Specification::find_all_by_name('yajl-ruby').any?
455
445
  require 'yajl'
456
446
  @@available_json_backends << 'yajl'
457
447
  @@json_backend = 'yajl'
@@ -460,9 +450,7 @@ module JSON
460
450
  if @@json_backend == 'yajl'
461
451
  @@serializer = lambda{|o| Yajl::Encoder.encode(o) }
462
452
  else
463
- @@serializer = lambda{|o|
464
- YAML.dump(o)
465
- }
453
+ @@serializer = lambda{|o| YAML.dump(o) }
466
454
  end
467
455
  end
468
456
 
@@ -478,18 +466,12 @@ module JSON
478
466
 
479
467
  private
480
468
 
481
- if begin
482
- Gem::Specification::find_by_name('uuidtools')
483
- rescue Gem::LoadError
484
- false
485
- rescue
486
- Gem.available?('uuidtools')
487
- end
469
+ if Gem::Specification::find_all_by_name('uuidtools').any?
488
470
  require 'uuidtools'
489
- @@fake_uri_generator = lambda{|s| UUIDTools::UUID.sha1_create(UUIDTools::UUID_URL_NAMESPACE, s).to_s }
471
+ @@fake_uuid_generator = lambda{|s| UUIDTools::UUID.sha1_create(UUIDTools::UUID_URL_NAMESPACE, s).to_s }
490
472
  else
491
- require 'json-schema/uri/uuid'
492
- @@fake_uri_generator = lambda{|s| JSON::Util::UUID.create_v5(s,JSON::Util::UUID::Nil).to_s }
473
+ require 'json-schema/util/uuid'
474
+ @@fake_uuid_generator = lambda{|s| JSON::Util::UUID.create_v5(s,JSON::Util::UUID::Nil).to_s }
493
475
  end
494
476
 
495
477
  def serialize schema
@@ -500,8 +482,8 @@ module JSON
500
482
  end
501
483
  end
502
484
 
503
- def fake_uri schema
504
- @@fake_uri_generator.call(schema)
485
+ def fake_uuid schema
486
+ @@fake_uuid_generator.call(schema)
505
487
  end
506
488
 
507
489
  def schema_to_list(schema)
@@ -517,7 +499,7 @@ module JSON
517
499
  if schema.is_a?(String)
518
500
  begin
519
501
  # Build a fake URI for this
520
- schema_uri = URI.parse(fake_uri(schema))
502
+ schema_uri = URI.parse(fake_uuid(schema))
521
503
  schema = JSON::Validator.parse(schema)
522
504
  if @options[:list] && @options[:fragment].nil?
523
505
  schema = schema_to_list(schema)
@@ -526,15 +508,7 @@ module JSON
526
508
  Validator.add_schema(schema)
527
509
  rescue
528
510
  # Build a uri for it
529
- schema_uri = URI.parse(schema)
530
- if schema_uri.relative?
531
- # Check for absolute path
532
- if schema[0,1] == '/'
533
- schema_uri = URI.parse("file://#{schema}")
534
- else
535
- schema_uri = URI.parse("file://#{Dir.pwd}/#{schema}")
536
- end
537
- end
511
+ schema_uri = normalized_uri(schema)
538
512
  if Validator.schemas[schema_uri.to_s].nil?
539
513
  schema = JSON::Validator.parse(open(schema_uri.to_s).read)
540
514
  if @options[:list] && @options[:fragment].nil?
@@ -546,7 +520,7 @@ module JSON
546
520
  schema = Validator.schemas[schema_uri.to_s]
547
521
  if @options[:list] && @options[:fragment].nil?
548
522
  schema = schema_to_list(schema.schema)
549
- schema_uri = URI.parse(fake_uri(serialize(schema)))
523
+ schema_uri = URI.parse(fake_uuid(serialize(schema)))
550
524
  schema = JSON::Schema.new(schema, schema_uri, @options[:version])
551
525
  Validator.add_schema(schema)
552
526
  end
@@ -557,7 +531,7 @@ module JSON
557
531
  if @options[:list] && @options[:fragment].nil?
558
532
  schema = schema_to_list(schema)
559
533
  end
560
- schema_uri = URI.parse(fake_uri(serialize(schema)))
534
+ schema_uri = URI.parse(fake_uuid(serialize(schema)))
561
535
  schema = JSON::Schema.new(schema,schema_uri,@options[:version])
562
536
  Validator.add_schema(schema)
563
537
  else
@@ -572,28 +546,14 @@ module JSON
572
546
  if @options[:json]
573
547
  data = JSON::Validator.parse(data)
574
548
  elsif @options[:uri]
575
- json_uri = URI.parse(data)
576
- if json_uri.relative?
577
- if data[0,1] == '/'
578
- json_uri = URI.parse("file://#{data}")
579
- else
580
- json_uri = URI.parse("file://#{Dir.pwd}/#{data}")
581
- end
582
- end
549
+ json_uri = normalized_uri(data)
583
550
  data = JSON::Validator.parse(open(json_uri.to_s).read)
584
551
  elsif data.is_a?(String)
585
552
  begin
586
553
  data = JSON::Validator.parse(data)
587
554
  rescue
588
555
  begin
589
- json_uri = URI.parse(data)
590
- if json_uri.relative?
591
- if data[0,1] == '/'
592
- json_uri = URI.parse("file://#{data}")
593
- else
594
- json_uri = URI.parse("file://#{Dir.pwd}/#{data}")
595
- end
596
- end
556
+ json_uri = normalized_uri(data)
597
557
  data = JSON::Validator.parse(open(json_uri.to_s).read)
598
558
  rescue
599
559
  # Silently discard the error - the data will not change
@@ -604,5 +564,18 @@ module JSON
604
564
  data
605
565
  end
606
566
 
567
+ def normalized_uri(data)
568
+ uri = URI.parse(data)
569
+ if uri.relative?
570
+ # Check for absolute path
571
+ if data[0,1] == '/'
572
+ uri = URI.parse("file://#{data}")
573
+ else
574
+ uri = URI.parse("file://#{Dir.pwd}/#{data}")
575
+ end
576
+ end
577
+ uri
578
+ end
579
+
607
580
  end
608
581
  end
@@ -35,7 +35,7 @@ module JSON
35
35
  @formats = @default_formats.clone
36
36
  @uri = URI.parse("http://json-schema.org/draft-01/schema#")
37
37
  @names = ["draft1"]
38
- @metaschema = File.join("resources", "draft-01.json")
38
+ @metaschema_name = "draft-01.json"
39
39
  end
40
40
 
41
41
  JSON::Validator.register_validator(self.new)
@@ -36,7 +36,7 @@ module JSON
36
36
  @formats = @default_formats.clone
37
37
  @uri = URI.parse("http://json-schema.org/draft-02/schema#")
38
38
  @names = ["draft2"]
39
- @metaschema = File.join("resources", "draft-02.json")
39
+ @metaschema_name = "draft-02.json"
40
40
  end
41
41
 
42
42
  JSON::Validator.register_validator(self.new)
@@ -40,7 +40,7 @@ module JSON
40
40
  @formats = @default_formats.clone
41
41
  @uri = URI.parse("http://json-schema.org/draft-03/schema#")
42
42
  @names = ["draft3", "http://json-schema.org/draft-03/schema#"]
43
- @metaschema = File.join("resources", "draft-03.json")
43
+ @metaschema_name = "draft-03.json"
44
44
  end
45
45
 
46
46
  JSON::Validator.register_validator(self.new)
@@ -37,7 +37,7 @@ module JSON
37
37
  "$ref" => JSON::Schema::RefAttribute
38
38
  }
39
39
  @default_formats = {
40
- 'date-time' => DateTimeFormat,
40
+ 'date-time' => DateTimeV4Format,
41
41
  'ipv4' => IP4Format,
42
42
  'ipv6' => IP6Format,
43
43
  'uri' => UriFormat
@@ -45,7 +45,7 @@ module JSON
45
45
  @formats = @default_formats.clone
46
46
  @uri = URI.parse("http://json-schema.org/draft-04/schema#")
47
47
  @names = ["draft4", "http://json-schema.org/draft-04/schema#"]
48
- @metaschema = File.join("resources", "draft-04.json")
48
+ @metaschema_name = "draft-04.json"
49
49
  end
50
50
 
51
51
  JSON::Validator.register_validator(self.new)
@@ -0,0 +1,14 @@
1
+ module JSON
2
+ class Schema
3
+
4
+ class HyperDraft4 < Draft4
5
+ def initialize
6
+ super
7
+ @uri = URI.parse("http://json-schema.org/draft-04/hyper-schema#")
8
+ end
9
+
10
+ JSON::Validator.register_validator(self.new)
11
+ JSON::Validator.register_default_validator(self.new)
12
+ end
13
+ end
14
+ end
@@ -11,11 +11,8 @@ class CommonTestSuiteTest < Test::Unit::TestCase
11
11
  "draft3/disallow.json",
12
12
  "draft3/optional/format.json",
13
13
  "draft3/optional/jsregex.json",
14
- "draft3/ref.json",
15
14
  "draft3/refRemote.json",
16
- "draft4/dependencies.json",
17
15
  "draft4/optional/format.json",
18
- "draft4/ref.json",
19
16
  "draft4/refRemote.json",
20
17
  ]
21
18
 
@@ -31,20 +28,20 @@ class CommonTestSuiteTest < Test::Unit::TestCase
31
28
  v = nil
32
29
 
33
30
  test["tests"].each do |t|
34
- err_id = "#{rel_file}, '#{base_description}'/'#{t['description']}'"
35
-
36
- define_method("test_#{err_id}") do
37
- skip "Known incompatibility with common test suite" if IGNORED_TESTS.include?(rel_file)
38
-
39
- assert_nothing_raised("Exception raised running #{err_id}") do
40
- v = JSON::Validator.fully_validate(schema,
41
- t["data"],
42
- :validate_schema => true,
43
- :version => version
44
- )
31
+ err_id = "#{rel_file}: #{base_description}/#{t['description']}"
32
+
33
+ unless IGNORED_TESTS.include?(rel_file)
34
+ define_method("test_#{err_id}") do
35
+ assert_nothing_raised("Exception raised running #{err_id}") do
36
+ v = JSON::Validator.fully_validate(schema,
37
+ t["data"],
38
+ :validate_schema => true,
39
+ :version => version
40
+ )
41
+ end
42
+
43
+ assert_equal t["valid"], v.empty?, "Common test suite case failed: #{err_id}\n#{v}"
45
44
  end
46
-
47
- assert v.empty? == t["valid"], "Common test suite case failed: #{err_id}\n#{v}"
48
45
  end
49
46
  end
50
47
  end
@@ -5,7 +5,7 @@ require File.dirname(__FILE__) + '/../lib/json-schema'
5
5
  class JSONSchemaCustomFormatTest < Test::Unit::TestCase
6
6
  def setup
7
7
  @all_versions = ['draft1', 'draft2', 'draft3', 'draft4']
8
- @format_proc = -> value { raise JSON::Schema::CustomFormatError.new("must be 42") unless value == "42" }
8
+ @format_proc = lambda { |value| raise JSON::Schema::CustomFormatError.new("must be 42") unless value == "42" }
9
9
  @schema_4 = {
10
10
  "$schema" => "http://json-schema.org/draft-04/schema#",
11
11
  "properties" => {
@@ -0,0 +1,40 @@
1
+ require File.expand_path('../test_helper', __FILE__)
2
+ require 'json-schema'
3
+
4
+ class FragmentValidationWithRef < Test::Unit::TestCase
5
+ def whole_schema
6
+ {
7
+ "$schema" => "http://json-schema.org/draft-04/schema#",
8
+ "type" => "object",
9
+ "definitions" => {
10
+ "post" => {
11
+ "type" => "object",
12
+ "properties" => {
13
+ "content" => {
14
+ "type" => "string"
15
+ },
16
+ "author" => {
17
+ "type" => "string"
18
+ }
19
+ }
20
+ },
21
+ "posts" => {
22
+ "type" => "array",
23
+ "items" => {
24
+ "$ref" => "#/definitions/post"
25
+ }
26
+ }
27
+ }
28
+ }
29
+ end
30
+
31
+ def test_validation_of_fragment
32
+ data = [{"content" => "ohai", "author" => "Bob"}]
33
+ v = nil
34
+ assert_nothing_raised do
35
+ v = JSON::Validator.fully_validate(whole_schema,data,:fragment => "#/definitions/posts")
36
+ end
37
+
38
+ assert(v.empty?, v.join("\n"))
39
+ end
40
+ end
@@ -0,0 +1,2 @@
1
+ require 'test/unit'
2
+ $:.unshift(File.expand_path('../../lib', __FILE__))
@@ -613,6 +613,8 @@ class JSONSchemaDraft1Test < Test::Unit::TestCase
613
613
  assert(!JSON::Validator.validate(schema,data,:version => :draft1))
614
614
  data = {"a" => "1111:2222:8888:9999:aaaa:cccc:eeee:ffff:bbbb"}
615
615
  assert(!JSON::Validator.validate(schema,data,:version => :draft1))
616
+ assert(JSON::Validator.validate(schema, {"a" => "::1"}, :version => :draft1), 'validate with shortcut')
617
+ assert(!JSON::Validator.validate(schema, {"a" => "42"}, :version => :draft1), 'not validate a simple number')
616
618
  end
617
619
 
618
620
  def test_format_time
@@ -637,6 +639,10 @@ class JSONSchemaDraft1Test < Test::Unit::TestCase
637
639
  assert(!JSON::Validator.validate(schema,data,:version => :draft1))
638
640
  data = {"a" => "12:00:00b"}
639
641
  assert(!JSON::Validator.validate(schema,data,:version => :draft1))
642
+ data = {"a" => "12:00:00"}
643
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
644
+ data = {"a" => "12:00:00\nabc"}
645
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
640
646
  end
641
647
 
642
648
 
@@ -658,6 +664,8 @@ class JSONSchemaDraft1Test < Test::Unit::TestCase
658
664
  assert(!JSON::Validator.validate(schema,data,:version => :draft1))
659
665
  data = {"a" => "2010-01-01n"}
660
666
  assert(!JSON::Validator.validate(schema,data,:version => :draft1))
667
+ data = {"a" => "2010-01-01\nabc"}
668
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
661
669
  end
662
670
 
663
671
  def test_format_datetime
@@ -682,6 +690,8 @@ class JSONSchemaDraft1Test < Test::Unit::TestCase
682
690
  assert(!JSON::Validator.validate(schema,data,:version => :draft1))
683
691
  data = {"a" => "2010-01-0112:00:00Z"}
684
692
  assert(!JSON::Validator.validate(schema,data,:version => :draft1))
693
+ data = {"a" => "2010-01-01T12:00:00Z\nabc"}
694
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
685
695
  end
686
696
 
687
697
  def test_format_unknown
@@ -685,6 +685,8 @@ class JSONSchemaDraft2Test < Test::Unit::TestCase
685
685
  assert(!JSON::Validator.validate(schema,data,:version => :draft2))
686
686
  data = {"a" => "1111:2222:8888:9999:aaaa:cccc:eeee:ffff:bbbb"}
687
687
  assert(!JSON::Validator.validate(schema,data,:version => :draft2))
688
+ assert(JSON::Validator.validate(schema, {"a" => "::1"}, :version => :draft2), 'validate with shortcut')
689
+ assert(!JSON::Validator.validate(schema, {"a" => "42"}, :version => :draft2), 'not validate a simple number')
688
690
  end
689
691
 
690
692
  def test_format_time
@@ -709,6 +711,8 @@ class JSONSchemaDraft2Test < Test::Unit::TestCase
709
711
  assert(!JSON::Validator.validate(schema,data,:version => :draft2))
710
712
  data = {"a" => "12:00:00b"}
711
713
  assert(!JSON::Validator.validate(schema,data,:version => :draft2))
714
+ data = {"a" => "12:00:00\nabc"}
715
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
712
716
  end
713
717
 
714
718
 
@@ -730,6 +734,8 @@ class JSONSchemaDraft2Test < Test::Unit::TestCase
730
734
  assert(!JSON::Validator.validate(schema,data,:version => :draft2))
731
735
  data = {"a" => "2010-01-01n"}
732
736
  assert(!JSON::Validator.validate(schema,data,:version => :draft2))
737
+ data = {"a" => "2010-01-01\nabc"}
738
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
733
739
  end
734
740
 
735
741
  def test_format_datetime
@@ -754,6 +760,8 @@ class JSONSchemaDraft2Test < Test::Unit::TestCase
754
760
  assert(!JSON::Validator.validate(schema,data,:version => :draft2))
755
761
  data = {"a" => "2010-01-0112:00:00Z"}
756
762
  assert(!JSON::Validator.validate(schema,data,:version => :draft2))
763
+ data = {"a" => "2010-01-01T12:00:00Z\nabc"}
764
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
757
765
  end
758
766
 
759
767
  def test_format_unknown
@@ -984,6 +984,8 @@ class JSONSchemaDraft3Test < Test::Unit::TestCase
984
984
  assert(!JSON::Validator.validate(schema,data))
985
985
  data = {"a" => "1111:2222:8888:9999:aaaa:cccc:eeee:ffff:bbbb"}
986
986
  assert(!JSON::Validator.validate(schema,data))
987
+ assert(JSON::Validator.validate(schema, {"a" => "::1"}), 'validate with shortcut')
988
+ assert(!JSON::Validator.validate(schema, {"a" => "42"}), 'not validate a simple number')
987
989
  end
988
990
 
989
991
  def test_format_time
@@ -1009,6 +1011,8 @@ class JSONSchemaDraft3Test < Test::Unit::TestCase
1009
1011
  assert(!JSON::Validator.validate(schema,data))
1010
1012
  data = {"a" => "12:00:00b"}
1011
1013
  assert(!JSON::Validator.validate(schema,data))
1014
+ data = {"a" => "12:00:00\nabc"}
1015
+ assert(!JSON::Validator.validate(schema,data))
1012
1016
  end
1013
1017
 
1014
1018
 
@@ -1031,6 +1035,8 @@ class JSONSchemaDraft3Test < Test::Unit::TestCase
1031
1035
  assert(!JSON::Validator.validate(schema,data))
1032
1036
  data = {"a" => "2010-01-01n"}
1033
1037
  assert(!JSON::Validator.validate(schema,data))
1038
+ data = {"a" => "2010-01-01\nabc"}
1039
+ assert(!JSON::Validator.validate(schema,data))
1034
1040
  end
1035
1041
 
1036
1042
  def test_format_datetime
@@ -1060,6 +1066,8 @@ class JSONSchemaDraft3Test < Test::Unit::TestCase
1060
1066
  assert(!JSON::Validator.validate(schema,data))
1061
1067
  data = {"a" => "2010-01-0112:00:00Z"}
1062
1068
  assert(!JSON::Validator.validate(schema,data))
1069
+ data = {"a" => "2010-01-01T12:00:00.1Z\nabc"}
1070
+ assert(!JSON::Validator.validate(schema,data))
1063
1071
 
1064
1072
  # test with a specific timezone
1065
1073
  data = {"a" => "2010-01-01T12:00:00+01"}
@@ -189,9 +189,7 @@ class JSONSchemaDraft4Test < Test::Unit::TestCase
189
189
 
190
190
  assert(JSON::Validator.validate({"$schema" => "http://json-schema.org/draft-04/schema#",'type' => ['string', 'null']}, "hello"))
191
191
  assert(!JSON::Validator.validate({"$schema" => "http://json-schema.org/draft-04/schema#",'type' => ['integer', 'object']}, "hello"))
192
- end
193
-
194
-
192
+ end
195
193
 
196
194
  def test_required
197
195
  # Set up the default datatype
@@ -927,6 +925,8 @@ class JSONSchemaDraft4Test < Test::Unit::TestCase
927
925
  assert(!JSON::Validator.validate(schema,data))
928
926
  data = {"a" => "1111:2222:8888:9999:aaaa:cccc:eeee:ffff:bbbb"}
929
927
  assert(!JSON::Validator.validate(schema,data))
928
+ assert(JSON::Validator.validate(schema, {"a" => "::1"}), 'validate with shortcut')
929
+ assert(!JSON::Validator.validate(schema, {"a" => "42"}), 'not validate a simple number')
930
930
  end
931
931
 
932
932
 
@@ -942,9 +942,9 @@ class JSONSchemaDraft4Test < Test::Unit::TestCase
942
942
  data = {"a" => "2010-01-01T12:00:00.1Z"}
943
943
  assert(JSON::Validator.validate(schema,data))
944
944
  data = {"a" => "2010-01-01T12:00:00,1Z"}
945
- assert(JSON::Validator.validate(schema,data))
945
+ assert(!JSON::Validator.validate(schema,data))
946
946
  data = {"a" => "2010-01-01T12:00:00+0000"}
947
- assert(JSON::Validator.validate(schema,data))
947
+ assert(!JSON::Validator.validate(schema,data))
948
948
  data = {"a" => "2010-01-01T12:00:00+00:00"}
949
949
  assert(JSON::Validator.validate(schema,data))
950
950
  data = {"a" => "2010-01-32T12:00:00Z"}
@@ -952,13 +952,13 @@ class JSONSchemaDraft4Test < Test::Unit::TestCase
952
952
  data = {"a" => "2010-13-01T12:00:00Z"}
953
953
  assert(!JSON::Validator.validate(schema,data))
954
954
  data = {"a" => "2010-01-01T24:00:00Z"}
955
- assert(!JSON::Validator.validate(schema,data))
955
+ assert(JSON::Validator.validate(schema,data))
956
956
  data = {"a" => "2010-01-01T12:60:00Z"}
957
957
  assert(!JSON::Validator.validate(schema,data))
958
958
  data = {"a" => "2010-01-01T12:00:60Z"}
959
- assert(!JSON::Validator.validate(schema,data))
959
+ assert(JSON::Validator.validate(schema,data))
960
960
  data = {"a" => "2010-01-01T12:00:00z"}
961
- assert(!JSON::Validator.validate(schema,data))
961
+ assert(JSON::Validator.validate(schema,data))
962
962
  data = {"a" => "2010-01-0112:00:00Z"}
963
963
  assert(!JSON::Validator.validate(schema,data))
964
964
  end
@@ -1060,6 +1060,32 @@ class JSONSchemaDraft4Test < Test::Unit::TestCase
1060
1060
  assert(JSON::Validator.validate(schema,data))
1061
1061
  end
1062
1062
 
1063
+ def test_schema_dependency
1064
+ schema = {
1065
+ "type"=> "object",
1066
+ "properties"=> {
1067
+ "name"=> { "type"=> "string" },
1068
+ "credit_card"=> { "type"=> "number" }
1069
+ },
1070
+ "required"=> ["name"],
1071
+ "dependencies"=> {
1072
+ "credit_card"=> {
1073
+ "properties"=> {
1074
+ "billing_address"=> { "type"=> "string" }
1075
+ },
1076
+ "required"=> ["billing_address"]
1077
+ }
1078
+ }
1079
+ }
1080
+ data = {
1081
+ "name" => "John Doe",
1082
+ "credit_card" => 5555555555555555
1083
+ }
1084
+ assert(!JSON::Validator.validate(schema,data), 'test schema dependency with invalid data')
1085
+ data['billing_address'] = "Somewhere over the rainbow"
1086
+ assert(JSON::Validator.validate(schema,data), 'test schema dependency with valid data')
1087
+ end
1088
+
1063
1089
  def test_default
1064
1090
  schema = {
1065
1091
  "$schema" => "http://json-schema.org/draft-04/schema#",
@@ -21,16 +21,16 @@ class RubySchemaTest < Test::Unit::TestCase
21
21
 
22
22
  def test_symbol_keys
23
23
  schema = {
24
- type: 'object',
25
- required: ["a"],
26
- properties: {
27
- a: {type: "integer", default: 42},
28
- b: {type: "integer"}
24
+ :type => 'object',
25
+ :required => ["a"],
26
+ :properties => {
27
+ :a => {:type => "integer", :default => 42},
28
+ :b => {:type => "integer"}
29
29
  }
30
30
  }
31
31
 
32
32
  data = {
33
- a: 5
33
+ :a => 5
34
34
  }
35
35
 
36
36
  assert(JSON::Validator.validate(schema, data))
@@ -38,15 +38,15 @@ class RubySchemaTest < Test::Unit::TestCase
38
38
 
39
39
  def test_symbol_keys_in_hash_within_array
40
40
  schema = {
41
- type: 'object',
42
- properties: {
43
- a: {
44
- type: "array",
45
- items: [
41
+ :type => 'object',
42
+ :properties => {
43
+ :a => {
44
+ :type => "array",
45
+ :items => [
46
46
  {
47
- properties: {
48
- b: {
49
- type: "integer"
47
+ :properties => {
48
+ :b => {
49
+ :type => "integer"
50
50
  }
51
51
  }
52
52
  }
@@ -56,9 +56,9 @@ class RubySchemaTest < Test::Unit::TestCase
56
56
  }
57
57
 
58
58
  data = {
59
- a: [
59
+ :a => [
60
60
  {
61
- b: 1
61
+ :b => 1
62
62
  }
63
63
  ]
64
64
  }
@@ -1,4 +1,5 @@
1
1
  require 'test/unit'
2
+ require 'tmpdir'
2
3
  require File.dirname(__FILE__) + '/../lib/json-schema'
3
4
 
4
5
  class JSONSchemaValidation < Test::Unit::TestCase
@@ -82,4 +83,14 @@ class JSONSchemaValidation < Test::Unit::TestCase
82
83
  assert(JSON::Validator.validate(valid_schema_v3,data,:validate_schema => true))
83
84
  assert(!JSON::Validator.validate(invalid_schema_v3,data,:validate_schema => true))
84
85
  end
86
+
87
+ def test_schema_validation_from_different_directory
88
+ Dir.mktmpdir do |tmpdir|
89
+ Dir.chdir(tmpdir) do
90
+ data = {"b" => {"a" => 5}}
91
+ assert(JSON::Validator.validate(valid_schema_v4,data,:validate_schema => true, :version => :draft4))
92
+ assert(!JSON::Validator.validate(invalid_schema_v4,data,:validate_schema => true, :version => :draft4))
93
+ end
94
+ end
95
+ end
85
96
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json-schema
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.0
4
+ version: 2.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kenny Hoxworth
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-26 00:00:00.000000000 Z
11
+ date: 2014-10-28 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email: hoxworth@gmail.com
@@ -33,6 +33,7 @@ files:
33
33
  - lib/json-schema/attributes/formats/custom.rb
34
34
  - lib/json-schema/attributes/formats/date.rb
35
35
  - lib/json-schema/attributes/formats/date_time.rb
36
+ - lib/json-schema/attributes/formats/date_time_v4.rb
36
37
  - lib/json-schema/attributes/formats/ip4.rb
37
38
  - lib/json-schema/attributes/formats/ip6.rb
38
39
  - lib/json-schema/attributes/formats/time.rb
@@ -69,14 +70,15 @@ files:
69
70
  - lib/json-schema/schema/validator.rb
70
71
  - lib/json-schema/schema.rb
71
72
  - lib/json-schema/uri/file.rb
72
- - lib/json-schema/uri/uuid.rb
73
73
  - lib/json-schema/util/array_set.rb
74
74
  - lib/json-schema/util/hash.rb
75
+ - lib/json-schema/util/uuid.rb
75
76
  - lib/json-schema/validator.rb
76
77
  - lib/json-schema/validators/draft1.rb
77
78
  - lib/json-schema/validators/draft2.rb
78
79
  - lib/json-schema/validators/draft3.rb
79
80
  - lib/json-schema/validators/draft4.rb
81
+ - lib/json-schema/validators/hyper-draft4.rb
80
82
  - lib/json-schema.rb
81
83
  - resources/draft-01.json
82
84
  - resources/draft-02.json
@@ -93,7 +95,9 @@ files:
93
95
  - test/test_extends_and_additionalProperties.rb
94
96
  - test/test_files_v3.rb
95
97
  - test/test_fragment_resolution.rb
98
+ - test/test_fragment_validation_with_ref.rb
96
99
  - test/test_full_validation.rb
100
+ - test/test_helper.rb
97
101
  - test/test_jsonschema_draft1.rb
98
102
  - test/test_jsonschema_draft2.rb
99
103
  - test/test_jsonschema_draft3.rb
@@ -139,12 +143,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
139
143
  requirements:
140
144
  - - ! '>='
141
145
  - !ruby/object:Gem::Version
142
- version: '0'
146
+ version: 1.8.7
143
147
  required_rubygems_version: !ruby/object:Gem::Requirement
144
148
  requirements:
145
149
  - - ! '>='
146
150
  - !ruby/object:Gem::Version
147
- version: '0'
151
+ version: '1.8'
148
152
  requirements: []
149
153
  rubyforge_project:
150
154
  rubygems_version: 2.0.7
@@ -161,7 +165,9 @@ test_files:
161
165
  - test/test_extends_and_additionalProperties.rb
162
166
  - test/test_files_v3.rb
163
167
  - test/test_fragment_resolution.rb
168
+ - test/test_fragment_validation_with_ref.rb
164
169
  - test/test_full_validation.rb
170
+ - test/test_helper.rb
165
171
  - test/test_jsonschema_draft1.rb
166
172
  - test/test_jsonschema_draft2.rb
167
173
  - test/test_jsonschema_draft3.rb