Skip to content

Commit

Permalink
Added Hash#except which is the inverse of Hash#slice -- return the ha…
Browse files Browse the repository at this point in the history
…sh except the keys that are specified [DHH]

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@7172 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
  • Loading branch information
dhh committed Jul 9, 2007
1 parent 5b2be62 commit cb23816
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 1 deletion.
2 changes: 2 additions & 0 deletions activesupport/CHANGELOG
@@ -1,5 +1,7 @@
*SVN*

* Added Hash#except which is the inverse of Hash#slice -- return the hash except the keys that are specified [DHH]

* Added support for pluralization with a different starting letter than the singular version (cow/kine) #4929 [norri_b/hasmanyjosh]

* Demote Hash#to_xml to use XmlSimple#xml_in_string so it can't read files or stdin. #8453 [candlerb, Jeremy Kemper]
Expand Down
3 changes: 2 additions & 1 deletion activesupport/lib/active_support/core_ext/hash.rb
@@ -1,4 +1,4 @@
%w(keys indifferent_access reverse_merge conversions diff slice).each do |ext|
%w(keys indifferent_access reverse_merge conversions diff slice except).each do |ext|
require "#{File.dirname(__FILE__)}/hash/#{ext}"
end

Expand All @@ -9,4 +9,5 @@ class Hash #:nodoc:
include ActiveSupport::CoreExtensions::Hash::Conversions
include ActiveSupport::CoreExtensions::Hash::Diff
include ActiveSupport::CoreExtensions::Hash::Slice
include ActiveSupport::CoreExtensions::Hash::Except
end
24 changes: 24 additions & 0 deletions activesupport/lib/active_support/core_ext/hash/except.rb
@@ -0,0 +1,24 @@
require 'set'

module ActiveSupport #:nodoc:
module CoreExtensions #:nodoc:
module Hash #:nodoc:
# Return a hash that includes everything but the given keys. This is useful for
# limiting a set of parameters to everything but a few known toggles:
#
# @person.update_attributes(params[:person].except(:admin))
module Except
# Returns a new hash without the given keys.
def except(*keys)
rejected = Set.new(respond_to?(:convert_key) ? keys.map { |key| convert_key(key) } : keys)
reject { |key,| rejected.include?(key) }
end

# Replaces the hash without only the given keys.
def except!(*keys)
replace(except(*keys))
end
end
end
end
end
13 changes: 13 additions & 0 deletions activesupport/test/core_ext/hash_ext_test.rb
Expand Up @@ -277,6 +277,19 @@ def test_indifferent_slice
assert_equal expected, copy
end
end

def test_except
original = { :a => 'x', :b => 'y', :c => 10 }
expected = { :a => 'x', :b => 'y' }

# Should return a new hash with only the given keys.
assert_equal expected, original.except(:c)
assert_not_equal expected, original

# Should replace the hash with only the given keys.
assert_equal expected, original.except!(:c)
assert_equal expected, original
end
end

class IWriteMyOwnXML
Expand Down

0 comments on commit cb23816

Please sign in to comment.