Class: JSONSchemer::Draft202012::Vocab::Applicator::AdditionalProperties

Inherits:
Keyword
  • Object
show all
Defined in:
lib/json_schemer/draft202012/vocab/applicator.rb

Constant Summary

Constants included from Output

Output::FRAGMENT_ENCODE_REGEX

Instance Attribute Summary

Attributes inherited from Keyword

#parent, #parsed, #root, #value

Attributes included from Output

#keyword, #schema

Instance Method Summary collapse

Methods inherited from Keyword

#absolute_keyword_location, #error_key, #fetch, #initialize, #parsed_schema, #schema_pointer

Methods included from Output

#x_error

Constructor Details

This class inherits a constructor from JSONSchemer::Keyword

Instance Method Details

#error(formatted_instance_location:) ⇒ Object



298
299
300
# File 'lib/json_schemer/draft202012/vocab/applicator.rb', line 298

def error(formatted_instance_location:, **)
  "object properties at #{formatted_instance_location} do not match `additionalProperties` schema"
end

#false_schema_error(formatted_instance_location:) ⇒ Object



302
303
304
# File 'lib/json_schemer/draft202012/vocab/applicator.rb', line 302

def false_schema_error(formatted_instance_location:, **)
  "object property at #{formatted_instance_location} is a disallowed additional property"
end

#parseObject



306
307
308
# File 'lib/json_schemer/draft202012/vocab/applicator.rb', line 306

def parse
  subschema(value)
end

#validate(instance, instance_location, keyword_location, context) ⇒ Object



310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
# File 'lib/json_schemer/draft202012/vocab/applicator.rb', line 310

def validate(instance, instance_location, keyword_location, context)
  return result(instance, instance_location, keyword_location, true) unless instance.is_a?(Hash)

  evaluated_keys = context.adjacent_results[Properties]&.annotation || []
  evaluated_keys += context.adjacent_results[PatternProperties]&.annotation || []
  evaluated_keys = evaluated_keys.to_set

  evaluated = instance.reject do |key, _value|
    evaluated_keys.include?(key)
  end

  nested = evaluated.map do |key, value|
    parsed.validate_instance(value, join_location(instance_location, key), keyword_location, context)
  end

  result(instance, instance_location, keyword_location, nested.all?(&:valid), nested, :annotation => evaluated.keys)
end