diff --git a/lib/core_ext/stringify_keys.rb b/lib/core_ext/stringify_keys.rb index 08fb9b4..47b3579 100644 --- a/lib/core_ext/stringify_keys.rb +++ b/lib/core_ext/stringify_keys.rb @@ -1,12 +1,16 @@ class Hash - # Stolen from ActiveSupport - def transform_keys - return enum_for(:transform_keys) { size } unless block_given? - result = {} - each_key do |key| - result[yield(key)] = self[key] + # Only define transform_keys when the native method is unavailable (Ruby < 2.5). + # Defining it unconditionally clobbers the native version, which also accepts a + # mapping hash, so downstream `transform_keys(a: :b)` calls raise ArgumentError. + unless method_defined?(:transform_keys) + def transform_keys + return enum_for(:transform_keys) { size } unless block_given? + result = {} + each_key do |key| + result[yield(key)] = self[key] + end + result end - result end # Returns a new hash with all keys converted to strings. diff --git a/test/json_logic_test.rb b/test/json_logic_test.rb index 2f76271..d6b87df 100644 --- a/test/json_logic_test.rb +++ b/test/json_logic_test.rb @@ -111,6 +111,15 @@ def test_filter_with_non_array ) end + def test_transform_keys_mapping_hash_preserved + skip "native transform_keys mapping form requires Ruby >= 3.0" if RUBY_VERSION < "3.0" + assert_equal({ b: 1 }, { a: 1 }.transform_keys(a: :b)) + end + + def test_stringify_keys_still_works + assert_equal({ "a" => 1, "b" => 2 }, { a: 1, b: 2 }.stringify_keys) + end + def test_uses_data assert_equal ["x", "y"], JSONLogic.uses_data( {