From c006e58c0a1d81c93740f956256b82feecc17bdf Mon Sep 17 00:00:00 2001 From: Shota Iguchi Date: Fri, 23 Feb 2018 01:56:39 +0900 Subject: [PATCH 1/2] Support ruby2.5 Hash#slice to Sinatra::IndifferentHash --- lib/sinatra/indifferent_hash.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/sinatra/indifferent_hash.rb b/lib/sinatra/indifferent_hash.rb index 95abdcd1..01662c42 100644 --- a/lib/sinatra/indifferent_hash.rb +++ b/lib/sinatra/indifferent_hash.rb @@ -104,6 +104,11 @@ module Sinatra super(*keys.map(&method(:convert_key))) end if method_defined?(:fetch_values) # Added in Ruby 2.3 + def slice(*keys) + keys.map!(&method(:convert_key)) + self.class[super(*keys)] + end if method_defined?(:slice) # Added in Ruby 2.5 + def values_at(*keys) super(*keys.map(&method(:convert_key))) end From 23afce5269ee084c33971a319dd24c970c6a3b25 Mon Sep 17 00:00:00 2001 From: Shota Iguchi Date: Fri, 23 Feb 2018 02:09:11 +0900 Subject: [PATCH 2/2] Add Sinatra::IndifferentHash#slice spec --- test/indifferent_hash_test.rb | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/test/indifferent_hash_test.rb b/test/indifferent_hash_test.rb index 83dad584..69101b48 100644 --- a/test/indifferent_hash_test.rb +++ b/test/indifferent_hash_test.rb @@ -169,6 +169,18 @@ class TestIndifferentHash < Minitest::Test assert_nil @hash.dig('nested', ?a, 0, :d) end + def test_slice + skip_if_lacking :slice + + assert_equal Sinatra::IndifferentHash[a: :a], @hash.slice(:a) + assert_equal Sinatra::IndifferentHash[b: :b], @hash.slice(?b) + assert_equal Sinatra::IndifferentHash[3 => 3], @hash.slice(3) + assert_equal Sinatra::IndifferentHash.new, @hash.slice(:d) + assert_equal Sinatra::IndifferentHash[a: :a, b: :b, 3 => 3], @hash.slice(:a, :b, 3) + assert_equal Sinatra::IndifferentHash[simple_nested: { a: :a, ?b => :b }], @hash.slice(:simple_nested) + assert_equal Sinatra::IndifferentHash[nested: { a: [{ a: :a, ?b => :b }, :c, 4], ?f => :f, 7 => 7 }], @hash.slice(:nested) + end + def test_fetch_values skip_if_lacking :fetch_values