From 825299319e9ebe7407b548c6498fcecf60f704fa Mon Sep 17 00:00:00 2001 From: Kunpei Sakai Date: Thu, 2 Jan 2020 04:44:44 +0900 Subject: [PATCH] Merge pull request #1572 from iguchi1124/support-ruby26-merge Support ruby 2.6 Hash#merge with multiple arguments --- lib/sinatra/indifferent_hash.rb | 22 +++++++++++++--------- test/indifferent_hash_test.rb | 14 ++++++++++++++ 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/lib/sinatra/indifferent_hash.rb b/lib/sinatra/indifferent_hash.rb index a0e721d4..3043a5a9 100644 --- a/lib/sinatra/indifferent_hash.rb +++ b/lib/sinatra/indifferent_hash.rb @@ -132,13 +132,17 @@ module Sinatra super(*keys) end - def merge!(other_hash) - return super if other_hash.is_a?(self.class) - - other_hash.each_pair do |key, value| - key = convert_key(key) - value = yield(key, self[key], value) if block_given? && key?(key) - self[key] = convert_value(value) + def merge!(*other_hashes) + other_hashes.each do |other_hash| + if other_hash.is_a?(self.class) + super(other_hash) + else + other_hash.each_pair do |key, value| + key = convert_key(key) + value = yield(key, self[key], value) if block_given? && key?(key) + self[key] = convert_value(value) + end + end end self @@ -146,8 +150,8 @@ module Sinatra alias_method :update, :merge! - def merge(other_hash, &block) - dup.merge!(other_hash, &block) + def merge(*other_hashes, &block) + dup.merge!(*other_hashes, &block) end def replace(other_hash) diff --git a/test/indifferent_hash_test.rb b/test/indifferent_hash_test.rb index 4cb21f79..88d9e73d 100644 --- a/test/indifferent_hash_test.rb +++ b/test/indifferent_hash_test.rb @@ -205,6 +205,20 @@ class TestIndifferentHash < Minitest::Test assert_equal 2, hash2[?q] end + def test_merge_with_multiple_argument + hash = Sinatra::IndifferentHash.new.merge({a: 1}, {b: 2}, {c: 3}) + assert_equal 1, hash[?a] + assert_equal 2, hash[?b] + assert_equal 3, hash[?c] + + hash2 = Sinatra::IndifferentHash[d: 4] + hash3 = {e: 5} + hash.merge!(hash2, hash3) + + assert_equal 4, hash[?d] + assert_equal 5, hash[?e] + end + def test_replace @hash.replace(?a=>1, :q=>2) assert_equal({ ?a=>1, ?q=>2 }, @hash)