From 044ecd1f71416f3906cb7f1a6872da5582ec5ffe Mon Sep 17 00:00:00 2001 From: exoego Date: Thu, 28 Mar 2024 14:55:16 +0900 Subject: [PATCH] Extract common function --- lib/rspec/openapi.rb | 1 + lib/rspec/openapi/key_transformer.rb | 25 +++++++++++++++++++++++++ lib/rspec/openapi/schema_file.rb | 25 ++----------------------- lib/rspec/openapi/schema_merger.rb | 17 ++--------------- 4 files changed, 30 insertions(+), 38 deletions(-) create mode 100644 lib/rspec/openapi/key_transformer.rb diff --git a/lib/rspec/openapi.rb b/lib/rspec/openapi.rb index 898b731..995093b 100644 --- a/lib/rspec/openapi.rb +++ b/lib/rspec/openapi.rb @@ -10,6 +10,7 @@ require 'rspec/openapi/schema_merger' require 'rspec/openapi/schema_cleaner' require 'rspec/openapi/schema_sorter' +require 'rspec/openapi/key_transformer' require 'rspec/openapi/minitest_hooks' if Object.const_defined?('Minitest') require 'rspec/openapi/rspec_hooks' if ENV['OPENAPI'] && Object.const_defined?('RSpec') diff --git a/lib/rspec/openapi/key_transformer.rb b/lib/rspec/openapi/key_transformer.rb new file mode 100644 index 0000000..dcf5924 --- /dev/null +++ b/lib/rspec/openapi/key_transformer.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +class << RSpec::OpenAPI::KeyTransformer = Object.new + def symbolize(value) + case value + when Hash + value.to_h { |k, v| [k.to_sym, symbolize(v)] } + when Array + value.map { |v| symbolize(v) } + else + value + end + end + + def stringify(value) + case value + when Hash + value.to_h { |k, v| [k.to_s, stringify(v)] } + when Array + value.map { |v| stringify(v) } + else + value + end + end +end diff --git a/lib/rspec/openapi/schema_file.rb b/lib/rspec/openapi/schema_file.rb index bea640f..0dc378f 100644 --- a/lib/rspec/openapi/schema_file.rb +++ b/lib/rspec/openapi/schema_file.rb @@ -15,7 +15,7 @@ def edit(&block) spec = read block.call(spec) ensure - write(stringify(spec)) + write(RSpec::OpenAPI::KeyTransformer::stringify(spec)) end private @@ -24,30 +24,9 @@ def edit(&block) def read return {} unless File.exist?(@path) - symbolize(YAML.safe_load(File.read(@path))) # this can also parse JSON + RSpec::OpenAPI::KeyTransformer::symbolize(YAML.safe_load(File.read(@path))) # this can also parse JSON end - def symbolize(value) - case value - when Hash - value.to_h { |k, v| [k.to_sym, symbolize(v)] } - when Array - value.map { |v| symbolize(v) } - else - value - end - end - - def stringify(value) - case value - when Hash - value.to_h { |k, v| [k.to_s, stringify(v)] } - when Array - value.map { |v| stringify(v) } - else - value - end - end # @param [Hash] spec def write(spec) diff --git a/lib/rspec/openapi/schema_merger.rb b/lib/rspec/openapi/schema_merger.rb index 00f92a8..192ee1a 100644 --- a/lib/rspec/openapi/schema_merger.rb +++ b/lib/rspec/openapi/schema_merger.rb @@ -4,26 +4,13 @@ class << RSpec::OpenAPI::SchemaMerger = Object.new # @param [Hash] base # @param [Hash] spec def merge!(base, spec) - spec = normalize_keys(spec) - base.replace(normalize_keys(base)) + spec = RSpec::OpenAPI::KeyTransformer::symbolize(spec) + base.replace(RSpec::OpenAPI::KeyTransformer::symbolize(base)) merge_schema!(base, spec) end private - def normalize_keys(spec) - case spec - when Hash - spec.to_h do |key, value| - [key.to_sym, normalize_keys(value)] - end - when Array - spec.map { |s| normalize_keys(s) } - else - spec - end - end - # Not doing `base.replace(deep_merge(base, spec))` to preserve key orders. # Also this needs to be aware of OpenAPI details because a Hash-like structure # may be an array whose Hash elements have a key name.