Class: JSONSchemer::Schema

Inherits:
Object
  • Object
show all
Defined in:
lib/json_schemer.rb

Constant Summary collapse

BOOLEANS =
Set[true, false].freeze

Instance Method Summary collapse

Constructor Details

#initialize(schema) ⇒ Schema

Returns a new instance of Schema.



20
21
22
# File 'lib/json_schemer.rb', line 20

def initialize(schema)
  @root = schema
end

Instance Method Details

#valid?(data, schema = root, pointer = '#', parent_uri = nil) ⇒ Boolean

Returns:

  • (Boolean)


24
25
26
# File 'lib/json_schemer.rb', line 24

def valid?(data, schema = root, pointer = '#', parent_uri = nil)
  validate(data, schema, pointer, parent_uri).none?
end

#validate(data, schema = root, pointer = '#', parent_uri = nil) {|error(data, schema, pointer, 'enum')| ... } ⇒ Object

Yields:

  • (error(data, schema, pointer, 'enum'))


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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/json_schemer.rb', line 28

def validate(data, schema = root, pointer = '#', parent_uri = nil)
  return enum_for(:validate, data, schema, pointer, parent_uri) unless block_given?

  return if schema == true
  if schema == false
    yield error(data, schema, pointer, 'schema')
    return
  end

  return if schema.empty?

  type = schema['type']
  enum = schema['enum']
  all_of = schema['allOf']
  any_of = schema['anyOf']
  one_of = schema['oneOf']
  not_schema = schema['not']
  if_schema = schema['if']
  then_schema = schema['then']
  else_schema = schema['else']
  ref = schema['$ref']
  id = schema['$id']

  parent_uri = join_uri(parent_uri, id)

  if ref
    validate_ref(data, schema, pointer, parent_uri, ref, &Proc.new)
    return
  end

  yield error(data, schema, pointer, 'enum') if enum && !enum.include?(data)
  yield error(data, schema, pointer, 'const') if schema.key?('const') && schema['const'] != data

  yield error(data, schema, pointer, 'allOf') if all_of && !all_of.all? { |subschema| valid?(data, subschema, pointer, parent_uri) }
  yield error(data, schema, pointer, 'anyOf') if any_of && !any_of.any? { |subschema| valid?(data, subschema, pointer, parent_uri) }
  yield error(data, schema, pointer, 'oneOf') if one_of && !one_of.one? { |subschema| valid?(data, subschema, pointer, parent_uri) }
  yield error(data, schema, pointer, 'not') if !not_schema.nil? && valid?(data, not_schema, pointer, parent_uri)

  if if_schema && valid?(data, if_schema, pointer, parent_uri)
    yield error(data, schema, pointer, 'then') if !then_schema.nil? && !valid?(data, then_schema, pointer, parent_uri)
  elsif if_schema
    yield error(data, schema, pointer, 'else') if !else_schema.nil? && !valid?(data, else_schema, pointer, parent_uri)
  end

  case type
  when nil
    validate_class(data, schema, pointer, parent_uri, &Proc.new)
  when String
    validate_type(data, schema, pointer, parent_uri, type, &Proc.new)
  when Array
    if valid_type = type.find { |subtype| valid?(data, { 'type' => subtype }, pointer, parent_uri) }
      validate_type(data, schema, pointer, parent_uri, valid_type, &Proc.new)
    else
      yield error(data, schema, pointer, 'type')
    end
  end
end