From 752818c07dff826251c5ef872d3d2b8602fe66ff Mon Sep 17 00:00:00 2001 From: David Harsha Date: Mon, 27 Jan 2025 17:44:59 -0800 Subject: [PATCH] Refactor integer check into keyword class method --- lib/json_schemer/draft202012/vocab/validation.rb | 6 +++++- lib/json_schemer/draft4/vocab/validation.rb | 5 ++--- lib/json_schemer/openapi30/meta.rb | 4 ++-- lib/json_schemer/openapi31/meta.rb | 10 ++-------- 4 files changed, 11 insertions(+), 14 deletions(-) diff --git a/lib/json_schemer/draft202012/vocab/validation.rb b/lib/json_schemer/draft202012/vocab/validation.rb index 5a135f4d..050ccf47 100644 --- a/lib/json_schemer/draft202012/vocab/validation.rb +++ b/lib/json_schemer/draft202012/vocab/validation.rb @@ -4,6 +4,10 @@ module Draft202012 module Vocab module Validation class Type < Keyword + def self.valid_integer?(instance) + instance.is_a?(Numeric) && (instance.is_a?(Integer) || instance.floor == instance) + end + def error(formatted_instance_location:, **) case value when 'null' @@ -45,7 +49,7 @@ def valid_type(type, instance) when 'number' instance.is_a?(Numeric) when 'integer' - instance.is_a?(Numeric) && (instance.is_a?(Integer) || instance.floor == instance) + self.class.valid_integer?(instance) when 'string' instance.is_a?(String) when 'array' diff --git a/lib/json_schemer/draft4/vocab/validation.rb b/lib/json_schemer/draft4/vocab/validation.rb index eeee1c1f..e1fc3050 100644 --- a/lib/json_schemer/draft4/vocab/validation.rb +++ b/lib/json_schemer/draft4/vocab/validation.rb @@ -4,9 +4,8 @@ module Draft4 module Vocab module Validation class Type < Draft202012::Vocab::Validation::Type - private - def valid_type(type, instance) - type == 'integer' ? instance.is_a?(Integer) : super + def self.valid_integer?(instance) + instance.is_a?(Integer) end end diff --git a/lib/json_schemer/openapi30/meta.rb b/lib/json_schemer/openapi30/meta.rb index 3fc0f3fd..c66fae31 100644 --- a/lib/json_schemer/openapi30/meta.rb +++ b/lib/json_schemer/openapi30/meta.rb @@ -4,8 +4,8 @@ module OpenAPI30 BASE_URI = URI('json-schemer://openapi30/schema') # https://spec.openapis.org/oas/v3.0.3#data-types FORMATS = OpenAPI31::FORMATS.merge( - 'int32' => proc { |instance, _format| !instance.is_a?(Integer) || instance.floor.bit_length < 32 }, - 'int64' => proc { |instance, _format| !instance.is_a?(Integer) || instance.floor.bit_length < 64 }, + 'int32' => proc { |instance, _format| !Draft4::Vocab::Validation::Type.valid_integer?(instance) || instance.floor.bit_length < 32 }, + 'int64' => proc { |instance, _format| !Draft4::Vocab::Validation::Type.valid_integer?(instance) || instance.floor.bit_length < 64 }, 'byte' => proc { |instance, _value| !instance.is_a?(String) || ContentEncoding::BASE64.call(instance).first }, 'binary' => proc { |instance, _value| !instance.is_a?(String) || instance.encoding == Encoding::BINARY }, 'date' => Format::DATE diff --git a/lib/json_schemer/openapi31/meta.rb b/lib/json_schemer/openapi31/meta.rb index 5bc793e7..d460ab0f 100644 --- a/lib/json_schemer/openapi31/meta.rb +++ b/lib/json_schemer/openapi31/meta.rb @@ -4,14 +4,8 @@ module OpenAPI31 BASE_URI = URI('https://spec.openapis.org/oas/3.1/dialect/base') # https://spec.openapis.org/oas/v3.1.0#data-types FORMATS = { - 'int32' => proc do |instance, _format| - valid_type = instance.is_a?(Numeric) && (instance.is_a?(Integer) || instance.floor == instance) - !valid_type || instance.floor.bit_length < 32 - end, - 'int64' => proc do |instance, _format| - valid_type = instance.is_a?(Numeric) && (instance.is_a?(Integer) || instance.floor == instance) - !valid_type || instance.floor.bit_length < 64 - end, + 'int32' => proc { |instance, _format| !Draft202012::Vocab::Validation::Type.valid_integer?(instance) || instance.floor.bit_length < 32 }, + 'int64' => proc { |instance, _format| !Draft202012::Vocab::Validation::Type.valid_integer?(instance) || instance.floor.bit_length < 64 }, 'float' => proc { |instance, _format| !instance.is_a?(Numeric) || instance.is_a?(Float) }, 'double' => proc { |instance, _format| !instance.is_a?(Numeric) || instance.is_a?(Float) }, 'password' => proc { |_instance, _format| true }