Skip to content

Commit

Permalink
Merge pull request #164 from davishmcclurg/unevaluated-properties
Browse files Browse the repository at this point in the history
Consider all siblings in `unevaluated` keywords
  • Loading branch information
davishmcclurg authored Jan 20, 2024
2 parents e947f2a + e512f76 commit ead0180
Show file tree
Hide file tree
Showing 6 changed files with 389 additions and 2,355 deletions.
2 changes: 1 addition & 1 deletion lib/json_schemer/draft202012/vocab/applicator.rb
Original file line number Diff line number Diff line change
Expand Up @@ -300,7 +300,7 @@ def error(formatted_instance_location:, **)
end

def false_schema_error(formatted_instance_location:, **)
"object property at #{formatted_instance_location} is not defined and schema does not allow additional properties"
"object property at #{formatted_instance_location} is a disallowed additional property"
end

def parse
Expand Down
26 changes: 18 additions & 8 deletions lib/json_schemer/draft202012/vocab/unevaluated.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@ def error(formatted_instance_location:, **)
"array items at #{formatted_instance_location} do not match `unevaluatedItems` schema"
end

def false_schema_error(formatted_instance_location:, **)
"array item at #{formatted_instance_location} is a disallowed unevaluated item"
end

def parse
subschema(value)
end
Expand All @@ -18,7 +22,7 @@ def validate(instance, instance_location, keyword_location, context)
unevaluated_items = instance.size.times.to_set

context.adjacent_results.each_value do |adjacent_result|
collect_unevaluated_items(adjacent_result, instance_location, unevaluated_items)
collect_unevaluated_items(adjacent_result, unevaluated_items)
end

nested = unevaluated_items.map do |index|
Expand All @@ -30,8 +34,7 @@ def validate(instance, instance_location, keyword_location, context)

private

def collect_unevaluated_items(result, instance_location, unevaluated_items)
return unless result.valid && result.instance_location == instance_location
def collect_unevaluated_items(result, unevaluated_items)
case result.source
when Applicator::PrefixItems
unevaluated_items.subtract(0..result.annotation)
Expand All @@ -41,7 +44,9 @@ def collect_unevaluated_items(result, instance_location, unevaluated_items)
unevaluated_items.subtract(result.annotation)
end
result.nested&.each do |subresult|
collect_unevaluated_items(subresult, instance_location, unevaluated_items)
if subresult.valid && subresult.instance_location == result.instance_location
collect_unevaluated_items(subresult, unevaluated_items)
end
end
end
end
Expand All @@ -51,6 +56,10 @@ def error(formatted_instance_location:, **)
"object properties at #{formatted_instance_location} do not match `unevaluatedProperties` schema"
end

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

def parse
subschema(value)
end
Expand All @@ -61,7 +70,7 @@ def validate(instance, instance_location, keyword_location, context)
evaluated_keys = Set[]

context.adjacent_results.each_value do |adjacent_result|
collect_evaluated_keys(adjacent_result, instance_location, evaluated_keys)
collect_evaluated_keys(adjacent_result, evaluated_keys)
end

evaluated = instance.reject do |key, _value|
Expand All @@ -77,14 +86,15 @@ def validate(instance, instance_location, keyword_location, context)

private

def collect_evaluated_keys(result, instance_location, evaluated_keys)
return unless result.valid && result.instance_location == instance_location
def collect_evaluated_keys(result, evaluated_keys)
case result.source
when Applicator::Properties, Applicator::PatternProperties, Applicator::AdditionalProperties, UnevaluatedProperties
evaluated_keys.merge(result.annotation)
end
result.nested&.each do |subresult|
collect_evaluated_keys(subresult, instance_location, evaluated_keys)
if subresult.valid && subresult.instance_location == result.instance_location
collect_evaluated_keys(subresult, evaluated_keys)
end
end
end
end
Expand Down
Loading

0 comments on commit ead0180

Please sign in to comment.