json-schema 2.4.1 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +6 -14
 - data/README.textile +58 -7
 - data/lib/json-schema.rb +3 -1
 - data/lib/json-schema/attributes/additionalitems.rb +14 -11
 - data/lib/json-schema/attributes/additionalproperties.rb +33 -43
 - data/lib/json-schema/attributes/anyof.rb +4 -0
 - data/lib/json-schema/attributes/dependencies.rb +31 -19
 - data/lib/json-schema/attributes/disallow.rb +2 -3
 - data/lib/json-schema/attributes/divisibleby.rb +11 -7
 - data/lib/json-schema/attributes/enum.rb +14 -16
 - data/lib/json-schema/attributes/format.rb +4 -7
 - data/lib/json-schema/attributes/formats/date_time_v4.rb +5 -8
 - data/lib/json-schema/attributes/formats/ip.rb +41 -0
 - data/lib/json-schema/attributes/formats/uri.rb +10 -8
 - data/lib/json-schema/attributes/items.rb +15 -16
 - data/lib/json-schema/attributes/limit.rb +179 -0
 - data/lib/json-schema/attributes/maxdecimal.rb +7 -6
 - data/lib/json-schema/attributes/multipleof.rb +4 -11
 - data/lib/json-schema/attributes/not.rb +1 -1
 - data/lib/json-schema/attributes/oneof.rb +15 -6
 - data/lib/json-schema/attributes/pattern.rb +7 -6
 - data/lib/json-schema/attributes/patternproperties.rb +9 -12
 - data/lib/json-schema/attributes/properties.rb +55 -39
 - data/lib/json-schema/attributes/properties_optional.rb +13 -12
 - data/lib/json-schema/attributes/ref.rb +4 -4
 - data/lib/json-schema/attributes/required.rb +16 -13
 - data/lib/json-schema/attributes/type.rb +13 -18
 - data/lib/json-schema/attributes/type_v4.rb +11 -18
 - data/lib/json-schema/attributes/uniqueitems.rb +5 -7
 - data/lib/json-schema/schema.rb +8 -8
 - data/lib/json-schema/schema/#validator.rb# +37 -0
 - data/lib/json-schema/schema/reader.rb +113 -0
 - data/lib/json-schema/util/uri.rb +16 -0
 - data/lib/json-schema/validator.rb +123 -128
 - data/lib/json-schema/validators/draft1.rb +1 -1
 - data/lib/json-schema/validators/draft2.rb +1 -1
 - data/lib/json-schema/validators/draft3.rb +1 -1
 - data/lib/json-schema/validators/draft4.rb +1 -1
 - data/lib/json-schema/validators/hyper-draft4.rb +1 -1
 - data/test/schemas/address_microformat.json +18 -0
 - data/test/schemas/definition_schema.json +15 -0
 - data/test/schemas/ref john with spaces schema.json +11 -0
 - data/test/schemas/relative_definition_schema.json +8 -0
 - data/test/test_all_of_ref_schema.rb +12 -15
 - data/test/test_any_of_ref_schema.rb +7 -9
 - data/test/test_bad_schema_ref.rb +18 -12
 - data/test/test_common_test_suite.rb +45 -29
 - data/test/test_custom_format.rb +2 -3
 - data/test/test_definition.rb +15 -0
 - data/test/test_extended_schema.rb +25 -31
 - data/test/test_extends_and_additionalProperties.rb +23 -21
 - data/test/test_files_v3.rb +14 -23
 - data/test/test_fragment_resolution.rb +6 -7
 - data/test/test_fragment_validation_with_ref.rb +2 -8
 - data/test/test_full_validation.rb +2 -3
 - data/test/test_helper.rb +46 -1
 - data/test/test_initialize_data.rb +118 -0
 - data/test/test_jsonschema_draft1.rb +48 -600
 - data/test/test_jsonschema_draft2.rb +48 -699
 - data/test/test_jsonschema_draft3.rb +91 -861
 - data/test/test_jsonschema_draft4.rb +173 -812
 - data/test/test_list_option.rb +6 -7
 - data/test/{test_merge_misisng_values.rb → test_merge_missing_values.rb} +2 -3
 - data/test/test_minitems.rb +2 -4
 - data/test/test_one_of.rb +9 -19
 - data/test/test_ruby_schema.rb +5 -14
 - data/test/test_schema_loader.rb +74 -0
 - data/test/test_schema_type_attribute.rb +2 -3
 - data/test/test_schema_validation.rb +4 -5
 - data/test/test_stringify.rb +2 -3
 - data/test/test_uri_related.rb +67 -0
 - data/test/test_validator.rb +53 -0
 - metadata +129 -51
 - data/lib/json-schema/attributes/dependencies_v4.rb +0 -27
 - data/lib/json-schema/attributes/formats/ip4.rb +0 -20
 - data/lib/json-schema/attributes/formats/ip6.rb +0 -20
 - data/lib/json-schema/attributes/maximum.rb +0 -17
 - data/lib/json-schema/attributes/maximum_inclusive.rb +0 -17
 - data/lib/json-schema/attributes/maxitems.rb +0 -14
 - data/lib/json-schema/attributes/maxlength.rb +0 -16
 - data/lib/json-schema/attributes/maxproperties.rb +0 -14
 - data/lib/json-schema/attributes/minimum.rb +0 -17
 - data/lib/json-schema/attributes/minimum_inclusive.rb +0 -17
 - data/lib/json-schema/attributes/minitems.rb +0 -14
 - data/lib/json-schema/attributes/minlength.rb +0 -16
 - data/lib/json-schema/attributes/minproperties.rb +0 -14
 - data/lib/json-schema/attributes/properties_v4.rb +0 -58
 - data/lib/json-schema/uri/file.rb +0 -36
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,15 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
              metadata.gz: !binary |-
         
     | 
| 
       9 
     | 
    
         
            -
                YjVlZjkzNWE5YTA3MjhlNTY0ZmMyMGRiNGE0YzYwODE1N2I3ZTFhMTAzYjQ1
         
     | 
| 
       10 
     | 
    
         
            -
                NTJjZGU2ZTE1OTg3NDJjNThhYzAwMGRiYzZiMzIzZWJiODRmNzA5NjVjMzAw
         
     | 
| 
       11 
     | 
    
         
            -
                ZTE4MjdjYzE3NGQ0ZjlhYmQ3NWViZjVmOWNhYzc2YjY2NWNlYTU=
         
     | 
| 
       12 
     | 
    
         
            -
              data.tar.gz: !binary |-
         
     | 
| 
       13 
     | 
    
         
            -
                ODA4M2U2YTkyMmM1NjhlMTUyN2M3NjJiODI3ZmUzMzNhYTFkNTE1YmRkYWM4
         
     | 
| 
       14 
     | 
    
         
            -
                MWNiODZlYmQ3YjdkY2M4ZDk3ZDVkNTZlYmJkNmNjNWVjODhjOWQxNzA5MmU2
         
     | 
| 
       15 
     | 
    
         
            -
                YjQwMDBmMjZmODdkOTI5YjBjMzUxMGJiOWNjY2JmNzZlZWZhYjY=
         
     | 
| 
      
 2 
     | 
    
         
            +
            SHA1:
         
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: b4d20081a44ab34c2a1d12268a7e4160b4070221
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: a9b98f1d541ad64563095ee77d03738e3d6fbfaa
         
     | 
| 
      
 5 
     | 
    
         
            +
            SHA512:
         
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 433b1267a8f4902cf007e6407fbd9bc253cd5884ae9c1311825cdf1e019c784239c2e7189e11e8d752449c27a5f74f22c00dbb6205ae3ae3d5342874628584a4
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 57f5da1f4a399df4c9025d6955a6d554fc41c23ac009651501f7badb5c622db272a53bbd3d3a2cac849b34055cbbb89d5c99775968e1b69ff8ddc3933dfc8966
         
     | 
    
        data/README.textile
    CHANGED
    
    | 
         @@ -1,17 +1,18 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            !https://travis-ci.org/ 
     | 
| 
       2 
     | 
    
         
            -
            !https://codeclimate.com/github/ 
     | 
| 
      
 1 
     | 
    
         
            +
            !https://travis-ci.org/ruby-json-schema/json-schema.svg?branch=master!:https://travis-ci.org/ruby-json-schema/json-schema
         
     | 
| 
      
 2 
     | 
    
         
            +
            !https://codeclimate.com/github/ruby-json-schema/json-schema/badges/gpa.svg!:https://codeclimate.com/github/ruby-json-schema/json-schema
         
     | 
| 
       3 
3 
     | 
    
         | 
| 
       4 
4 
     | 
    
         
             
            h1. Ruby JSON Schema Validator
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
       6 
6 
     | 
    
         
             
            This library is intended to provide Ruby with an interface for validating JSON objects against a JSON schema conforming to "JSON Schema Draft 4":http://tools.ietf.org/html/draft-zyp-json-schema-04. Legacy support for "JSON Schema Draft 3":http://tools.ietf.org/html/draft-zyp-json-schema-03, "JSON Schema Draft 2":http://tools.ietf.org/html/draft-zyp-json-schema-02, and "JSON Schema Draft 1":http://tools.ietf.org/html/draft-zyp-json-schema-01 is also included.
         
     | 
| 
       7 
7 
     | 
    
         | 
| 
       8 
     | 
    
         
            -
            h2.  
     | 
| 
      
 8 
     | 
    
         
            +
            h2. Additional Resources
         
     | 
| 
       9 
9 
     | 
    
         | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
      
 10 
     | 
    
         
            +
            * "Google Groups":https://groups.google.com/forum/#!forum/ruby-json-schema
         
     | 
| 
      
 11 
     | 
    
         
            +
            * #ruby-json-schema on chat.freenode.net
         
     | 
| 
       11 
12 
     | 
    
         | 
| 
       12 
     | 
    
         
            -
            h2.  
     | 
| 
      
 13 
     | 
    
         
            +
            h2. Version 2.0.0 Upgrade Notes
         
     | 
| 
       13 
14 
     | 
    
         | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
      
 15 
     | 
    
         
            +
            Please be aware that the upgrade to version 2.0.0 will use Draft-04 *by default*, so schemas that do not declare a validator using the <code>$schema</code> keyword will use Draft-04 now instead of Draft-03. This is the reason for the major version upgrade.
         
     | 
| 
       15 
16 
     | 
    
         | 
| 
       16 
17 
     | 
    
         
             
            h2. Installation
         
     | 
| 
       17 
18 
     | 
    
         | 
| 
         @@ -277,6 +278,32 @@ data = { 
     | 
|
| 
       277 
278 
     | 
    
         
             
            JSON::Validator.validate(schema, data, :version => :draft2)
         
     | 
| 
       278 
279 
     | 
    
         
             
            </pre>
         
     | 
| 
       279 
280 
     | 
    
         | 
| 
      
 281 
     | 
    
         
            +
            h3. Explicitly specifying the type of the data
         
     | 
| 
      
 282 
     | 
    
         
            +
             
     | 
| 
      
 283 
     | 
    
         
            +
            By default, json-schema accepts a variety of different types for the data parameter, and it will try to work out what to do with it dynamically. You can pass it a string uri (in which case it will download the json from that location before validating), a string of JSON text, or simply a ruby object (such as an array or hash representing parsed json). However, sometimes the nature of the data is ambiguous (for example, is "http://github.com" just a string, or is it a uri?). In other situations, you have already parsed your JSON, and you don't need to re-parse it.
         
     | 
| 
      
 284 
     | 
    
         
            +
             
     | 
| 
      
 285 
     | 
    
         
            +
            If you want to be explict about what kind of data is being parsed, JSON schema supports a number of options:
         
     | 
| 
      
 286 
     | 
    
         
            +
             
     | 
| 
      
 287 
     | 
    
         
            +
            <pre>
         
     | 
| 
      
 288 
     | 
    
         
            +
            require 'rubygems'
         
     | 
| 
      
 289 
     | 
    
         
            +
            require 'json-schema'
         
     | 
| 
      
 290 
     | 
    
         
            +
             
     | 
| 
      
 291 
     | 
    
         
            +
            schema = {
         
     | 
| 
      
 292 
     | 
    
         
            +
              "type" => "string"
         
     | 
| 
      
 293 
     | 
    
         
            +
            }
         
     | 
| 
      
 294 
     | 
    
         
            +
             
     | 
| 
      
 295 
     | 
    
         
            +
            # examines the data, determines it's a uri, then tries to load data from it
         
     | 
| 
      
 296 
     | 
    
         
            +
            JSON::Validator.validate(schema, 'https://api.github.com') # returns false
         
     | 
| 
      
 297 
     | 
    
         
            +
             
     | 
| 
      
 298 
     | 
    
         
            +
            # data is already parsed json - just accept it as-is
         
     | 
| 
      
 299 
     | 
    
         
            +
            JSON::Validator.validate(schema, 'https://api.github.com', :parse_data => false) # returns true
         
     | 
| 
      
 300 
     | 
    
         
            +
             
     | 
| 
      
 301 
     | 
    
         
            +
            # data is parsed to a json string
         
     | 
| 
      
 302 
     | 
    
         
            +
            JSON::Validator.validate(schema, '"https://api.github.com"', :json => true) # returns true
         
     | 
| 
      
 303 
     | 
    
         
            +
             
     | 
| 
      
 304 
     | 
    
         
            +
            # loads data from the uri
         
     | 
| 
      
 305 
     | 
    
         
            +
            JSON::Validator.validate(schema, 'https://api.github.com', :uri => true) # returns false
         
     | 
| 
      
 306 
     | 
    
         
            +
            </pre>
         
     | 
| 
       280 
307 
     | 
    
         | 
| 
       281 
308 
     | 
    
         
             
            h3. Extend an existing schema and validate against it
         
     | 
| 
       282 
309 
     | 
    
         | 
| 
         @@ -332,7 +359,7 @@ JSON::Validator.validate(schema,data) # => false 
     | 
|
| 
       332 
359 
     | 
    
         | 
| 
       333 
360 
     | 
    
         
             
            h3. Custom format validation
         
     | 
| 
       334 
361 
     | 
    
         | 
| 
       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  
     | 
| 
      
 362 
     | 
    
         
            +
            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 name, e.g. "The property '#a'":
         
     | 
| 
       336 
363 
     | 
    
         | 
| 
       337 
364 
     | 
    
         
             
            <pre>
         
     | 
| 
       338 
365 
     | 
    
         
             
            require 'rubygems'
         
     | 
| 
         @@ -370,6 +397,30 @@ errors = JSON::Validator.fully_validate(schema, {"a" => "23"}) 
     | 
|
| 
       370 
397 
     | 
    
         | 
| 
       371 
398 
     | 
    
         
             
            </pre>
         
     | 
| 
       372 
399 
     | 
    
         | 
| 
      
 400 
     | 
    
         
            +
            h2. Controlling Remote Schema Reading
         
     | 
| 
      
 401 
     | 
    
         
            +
             
     | 
| 
      
 402 
     | 
    
         
            +
            In some cases, you may wish to prevent the JSON Schema library from making HTTP calls or reading local files in order to resolve <code>$ref</code> schemas. If you fully control all schemas which should be used by validation, this could be accomplished by registering all referenced schemas with the validator in advance:
         
     | 
| 
      
 403 
     | 
    
         
            +
             
     | 
| 
      
 404 
     | 
    
         
            +
            <pre>
         
     | 
| 
      
 405 
     | 
    
         
            +
            schema = JSON::Schema.new(some_schema_definition, Addressable::URI.parse('http://example.com/my-schema'))
         
     | 
| 
      
 406 
     | 
    
         
            +
            JSON::Validator.add_schema(schema)
         
     | 
| 
      
 407 
     | 
    
         
            +
            </pre>
         
     | 
| 
      
 408 
     | 
    
         
            +
             
     | 
| 
      
 409 
     | 
    
         
            +
            If more extensive control is necessary, the <code>JSON::Schema::Reader</code> instance used can be configured in a few ways:
         
     | 
| 
      
 410 
     | 
    
         
            +
             
     | 
| 
      
 411 
     | 
    
         
            +
            <pre>
         
     | 
| 
      
 412 
     | 
    
         
            +
            # Change the default schema reader used
         
     | 
| 
      
 413 
     | 
    
         
            +
            JSON::Validator.schema_reader = JSON::Schema::Reader.new(:accept_uri => true, :accept_file => false)
         
     | 
| 
      
 414 
     | 
    
         
            +
             
     | 
| 
      
 415 
     | 
    
         
            +
            # For this validation call, use a reader which only accepts URIs from my-website.com
         
     | 
| 
      
 416 
     | 
    
         
            +
            schema_reader = JSON::Schema::Reader.new(
         
     | 
| 
      
 417 
     | 
    
         
            +
              :accept_uri => proc { |uri| uri.host == 'my-website.com' }
         
     | 
| 
      
 418 
     | 
    
         
            +
            )
         
     | 
| 
      
 419 
     | 
    
         
            +
            JSON::Validator.validate(some_schema, some_object, :schema_reader => schema_reader)
         
     | 
| 
      
 420 
     | 
    
         
            +
            </pre>
         
     | 
| 
      
 421 
     | 
    
         
            +
             
     | 
| 
      
 422 
     | 
    
         
            +
            The <code>JSON::Schema::Reader</code> interface requires only an object which responds to <code>read(string)</code> and returns a <code>JSON::Schema</code> instance. See the "API documentation":http://www.rubydoc.info/github/ruby-json-schema/json-schema/master/JSON/Schema/Reader for more information.
         
     | 
| 
      
 423 
     | 
    
         
            +
             
     | 
| 
       373 
424 
     | 
    
         
             
            h2. JSON Backends
         
     | 
| 
       374 
425 
     | 
    
         | 
| 
       375 
426 
     | 
    
         
             
            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.
         
     | 
    
        data/lib/json-schema.rb
    CHANGED
    
    | 
         @@ -9,9 +9,11 @@ if Gem::Specification::find_all_by_name('multi_json').any? 
     | 
|
| 
       9 
9 
     | 
    
         
             
            end
         
     | 
| 
       10 
10 
     | 
    
         | 
| 
       11 
11 
     | 
    
         
             
            require 'json-schema/util/array_set'
         
     | 
| 
      
 12 
     | 
    
         
            +
            require 'json-schema/util/uri'
         
     | 
| 
       12 
13 
     | 
    
         
             
            require 'json-schema/schema'
         
     | 
| 
      
 14 
     | 
    
         
            +
            require 'json-schema/schema/reader'
         
     | 
| 
       13 
15 
     | 
    
         
             
            require 'json-schema/validator'
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
       14 
17 
     | 
    
         
             
            Dir[File.join(File.dirname(__FILE__), "json-schema/attributes/*.rb")].each {|file| require file }
         
     | 
| 
       15 
18 
     | 
    
         
             
            Dir[File.join(File.dirname(__FILE__), "json-schema/attributes/formats/*.rb")].each {|file| require file }
         
     | 
| 
       16 
19 
     | 
    
         
             
            Dir[File.join(File.dirname(__FILE__), "json-schema/validators/*.rb")].sort!.each {|file| require file }
         
     | 
| 
       17 
     | 
    
         
            -
            require 'json-schema/uri/file'
         
     | 
| 
         @@ -4,19 +4,22 @@ module JSON 
     | 
|
| 
       4 
4 
     | 
    
         
             
              class Schema
         
     | 
| 
       5 
5 
     | 
    
         
             
                class AdditionalItemsAttribute < Attribute
         
     | 
| 
       6 
6 
     | 
    
         
             
                  def self.validate(current_schema, data, fragments, processor, validator, options = {})
         
     | 
| 
       7 
     | 
    
         
            -
                     
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
      
 7 
     | 
    
         
            +
                    return unless data.is_a?(Array)
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
                    schema = current_schema.schema
         
     | 
| 
      
 10 
     | 
    
         
            +
                    return unless schema['items'].is_a?(Array)
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                    case schema['additionalItems']
         
     | 
| 
      
 13 
     | 
    
         
            +
                    when false
         
     | 
| 
      
 14 
     | 
    
         
            +
                      if schema['items'].length != data.length
         
     | 
| 
       9 
15 
     | 
    
         
             
                        message = "The property '#{build_fragment(fragments)}' contains additional array elements outside of the schema when none are allowed"
         
     | 
| 
       10 
16 
     | 
    
         
             
                        validation_error(processor, message, fragments, current_schema, self, options[:record_errors])
         
     | 
| 
       11 
     | 
    
         
            -
                       
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
                            fragments.pop
         
     | 
| 
       18 
     | 
    
         
            -
                          end
         
     | 
| 
       19 
     | 
    
         
            -
                        end
         
     | 
| 
      
 17 
     | 
    
         
            +
                      end
         
     | 
| 
      
 18 
     | 
    
         
            +
                    when Hash
         
     | 
| 
      
 19 
     | 
    
         
            +
                      additional_items_schema = JSON::Schema.new(schema['additionalItems'], current_schema.uri, validator)
         
     | 
| 
      
 20 
     | 
    
         
            +
                      data.each_with_index do |item, i|
         
     | 
| 
      
 21 
     | 
    
         
            +
                        next if i < schema['items'].length
         
     | 
| 
      
 22 
     | 
    
         
            +
                        additional_items_schema.validate(item, fragments + [i.to_s], processor, options)
         
     | 
| 
       20 
23 
     | 
    
         
             
                      end
         
     | 
| 
       21 
24 
     | 
    
         
             
                    end
         
     | 
| 
       22 
25 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -5,62 +5,52 @@ module JSON 
     | 
|
| 
       5 
5 
     | 
    
         
             
              class Schema
         
     | 
| 
       6 
6 
     | 
    
         
             
                class AdditionalPropertiesAttribute < Attribute
         
     | 
| 
       7 
7 
     | 
    
         
             
                  def self.validate(current_schema, data, fragments, processor, validator, options = {})
         
     | 
| 
       8 
     | 
    
         
            -
                     
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
                        current_schema.schema['type'].is_a?(String) &&
         
     | 
| 
       11 
     | 
    
         
            -
                        current_schema.schema['type'].downcase == 'object'
         
     | 
| 
       12 
     | 
    
         
            -
                      )
         
     | 
| 
       13 
     | 
    
         
            -
                    )
         
     | 
| 
       14 
     | 
    
         
            -
                      extra_properties = data.keys
         
     | 
| 
       15 
     | 
    
         
            -
                      extra_properties = remove_valid_properties(extra_properties, current_schema, validator)
         
     | 
| 
      
 8 
     | 
    
         
            +
                    schema = current_schema.schema
         
     | 
| 
      
 9 
     | 
    
         
            +
                    return unless data.is_a?(Hash) && (schema['type'].nil? || schema['type'] == 'object')
         
     | 
| 
       16 
10 
     | 
    
         | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
       25 
     | 
    
         
            -
                        end
         
     | 
| 
       26 
     | 
    
         
            -
                        extra_properties -= matching_properties
         
     | 
| 
       27 
     | 
    
         
            -
                      end
         
     | 
| 
       28 
     | 
    
         
            -
                      if !extra_properties.empty? and (addprop == false or (addprop.is_a?(Hash) and !addprop.empty?))
         
     | 
| 
       29 
     | 
    
         
            -
                        message = "The property '#{build_fragment(fragments)}' contains additional properties #{extra_properties.inspect} outside of the schema when none are allowed"
         
     | 
| 
       30 
     | 
    
         
            -
                        validation_error(processor, message, fragments, current_schema, self, options[:record_errors])
         
     | 
| 
      
 11 
     | 
    
         
            +
                    extra_properties = remove_valid_properties(data.keys, current_schema, validator)
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                    addprop = schema['additionalProperties']
         
     | 
| 
      
 14 
     | 
    
         
            +
                    if addprop.is_a?(Hash)
         
     | 
| 
      
 15 
     | 
    
         
            +
                      matching_properties = extra_properties # & addprop.keys
         
     | 
| 
      
 16 
     | 
    
         
            +
                      matching_properties.each do |key|
         
     | 
| 
      
 17 
     | 
    
         
            +
                        additional_property_schema = JSON::Schema.new(addprop[key] || addprop, current_schema.uri, validator)
         
     | 
| 
      
 18 
     | 
    
         
            +
                        additional_property_schema.validate(data[key], fragments + [key], processor, options)
         
     | 
| 
       31 
19 
     | 
    
         
             
                      end
         
     | 
| 
      
 20 
     | 
    
         
            +
                      extra_properties -= matching_properties
         
     | 
| 
      
 21 
     | 
    
         
            +
                    end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                    if extra_properties.any? && (addprop == false || (addprop.is_a?(Hash) && !addprop.empty?))
         
     | 
| 
      
 24 
     | 
    
         
            +
                      message = "The property '#{build_fragment(fragments)}' contains additional properties #{extra_properties.inspect} outside of the schema when none are allowed"
         
     | 
| 
      
 25 
     | 
    
         
            +
                      validation_error(processor, message, fragments, current_schema, self, options[:record_errors])
         
     | 
| 
       32 
26 
     | 
    
         
             
                    end
         
     | 
| 
       33 
27 
     | 
    
         
             
                  end
         
     | 
| 
       34 
28 
     | 
    
         | 
| 
       35 
29 
     | 
    
         
             
                  def self.remove_valid_properties(extra_properties, current_schema, validator)
         
     | 
| 
      
 30 
     | 
    
         
            +
                    schema = current_schema.schema
         
     | 
| 
       36 
31 
     | 
    
         | 
| 
       37 
     | 
    
         
            -
             
     | 
| 
       38 
     | 
    
         
            -
             
     | 
| 
       39 
     | 
    
         
            -
             
     | 
| 
      
 32 
     | 
    
         
            +
                    if schema['properties']
         
     | 
| 
      
 33 
     | 
    
         
            +
                      extra_properties = extra_properties - schema['properties'].keys
         
     | 
| 
      
 34 
     | 
    
         
            +
                    end
         
     | 
| 
       40 
35 
     | 
    
         | 
| 
       41 
     | 
    
         
            -
             
     | 
| 
       42 
     | 
    
         
            -
             
     | 
| 
       43 
     | 
    
         
            -
             
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
       45 
     | 
    
         
            -
                          extras_clone.each do |prop|
         
     | 
| 
       46 
     | 
    
         
            -
                            if r.match(prop)
         
     | 
| 
       47 
     | 
    
         
            -
                              extra_properties = extra_properties - [prop]
         
     | 
| 
       48 
     | 
    
         
            -
                            end
         
     | 
| 
       49 
     | 
    
         
            -
                          end
         
     | 
| 
       50 
     | 
    
         
            -
                        end
         
     | 
| 
      
 36 
     | 
    
         
            +
                    if schema['patternProperties']
         
     | 
| 
      
 37 
     | 
    
         
            +
                      schema['patternProperties'].each_key do |key|
         
     | 
| 
      
 38 
     | 
    
         
            +
                        regexp = Regexp.new(key)
         
     | 
| 
      
 39 
     | 
    
         
            +
                        extra_properties.reject! { |prop| regexp.match(prop) }
         
     | 
| 
       51 
40 
     | 
    
         
             
                      end
         
     | 
| 
      
 41 
     | 
    
         
            +
                    end
         
     | 
| 
       52 
42 
     | 
    
         | 
| 
       53 
     | 
    
         
            -
             
     | 
| 
       54 
     | 
    
         
            -
             
     | 
| 
       55 
     | 
    
         
            -
             
     | 
| 
       56 
     | 
    
         
            -
             
     | 
| 
       57 
     | 
    
         
            -
             
     | 
| 
       58 
     | 
    
         
            -
             
     | 
| 
       59 
     | 
    
         
            -
                          end
         
     | 
| 
      
 43 
     | 
    
         
            +
                    if extended_schemas = schema['extends']
         
     | 
| 
      
 44 
     | 
    
         
            +
                      extended_schemas = [extended_schemas] unless extended_schemas.is_a?(Array)
         
     | 
| 
      
 45 
     | 
    
         
            +
                      extended_schemas.each do |schema_value|
         
     | 
| 
      
 46 
     | 
    
         
            +
                        _, extended_schema = JSON::Schema::ExtendsAttribute.get_extended_uri_and_schema(schema_value, current_schema, validator)
         
     | 
| 
      
 47 
     | 
    
         
            +
                        if extended_schema
         
     | 
| 
      
 48 
     | 
    
         
            +
                          extra_properties = remove_valid_properties(extra_properties, extended_schema, validator)
         
     | 
| 
       60 
49 
     | 
    
         
             
                        end
         
     | 
| 
       61 
50 
     | 
    
         
             
                      end
         
     | 
| 
      
 51 
     | 
    
         
            +
                    end
         
     | 
| 
       62 
52 
     | 
    
         | 
| 
       63 
     | 
    
         
            -
             
     | 
| 
      
 53 
     | 
    
         
            +
                    extra_properties
         
     | 
| 
       64 
54 
     | 
    
         
             
                  end
         
     | 
| 
       65 
55 
     | 
    
         | 
| 
       66 
56 
     | 
    
         
             
                end
         
     | 
| 
         @@ -8,6 +8,8 @@ module JSON 
     | 
|
| 
       8 
8 
     | 
    
         
             
                    errors = Hash.new { |hsh, k| hsh[k] = [] }
         
     | 
| 
       9 
9 
     | 
    
         
             
                    valid = false
         
     | 
| 
       10 
10 
     | 
    
         | 
| 
      
 11 
     | 
    
         
            +
                    original_data = data.is_a?(Hash) ? data.clone : data
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
       11 
13 
     | 
    
         
             
                    current_schema.schema['anyOf'].each_with_index do |element, schema_index|
         
     | 
| 
       12 
14 
     | 
    
         
             
                      schema = JSON::Schema.new(element,current_schema.uri,validator)
         
     | 
| 
       13 
15 
     | 
    
         | 
| 
         @@ -30,6 +32,8 @@ module JSON 
     | 
|
| 
       30 
32 
     | 
    
         
             
                      end
         
     | 
| 
       31 
33 
     | 
    
         | 
| 
       32 
34 
     | 
    
         
             
                      break if valid
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
                      data = original_data
         
     | 
| 
       33 
37 
     | 
    
         
             
                    end
         
     | 
| 
       34 
38 
     | 
    
         | 
| 
       35 
39 
     | 
    
         
             
                    if !valid
         
     | 
| 
         @@ -4,29 +4,41 @@ module JSON 
     | 
|
| 
       4 
4 
     | 
    
         
             
              class Schema
         
     | 
| 
       5 
5 
     | 
    
         
             
                class DependenciesAttribute < Attribute
         
     | 
| 
       6 
6 
     | 
    
         
             
                  def self.validate(current_schema, data, fragments, processor, validator, options = {})
         
     | 
| 
       7 
     | 
    
         
            -
                     
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
                                validation_error(processor, message, fragments, current_schema, self, options[:record_errors])
         
     | 
| 
       20 
     | 
    
         
            -
                              end
         
     | 
| 
       21 
     | 
    
         
            -
                            end
         
     | 
| 
       22 
     | 
    
         
            -
                          else
         
     | 
| 
       23 
     | 
    
         
            -
                            schema = JSON::Schema.new(dependency_value,current_schema.uri,validator)
         
     | 
| 
       24 
     | 
    
         
            -
                            schema.validate(data, fragments, processor, options)
         
     | 
| 
       25 
     | 
    
         
            -
                          end
         
     | 
| 
      
 7 
     | 
    
         
            +
                    return unless data.is_a?(Hash)
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
                    current_schema.schema['dependencies'].each do |property, dependency_value|
         
     | 
| 
      
 10 
     | 
    
         
            +
                      next unless data.has_key?(property.to_s)
         
     | 
| 
      
 11 
     | 
    
         
            +
                      next unless accept_value?(dependency_value)
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                      case dependency_value
         
     | 
| 
      
 14 
     | 
    
         
            +
                      when String
         
     | 
| 
      
 15 
     | 
    
         
            +
                        validate_dependency(current_schema, data, property, dependency_value, fragments, processor, self, options)
         
     | 
| 
      
 16 
     | 
    
         
            +
                      when Array
         
     | 
| 
      
 17 
     | 
    
         
            +
                        dependency_value.each do |value|
         
     | 
| 
      
 18 
     | 
    
         
            +
                          validate_dependency(current_schema, data, property, value, fragments, processor, self, options)
         
     | 
| 
       26 
19 
     | 
    
         
             
                        end
         
     | 
| 
      
 20 
     | 
    
         
            +
                      else
         
     | 
| 
      
 21 
     | 
    
         
            +
                        schema = JSON::Schema.new(dependency_value, current_schema.uri, validator)
         
     | 
| 
      
 22 
     | 
    
         
            +
                        schema.validate(data, fragments, processor, options)
         
     | 
| 
       27 
23 
     | 
    
         
             
                      end
         
     | 
| 
       28 
24 
     | 
    
         
             
                    end
         
     | 
| 
       29 
25 
     | 
    
         
             
                  end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                  def self.validate_dependency(schema, data, property, value, fragments, processor, attribute, options)
         
     | 
| 
      
 28 
     | 
    
         
            +
                    return if data.key?(value.to_s)
         
     | 
| 
      
 29 
     | 
    
         
            +
                    message = "The property '#{build_fragment(fragments)}' has a property '#{property}' that depends on a missing property '#{value}'"
         
     | 
| 
      
 30 
     | 
    
         
            +
                    validation_error(processor, message, fragments, schema, attribute, options[:record_errors])
         
     | 
| 
      
 31 
     | 
    
         
            +
                  end
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                  def self.accept_value?(value)
         
     | 
| 
      
 34 
     | 
    
         
            +
                    value.is_a?(String) || value.is_a?(Array) || value.is_a?(Hash)
         
     | 
| 
      
 35 
     | 
    
         
            +
                  end
         
     | 
| 
      
 36 
     | 
    
         
            +
                end
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
                class DependenciesV4Attribute < DependenciesAttribute
         
     | 
| 
      
 39 
     | 
    
         
            +
                  def self.accept_value?(value)
         
     | 
| 
      
 40 
     | 
    
         
            +
                    value.is_a?(Array) || value.is_a?(Hash)
         
     | 
| 
      
 41 
     | 
    
         
            +
                  end
         
     | 
| 
       30 
42 
     | 
    
         
             
                end
         
     | 
| 
       31 
43 
     | 
    
         
             
              end
         
     | 
| 
       32 
44 
     | 
    
         
             
            end
         
     | 
| 
         @@ -4,9 +4,8 @@ module JSON 
     | 
|
| 
       4 
4 
     | 
    
         
             
              class Schema
         
     | 
| 
       5 
5 
     | 
    
         
             
                class DisallowAttribute < Attribute
         
     | 
| 
       6 
6 
     | 
    
         
             
                  def self.validate(current_schema, data, fragments, processor, validator, options = {})
         
     | 
| 
       7 
     | 
    
         
            -
                     
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
                    end
         
     | 
| 
      
 7 
     | 
    
         
            +
                    return unless type = validator.attributes['type']
         
     | 
| 
      
 8 
     | 
    
         
            +
                    type.validate(current_schema, data, fragments, processor, validator, options.merge(:disallow => true))
         
     | 
| 
       10 
9 
     | 
    
         
             
                  end
         
     | 
| 
       11 
10 
     | 
    
         
             
                end
         
     | 
| 
       12 
11 
     | 
    
         
             
              end
         
     | 
| 
         @@ -3,14 +3,18 @@ require 'json-schema/attribute' 
     | 
|
| 
       3 
3 
     | 
    
         
             
            module JSON
         
     | 
| 
       4 
4 
     | 
    
         
             
              class Schema
         
     | 
| 
       5 
5 
     | 
    
         
             
                class DivisibleByAttribute < Attribute
         
     | 
| 
      
 6 
     | 
    
         
            +
                  def self.keyword
         
     | 
| 
      
 7 
     | 
    
         
            +
                    'divisibleBy'
         
     | 
| 
      
 8 
     | 
    
         
            +
                  end
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
       6 
10 
     | 
    
         
             
                  def self.validate(current_schema, data, fragments, processor, validator, options = {})
         
     | 
| 
       7 
     | 
    
         
            -
                     
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
                       
     | 
| 
      
 11 
     | 
    
         
            +
                    return unless data.is_a?(Numeric)
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                    factor = current_schema.schema[keyword]
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                    if factor == 0 || factor == 0.0 || (BigDecimal.new(data.to_s) % BigDecimal.new(factor.to_s)).to_f != 0
         
     | 
| 
      
 16 
     | 
    
         
            +
                      message = "The property '#{build_fragment(fragments)}' was not divisible by #{factor}"
         
     | 
| 
      
 17 
     | 
    
         
            +
                      validation_error(processor, message, fragments, current_schema, self, options[:record_errors])
         
     | 
| 
       14 
18 
     | 
    
         
             
                    end
         
     | 
| 
       15 
19 
     | 
    
         
             
                  end
         
     | 
| 
       16 
20 
     | 
    
         
             
                end
         
     | 
| 
         @@ -4,22 +4,20 @@ module JSON 
     | 
|
| 
       4 
4 
     | 
    
         
             
              class Schema
         
     | 
| 
       5 
5 
     | 
    
         
             
                class EnumAttribute < Attribute
         
     | 
| 
       6 
6 
     | 
    
         
             
                  def self.validate(current_schema, data, fragments, processor, validator, options = {})
         
     | 
| 
       7 
     | 
    
         
            -
                     
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
                      validation_error(processor, message, fragments, current_schema, self, options[:record_errors])
         
     | 
| 
       22 
     | 
    
         
            -
                    end
         
     | 
| 
      
 7 
     | 
    
         
            +
                    enum = current_schema.schema['enum']
         
     | 
| 
      
 8 
     | 
    
         
            +
                    return if enum.include?(data)
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
                    values = enum.map { |val|
         
     | 
| 
      
 11 
     | 
    
         
            +
                      case val
         
     | 
| 
      
 12 
     | 
    
         
            +
                      when nil   then 'null'
         
     | 
| 
      
 13 
     | 
    
         
            +
                      when Array then 'array'
         
     | 
| 
      
 14 
     | 
    
         
            +
                      when Hash  then 'object'
         
     | 
| 
      
 15 
     | 
    
         
            +
                      else val.to_s
         
     | 
| 
      
 16 
     | 
    
         
            +
                      end
         
     | 
| 
      
 17 
     | 
    
         
            +
                    }.join(', ')
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                    message = "The property '#{build_fragment(fragments)}' value #{data.inspect} did not match one of the following values: #{values}"
         
     | 
| 
      
 20 
     | 
    
         
            +
                    validation_error(processor, message, fragments, current_schema, self, options[:record_errors])
         
     | 
| 
       23 
21 
     | 
    
         
             
                  end
         
     | 
| 
       24 
22 
     | 
    
         
             
                end
         
     | 
| 
       25 
23 
     | 
    
         
             
              end
         
     | 
| 
         @@ -1,16 +1,13 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require 'json-schema/attribute'
         
     | 
| 
       2 
     | 
    
         
            -
            require 'uri'
         
     | 
| 
       3 
2 
     | 
    
         | 
| 
       4 
3 
     | 
    
         
             
            module JSON
         
     | 
| 
       5 
4 
     | 
    
         
             
              class Schema
         
     | 
| 
       6 
5 
     | 
    
         
             
                class FormatAttribute < Attribute
         
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
6 
     | 
    
         
             
                  def self.validate(current_schema, data, fragments, processor, validator, options = {})
         
     | 
| 
       9 
     | 
    
         
            -
                     
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
                    end
         
     | 
| 
      
 7 
     | 
    
         
            +
                    return unless data_valid_for_type?(data, current_schema.schema['type'])
         
     | 
| 
      
 8 
     | 
    
         
            +
                    format = current_schema.schema['format'].to_s
         
     | 
| 
      
 9 
     | 
    
         
            +
                    validator = validator.formats[format]
         
     | 
| 
      
 10 
     | 
    
         
            +
                    validator.validate(current_schema, data, fragments, processor, validator, options) unless validator.nil?
         
     | 
| 
       14 
11 
     | 
    
         
             
                  end
         
     | 
| 
       15 
12 
     | 
    
         
             
                end
         
     | 
| 
       16 
13 
     | 
    
         
             
              end
         
     | 
| 
         @@ -4,14 +4,11 @@ module JSON 
     | 
|
| 
       4 
4 
     | 
    
         
             
              class Schema
         
     | 
| 
       5 
5 
     | 
    
         
             
                class DateTimeV4Format < FormatAttribute
         
     | 
| 
       6 
6 
     | 
    
         
             
                  def self.validate(current_schema, data, fragments, processor, validator, options = {})
         
     | 
| 
       7 
     | 
    
         
            -
                     
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
                        validation_error(processor, error_message, fragments, current_schema, self, options[:record_errors])
         
     | 
| 
       13 
     | 
    
         
            -
                      end
         
     | 
| 
       14 
     | 
    
         
            -
                    end
         
     | 
| 
      
 7 
     | 
    
         
            +
                    return unless data.is_a?(String)
         
     | 
| 
      
 8 
     | 
    
         
            +
                    DateTime.rfc3339(data)
         
     | 
| 
      
 9 
     | 
    
         
            +
                  rescue ArgumentError
         
     | 
| 
      
 10 
     | 
    
         
            +
                    error_message = "The property '#{build_fragment(fragments)}' must be a valid RFC3339 date/time string"
         
     | 
| 
      
 11 
     | 
    
         
            +
                    validation_error(processor, error_message, fragments, current_schema, self, options[:record_errors])
         
     | 
| 
       15 
12 
     | 
    
         
             
                  end
         
     | 
| 
       16 
13 
     | 
    
         
             
                end
         
     | 
| 
       17 
14 
     | 
    
         
             
              end
         
     |