Class: JSON::Schema::TypeAttribute

Inherits:
Attribute
  • Object
show all
Defined in:
lib/json-schema/attributes/type.rb

Class Method Summary collapse

Methods inherited from Attribute

build_fragment, validation_error

Class Method Details

.validate(current_schema, data, fragments, validator, options = {}) ⇒ Object



4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/json-schema/attributes/type.rb', line 4

def self.validate(current_schema, data, fragments, validator, options = {})
  union = true

  if options[:disallow]
    types = current_schema.schema['disallow']
  else
    types = current_schema.schema['type']
  end

  if !types.is_a?(Array)
    types = [types]
    union = false
  end
  valid = false

  types.each do |type|
    if type.is_a?(String)
      case type
      when "string"
        valid = data.is_a?(String)
      when "number"
        valid = data.is_a?(Numeric)
      when "integer"
        valid = data.is_a?(Integer)
      when "boolean"
        valid = (data.is_a?(TrueClass) || data.is_a?(FalseClass))
      when "object"
        valid = data.is_a?(Hash)
      when "array"
        valid = data.is_a?(Array)
      when "null"
        valid = data.is_a?(NilClass)
      when "any"
        valid = true
      else
        valid = true
      end
    elsif type.is_a?(Hash) && union
      # Validate as a schema
      schema = JSON::Schema.new(type,current_schema.uri,validator)
      begin
        schema.validate(data,fragments,options)
        valid = true
      rescue ValidationError
        # We don't care that these schemas don't validate - we only care that one validated
      end
    end

    break if valid
  end

  if (options[:disallow])
    if valid
      message = "The property '#{build_fragment(fragments)}' matched one or more of the following types:"
      types.each {|type| message += type.is_a?(String) ? " #{type}," : " (schema)," }
      message.chop!
      validation_error(message, fragments, current_schema, options[:record_errors])
    end
  elsif !valid
    message = "The property '#{build_fragment(fragments)}' of type #{data.class} did not match one or more of the following types:"
    types.each {|type| message += type.is_a?(String) ? " #{type}," : " (schema)," }
    message.chop!
    validation_error(message, fragments, current_schema, options[:record_errors])
  end
end