module RSpec::OpenAPI::SchemaMerger

Public Class Methods

reverse_merge!(base, spec) click to toggle source

@param [Hash] base @param [Hash] spec

# File lib/rspec/openapi/schema_merger.rb, line 4
def reverse_merge!(base, spec)
  spec = normalize_keys(spec)
  deep_reverse_merge!(base, spec)
end

Private Class Methods

deep_reverse_merge!(base, spec) click to toggle source

Not doing `base.replace(deep_merge(base, spec))` to preserve key orders TODO: Perform more intelligent merges like rerouting edits / merging types Should we probably force-merge `summary` regardless of manual modifications?

# File lib/rspec/openapi/schema_merger.rb, line 27
def deep_reverse_merge!(base, spec)
  spec.each do |key, value|
    if base[key].is_a?(Hash) && value.is_a?(Hash)
      deep_reverse_merge!(base[key], value)
    elsif !base.key?(key)
      base[key] = value
    elsif base[key].is_a?(Array) && value.is_a?(Array)
      if key == "parameters"
        # merge arrays
        base[key] |= value
      end
    else
      # no-op
    end
  end
  base
end
normalize_keys(spec) click to toggle source
# File lib/rspec/openapi/schema_merger.rb, line 11
def normalize_keys(spec)
  case spec
  when Hash
    spec.map do |key, value|
      [key.to_s, normalize_keys(value)]
    end.to_h
  when Array
    spec.map { |s| normalize_keys(s) }
  else
    spec
  end
end