diff --git a/json_skooma.gemspec b/json_skooma.gemspec index f957529..b4bc266 100644 --- a/json_skooma.gemspec +++ b/json_skooma.gemspec @@ -29,5 +29,5 @@ Gem::Specification.new do |spec| spec.add_runtime_dependency "zeitwerk", "~> 2.6" spec.add_runtime_dependency "hana", "~> 1.3" spec.add_runtime_dependency "regexp_parser", "~> 2.0" - spec.add_runtime_dependency "uri-idna", "~> 0.1" + spec.add_runtime_dependency "uri-idna", "~> 0.2" end diff --git a/lib/json_skooma/dialects/draft201909.rb b/lib/json_skooma/dialects/draft201909.rb index 2920ced..040e5f4 100644 --- a/lib/json_skooma/dialects/draft201909.rb +++ b/lib/json_skooma/dialects/draft201909.rb @@ -36,11 +36,11 @@ def call(registry, assert_formats: false) Keywords::Draft201909::Items, Keywords::Draft201909::AdditionalItems, Keywords::Draft201909::UnevaluatedItems, + Keywords::Draft201909::UnevaluatedProperties, Keywords::Applicator::Contains, Keywords::Applicator::Properties, Keywords::Applicator::PatternProperties, Keywords::Applicator::AdditionalProperties, - Keywords::Unevaluated::UnevaluatedProperties, Keywords::Applicator::PropertyNames ) diff --git a/lib/json_skooma/keywords/draft_2019_09/unevaluated_items.rb b/lib/json_skooma/keywords/draft_2019_09/unevaluated_items.rb index 4aae83b..65b4c9b 100644 --- a/lib/json_skooma/keywords/draft_2019_09/unevaluated_items.rb +++ b/lib/json_skooma/keywords/draft_2019_09/unevaluated_items.rb @@ -10,7 +10,7 @@ class UnevaluatedItems < Base self.depends_on = %w[ items additionalItems if then else allOf anyOf oneOf not - $ref $dynamicRef + $ref $dynamicRef $recursiveRef ] LOOKUP_KEYWORDS = %w[items additionalItems unevaluatedItems].freeze diff --git a/lib/json_skooma/keywords/draft_2019_09/unevaluated_properties.rb b/lib/json_skooma/keywords/draft_2019_09/unevaluated_properties.rb new file mode 100644 index 0000000..343b25c --- /dev/null +++ b/lib/json_skooma/keywords/draft_2019_09/unevaluated_properties.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true + +module JSONSkooma + module Keywords + module Draft201909 + class UnevaluatedProperties < Base + self.key = "unevaluatedProperties" + self.instance_types = %w[object] + self.value_schema = :schema + self.depends_on = %w[ + properties patternProperties additionalProperties + if then else dependentSchemas allOf anyOf oneOf not + $ref $dynamicRef $recursiveRef + ] + + LOOKUP_KEYWORDS = %w[properties patternProperties additionalProperties unevaluatedProperties].freeze + + def evaluate(instance, result) + evaluated_names = Set.new + result.parent.collect_annotations(instance, keys: LOOKUP_KEYWORDS) do |node| + evaluated_names += node.annotation + end + + annotation = [] + error = [] + instance.each do |name, item| + next if evaluated_names.include?(name) + + if json.evaluate(item, result).passed? + annotation << name + else + error << name + # reset to success for the next iteration + result.success + end + end + + return result.failure(error) if error.any? + + result.annotate(annotation) + end + end + end + end +end diff --git a/lib/json_skooma/validators/idn_hostname.rb b/lib/json_skooma/validators/idn_hostname.rb index 908bcd9..219d60c 100644 --- a/lib/json_skooma/validators/idn_hostname.rb +++ b/lib/json_skooma/validators/idn_hostname.rb @@ -6,7 +6,8 @@ module JSONSkooma module Validators class IdnHostname < Base def call(data) - URI::IDNA.register(ulabel: data.value) + register_opts = data.value.ascii_only? ? {alabel: data.value} : {ulabel: data.value} + URI::IDNA.register(**register_opts) rescue URI::IDNA::Error => e raise FormatError, "#{data} is not a valid IDN hostname: #{e.message}" end diff --git a/spec/json_schema_test_suite b/spec/json_schema_test_suite index 95fe6ca..3dab98c 160000 --- a/spec/json_schema_test_suite +++ b/spec/json_schema_test_suite @@ -1 +1 @@ -Subproject commit 95fe6ca20a90a019f4538f3670b6dd49d91dfdee +Subproject commit 3dab98cae07f244afcb278c0b7a03c0d8975a3de