Permalink
Browse files

Merge pull request #16149 from sferik/refactor-transform_values

Refactor Hash#transform_values and Hash#transform_values!
  • Loading branch information...
guilleiguaran committed Jul 12, 2014
2 parents 073397c + f1bad13 commit 84b4260e6c6238a8bd8ec5880daa8f7b10cfcb14
@@ -6,7 +6,8 @@ class Hash
# hash.transform_keys{ |key| key.to_s.upcase }
# # => {"NAME"=>"Rob", "AGE"=>"28"}
def transform_keys
result = {}
return enum_for(:transform_keys) unless block_given?
result = self.class.new
each_key do |key|
result[yield(key)] = self[key]
end
@@ -16,6 +17,7 @@ def transform_keys
# Destructively convert all keys using the block operations.
# Same as transform_keys but modifies +self+.
def transform_keys!
return enum_for(:transform_keys!) unless block_given?
keys.each do |key|
self[yield(key)] = delete(key)
end
@@ -4,7 +4,8 @@ class Hash
#
# { a: 1, b: 2, c: 3 }.transform_values { |x| x * 2 }
# # => { a: 2, b: 4, c: 6 }
def transform_values(&block)
def transform_values
return enum_for(:transform_values) unless block_given?
result = self.class.new
each do |key, value|
result[key] = yield(value)
@@ -14,6 +15,7 @@ def transform_values(&block)
# Destructive +transform_values+
def transform_values!
return enum_for(:transform_values!) unless block_given?
each do |key, value|
self[key] = yield(value)
end
@@ -0,0 +1,32 @@
require 'abstract_unit'
require 'active_support/core_ext/hash/transform_keys'
class TransformKeysTest < ActiveSupport::TestCase
test "transform_keys returns a new hash with the keys computed from the block" do
original = { a: 'a', b: 'b' }
mapped = original.transform_keys { |k| "#{k}!".to_sym }
assert_equal({ a: 'a', b: 'b' }, original)
assert_equal({ a!: 'a', b!: 'b' }, mapped)
end
test "transform_keys! modifies the keys of the original" do
original = { a: 'a', b: 'b' }
mapped = original.transform_keys! { |k| "#{k}!".to_sym }
assert_equal({ a!: 'a', b!: 'b' }, original)
assert_same original, mapped
end
test "transform_keys returns an Enumerator if no block is given" do
original = { a: 'a', b: 'b' }
enumerator = original.transform_keys
assert_equal Enumerator, enumerator.class
end
test "transform_keys is chainable with Enumerable methods" do
original = { a: 'a', b: 'b' }
mapped = original.transform_keys.with_index { |k, i| [k, i].join.to_sym }
assert_equal({ a0: 'a', b1: 'b' }, mapped)
end
end
@@ -46,4 +46,16 @@ class TransformValuesTest < ActiveSupport::TestCase
assert_equal 'a!', mapped[:a]
assert_nil mapped[:b]
end
test "transform_values returns an Enumerator if no block is given" do
original = { a: 'a', b: 'b' }
enumerator = original.transform_values
assert_equal Enumerator, enumerator.class
end
test "transform_values is chainable with Enumerable methods" do
original = { a: 'a', b: 'b' }
mapped = original.transform_values.with_index { |v, i| [v, i].join }
assert_equal({ a: 'a0', b: 'b1' }, mapped)
end
end

0 comments on commit 84b4260

Please sign in to comment.