From 87468284d523d5e760445633666232840777e312 Mon Sep 17 00:00:00 2001
From: Gabriel Sobrinho <gabriel.sobrinho@gmail.com>
Date: Wed, 6 Mar 2019 11:16:07 -0300
Subject: Fix including/excluding flattening

---
 activesupport/lib/active_support/core_ext/array/access.rb | 12 ++++++------
 activesupport/lib/active_support/core_ext/enumerable.rb   |  2 +-
 activesupport/test/core_ext/array/access_test.rb          |  2 ++
 activesupport/test/core_ext/enumerable_test.rb            |  1 +
 4 files changed, 10 insertions(+), 7 deletions(-)

(limited to 'activesupport')

diff --git a/activesupport/lib/active_support/core_ext/array/access.rb b/activesupport/lib/active_support/core_ext/array/access.rb
index c9eecc55f9..10e4c6b09d 100644
--- a/activesupport/lib/active_support/core_ext/array/access.rb
+++ b/activesupport/lib/active_support/core_ext/array/access.rb
@@ -31,21 +31,21 @@ class Array
 
   # Returns a new array that includes the passed elements.
   #
-  # Example: [ 1, 2, 3 ].including(4, 5) => [ 1, 2, 3, 4, 5 ]
+  #   [ 1, 2, 3 ].including(4, 5) => [ 1, 2, 3, 4, 5 ]
+  #   [ [ 0, 1 ] ].including([ [ 1, 0 ] ]) => [ [ 0, 1 ], [ 1, 0 ] ]
   def including(*elements)
-    self + elements.flatten
+    self + elements.flatten(1)
   end
 
   # Returns a copy of the Array excluding the specified elements.
   #
-  #   people = ["David", "Rafael", "Aaron", "Todd"]
-  #   people.excluding "Aaron", "Todd"
-  #   # => ["David", "Rafael"]
+  #   ["David", "Rafael", "Aaron", "Todd"].excluding("Aaron", "Todd") => ["David", "Rafael"]
+  #   [ [ 0, 1 ], [ 1, 0 ] ].excluding([ [ 1, 0 ] ]) => [ [ 0, 1 ] ]
   #
   # Note: This is an optimization of <tt>Enumerable#excluding</tt> that uses <tt>Array#-</tt>
   # instead of <tt>Array#reject</tt> for performance reasons.
   def excluding(*elements)
-    self - elements.flatten
+    self - elements.flatten(1)
   end
 
   # Alias for #excluding.
diff --git a/activesupport/lib/active_support/core_ext/enumerable.rb b/activesupport/lib/active_support/core_ext/enumerable.rb
index d6fb89e588..4675c41936 100644
--- a/activesupport/lib/active_support/core_ext/enumerable.rb
+++ b/activesupport/lib/active_support/core_ext/enumerable.rb
@@ -125,7 +125,7 @@ module Enumerable
   #   {foo: 1, bar: 2, baz: 3}.excluding :bar
   #   # => {foo: 1, baz: 3}
   def excluding(*elements)
-    elements.flatten!
+    elements.flatten!(1)
     reject { |element| elements.include?(element) }
   end
 
diff --git a/activesupport/test/core_ext/array/access_test.rb b/activesupport/test/core_ext/array/access_test.rb
index 8f89c3f25c..427b058925 100644
--- a/activesupport/test/core_ext/array/access_test.rb
+++ b/activesupport/test/core_ext/array/access_test.rb
@@ -35,11 +35,13 @@ class AccessTest < ActiveSupport::TestCase
   def test_including
     assert_equal [1, 2, 3, 4, 5], [1, 2, 4].including(3, 5).sort
     assert_equal [1, 2, 3, 4, 5], [1, 2, 4].including([3, 5]).sort
+    assert_equal [[0, 1], [1, 0]], [[0, 1]].including([[1, 0]])
   end
 
   def test_excluding
     assert_equal [1, 2, 4], [1, 2, 3, 4, 5].excluding(3, 5)
     assert_equal [1, 2, 4], [1, 2, 3, 4, 5].excluding([3, 5])
+    assert_equal [[0, 1]], [[0, 1], [1, 0]].excluding([[1, 0]])
   end
 
   def test_without
diff --git a/activesupport/test/core_ext/enumerable_test.rb b/activesupport/test/core_ext/enumerable_test.rb
index 4e9cf3848d..381b5a1f32 100644
--- a/activesupport/test/core_ext/enumerable_test.rb
+++ b/activesupport/test/core_ext/enumerable_test.rb
@@ -220,6 +220,7 @@ class EnumerableTests < ActiveSupport::TestCase
   def test_excluding
     assert_equal [1, 2, 4], GenericEnumerable.new((1..5).to_a).excluding(3, 5)
     assert_equal [3, 4, 5], GenericEnumerable.new((1..5).to_a).excluding([1, 2])
+    assert_equal [[0, 1]], GenericEnumerable.new([[0, 1], [1, 0]]).excluding([[1, 0]])
     assert_equal [1, 2, 4], (1..5).to_a.excluding(3, 5)
     assert_equal [1, 2, 4], (1..5).to_set.excluding(3, 5)
     assert_equal({ foo: 1, baz: 3 }, { foo: 1, bar: 2, baz: 3 }.excluding(:bar))
-- 
cgit v1.2.3