Skip to content

Commit

Permalink
Merge pull request #28603 from mikeastock/alias-reverse-merge
Browse files Browse the repository at this point in the history
Add an alias for reverse_merge to with_defaults
  • Loading branch information
sgrif committed Mar 29, 2017
2 parents f77a6be + 0117810 commit d5a2e8b
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 0 deletions.
2 changes: 2 additions & 0 deletions actionpack/lib/action_controller/metal/strong_parameters.rb
Expand Up @@ -667,13 +667,15 @@ def reverse_merge(other_hash)
other_hash.to_h.merge(@parameters)
)
end
alias_method :with_defaults, :reverse_merge

# Returns current <tt>ActionController::Parameters</tt> instance with
# current hash merged into +other_hash+.
def reverse_merge!(other_hash)
@parameters.merge!(other_hash.to_h) { |key, left, right| left }
self
end
alias_method :with_defaults!, :reverse_merge!

# This is required by ActiveModel attribute assignment, so that user can
# pass +Parameters+ to a mass assignment methods in a model. It should not
Expand Down
16 changes: 16 additions & 0 deletions actionpack/test/controller/parameters/parameters_permit_test.rb
Expand Up @@ -310,6 +310,14 @@ def walk_permitted(params)
refute_predicate merged_params[:person], :empty?
end

test "#with_defaults is an alias of reverse_merge" do
default_params = ActionController::Parameters.new(id: "1234", person: {}).permit!
merged_params = @params.with_defaults(default_params)

assert_equal "1234", merged_params[:id]
refute_predicate merged_params[:person], :empty?
end

test "not permitted is sticky beyond reverse_merge" do
refute_predicate @params.reverse_merge(a: "b"), :permitted?
end
Expand All @@ -327,6 +335,14 @@ def walk_permitted(params)
refute_predicate @params[:person], :empty?
end

test "#with_defaults! is an alias of reverse_merge!" do
default_params = ActionController::Parameters.new(id: "1234", person: {}).permit!
@params.with_defaults!(default_params)

assert_equal "1234", @params[:id]
refute_predicate @params[:person], :empty?
end

test "modifying the parameters" do
@params[:person][:hometown] = "Chicago"
@params[:person][:family] = { brother: "Jonas" }
Expand Down
Expand Up @@ -12,11 +12,13 @@ class Hash
def reverse_merge(other_hash)
other_hash.merge(self)
end
alias_method :with_defaults, :reverse_merge

# Destructive +reverse_merge+.
def reverse_merge!(other_hash)
# right wins if there is no left
merge!(other_hash) { |key, left, right| left }
end
alias_method :reverse_update, :reverse_merge!
alias_method :with_defaults!, :reverse_merge!
end
Expand Up @@ -225,11 +225,13 @@ def merge(hash, &block)
def reverse_merge(other_hash)
super(self.class.new(other_hash))
end
alias_method :with_defaults, :reverse_merge

# Same semantics as +reverse_merge+ but modifies the receiver in-place.
def reverse_merge!(other_hash)
replace(reverse_merge(other_hash))
end
alias_method :with_defaults!, :reverse_merge!

# Replaces the contents of this hash with other_hash.
#
Expand Down
25 changes: 25 additions & 0 deletions activesupport/test/core_ext/hash_ext_test.rb
Expand Up @@ -535,6 +535,16 @@ def test_indifferent_reverse_merging
assert_equal "clobber", hash[:another]
end

def test_indifferent_with_defaults_aliases_reverse_merge
hash = HashWithIndifferentAccess.new key: :old_value
actual = hash.with_defaults key: :new_value
assert_equal :old_value, actual[:key]

hash = HashWithIndifferentAccess.new key: :old_value
hash.with_defaults! key: :new_value
assert_equal :old_value, hash[:key]
end

def test_indifferent_deleting
get_hash = proc { { a: "foo" }.with_indifferent_access }
hash = get_hash.call
Expand Down Expand Up @@ -848,6 +858,21 @@ def test_reverse_merge
assert_equal expected, merged
end

def test_with_defaults_aliases_reverse_merge
defaults = { a: "x", b: "y", c: 10 }.freeze
options = { a: 1, b: 2 }
expected = { a: 1, b: 2, c: 10 }

# Should be an alias for reverse_merge
assert_equal expected, options.with_defaults(defaults)
assert_not_equal expected, options

# Should be an alias for reverse_merge!
merged = options.dup
assert_equal expected, merged.with_defaults!(defaults)
assert_equal expected, merged
end

def test_slice
original = { a: "x", b: "y", c: 10 }
expected = { a: "x", b: "y" }
Expand Down

0 comments on commit d5a2e8b

Please sign in to comment.