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